DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [RFC 0/3] mlx5: LACP handling for bonded devices
@ 2020-06-02  9:38 Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 1/3] common/mlx5: add default miss action Shiri Kuzin
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Shiri Kuzin @ 2020-06-02  9:38 UTC (permalink / raw)
  To: dev; +Cc: matan, rasland, viacheslavo

When the driver has a bond configured LACP traffic should
be steered to kernel to manage the bond using a new rdma-core
API.
This is done by creating a new internal action and adding a 
new devarg that will allow the user to manage the bond and 
get lacp traffic if they wish.  

Shiri Kuzin (3):
  common/mlx5: add default miss action
  net/mlx5: add default miss action to flow engine
  net/mlx5: add new devarg dv_lacp_by_user

 drivers/common/mlx5/Makefile    |  5 +++
 drivers/common/mlx5/meson.build |  2 +
 drivers/common/mlx5/mlx5_glue.c | 13 ++++++
 drivers/common/mlx5/mlx5_glue.h |  1 +
 drivers/net/mlx5/mlx5.c         |  6 +++
 drivers/net/mlx5/mlx5.h         |  7 ++++
 drivers/net/mlx5/mlx5_flow.c    | 72 ++++++++++++++++++++++++++++++++
 drivers/net/mlx5/mlx5_flow.h    | 10 ++++-
 drivers/net/mlx5/mlx5_flow_dv.c | 91 ++++++++++++++++++++++++++++++++++++++++-
 drivers/net/mlx5/mlx5_trigger.c |  9 ++++
 10 files changed, 213 insertions(+), 3 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dpdk-dev] [RFC 1/3] common/mlx5: add default miss action
  2020-06-02  9:38 [dpdk-dev] [RFC 0/3] mlx5: LACP handling for bonded devices Shiri Kuzin
@ 2020-06-02  9:38 ` Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 2/3] net/mlx5: add default miss action to flow engine Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 3/3] net/mlx5: add new devarg dv_lacp_by_user Shiri Kuzin
  2 siblings, 0 replies; 4+ messages in thread
From: Shiri Kuzin @ 2020-06-02  9:38 UTC (permalink / raw)
  To: dev; +Cc: matan, rasland, viacheslavo

Add dv_create_action_default_miss wrapper function
for the action added to the rdma-core
MLX5DV_FLOW_ACTION_DEFAULT_MISS.

When a packet matches MLX5DV_FLOW_ACTION_DEFAULT_MISS
action it is steered to the default miss of the verbs
steering domain.

Signed-off-by: Shiri Kuzin <shirik@mellanox.com>
---
 drivers/common/mlx5/Makefile    |  5 +++++
 drivers/common/mlx5/meson.build |  2 ++
 drivers/common/mlx5/mlx5_glue.c | 13 +++++++++++++
 drivers/common/mlx5/mlx5_glue.h |  1 +
 4 files changed, 21 insertions(+)

diff --git a/drivers/common/mlx5/Makefile b/drivers/common/mlx5/Makefile
index 0d8cc1b..c5c979a 100644
--- a/drivers/common/mlx5/Makefile
+++ b/drivers/common/mlx5/Makefile
@@ -153,6 +153,11 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
 		enum MLX5DV_FLOW_ACTION_COUNTERS_DEVX \
 		$(AUTOCONF_OUTPUT)
 	$Q sh -- '$<' '$@' \
+		HAVE_MLX5_DR_CREATE_ACTION_DEFAULT_MISS \
+		infiniband/mlx5dv.h \
+		enum MLX5DV_FLOW_ACTION_DEFAULT_MISS \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
 		HAVE_IBV_DEVX_ASYNC \
 		infiniband/mlx5dv.h \
 		func mlx5dv_devx_obj_query_async \
diff --git a/drivers/common/mlx5/meson.build b/drivers/common/mlx5/meson.build
index 5a802ba..9ba90b7 100644
--- a/drivers/common/mlx5/meson.build
+++ b/drivers/common/mlx5/meson.build
@@ -120,6 +120,8 @@ has_sym_args = [
 	'mlx5dv_devx_obj_create' ],
 	[ 'HAVE_IBV_FLOW_DEVX_COUNTERS', 'infiniband/mlx5dv.h',
 	'MLX5DV_FLOW_ACTION_COUNTERS_DEVX' ],
+	[ 'HAVE_MLX5_DR_CREATE_ACTION_DEFAULT_MISS', 'infiniband/mlx5dv.h',
+	'MLX5DV_FLOW_ACTION_DEFAULT_MISS' ],
 	[ 'HAVE_IBV_DEVX_ASYNC', 'infiniband/mlx5dv.h',
 	'mlx5dv_devx_obj_query_async' ],
 	[ 'HAVE_IBV_DEVX_QP', 'infiniband/mlx5dv.h',
diff --git a/drivers/common/mlx5/mlx5_glue.c b/drivers/common/mlx5/mlx5_glue.c
index f270f67..62e15cb 100644
--- a/drivers/common/mlx5/mlx5_glue.c
+++ b/drivers/common/mlx5/mlx5_glue.c
@@ -795,6 +795,17 @@
 #endif
 }
 
+static void *
+mlx5_glue_dr_create_flow_action_default_miss(void)
+{
+#if defined(HAVE_MLXDV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_DEFAULT_MISS)
+	return mlx5dv_dr_action_create_default_miss();
+#else
+	errno = ENOTSUP;
+	return NULL;
+#endif
+}
+
 static int
 mlx5_glue_dv_destroy_flow(void *flow_id)
 {
@@ -1264,6 +1275,8 @@
 	.dv_create_flow_action_tag =  mlx5_glue_dv_create_flow_action_tag,
 	.dv_create_flow_action_meter = mlx5_glue_dv_create_flow_action_meter,
 	.dv_modify_flow_action_meter = mlx5_glue_dv_modify_flow_action_meter,
+	.dr_create_flow_action_default_miss = 
+		mlx5_glue_dr_create_flow_action_default_miss,
 	.dv_destroy_flow = mlx5_glue_dv_destroy_flow,
 	.dv_destroy_flow_matcher = mlx5_glue_dv_destroy_flow_matcher,
 	.dv_open_device = mlx5_glue_dv_open_device,
diff --git a/drivers/common/mlx5/mlx5_glue.h b/drivers/common/mlx5/mlx5_glue.h
index 81d6a22..f5bec6a 100644
--- a/drivers/common/mlx5/mlx5_glue.h
+++ b/drivers/common/mlx5/mlx5_glue.h
@@ -237,6 +237,7 @@ struct mlx5_glue {
 		(struct mlx5dv_dr_flow_meter_attr *attr);
 	int (*dv_modify_flow_action_meter)(void *action,
 		struct mlx5dv_dr_flow_meter_attr *attr, uint64_t modify_bits);
+	void *(*dr_create_flow_action_default_miss)();
 	int (*dv_destroy_flow)(void *flow);
 	int (*dv_destroy_flow_matcher)(void *matcher);
 	struct ibv_context *(*dv_open_device)(struct ibv_device *device);
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dpdk-dev] [RFC 2/3] net/mlx5: add default miss action to flow engine
  2020-06-02  9:38 [dpdk-dev] [RFC 0/3] mlx5: LACP handling for bonded devices Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 1/3] common/mlx5: add default miss action Shiri Kuzin
@ 2020-06-02  9:38 ` Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 3/3] net/mlx5: add new devarg dv_lacp_by_user Shiri Kuzin
  2 siblings, 0 replies; 4+ messages in thread
From: Shiri Kuzin @ 2020-06-02  9:38 UTC (permalink / raw)
  To: dev; +Cc: matan, rasland, viacheslavo

The new action is an internal mlx5 action that will call
the rdma-core function MLX5DV_FLOW_ACTION_DEFAULT_MISS.

The default miss action will be used when a bond is
configured to allow traffic realted to the bond to
be managed in the kernel.

Signed-off-by: Shiri Kuzin <shirik@mellanox.com>
---
 drivers/net/mlx5/mlx5.h         |  5 +++
 drivers/net/mlx5/mlx5_flow.c    | 72 ++++++++++++++++++++++++++++++++
 drivers/net/mlx5/mlx5_flow.h    | 10 ++++-
 drivers/net/mlx5/mlx5_flow_dv.c | 91 ++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 175 insertions(+), 3 deletions(-)

diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 2908c8b..bc57fb5 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -509,6 +509,9 @@ struct mlx5_ibv_shared {
 	uint32_t port_id_action_list; /* List of port ID actions. */
 	uint32_t push_vlan_action_list; /* List of push VLAN actions. */
 	struct mlx5_flow_counter_mng cmng; /* Counters management structure. */
+	void *default_miss_action; /* Pointer to the rdma-core action. */
+	rte_atomic32_t default_miss_refcnt;
+	/* Default miss action reference counter. */
 	struct mlx5_indexed_pool *ipool[MLX5_IPOOL_MAX];
 	/* Memory Pool for mlx5 flow resources. */
 	/* Shared interrupt handler section. */
@@ -801,6 +804,8 @@ int mlx5_ctrl_flow_vlan(struct rte_eth_dev *dev,
 int mlx5_ctrl_flow(struct rte_eth_dev *dev,
 		   struct rte_flow_item_eth *eth_spec,
 		   struct rte_flow_item_eth *eth_mask);
+int mlx5_flow_default_miss(struct rte_eth_dev *dev,
+		   struct rte_flow_item_eth *eth_spec);
 struct rte_flow *mlx5_flow_create_esw_table_zero_flow(struct rte_eth_dev *dev);
 int mlx5_flow_create_drop_queue(struct rte_eth_dev *dev);
 void mlx5_flow_delete_drop_queue(struct rte_eth_dev *dev);
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index f2c3cf9..d3eb42e 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -1242,6 +1242,30 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
 }
 
 /*
+ * Validate the default miss action.
+ *
+ * @param[in] action_flags
+ *   Bit-fields that holds the actions detected until now.
+ * @param[out] error
+ *   Pointer to error structure.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_flow_validate_action_default_miss(uint64_t action_flags,
+				struct rte_flow_error *error)
+{
+
+	if (action_flags & MLX5_FLOW_FATE_ACTIONS)
+		return rte_flow_error_set(error, EINVAL,
+					  RTE_FLOW_ERROR_TYPE_ACTION, NULL,
+					  "can't have 2 fate actions in"
+					  " same flow");
+	return 0;
+}
+
+/*
  * Validate the count action.
  *
  * @param[in] dev
@@ -4988,6 +5012,54 @@ struct rte_flow *
 }
 
 /**
+ * Deafult miss flow
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ * @param eth_spec
+ *   An Ethernet flow spec to apply.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_flow_default_miss(struct rte_eth_dev *dev,
+		    struct rte_flow_item_eth *eth_spec)
+{
+	struct mlx5_priv *priv = dev->data->dev_private;
+	const struct rte_flow_attr attr = {
+		.ingress = 1,
+		.priority = 0,
+	};
+	struct rte_flow_item items[] = {
+		{
+			.type = RTE_FLOW_ITEM_TYPE_ETH,
+			.spec = eth_spec,
+		},
+		{
+			.type = RTE_FLOW_ITEM_TYPE_END,
+		},
+	};
+	struct rte_flow_action actions[] = {
+		{
+			.type = MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS,
+		},
+		{
+			.type = RTE_FLOW_ACTION_TYPE_END,
+		},
+	};
+	
+	struct rte_flow_error error;
+	uint32_t flow_idx;
+	
+	flow_idx = flow_list_create(dev, &priv->ctrl_flows,
+				&attr, items, actions, false, &error);
+	if (!flow_idx)
+		return -rte_errno;
+	return 0;
+}
+
+/**
  * Destroy a flow.
  *
  * @see rte_flow_destroy()
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 2c96677..d489f64 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -43,6 +43,7 @@ enum mlx5_rte_flow_action_type {
 	MLX5_RTE_FLOW_ACTION_TYPE_TAG,
 	MLX5_RTE_FLOW_ACTION_TYPE_MARK,
 	MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG,
+	MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS,
 };
 
 /* Matches on selected register. */
@@ -200,10 +201,12 @@ enum mlx5_feature_name {
 #define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 32)
 #define MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 33)
 #define MLX5_FLOW_ACTION_AGE (1ull << 34)
+#define MLX5_FLOW_ACTION_DEFAULT_MISS (1ull << 35)
 
 #define MLX5_FLOW_FATE_ACTIONS \
 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
-	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP)
+	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP | \
+	 MLX5_FLOW_ACTION_DEFAULT_MISS)
 
 #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
@@ -365,6 +368,7 @@ enum mlx5_flow_fate_type {
 	MLX5_FLOW_FATE_PORT_ID,
 	MLX5_FLOW_FATE_DROP,
 	MLX5_FLOW_FATE_MAX,
+	MLX5_FLOW_FATE_DEFAULT_MISS
 };
 
 /* Matcher PRM representation */
@@ -537,7 +541,7 @@ struct mlx5_flow_handle {
 	void *ib_flow; /**< Verbs flow pointer. */
 	uint32_t split_flow_id:28; /**< Sub flow unique match flow id. */
 	uint32_t mark:1; /**< Metadate rxq mark flag. */
-	uint32_t fate_action:3; /**< Fate action type. */
+	uint32_t fate_action:4; /**< Fate action type. */
 	union {
 		uint32_t rix_hrxq; /**< Hash Rx queue object index. */
 		uint32_t rix_jump; /**< Index to the jump action resource. */
@@ -946,6 +950,8 @@ int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
 				  const struct rte_flow_attr *attr,
 				  uint64_t item_flags,
 				  struct rte_flow_error *error);
+int mlx5_flow_validate_action_default_miss(uint64_t action_flags,
+				struct rte_flow_error *error);
 int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
 				  const struct rte_flow_attr *attributes,
 				  struct rte_flow_error *error);
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index e481831..70d9cc3 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -2675,6 +2675,44 @@ struct field_modify_info modify_tcp[] = {
 }
 
 /**
+ * Find existing default miss resource or create and register a new one.
+ *
+ * @param[in, out] dev
+ *   Pointer to rte_eth_dev structure.
+ * @param[in, out] tbl
+ *   Pointer to flow table resource.
+ * @parm[in, out] dev_flow
+ *   Pointer to the dev_flow.
+ * @param[out] error
+ *   pointer to error structure.
+ *
+ * @return
+ *   0 on success otherwise -errno and errno is set.
+ */
+static int
+flow_dv_default_miss_resource_register(struct rte_eth_dev *dev,
+		struct rte_flow_error *error)
+{
+	struct mlx5_priv *priv = dev->data->dev_private;
+	struct mlx5_ibv_shared *sh = priv->sh;
+	int cnt;
+	
+	cnt = rte_atomic32_read(&sh->default_miss_refcnt);
+	if (!cnt){
+		sh->default_miss_action =
+		mlx5_glue->dr_create_flow_action_default_miss;
+		if (sh->default_miss_action)
+		return rte_flow_error_set(error, ENOMEM,
+				RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+				NULL, "cannot create default miss action");
+		DRV_LOG(DEBUG, "new default miss resource %p: refcnt %d++",
+				(void *)sh->default_miss_action, cnt);
+	}
+	rte_atomic32_inc(&sh->default_miss_refcnt);
+	return 0;
+}
+
+/**
  * Find existing table port ID resource or create and register a new one.
  *
  * @param[in, out] dev
@@ -5215,6 +5253,15 @@ struct field_modify_info modify_tcp[] = {
 			action_flags |= MLX5_FLOW_ACTION_RSS;
 			++actions_n;
 			break;
+		case MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS:
+			ret = 
+			mlx5_flow_validate_action_default_miss(action_flags,
+					error);
+			if (ret < 0)
+				return ret;
+			action_flags |= MLX5_FLOW_ACTION_DEFAULT_MISS;
+			++actions_n;
+			break;
 		case RTE_FLOW_ACTION_TYPE_COUNT:
 			ret = flow_dv_validate_action_count(dev, error);
 			if (ret < 0)
@@ -8178,6 +8225,14 @@ struct field_modify_info modify_tcp[] = {
 				return -rte_errno;
 			action_flags |= MLX5_FLOW_ACTION_SET_TAG;
 			break;
+		case MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS:
+			if (flow_dv_default_miss_resource_register
+					(dev, error))
+			return -rte_errno;
+			action_flags |= MLX5_FLOW_ACTION_DEFAULT_MISS;
+			dev_flow->handle->fate_action = 
+					MLX5_FLOW_FATE_DEFAULT_MISS;
+			break;
 		case RTE_FLOW_ACTION_TYPE_METER:
 			mtr = actions->conf;
 			if (!flow->meter) {
@@ -8270,7 +8325,11 @@ struct field_modify_info modify_tcp[] = {
 			flow_dv_translate_item_eth(match_mask, match_value,
 						   items, tunnel,
 						   dev_flow->dv.group);
-			matcher.priority = MLX5_PRIORITY_MAP_L2;
+			matcher.priority =
+			((action_flags & MLX5_FLOW_ACTION_DEFAULT_MISS) &
+					(!dev_flow->external)) ?
+			MLX5_PRIORITY_MAP_L3 :
+			MLX5_PRIORITY_MAP_L2;
 			last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L2 :
 					     MLX5_FLOW_LAYER_OUTER_L2;
 			break;
@@ -8732,6 +8791,34 @@ struct field_modify_info modify_tcp[] = {
 }
 
 /**
+ * Release a default miss resource.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ * @return
+ *   1 while a reference on it exists, 0 when freed.
+ */
+static int
+flow_dv_default_miss_resource_release(struct rte_eth_dev *dev)
+{
+	struct mlx5_priv *priv = dev->data->dev_private;
+	struct mlx5_ibv_shared *sh = priv->sh;
+
+	MLX5_ASSERT(sh->default_miss_action);
+	DRV_LOG(DEBUG, "default miss resource %p: refcnt %d--",
+			(void *)sh->default_miss_action,
+			rte_atomic32_read(&sh->default_miss_refcnt));
+	if (rte_atomic32_dec_and_test(&sh->default_miss_refcnt)){
+		claim_zero(mlx5_glue->destroy_flow_action
+				(sh->default_miss_action));
+		DRV_LOG(DEBUG, "default miss resource %p: removed",
+				(void *)sh->default_miss_action);
+		return 0;
+	}
+	return 1;
+}
+
+/**
  * Release a modify-header resource.
  *
  * @param handle
@@ -8866,6 +8953,8 @@ struct field_modify_info modify_tcp[] = {
 		flow_dv_jump_tbl_resource_release(dev, handle);
 	else if (handle->fate_action == MLX5_FLOW_FATE_PORT_ID)
 		flow_dv_port_id_action_resource_release(dev, handle);
+	else if (handle->fate_action == MLX5_FLOW_FATE_DEFAULT_MISS)
+		flow_dv_default_miss_resource_release(dev);
 	else
 		DRV_LOG(DEBUG, "Incorrect fate action:%d", handle->fate_action);
 	handle->rix_fate = 0;
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dpdk-dev] [RFC 3/3] net/mlx5: add new devarg dv_lacp_by_user
  2020-06-02  9:38 [dpdk-dev] [RFC 0/3] mlx5: LACP handling for bonded devices Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 1/3] common/mlx5: add default miss action Shiri Kuzin
  2020-06-02  9:38 ` [dpdk-dev] [RFC 2/3] net/mlx5: add default miss action to flow engine Shiri Kuzin
@ 2020-06-02  9:38 ` Shiri Kuzin
  2 siblings, 0 replies; 4+ messages in thread
From: Shiri Kuzin @ 2020-06-02  9:38 UTC (permalink / raw)
  To: dev; +Cc: matan, rasland, viacheslavo

The new devarg will control the steering of the lacp traffic.
when setting dv_lacp_by_user = 0 the lacp traffic will be
steered to kernel and managed there.

When setting dv_lacp_by_user = 1 the lacp traffic will
not be steered and the user will need to manage it.

Signed-off-by: Shiri Kuzin <shirik@mellanox.com>
---
 drivers/net/mlx5/mlx5.c         | 6 ++++++
 drivers/net/mlx5/mlx5.h         | 2 ++
 drivers/net/mlx5/mlx5_trigger.c | 9 +++++++++
 3 files changed, 17 insertions(+)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 469ff73..f015050 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -140,6 +140,9 @@
 /* Enable extensive flow metadata support. */
 #define MLX5_DV_XMETA_EN "dv_xmeta_en"
 
+/* Device parameter to let the user manage the lacp traffic of bonded device */
+#define MLX5_DV_LACP_BY_USER "dv_lacp_by_user" 
+
 /* Activate Netlink support in VF mode. */
 #define MLX5_VF_NL_EN "vf_nl_en"
 
@@ -1852,6 +1855,8 @@ struct mlx5_flow_id_pool *
 			return -rte_errno;
 		}
 		config->dv_xmeta_en = tmp;
+	} else if (strcmp(MLX5_DV_LACP_BY_USER, key) == 0) {
+		config->dv_lacp_by_user = !!tmp;
 	} else if (strcmp(MLX5_MR_EXT_MEMSEG_EN, key) == 0) {
 		config->mr_ext_memseg_en = !!tmp;
 	} else if (strcmp(MLX5_MAX_DUMP_FILES_NUM, key) == 0) {
@@ -1910,6 +1915,7 @@ struct mlx5_flow_id_pool *
 		MLX5_DV_ESW_EN,
 		MLX5_DV_FLOW_EN,
 		MLX5_DV_XMETA_EN,
+		MLX5_DV_LACP_BY_USER,
 		MLX5_MR_EXT_MEMSEG_EN,
 		MLX5_REPRESENTOR,
 		MLX5_MAX_DUMP_FILES_NUM,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index bc57fb5..ff6bd83 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -157,6 +157,8 @@ struct mlx5_dev_config {
 	unsigned int dv_esw_en:1; /* Enable E-Switch DV flow. */
 	unsigned int dv_flow_en:1; /* Enable DV flow. */
 	unsigned int dv_xmeta_en:2; /* Enable extensive flow metadata. */
+	unsigned int dv_lacp_by_user:1;
+	/* Enable user to manage LACP traffic. */
 	unsigned int swp:1; /* Tx generic tunnel checksum and TSO offload. */
 	unsigned int devx:1; /* Whether devx interface is available or not. */
 	unsigned int dest_tir:1; /* Whether advanced DR API is available. */
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
index f123193..ef5c8f2 100644
--- a/drivers/net/mlx5/mlx5_trigger.c
+++ b/drivers/net/mlx5/mlx5_trigger.c
@@ -434,6 +434,10 @@
 	const struct rte_ether_addr cmp = {
 		.addr_bytes = "\x00\x00\x00\x00\x00\x00",
 	};
+	struct rte_flow_item_eth lacp_spec = {
+		.type = 0x8809,
+		.dst.addr_bytes = "\x01\x80\xc2\x00\x00\x02",
+	};
 	unsigned int i;
 	unsigned int j;
 	int ret;
@@ -464,6 +468,11 @@
 				" configured - only Eswitch group 0 flows are"
 				" supported.", dev->data->port_id);
 	}
+	if (!priv->config.dv_lacp_by_user && priv->pf_bond) {
+		ret = mlx5_flow_default_miss(dev,&lacp_spec);
+		if (ret)
+			goto error;
+	}
 	if (priv->isolated)
 		return 0;
 	if (dev->data->promiscuous) {
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-06-02  9:39 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-02  9:38 [dpdk-dev] [RFC 0/3] mlx5: LACP handling for bonded devices Shiri Kuzin
2020-06-02  9:38 ` [dpdk-dev] [RFC 1/3] common/mlx5: add default miss action Shiri Kuzin
2020-06-02  9:38 ` [dpdk-dev] [RFC 2/3] net/mlx5: add default miss action to flow engine Shiri Kuzin
2020-06-02  9:38 ` [dpdk-dev] [RFC 3/3] net/mlx5: add new devarg dv_lacp_by_user Shiri Kuzin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).