Using extend Destination list in the FTE to implement the mirroring
feature.
Add two new rdma-core command for create group action and multiple
destination action.
Group action which is a group of sub-action will be used together
for input to multiple destination action.
Multiple destination action can be used for mirroring packet to
different vport or Queue.
Signed-off-by: Jiawei Wang <jiaweiw@nvidia.com>
---
drivers/common/mlx5/linux/meson.build | 2 ++
drivers/common/mlx5/linux/mlx5_glue.c | 37 +++++++++++++++++++++++++++++++++++
drivers/common/mlx5/linux/mlx5_glue.h | 5 +++++
3 files changed, 44 insertions(+)
@@ -176,6 +176,8 @@ has_sym_args = [
'mlx5dv_dr_action_create_flow_sampler'],
[ 'HAVE_MLX5DV_DR_MEM_RECLAIM', 'infiniband/mlx5dv.h',
'mlx5dv_dr_domain_set_reclaim_device_memory'],
+ [ 'HAVE_MLX5_DR_CREATE_ACTION_MULTI_DEST', 'infiniband/mlx5dv.h',
+ 'mlx5dv_dr_action_create_multi_dest'],
[ 'HAVE_DEVLINK', 'linux/devlink.h', 'DEVLINK_GENL_NAME' ],
]
config = configuration_data()
@@ -1076,6 +1076,39 @@
#endif
}
+static void *
+mlx5_glue_dr_create_flow_action_group(size_t num_actions, void *actions[])
+{
+#ifdef HAVE_MLX5_DR_CREATE_ACTION_MULTI_DEST
+ return mlx5dv_dr_action_create_group(num_actions,
+ (struct mlx5dv_dr_action **)actions);
+#else
+ (void)num_actions;
+ (void)actions;
+ errno = ENOTSUP;
+ return NULL;
+#endif
+}
+
+static void *
+mlx5_glue_dr_create_flow_action_multi_dest(void *domain,
+ size_t num_actions,
+ void *actions[])
+{
+#ifdef HAVE_MLX5_DR_CREATE_ACTION_MULTI_DEST
+ return mlx5dv_dr_action_create_multi_dest
+ (domain,
+ num_actions,
+ (struct mlx5dv_dr_action **)actions);
+#else
+ (void)domain;
+ (void)num_actions;
+ (void)actions;
+ errno = ENOTSUP;
+ return NULL;
+#endif
+}
+
static int
mlx5_glue_devx_query_eqn(struct ibv_context *ctx, uint32_t cpus,
uint32_t *eqn)
@@ -1354,6 +1387,10 @@
.dr_reclaim_domain_memory = mlx5_glue_dr_reclaim_domain_memory,
.dr_create_flow_action_sampler =
mlx5_glue_dr_create_flow_action_sampler,
+ .dr_create_flow_action_group =
+ mlx5_glue_dr_create_flow_action_group,
+ .dr_create_flow_action_multi_dest =
+ mlx5_glue_dr_create_flow_action_multi_dest,
.devx_query_eqn = mlx5_glue_devx_query_eqn,
.devx_create_event_channel = mlx5_glue_devx_create_event_channel,
.devx_destroy_event_channel = mlx5_glue_devx_destroy_event_channel,
@@ -322,6 +322,11 @@ struct mlx5_glue {
void (*dv_free_pp)(struct mlx5dv_pp *pp);
void *(*dr_create_flow_action_sampler)
(struct mlx5dv_dr_flow_sampler_attr *attr);
+ void *(*dr_create_flow_action_group)(size_t num_actions,
+ void *actions[]);
+ void *(*dr_create_flow_action_multi_dest)(void *domain,
+ size_t num_actions,
+ void *actions[]);
};
extern const struct mlx5_glue *mlx5_glue;