[dpdk-dev] [PATCH v6 08/12] common/mlx5: add glue function for mirroring

Jiawei Wang jiaweiw at nvidia.com
Wed Sep 9 08:48:30 CEST 2020


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 at 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(+)

diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build
index 1aa137d..d53b891 100644
--- a/drivers/common/mlx5/linux/meson.build
+++ b/drivers/common/mlx5/linux/meson.build
@@ -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()
diff --git a/drivers/common/mlx5/linux/mlx5_glue.c b/drivers/common/mlx5/linux/mlx5_glue.c
index 771a47c..e44d822 100644
--- a/drivers/common/mlx5/linux/mlx5_glue.c
+++ b/drivers/common/mlx5/linux/mlx5_glue.c
@@ -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,
diff --git a/drivers/common/mlx5/linux/mlx5_glue.h b/drivers/common/mlx5/linux/mlx5_glue.h
index a77d239..d5232d1 100644
--- a/drivers/common/mlx5/linux/mlx5_glue.h
+++ b/drivers/common/mlx5/linux/mlx5_glue.h
@@ -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;
-- 
1.8.3.1



More information about the dev mailing list