[1/2] ethdev: add mhpsdp hardware port match item

Message ID 20230128130857.17399-2-jiaweiw@nvidia.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series add new mhpsdp hw port in the flow item and Tx queue API |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Jiawei Wang Jan. 28, 2023, 1:08 p.m. UTC
  For the multiple hardware ports connect to a single DPDK port (mhpsdp),
currently there is no information to indicate the packet belongs to
which hardware port.

This patch introduces a new hardware port item in rte flow API, and
the port value reflects the hardware port of the received packets.

While uses the hardware port as a matching item in the flow, and sets the
same port value on the tx queue, then the packet can be sent from the same
hardware port with received.

This patch also adds the testpmd command line to match the new item:
	flow create 0 ingress group 0 pattern mhpsdp_hw_port hwport is 1 /
	end actions queue index 0 / end

The above command means that creates a flow on a single DPDK port and
matches the packet from the first physical port (the hwport 1
stands for the first port) and redirects these packets into RxQ 0.

Signed-off-by: Jiawei Wang <jiaweiw@nvidia.com>
---
 app/test-pmd/cmdline_flow.c                 | 29 +++++++++++++++++++
 doc/guides/prog_guide/rte_flow.rst          |  8 ++++++
 doc/guides/rel_notes/release_23_03.rst      |  5 ++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  5 ++++
 lib/ethdev/rte_flow.c                       |  1 +
 lib/ethdev/rte_flow.h                       | 32 +++++++++++++++++++++
 6 files changed, 80 insertions(+)
  

Patch

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 88108498e0..fb9c0cc622 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -465,6 +465,8 @@  enum index {
 	ITEM_METER,
 	ITEM_METER_COLOR,
 	ITEM_METER_COLOR_NAME,
+	ITEM_MHPSDP_HW_PORT,
+	ITEM_MHPSDP_HW_PORT_VALUE,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -1355,6 +1357,7 @@  static const enum index next_item[] = {
 	ITEM_L2TPV2,
 	ITEM_PPP,
 	ITEM_METER,
+	ITEM_MHPSDP_HW_PORT,
 	END_SET,
 	ZERO,
 };
@@ -1821,6 +1824,12 @@  static const enum index item_meter[] = {
 	ZERO,
 };
 
+static const enum index item_mhpsdp_hw_port[] = {
+	ITEM_MHPSDP_HW_PORT_VALUE,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -6443,6 +6452,23 @@  static const struct token token_list[] = {
 				ARGS_ENTRY(struct buffer, port)),
 		.call = parse_mp,
 	},
+	[ITEM_MHPSDP_HW_PORT] = {
+		.name = "mhpsdp_hw_port",
+		.help = "match on the hardware port of the"
+			" received packet.",
+		.priv = PRIV_ITEM(MHPSDP_HW_PORT,
+				  sizeof(struct rte_flow_item_mhpsdp_hw_port)),
+		.next = NEXT(item_mhpsdp_hw_port),
+		.call = parse_vc,
+	},
+	[ITEM_MHPSDP_HW_PORT_VALUE] = {
+		.name = "hwport",
+		.help = "hardware port value",
+		.next = NEXT(item_mhpsdp_hw_port, NEXT_ENTRY(COMMON_UNSIGNED),
+			     item_param),
+		.args = ARGS(ARGS_ENTRY(struct rte_flow_item_mhpsdp_hw_port,
+					hwport)),
+	},
 };
 
 /** Remove and return last entry from argument stack. */
@@ -10981,6 +11007,9 @@  flow_item_default_mask(const struct rte_flow_item *item)
 	case RTE_FLOW_ITEM_TYPE_METER_COLOR:
 		mask = &rte_flow_item_meter_color_mask;
 		break;
+	case RTE_FLOW_ITEM_TYPE_MHPSDP_HW_PORT:
+		mask = &rte_flow_item_mhpsdp_hw_port_mask;
+		break;
 	default:
 		break;
 	}
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 3e6242803d..175ffec288 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1544,6 +1544,14 @@  Matches Color Marker set by a Meter.
 
 - ``color``: Metering color marker.
 
+Item: ``MHPSDP_HW_PORT``
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Matches on the hardware port of the received packet, the hardware port in the
+group of physical ports connected to a single DPDK port.
+
+- ``hwport``: Hardware port value.
+
 Actions
 ~~~~~~~
 
diff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst
index c15f6fbb9f..b5b3ab8886 100644
--- a/doc/guides/rel_notes/release_23_03.rst
+++ b/doc/guides/rel_notes/release_23_03.rst
@@ -69,6 +69,11 @@  New Features
     ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter
     required for eth_rx, eth_tx, crypto and timer eventdev adapters.
 
+* **Added rte_flow support for matching MHPSDP_HW_PORT fields.**
+
+  For the multiple hardware ports connect to a single DPDK port (mhpsdp),
+  Added ``mhpsdp_hw_port`` item in rte_flow to support hardware port of
+  the packets.
 
 Removed Items
 -------------
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 0037506a79..7be7c55d63 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3712,6 +3712,11 @@  This section lists supported pattern items and their attributes, if any.
 
   - ``color {value}``: meter color value (green/yellow/red).
 
+- ``mhpsdp_hw_port``: match hardware port in the group of multiple ports connect
+  to a single DPDK port.
+
+  - ``hwport {value}``: hardware port value.
+
 - ``send_to_kernel``: send packets to kernel.
 
 
diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
index 7d0c24366c..92115a792a 100644
--- a/lib/ethdev/rte_flow.c
+++ b/lib/ethdev/rte_flow.c
@@ -157,6 +157,7 @@  static const struct rte_flow_desc_data rte_flow_desc_item[] = {
 	MK_FLOW_ITEM(L2TPV2, sizeof(struct rte_flow_item_l2tpv2)),
 	MK_FLOW_ITEM(PPP, sizeof(struct rte_flow_item_ppp)),
 	MK_FLOW_ITEM(METER_COLOR, sizeof(struct rte_flow_item_meter_color)),
+	MK_FLOW_ITEM(MHPSDP_HW_PORT, sizeof(struct rte_flow_item_mhpsdp_hw_port)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index b60987db4b..53f99a20c8 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -624,6 +624,13 @@  enum rte_flow_item_type {
 	 * See struct rte_flow_item_meter_color.
 	 */
 	RTE_FLOW_ITEM_TYPE_METER_COLOR,
+
+	/**
+	 * Matches on the physical port of the received packet.
+	 *
+	 * See struct rte_flow_item_mhpsdp_hw_port.
+	 */
+	RTE_FLOW_ITEM_TYPE_MHPSDP_HW_PORT,
 };
 
 /**
@@ -2103,6 +2110,31 @@  static const struct rte_flow_item_meter_color rte_flow_item_meter_color_mask = {
 };
 #endif
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_MHPSDP_HW_PORT
+ *
+ * For the multiple hardware ports connect to a single DPDK port (mhpsdp),
+ * use this item to match the hardware port of the packets.
+ */
+struct rte_flow_item_mhpsdp_hw_port {
+	/**
+	 * Hardware port in the group of multiple ports connect
+	 * to a single DPDK port. Value 1 means the first hw port.
+	 */
+	uint8_t hwport;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_MHPSDP_HW_PORT. */
+#ifndef __cplusplus
+static const struct rte_flow_item_mhpsdp_hw_port
+rte_flow_item_mhpsdp_hw_port_mask = {
+	.hwport = 0xff,
+};
+#endif
+
 /**
  * Action types.
  *