On 1/24/23 12:37, Gregory Etelson wrote:
Quota action limits traffic according to pre-defined configuration.
Quota reflects overall traffic usage regardless bandwidth.
Quota flow action initialized with signed tokens number value.
Quota flow action updates tokens number according to
these rules:
1. if quota was configured to count packet length, for each packet
    of size S, tokens number reduced by S.
2. If quota was configured to count packets, each packet decrements
    tokens number.
quota action sets packet metadata according to a number of remaining
tokens number:
   PASS - remaining tokens number is non-negative.
   BLOCK - remaining tokens number is negative.

Quota flow item matches on that data

Application updates tokens number in quota flow action
with SET or ADD calls:
  SET(QUOTA, val) - arm quota with new tokens number set to val
  ADD(QUOTA, val) - increase existing quota tokens number by val

Both SET and ADD return to application number of tokens stored in port
before update.

If quota state was BLOCK (negative action tokens number)
application can change it to PASS after providing enough tokens to
raise action tokens number to 0 or above.

Application must create a rule with quota action to mark flow and
match on the mark with quota item in following flow rule.

Signed-off-by: Gregory Etelson <getel...@nvidia.com>
Acked-by: Ori Kam <or...@nvidia.com>

[snip]

diff --git a/doc/guides/prog_guide/rte_flow.rst 
b/doc/guides/prog_guide/rte_flow.rst
index 3e6242803d..7a3868638c 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1544,6 +1544,13 @@ Matches Color Marker set by a Meter.
- ``color``: Metering color marker. +Item: ``QUOTA``
+^^^^^^^^^^^^^^^
+
+Matches flow quota state set by quota action.
+
+- ``state``: Flow quota state
+
  Actions
  ~~~~~~~
@@ -3227,6 +3234,40 @@ and rte_mtr_policy_get() API respectively.
     | ``policy``       | Meter policy object  |
     +------------------+----------------------+
+Action: ``QUOTA``
+^^^^^^^^^^^^^^^^^
+
+Update ``quota`` value and set packet quota state.
+If the ``quota`` value after update is non-negative packet quota state set to
+``RTE_FLOW_QUOTA_STATE_PASS``. Otherwise, packet quota state set to 
``RTE_FLOW_QUOTA_STATE_BLOCK``.
+The ``quota`` value is reduced according to ``mode`` setting.
+
+.. _table_rte_flow_action_quota:
+
+.. table:: QUOTA
+
+   +------------------+------------------------+
+   | Field            | Value                  |
+   +==================+========================+
+   | ``mode``         | Quota operational mode |
+   +------------------+------------------------+
+   | ``quota``        | Quota value            |
+   +------------------+------------------------+
+
+.. _rte_flow_quota_mode:
+
+.. table:: Quota update modes
+
+   +---------------------------------+-------------------------------------+
+   | Value                           | Description                         |
+   +=================================+=====================================+
+   | ``RTE_FLOW_QUOTA_MODE_PACKET``  | Count packets                       |
+   +---------------------------------+-------------------------------------+
+   | ``RTE_FLOW_QUOTA_MODE_L2``      | Count packet bytes starting from L2 |
+   +------------------+----------------------------------------------------+
+   | ``RTE_FLOW_QUOTA_MODE_L3``      | Count packet bytes starting from L3 |
+   +------------------+----------------------------------------------------+
+
  Negative types
  ~~~~~~~~~~~~~~
diff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst
index 5b98e18032..0756cca241 100644
--- a/doc/guides/rel_notes/release_23_03.rst
+++ b/doc/guides/rel_notes/release_23_03.rst
@@ -77,6 +77,18 @@ New Features
    - ``rte_flow_async_action_handle_query_update``

Just one empty line between section items

+* **Added quota flow action and quota flow item.**
+
+  - ``RTE_FLOW_ACTION_TYPE_QUOTA``
+  - ``RTE_FLOW_ITEM_TYPE_QUOTA``
+
+
Just one empty line between section items

+* **Updated testpmd to support quota flow action and item.**
+
+  Added support for flow quota action and item.
+
+
+

It should be 2 empty lines, not 3,

  Removed Items
  -------------

[snip]

diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index 6705cb32af..46409ed607 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -624,7 +624,45 @@ enum rte_flow_item_type {
         * See struct rte_flow_item_meter_color.
         */
        RTE_FLOW_ITEM_TYPE_METER_COLOR,
+
+       /**
+        * Match Quota state
+        *
+        * @see struct rte_flow_item_quota
+        */
+        RTE_FLOW_ITEM_TYPE_QUOTA,
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * QUOTA state.
+ *
+ * @see struct rte_flow_item_quota
+ */
+enum rte_flow_quota_state {
+       RTE_FLOW_QUOTA_STATE_PASS, /**< PASS quota state */
+       RTE_FLOW_QUOTA_STATE_BLOCK /**< BLOCK quota state */
+};
+
+/**
+ * RTE_FLOW_ITEM_TYPE_QUOTA
+ *
+ * Matches QUOTA state
+ */
+struct rte_flow_item_quota {
+       enum rte_flow_quota_state state;
+};
+
+/**
+ * Default mask for RTE_FLOW_ITEM_TYPE_QUOTA
+ */
+#ifndef __cplusplus
+static const struct rte_flow_item_quota rte_flow_item_quota_mask = {
+       .state = (enum rte_flow_quota_state)0xff
  };
+#endif
/**
   *
@@ -2736,6 +2774,81 @@ enum rte_flow_action_type {
         * No associated configuration structure.
         */
        RTE_FLOW_ACTION_TYPE_SEND_TO_KERNEL,
+
+       /**
+        * Apply the quota verdict (PASS or BLOCK) to a flow.
+        *
+        * @see struct rte_flow_action_quota
+        * @see struct rte_flow_query_quota
+        * @see struct rte_flow_update_quota
+        */
+        RTE_FLOW_ACTION_TYPE_QUOTA,
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * QUOTA operational mode.
+ *
+ * @see struct rte_flow_action_quota
+ */
+enum rte_flow_quota_mode {
+       RTE_FLOW_QUOTA_MODE_PACKET = 1, /** Count packets */

/**<  since you put documentation after documented member

+       RTE_FLOW_QUOTA_MODE_L2 = 2, /** Count packet bytes starting from L2 */

/**<

also, why do you initialize every member? are you going to rely
on these values?

+       RTE_FLOW_QUOTA_MODE_L3 = 3, /** Count packet bytes starting from L3 */

/**<

+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Create QUOTA action.
+ *
+ * @see RTE_FLOW_ACTION_TYPE_QUOTA
+ */
+struct rte_flow_action_quota {
+       enum rte_flow_quota_mode mode; /** quota operational mode */

/**<  since you put documentation after documented member

+       int64_t quota;                 /** quota value */

/**<

+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Query indirect QUOTA action.
+ *
+ * @see RTE_FLOW_ACTION_TYPE_QUOTA
+ *
+ */
+struct rte_flow_query_quota {
+       int64_t quota; /** quota value */

/**<  since you put documentation after documented member

+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Indirect QUOTA update operations.
+ *
+ * @see struct rte_flow_update_quota
+ */
+enum rte_flow_update_quota_op {
+       RTE_FLOW_UPDATE_QUOTA_SET, /** set new quota value */

/**<  since you put documentation after documented member

+       RTE_FLOW_UPDATE_QUOTA_ADD, /** increase existing quota with new value */

/**<

+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * @see RTE_FLOW_ACTION_TYPE_QUOTA
+ *
+ * Update indirect QUOTA action.
+ */
+struct rte_flow_update_quota {
+       enum rte_flow_update_quota_op op; /** update operation */

/**<  since you put documentation after documented member

+       int64_t quota;                    /** quota value */

/**<

  };
/**
@@ -4854,6 +4967,11 @@ struct rte_flow_port_info {
         * @see RTE_FLOW_ACTION_TYPE_CONNTRACK
         */
        uint32_t max_nb_conn_tracks;
+       /**
+        * Maximum number of quota actions.
+        * @see RTE_FLOW_ACTION_TYPE_QUOTA
+        */
+       uint32_t max_nb_quotas;
        /**
         * Port supported flags (RTE_FLOW_PORT_FLAG_*).
         */
@@ -4932,6 +5050,11 @@ struct rte_flow_port_attr {
         * @see RTE_FLOW_ACTION_TYPE_CONNTRACK
         */
        uint32_t nb_conn_tracks;
+       /**
+        * Maximum number of quota actions.
+        * @see RTE_FLOW_ACTION_TYPE_QUOTA
+        */
+       uint32_t nb_quotas;
        /**
         * Port flags (RTE_FLOW_PORT_FLAG_*).
         */

Reply via email to