@@ -29,6 +29,9 @@ mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type,
29
29
case MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX :
30
30
* namespace = MLX5_FLOW_NAMESPACE_EGRESS ;
31
31
break ;
32
+ case MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB :
33
+ * namespace = MLX5_FLOW_NAMESPACE_FDB ;
34
+ break ;
32
35
default :
33
36
return - EINVAL ;
34
37
}
@@ -93,6 +96,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
93
96
((dest_devx && dest_qp ) || (!dest_devx && !dest_qp )))
94
97
return - EINVAL ;
95
98
99
+ /* Allow only DEVX object as dest when inserting to FDB */
100
+ if (fs_matcher -> ns_type == MLX5_FLOW_NAMESPACE_FDB && !dest_devx )
101
+ return - EINVAL ;
102
+
96
103
if (dest_devx ) {
97
104
devx_obj = uverbs_attr_get_obj (
98
105
attrs , MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX );
@@ -104,6 +111,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
104
111
*/
105
112
if (!mlx5_ib_devx_is_flow_dest (devx_obj , & dest_id , & dest_type ))
106
113
return - EINVAL ;
114
+ /* Allow only flow table as dest when inserting to FDB */
115
+ if (fs_matcher -> ns_type == MLX5_FLOW_NAMESPACE_FDB &&
116
+ dest_type != MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE )
117
+ return - EINVAL ;
107
118
} else if (dest_qp ) {
108
119
struct mlx5_ib_qp * mqp ;
109
120
@@ -203,21 +214,67 @@ static int flow_matcher_cleanup(struct ib_uobject *uobject,
203
214
return 0 ;
204
215
}
205
216
217
+ static int mlx5_ib_matcher_ns (struct uverbs_attr_bundle * attrs ,
218
+ struct mlx5_ib_flow_matcher * obj )
219
+ {
220
+ enum mlx5_ib_uapi_flow_table_type ft_type =
221
+ MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX ;
222
+ u32 flags ;
223
+ int err ;
224
+
225
+ /* New users should use MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE and older
226
+ * users should switch to it. We leave this to not break userspace
227
+ */
228
+ if (uverbs_attr_is_valid (attrs , MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE ) &&
229
+ uverbs_attr_is_valid (attrs , MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS ))
230
+ return - EINVAL ;
231
+
232
+ if (uverbs_attr_is_valid (attrs , MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE )) {
233
+ err = uverbs_get_const (& ft_type , attrs ,
234
+ MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE );
235
+ if (err )
236
+ return err ;
237
+
238
+ err = mlx5_ib_ft_type_to_namespace (ft_type , & obj -> ns_type );
239
+ if (err )
240
+ return err ;
241
+
242
+ return 0 ;
243
+ }
244
+
245
+ if (uverbs_attr_is_valid (attrs , MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS )) {
246
+ err = uverbs_get_flags32 (& flags , attrs ,
247
+ MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS ,
248
+ IB_FLOW_ATTR_FLAGS_EGRESS );
249
+ if (err )
250
+ return err ;
251
+
252
+ if (flags ) {
253
+ mlx5_ib_ft_type_to_namespace (
254
+ MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX ,
255
+ & obj -> ns_type );
256
+ return 0 ;
257
+ }
258
+ }
259
+
260
+ obj -> ns_type = MLX5_FLOW_NAMESPACE_BYPASS ;
261
+
262
+ return 0 ;
263
+ }
264
+
206
265
static int UVERBS_HANDLER (MLX5_IB_METHOD_FLOW_MATCHER_CREATE )(
207
266
struct uverbs_attr_bundle * attrs )
208
267
{
209
268
struct ib_uobject * uobj = uverbs_attr_get_uobject (
210
269
attrs , MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE );
211
270
struct mlx5_ib_dev * dev = mlx5_udata_to_mdev (& attrs -> driver_udata );
212
271
struct mlx5_ib_flow_matcher * obj ;
213
- u32 flags ;
214
272
int err ;
215
273
216
274
obj = kzalloc (sizeof (struct mlx5_ib_flow_matcher ), GFP_KERNEL );
217
275
if (!obj )
218
276
return - ENOMEM ;
219
277
220
- obj -> ns_type = MLX5_FLOW_NAMESPACE_BYPASS ;
221
278
obj -> mask_len = uverbs_attr_get_len (
222
279
attrs , MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK );
223
280
err = uverbs_copy_from (& obj -> matcher_mask ,
@@ -243,19 +300,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
243
300
if (err )
244
301
goto end ;
245
302
246
- err = uverbs_get_flags32 (& flags , attrs ,
247
- MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS ,
248
- IB_FLOW_ATTR_FLAGS_EGRESS );
303
+ err = mlx5_ib_matcher_ns (attrs , obj );
249
304
if (err )
250
305
goto end ;
251
306
252
- if (flags ) {
253
- err = mlx5_ib_ft_type_to_namespace (
254
- MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX , & obj -> ns_type );
255
- if (err )
256
- goto end ;
257
- }
258
-
259
307
uobj -> object = obj ;
260
308
obj -> mdev = dev -> mdev ;
261
309
atomic_set (& obj -> usecnt , 0 );
@@ -605,6 +653,9 @@ DECLARE_UVERBS_NAMED_METHOD(
605
653
UA_MANDATORY ),
606
654
UVERBS_ATTR_FLAGS_IN (MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS ,
607
655
enum ib_flow_flags ,
656
+ UA_OPTIONAL ),
657
+ UVERBS_ATTR_CONST_IN (MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE ,
658
+ enum mlx5_ib_uapi_flow_table_type ,
608
659
UA_OPTIONAL ));
609
660
610
661
DECLARE_UVERBS_NAMED_METHOD_DESTROY (
0 commit comments