[v2,1/2] ethdev: add random item support

Message ID 20230911074149.697944-2-michaelba@nvidia.com (mailing list archive)
State Superseded
Delegated to: Ferruh Yigit
Headers
Series ethdev: add random item support |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Michael Baum Sept. 11, 2023, 7:41 a.m. UTC
  Add support for a new item type "RTE_FLOW_ITEM_TYPE_RANDOM".
This item enables to match on some random value as a part of flow rule.

Signed-off-by: Michael Baum <michaelba@nvidia.com>
---
 doc/guides/nics/features/default.ini   |  1 +
 doc/guides/prog_guide/rte_flow.rst     | 11 +++++++++
 doc/guides/rel_notes/release_23_11.rst |  4 ++++
 lib/ethdev/rte_flow.c                  |  1 +
 lib/ethdev/rte_flow.h                  | 33 ++++++++++++++++++++++++++
 5 files changed, 50 insertions(+)
  

Comments

Thomas Monjalon Sept. 11, 2023, 3:59 p.m. UTC | #1
11/09/2023 09:41, Michael Baum:
> Add support for a new item type "RTE_FLOW_ITEM_TYPE_RANDOM".
> This item enables to match on some random value as a part of flow rule.
> 
> Signed-off-by: Michael Baum <michaelba@nvidia.com>
> ---
> +Item: ``RANDOM``
> +^^^^^^^^^^^^^^^^
> +
> +Matches a random value.
> +
> +This value is not based on the packet data/headers.
> +Application shouldn't assume that this value is kept during the life time of
> +the packet.
> +
> +- ``value``: Random value.

I think it is the opposite:
the value is defined by the application, right?
Then it matches randomly based on a number generator?

Please describe where the random is generated and what is the range.

We could also wonder why it is not integrated in the existing sampling item.
  
Michael Baum Oct. 12, 2023, 10:14 a.m. UTC | #2
11/09/2023 19:00, Thomas Monjalon:
> 
> 11/09/2023 09:41, Michael Baum:
> > Add support for a new item type "RTE_FLOW_ITEM_TYPE_RANDOM".
> > This item enables to match on some random value as a part of flow rule.
> >
> > Signed-off-by: Michael Baum <michaelba@nvidia.com>
> > ---
> > +Item: ``RANDOM``
> > +^^^^^^^^^^^^^^^^
> > +
> > +Matches a random value.
> > +
> > +This value is not based on the packet data/headers.
> > +Application shouldn't assume that this value is kept during the life
> > +time of the packet.
> > +
> > +- ``value``: Random value.
> 
> I think it is the opposite:
> the value is defined by the application, right?
> Then it matches randomly based on a number generator?
Generating the random number is the PMD responsibility, it may be performed by either HW or SW.
The application provides the random value/range to match on.

> 
> Please describe where the random is generated and what is the range.
Ack

> 
> We could also wonder why it is not integrated in the existing sampling item.
We don't have sample item, we have existing sample action.
  

Patch

diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini
index 2011e97127..0a790dafe8 100644
--- a/doc/guides/nics/features/default.ini
+++ b/doc/guides/nics/features/default.ini
@@ -139,6 +139,7 @@  pppoes               =
 pppoe_proto_id       =
 quota                =
 raw                  =
+random               =
 represented_port     =
 sctp                 =
 tag                  =
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 5bc998a433..5ad699dff7 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1566,6 +1566,17 @@  Matches an InfiniBand base transport header in RoCE packet.
 
 - ``hdr``: InfiniBand base transport header definition (``rte_ib.h``).
 
+Item: ``RANDOM``
+^^^^^^^^^^^^^^^^
+
+Matches a random value.
+
+This value is not based on the packet data/headers.
+Application shouldn't assume that this value is kept during the life time of
+the packet.
+
+- ``value``: Random value.
+
 Actions
 ~~~~~~~
 
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 333e1d95a2..bcd71138cb 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -78,6 +78,10 @@  New Features
 * build: Optional libraries can now be selected with the new ``enable_libs``
   build option similarly to the existing ``enable_drivers`` build option.
 
+* **Added flow matching of random value.**
+
+  Added ``RTE_FLOW_ITEM_RANDOM`` to match random value.
+
 
 Removed Items
 -------------
diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
index 271d854f78..51db3e5aec 100644
--- a/lib/ethdev/rte_flow.c
+++ b/lib/ethdev/rte_flow.c
@@ -136,6 +136,7 @@  static const struct rte_flow_desc_data rte_flow_desc_item[] = {
 		     sizeof(struct rte_flow_item_icmp6_nd_opt_tla_eth)),
 	MK_FLOW_ITEM(MARK, sizeof(struct rte_flow_item_mark)),
 	MK_FLOW_ITEM(META, sizeof(struct rte_flow_item_meta)),
+	MK_FLOW_ITEM(RANDOM, sizeof(struct rte_flow_item_random)),
 	MK_FLOW_ITEM(TAG, sizeof(struct rte_flow_item_tag)),
 	MK_FLOW_ITEM(GRE_KEY, sizeof(rte_be32_t)),
 	MK_FLOW_ITEM(GRE_OPTION, sizeof(struct rte_flow_item_gre_opt)),
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index 2ebb76dbc0..b5228b293c 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -688,6 +688,19 @@  enum rte_flow_item_type {
 	 * @see struct rte_flow_item_ib_bth.
 	 */
 	RTE_FLOW_ITEM_TYPE_IB_BTH,
+
+	/**
+	 * [META]
+	 *
+	 * Matches a random value.
+	 *
+	 * This value is not based on the packet data/headers.
+	 * Application shouldn't assume that this value is kept during the life
+	 * time of the packet.
+	 *
+	 * @see struct rte_flow_item_random.
+	 */
+	RTE_FLOW_ITEM_TYPE_RANDOM,
 };
 
 /**
@@ -2031,6 +2044,25 @@  static const struct rte_flow_item_ib_bth rte_flow_item_ib_bth_mask = {
 };
 #endif
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_RANDOM
+ *
+ * Matches a random value.
+ */
+struct rte_flow_item_random {
+	uint32_t value;
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_RANDOM. */
+#ifndef __cplusplus
+static const struct rte_flow_item_random rte_flow_item_random_mask = {
+	.value = UINT32_MAX,
+};
+#endif
+
 /**
  * Matching pattern item definition.
  *
@@ -3875,6 +3907,7 @@  enum rte_flow_field_id {
 	RTE_FLOW_FIELD_GENEVE_OPT_CLASS,/**< GENEVE option class. */
 	RTE_FLOW_FIELD_GENEVE_OPT_DATA,	/**< GENEVE option data. */
 	RTE_FLOW_FIELD_MPLS,		/**< MPLS header. */
+	RTE_FLOW_FIELD_RANDOM		/**< Random value. */
 };
 
 /**