[v3,07/12] net/bnxt: support meta flow items to match on traffic source

Message ID 20211010143930.4985-8-ivan.malov@oktetlabs.ru (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series ethdev: rework transfer flow API |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Ivan Malov Oct. 10, 2021, 2:39 p.m. UTC
  From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>

Add support for items PORT_REPRESENTOR and REPRESENTED_PORT
based on the existing support for item PORT_ID.

The use of item PORT_ID depends on the specified direction attribute.
Items PORT_REPRESENTOR and REPRESENTED_PORT, in turn, define traffic
direction themselves. The former matches traffic from the driver's
vNIC. The latter matches packets from either a v-port (network) or
a VF's vNIC (if the driver's port is a VF representor).

Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
---
 drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c | 10 ++-
 drivers/net/bnxt/tf_ulp/ulp_rte_parser.c      | 77 ++++++++++++++-----
 drivers/net/bnxt/tf_ulp/ulp_rte_parser.h      |  6 +-
 3 files changed, 70 insertions(+), 23 deletions(-)
  

Patch

diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
index 9b165c12b5..d28dd2e587 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
@@ -266,7 +266,7 @@  struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {
 	},
 	[RTE_FLOW_ITEM_TYPE_PORT_ID] = {
 	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
-	.proto_hdr_func          = ulp_rte_port_id_hdr_handler
+	.proto_hdr_func          = ulp_rte_port_hdr_handler
 	},
 	[RTE_FLOW_ITEM_TYPE_RAW] = {
 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
@@ -427,6 +427,14 @@  struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {
 	[RTE_FLOW_ITEM_TYPE_HIGIG2] = {
 	.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
 	.proto_hdr_func          = NULL
+	},
+	[RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR] = {
+	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
+	.proto_hdr_func          = ulp_rte_port_hdr_handler
+	},
+	[RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT] = {
+	.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,
+	.proto_hdr_func          = ulp_rte_port_hdr_handler
 	}
 };
 
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
index 3a9c9bba27..e1ea8932b0 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
@@ -400,7 +400,8 @@  bnxt_ulp_rte_parser_direction_compute(struct ulp_rte_parser_params *params)
 static int32_t
 ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params,
 			uint32_t ifindex,
-			uint16_t mask)
+			uint16_t mask,
+			enum bnxt_ulp_direction_type item_dir)
 {
 	uint16_t svif;
 	enum bnxt_ulp_direction_type dir;
@@ -429,11 +430,14 @@  ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params,
 	bnxt_ulp_rte_parser_direction_compute(params);
 
 	/* Get the computed direction */
-	dir = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
-	if (dir == BNXT_ULP_DIR_INGRESS) {
+	dir = (item_dir != BNXT_ULP_DIR_INVALID) ? item_dir :
+		ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION);
+	if (dir == BNXT_ULP_DIR_INGRESS &&
+	    port_type != BNXT_ULP_INTF_TYPE_VF_REP) {
 		svif_type = BNXT_ULP_PHY_PORT_SVIF;
 	} else {
-		if (port_type == BNXT_ULP_INTF_TYPE_VF_REP)
+		if (port_type == BNXT_ULP_INTF_TYPE_VF_REP &&
+		    item_dir != BNXT_ULP_DIR_EGRESS)
 			svif_type = BNXT_ULP_VF_FUNC_SVIF;
 		else
 			svif_type = BNXT_ULP_DRV_FUNC_SVIF;
@@ -474,7 +478,8 @@  ulp_rte_parser_implicit_match_port_process(struct ulp_rte_parser_params *params)
 	}
 
 	/* Update the SVIF details */
-	rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask);
+	rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask,
+				     BNXT_ULP_DIR_INVALID);
 	return rc;
 }
 
@@ -522,7 +527,8 @@  ulp_rte_pf_hdr_handler(const struct rte_flow_item *item __rte_unused,
 	}
 
 	/* Update the SVIF details */
-	return  ulp_rte_parser_svif_set(params, ifindex, svif_mask);
+	return ulp_rte_parser_svif_set(params, ifindex, svif_mask,
+				       BNXT_ULP_DIR_INVALID);
 }
 
 /* Function to handle the parsing of RTE Flow item VF Header. */
@@ -555,39 +561,72 @@  ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
 		return rc;
 	}
 	/* Update the SVIF details */
-	return ulp_rte_parser_svif_set(params, ifindex, mask);
+	return ulp_rte_parser_svif_set(params, ifindex, mask,
+				       BNXT_ULP_DIR_INVALID);
 }
 
-/* Function to handle the parsing of RTE Flow item port id  Header. */
+/* Parse items PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
 int32_t
-ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item,
-			    struct ulp_rte_parser_params *params)
+ulp_rte_port_hdr_handler(const struct rte_flow_item *item,
+			 struct ulp_rte_parser_params *params)
 {
-	const struct rte_flow_item_port_id *port_spec = item->spec;
-	const struct rte_flow_item_port_id *port_mask = item->mask;
+	enum bnxt_ulp_direction_type item_dir;
+	uint16_t ethdev_id;
 	uint16_t mask = 0;
 	int32_t rc = BNXT_TF_RC_PARSE_ERR;
 	uint32_t ifindex;
 
-	if (!port_spec) {
-		BNXT_TF_DBG(ERR, "ParseErr:Port id is not valid\n");
+	if (!item->spec) {
+		BNXT_TF_DBG(ERR, "ParseErr:Port spec is not valid\n");
 		return rc;
 	}
-	if (!port_mask) {
-		BNXT_TF_DBG(ERR, "ParseErr:Phy Port mask is not valid\n");
+	if (!item->mask) {
+		BNXT_TF_DBG(ERR, "ParseErr:Port mask is not valid\n");
+		return rc;
+	}
+
+	switch (item->type) {
+	case RTE_FLOW_ITEM_TYPE_PORT_ID: {
+		const struct rte_flow_item_port_id *port_spec = item->spec;
+		const struct rte_flow_item_port_id *port_mask = item->mask;
+
+		item_dir = BNXT_ULP_DIR_INVALID;
+		ethdev_id = port_spec->id;
+		mask = port_mask->id;
+		break;
+	}
+	case RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR: {
+		const struct rte_flow_item_ethdev *ethdev_spec = item->spec;
+		const struct rte_flow_item_ethdev *ethdev_mask = item->mask;
+
+		item_dir = BNXT_ULP_DIR_INGRESS;
+		ethdev_id = ethdev_spec->port_id;
+		mask = ethdev_mask->port_id;
+		break;
+	}
+	case RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT: {
+		const struct rte_flow_item_ethdev *ethdev_spec = item->spec;
+		const struct rte_flow_item_ethdev *ethdev_mask = item->mask;
+
+		item_dir = BNXT_ULP_DIR_EGRESS;
+		ethdev_id = ethdev_spec->port_id;
+		mask = ethdev_mask->port_id;
+		break;
+	}
+	default:
+		BNXT_TF_DBG(ERR, "ParseErr:Unexpected item\n");
 		return rc;
 	}
-	mask = port_mask->id;
 
 	/* perform the conversion from dpdk port to bnxt ifindex */
 	if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx,
-					      port_spec->id,
+					      ethdev_id,
 					      &ifindex)) {
 		BNXT_TF_DBG(ERR, "ParseErr:Portid is not valid\n");
 		return rc;
 	}
 	/* Update the SVIF details */
-	return ulp_rte_parser_svif_set(params, ifindex, mask);
+	return ulp_rte_parser_svif_set(params, ifindex, mask, item_dir);
 }
 
 /* Function to handle the parsing of RTE Flow item phy port Header. */
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
index e14f86278a..0acb93946b 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
@@ -90,10 +90,10 @@  int32_t
 ulp_rte_vf_hdr_handler(const struct rte_flow_item *item,
 		       struct ulp_rte_parser_params *params);
 
-/* Function to handle the parsing of RTE Flow item port id Header. */
+/* Parse items PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
 int32_t
-ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item,
-			    struct ulp_rte_parser_params *params);
+ulp_rte_port_hdr_handler(const struct rte_flow_item *item,
+			 struct ulp_rte_parser_params *params);
 
 /* Function to handle the parsing of RTE Flow item port Header. */
 int32_t