1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
3 * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved.
6 #include <rdma/ib_user_verbs.h>
7 #include <rdma/ib_verbs.h>
8 #include <rdma/uverbs_types.h>
9 #include <rdma/uverbs_ioctl.h>
10 #include <rdma/uverbs_std_types.h>
11 #include <rdma/mlx5_user_ioctl_cmds.h>
12 #include <rdma/mlx5_user_ioctl_verbs.h>
13 #include <rdma/ib_umem.h>
14 #include <linux/mlx5/driver.h>
15 #include <linux/mlx5/fs.h>
18 #define UVERBS_MODULE_NAME mlx5_ib
19 #include <rdma/uverbs_named_ioctl.h>
22 mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type
,
23 enum mlx5_flow_namespace_type
*namespace)
26 case MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX
:
27 *namespace = MLX5_FLOW_NAMESPACE_BYPASS
;
29 case MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX
:
30 *namespace = MLX5_FLOW_NAMESPACE_EGRESS
;
39 static const struct uverbs_attr_spec mlx5_ib_flow_type
[] = {
40 [MLX5_IB_FLOW_TYPE_NORMAL
] = {
41 .type
= UVERBS_ATTR_TYPE_PTR_IN
,
43 .len
= sizeof(u16
), /* data is priority */
44 .min_len
= sizeof(u16
),
47 [MLX5_IB_FLOW_TYPE_SNIFFER
] = {
48 .type
= UVERBS_ATTR_TYPE_PTR_IN
,
49 UVERBS_ATTR_NO_DATA(),
51 [MLX5_IB_FLOW_TYPE_ALL_DEFAULT
] = {
52 .type
= UVERBS_ATTR_TYPE_PTR_IN
,
53 UVERBS_ATTR_NO_DATA(),
55 [MLX5_IB_FLOW_TYPE_MC_DEFAULT
] = {
56 .type
= UVERBS_ATTR_TYPE_PTR_IN
,
57 UVERBS_ATTR_NO_DATA(),
61 #define MLX5_IB_CREATE_FLOW_MAX_FLOW_ACTIONS 2
62 static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW
)(
63 struct uverbs_attr_bundle
*attrs
)
65 struct mlx5_flow_act flow_act
= {.flow_tag
= MLX5_FS_DEFAULT_FLOW_TAG
};
66 struct mlx5_ib_flow_handler
*flow_handler
;
67 struct mlx5_ib_flow_matcher
*fs_matcher
;
68 struct ib_uobject
**arr_flow_actions
;
69 struct ib_uflow_resources
*uflow_res
;
71 int dest_id
, dest_type
;
74 bool dest_devx
, dest_qp
;
75 struct ib_qp
*qp
= NULL
;
76 struct ib_uobject
*uobj
=
77 uverbs_attr_get_uobject(attrs
, MLX5_IB_ATTR_CREATE_FLOW_HANDLE
);
78 struct mlx5_ib_dev
*dev
= to_mdev(uobj
->context
->device
);
82 if (!capable(CAP_NET_RAW
))
86 uverbs_attr_is_valid(attrs
, MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX
);
87 dest_qp
= uverbs_attr_is_valid(attrs
,
88 MLX5_IB_ATTR_CREATE_FLOW_DEST_QP
);
90 fs_matcher
= uverbs_attr_get_obj(attrs
,
91 MLX5_IB_ATTR_CREATE_FLOW_MATCHER
);
92 if (fs_matcher
->ns_type
== MLX5_FLOW_NAMESPACE_BYPASS
&&
93 ((dest_devx
&& dest_qp
) || (!dest_devx
&& !dest_qp
)))
97 devx_obj
= uverbs_attr_get_obj(
98 attrs
, MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX
);
100 return PTR_ERR(devx_obj
);
102 /* Verify that the given DEVX object is a flow
103 * steering destination.
105 if (!mlx5_ib_devx_is_flow_dest(devx_obj
, &dest_id
, &dest_type
))
107 } else if (dest_qp
) {
108 struct mlx5_ib_qp
*mqp
;
110 qp
= uverbs_attr_get_obj(attrs
,
111 MLX5_IB_ATTR_CREATE_FLOW_DEST_QP
);
115 if (qp
->qp_type
!= IB_QPT_RAW_PACKET
)
119 if (mqp
->flags
& MLX5_IB_QP_RSS
)
120 dest_id
= mqp
->rss_qp
.tirn
;
122 dest_id
= mqp
->raw_packet_qp
.rq
.tirn
;
123 dest_type
= MLX5_FLOW_DESTINATION_TYPE_TIR
;
125 dest_type
= MLX5_FLOW_DESTINATION_TYPE_PORT
;
128 len
= uverbs_attr_get_uobjs_arr(attrs
,
129 MLX5_IB_ATTR_CREATE_FLOW_ARR_COUNTERS_DEVX
, &arr_flow_actions
);
131 devx_obj
= arr_flow_actions
[0]->object
;
133 if (!mlx5_ib_devx_is_flow_counter(devx_obj
, &counter_id
))
135 flow_act
.action
|= MLX5_FLOW_CONTEXT_ACTION_COUNT
;
138 if (dest_type
== MLX5_FLOW_DESTINATION_TYPE_TIR
&&
139 fs_matcher
->ns_type
== MLX5_FLOW_NAMESPACE_EGRESS
)
142 cmd_in
= uverbs_attr_get_alloced_ptr(
143 attrs
, MLX5_IB_ATTR_CREATE_FLOW_MATCH_VALUE
);
144 inlen
= uverbs_attr_get_len(attrs
,
145 MLX5_IB_ATTR_CREATE_FLOW_MATCH_VALUE
);
147 uflow_res
= flow_resources_alloc(MLX5_IB_CREATE_FLOW_MAX_FLOW_ACTIONS
);
151 len
= uverbs_attr_get_uobjs_arr(attrs
,
152 MLX5_IB_ATTR_CREATE_FLOW_ARR_FLOW_ACTIONS
, &arr_flow_actions
);
153 for (i
= 0; i
< len
; i
++) {
154 struct mlx5_ib_flow_action
*maction
=
155 to_mflow_act(arr_flow_actions
[i
]->object
);
157 ret
= parse_flow_flow_action(maction
, false, &flow_act
);
160 flow_resources_add(uflow_res
, IB_FLOW_SPEC_ACTION_HANDLE
,
161 arr_flow_actions
[i
]->object
);
164 ret
= uverbs_copy_from(&flow_act
.flow_tag
, attrs
,
165 MLX5_IB_ATTR_CREATE_FLOW_TAG
);
167 if (flow_act
.flow_tag
>= BIT(24)) {
171 flow_act
.flags
|= FLOW_ACT_HAS_TAG
;
174 flow_handler
= mlx5_ib_raw_fs_rule_add(dev
, fs_matcher
, &flow_act
,
178 if (IS_ERR(flow_handler
)) {
179 ret
= PTR_ERR(flow_handler
);
183 ib_set_flow(uobj
, &flow_handler
->ibflow
, qp
, &dev
->ib_dev
, uflow_res
);
187 ib_uverbs_flow_resources_free(uflow_res
);
191 static int flow_matcher_cleanup(struct ib_uobject
*uobject
,
192 enum rdma_remove_reason why
)
194 struct mlx5_ib_flow_matcher
*obj
= uobject
->object
;
197 ret
= ib_destroy_usecnt(&obj
->usecnt
, why
, uobject
);
205 static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE
)(
206 struct uverbs_attr_bundle
*attrs
)
208 struct ib_uobject
*uobj
= uverbs_attr_get_uobject(
209 attrs
, MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE
);
210 struct mlx5_ib_dev
*dev
= to_mdev(uobj
->context
->device
);
211 struct mlx5_ib_flow_matcher
*obj
;
215 obj
= kzalloc(sizeof(struct mlx5_ib_flow_matcher
), GFP_KERNEL
);
219 obj
->ns_type
= MLX5_FLOW_NAMESPACE_BYPASS
;
220 obj
->mask_len
= uverbs_attr_get_len(
221 attrs
, MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK
);
222 err
= uverbs_copy_from(&obj
->matcher_mask
,
224 MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK
);
228 obj
->flow_type
= uverbs_attr_get_enum_id(
229 attrs
, MLX5_IB_ATTR_FLOW_MATCHER_FLOW_TYPE
);
231 if (obj
->flow_type
== MLX5_IB_FLOW_TYPE_NORMAL
) {
232 err
= uverbs_copy_from(&obj
->priority
,
234 MLX5_IB_ATTR_FLOW_MATCHER_FLOW_TYPE
);
239 err
= uverbs_copy_from(&obj
->match_criteria_enable
,
241 MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA
);
245 err
= uverbs_get_flags32(&flags
, attrs
,
246 MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS
,
247 IB_FLOW_ATTR_FLAGS_EGRESS
);
252 err
= mlx5_ib_ft_type_to_namespace(
253 MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX
, &obj
->ns_type
);
259 obj
->mdev
= dev
->mdev
;
260 atomic_set(&obj
->usecnt
, 0);
268 void mlx5_ib_destroy_flow_action_raw(struct mlx5_ib_flow_action
*maction
)
270 switch (maction
->flow_action_raw
.sub_type
) {
271 case MLX5_IB_FLOW_ACTION_MODIFY_HEADER
:
272 mlx5_modify_header_dealloc(maction
->flow_action_raw
.dev
->mdev
,
273 maction
->flow_action_raw
.action_id
);
275 case MLX5_IB_FLOW_ACTION_PACKET_REFORMAT
:
276 mlx5_packet_reformat_dealloc(maction
->flow_action_raw
.dev
->mdev
,
277 maction
->flow_action_raw
.action_id
);
279 case MLX5_IB_FLOW_ACTION_DECAP
:
286 static struct ib_flow_action
*
287 mlx5_ib_create_modify_header(struct mlx5_ib_dev
*dev
,
288 enum mlx5_ib_uapi_flow_table_type ft_type
,
289 u8 num_actions
, void *in
)
291 enum mlx5_flow_namespace_type
namespace;
292 struct mlx5_ib_flow_action
*maction
;
295 ret
= mlx5_ib_ft_type_to_namespace(ft_type
, &namespace);
297 return ERR_PTR(-EINVAL
);
299 maction
= kzalloc(sizeof(*maction
), GFP_KERNEL
);
301 return ERR_PTR(-ENOMEM
);
303 ret
= mlx5_modify_header_alloc(dev
->mdev
, namespace, num_actions
, in
,
304 &maction
->flow_action_raw
.action_id
);
310 maction
->flow_action_raw
.sub_type
=
311 MLX5_IB_FLOW_ACTION_MODIFY_HEADER
;
312 maction
->flow_action_raw
.dev
= dev
;
314 return &maction
->ib_action
;
317 static bool mlx5_ib_modify_header_supported(struct mlx5_ib_dev
*dev
)
319 return MLX5_CAP_FLOWTABLE_NIC_RX(dev
->mdev
,
320 max_modify_header_actions
) ||
321 MLX5_CAP_FLOWTABLE_NIC_TX(dev
->mdev
, max_modify_header_actions
);
324 static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_ACTION_CREATE_MODIFY_HEADER
)(
325 struct uverbs_attr_bundle
*attrs
)
327 struct ib_uobject
*uobj
= uverbs_attr_get_uobject(
328 attrs
, MLX5_IB_ATTR_CREATE_MODIFY_HEADER_HANDLE
);
329 struct mlx5_ib_dev
*mdev
= to_mdev(uobj
->context
->device
);
330 enum mlx5_ib_uapi_flow_table_type ft_type
;
331 struct ib_flow_action
*action
;
336 if (!mlx5_ib_modify_header_supported(mdev
))
339 in
= uverbs_attr_get_alloced_ptr(attrs
,
340 MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM
);
342 num_actions
= uverbs_attr_ptr_get_array_size(
343 attrs
, MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM
,
344 MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto
));
348 ret
= uverbs_get_const(&ft_type
, attrs
,
349 MLX5_IB_ATTR_CREATE_MODIFY_HEADER_FT_TYPE
);
352 action
= mlx5_ib_create_modify_header(mdev
, ft_type
, num_actions
, in
);
354 return PTR_ERR(action
);
356 uverbs_flow_action_fill_action(action
, uobj
, uobj
->context
->device
,
357 IB_FLOW_ACTION_UNSPECIFIED
);
362 static bool mlx5_ib_flow_action_packet_reformat_valid(struct mlx5_ib_dev
*ibdev
,
363 u8 packet_reformat_type
,
366 switch (packet_reformat_type
) {
367 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TUNNEL
:
368 if (ft_type
== MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX
)
369 return MLX5_CAP_FLOWTABLE(ibdev
->mdev
,
370 encap_general_header
);
372 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL
:
373 if (ft_type
== MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX
)
374 return MLX5_CAP_FLOWTABLE_NIC_TX(ibdev
->mdev
,
375 reformat_l2_to_l3_tunnel
);
377 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2
:
378 if (ft_type
== MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX
)
379 return MLX5_CAP_FLOWTABLE_NIC_RX(ibdev
->mdev
,
380 reformat_l3_tunnel_to_l2
);
382 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2
:
383 if (ft_type
== MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX
)
384 return MLX5_CAP_FLOWTABLE_NIC_RX(ibdev
->mdev
, decap
);
393 static int mlx5_ib_dv_to_prm_packet_reforamt_type(u8 dv_prt
, u8
*prm_prt
)
396 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L2_TUNNEL
:
397 *prm_prt
= MLX5_REFORMAT_TYPE_L2_TO_L2_TUNNEL
;
399 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2
:
400 *prm_prt
= MLX5_REFORMAT_TYPE_L3_TUNNEL_TO_L2
;
402 case MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TO_L3_TUNNEL
:
403 *prm_prt
= MLX5_REFORMAT_TYPE_L2_TO_L3_TUNNEL
;
412 static int mlx5_ib_flow_action_create_packet_reformat_ctx(
413 struct mlx5_ib_dev
*dev
,
414 struct mlx5_ib_flow_action
*maction
,
415 u8 ft_type
, u8 dv_prt
,
416 void *in
, size_t len
)
418 enum mlx5_flow_namespace_type
namespace;
422 ret
= mlx5_ib_ft_type_to_namespace(ft_type
, &namespace);
426 ret
= mlx5_ib_dv_to_prm_packet_reforamt_type(dv_prt
, &prm_prt
);
430 ret
= mlx5_packet_reformat_alloc(dev
->mdev
, prm_prt
, len
,
432 &maction
->flow_action_raw
.action_id
);
436 maction
->flow_action_raw
.sub_type
=
437 MLX5_IB_FLOW_ACTION_PACKET_REFORMAT
;
438 maction
->flow_action_raw
.dev
= dev
;
443 static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_ACTION_CREATE_PACKET_REFORMAT
)(
444 struct uverbs_attr_bundle
*attrs
)
446 struct ib_uobject
*uobj
= uverbs_attr_get_uobject(attrs
,
447 MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_HANDLE
);
448 struct mlx5_ib_dev
*mdev
= to_mdev(uobj
->context
->device
);
449 enum mlx5_ib_uapi_flow_action_packet_reformat_type dv_prt
;
450 enum mlx5_ib_uapi_flow_table_type ft_type
;
451 struct mlx5_ib_flow_action
*maction
;
454 ret
= uverbs_get_const(&ft_type
, attrs
,
455 MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_FT_TYPE
);
459 ret
= uverbs_get_const(&dv_prt
, attrs
,
460 MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_TYPE
);
464 if (!mlx5_ib_flow_action_packet_reformat_valid(mdev
, dv_prt
, ft_type
))
467 maction
= kzalloc(sizeof(*maction
), GFP_KERNEL
);
472 MLX5_IB_UAPI_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2
) {
473 maction
->flow_action_raw
.sub_type
=
474 MLX5_IB_FLOW_ACTION_DECAP
;
475 maction
->flow_action_raw
.dev
= mdev
;
480 in
= uverbs_attr_get_alloced_ptr(attrs
,
481 MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_DATA_BUF
);
487 len
= uverbs_attr_get_len(attrs
,
488 MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_DATA_BUF
);
490 ret
= mlx5_ib_flow_action_create_packet_reformat_ctx(mdev
,
491 maction
, ft_type
, dv_prt
, in
, len
);
496 uverbs_flow_action_fill_action(&maction
->ib_action
, uobj
,
497 uobj
->context
->device
,
498 IB_FLOW_ACTION_UNSPECIFIED
);
506 DECLARE_UVERBS_NAMED_METHOD(
507 MLX5_IB_METHOD_CREATE_FLOW
,
508 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_FLOW_HANDLE
,
513 MLX5_IB_ATTR_CREATE_FLOW_MATCH_VALUE
,
514 UVERBS_ATTR_SIZE(1, sizeof(struct mlx5_ib_match_params
)),
517 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_FLOW_MATCHER
,
518 MLX5_IB_OBJECT_FLOW_MATCHER
,
521 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_FLOW_DEST_QP
,
524 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX
,
525 MLX5_IB_OBJECT_DEVX_OBJ
,
527 UVERBS_ATTR_IDRS_ARR(MLX5_IB_ATTR_CREATE_FLOW_ARR_FLOW_ACTIONS
,
528 UVERBS_OBJECT_FLOW_ACTION
,
529 UVERBS_ACCESS_READ
, 1,
530 MLX5_IB_CREATE_FLOW_MAX_FLOW_ACTIONS
,
532 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_CREATE_FLOW_TAG
,
533 UVERBS_ATTR_TYPE(u32
),
535 UVERBS_ATTR_IDRS_ARR(MLX5_IB_ATTR_CREATE_FLOW_ARR_COUNTERS_DEVX
,
536 MLX5_IB_OBJECT_DEVX_OBJ
,
537 UVERBS_ACCESS_READ
, 1, 1,
540 DECLARE_UVERBS_NAMED_METHOD_DESTROY(
541 MLX5_IB_METHOD_DESTROY_FLOW
,
542 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_FLOW_HANDLE
,
544 UVERBS_ACCESS_DESTROY
,
547 ADD_UVERBS_METHODS(mlx5_ib_fs
,
549 &UVERBS_METHOD(MLX5_IB_METHOD_CREATE_FLOW
),
550 &UVERBS_METHOD(MLX5_IB_METHOD_DESTROY_FLOW
));
552 DECLARE_UVERBS_NAMED_METHOD(
553 MLX5_IB_METHOD_FLOW_ACTION_CREATE_MODIFY_HEADER
,
554 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_MODIFY_HEADER_HANDLE
,
555 UVERBS_OBJECT_FLOW_ACTION
,
558 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM
,
559 UVERBS_ATTR_MIN_SIZE(MLX5_UN_SZ_BYTES(
560 set_action_in_add_action_in_auto
)),
563 UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_CREATE_MODIFY_HEADER_FT_TYPE
,
564 enum mlx5_ib_uapi_flow_table_type
,
567 DECLARE_UVERBS_NAMED_METHOD(
568 MLX5_IB_METHOD_FLOW_ACTION_CREATE_PACKET_REFORMAT
,
569 UVERBS_ATTR_IDR(MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_HANDLE
,
570 UVERBS_OBJECT_FLOW_ACTION
,
573 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_DATA_BUF
,
574 UVERBS_ATTR_MIN_SIZE(1),
577 UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_TYPE
,
578 enum mlx5_ib_uapi_flow_action_packet_reformat_type
,
580 UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_CREATE_PACKET_REFORMAT_FT_TYPE
,
581 enum mlx5_ib_uapi_flow_table_type
,
585 mlx5_ib_flow_actions
,
586 UVERBS_OBJECT_FLOW_ACTION
,
587 &UVERBS_METHOD(MLX5_IB_METHOD_FLOW_ACTION_CREATE_MODIFY_HEADER
),
588 &UVERBS_METHOD(MLX5_IB_METHOD_FLOW_ACTION_CREATE_PACKET_REFORMAT
));
590 DECLARE_UVERBS_NAMED_METHOD(
591 MLX5_IB_METHOD_FLOW_MATCHER_CREATE
,
592 UVERBS_ATTR_IDR(MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE
,
593 MLX5_IB_OBJECT_FLOW_MATCHER
,
597 MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK
,
598 UVERBS_ATTR_SIZE(1, sizeof(struct mlx5_ib_match_params
)),
600 UVERBS_ATTR_ENUM_IN(MLX5_IB_ATTR_FLOW_MATCHER_FLOW_TYPE
,
603 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA
,
604 UVERBS_ATTR_TYPE(u8
),
606 UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS
,
610 DECLARE_UVERBS_NAMED_METHOD_DESTROY(
611 MLX5_IB_METHOD_FLOW_MATCHER_DESTROY
,
612 UVERBS_ATTR_IDR(MLX5_IB_ATTR_FLOW_MATCHER_DESTROY_HANDLE
,
613 MLX5_IB_OBJECT_FLOW_MATCHER
,
614 UVERBS_ACCESS_DESTROY
,
617 DECLARE_UVERBS_NAMED_OBJECT(MLX5_IB_OBJECT_FLOW_MATCHER
,
618 UVERBS_TYPE_ALLOC_IDR(flow_matcher_cleanup
),
619 &UVERBS_METHOD(MLX5_IB_METHOD_FLOW_MATCHER_CREATE
),
620 &UVERBS_METHOD(MLX5_IB_METHOD_FLOW_MATCHER_DESTROY
));
622 static bool flow_is_supported(struct ib_device
*device
)
624 return !to_mdev(device
)->rep
;
627 const struct uapi_definition mlx5_ib_flow_defs
[] = {
628 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
629 MLX5_IB_OBJECT_FLOW_MATCHER
,
630 UAPI_DEF_IS_OBJ_SUPPORTED(flow_is_supported
)),
631 UAPI_DEF_CHAIN_OBJ_TREE(
634 UAPI_DEF_IS_OBJ_SUPPORTED(flow_is_supported
)),
635 UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION
,
636 &mlx5_ib_flow_actions
),