[dpdk-dev,v2,1/4] ethdev: add group counter support to rte_flow
Checks
Commit Message
Add new RTE_FLOW_ACTION_TYPE_GROUP_COUNT action type to enable shared
counters across multiple flows on a single port or across multiple
flows on multiple ports within the same switch domain.
Introduce new API rte_flow_query_group_count to allow querying of group
counters.
Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
doc/guides/prog_guide/rte_flow.rst | 33 +++++++++++++++++++
lib/librte_ether/rte_ethdev_version.map | 8 +++++
lib/librte_ether/rte_flow.c | 21 +++++++++++++
lib/librte_ether/rte_flow.h | 56 ++++++++++++++++++++++++++++++++-
lib/librte_ether/rte_flow_driver.h | 6 ++++
5 files changed, 123 insertions(+), 1 deletion(-)
Comments
05/04/2018 15:51, Declan Doherty:
> +Group Count Query
> +~~~~~~~~~~~~~~~~~
> +
> +Query group counter which can be associated with multiple flows on a specified
> +port.
> +
> +This function allows retrieving of group counters. Data
> +is gathered by special actions which must be present in the flow rule
> +definition.
I would like seeing an explanation of how group counter work.
The guide can be more verbose than the doxygen comments.
On 05/04/2018 17:31, Thomas Monjalon wrote:
> 05/04/2018 15:51, Declan Doherty:
>> +Group Count Query
>> +~~~~~~~~~~~~~~~~~
>> +
>> +Query group counter which can be associated with multiple flows on a specified
>> +port.
>> +
>> +This function allows retrieving of group counters. Data
>> +is gathered by special actions which must be present in the flow rule
>> +definition.
> I would like seeing an explanation of how group counter work.
> The guide can be more verbose than the doxygen comments.
A bit elaborated explanation is as below.
This function allows retrieving of group counters. A group counter is a
counter which can be shared among multiple flows on a single port or
among multiple flows on multiple ports within the same switch domain.
Data is gathered by special actions which must be present in the flow
rule definition.
When the tunnel is created, the underlying PMD can keep track of the
tunnel which is specified as table 0. Then each time a packet is
received belongs to the tunnel, the counter is increased. During the
query the counter is returned.
@@ -1698,6 +1698,39 @@ Return values:
- 0 on success, a negative errno value otherwise and ``rte_errno`` is set.
+
+Group Count Query
+~~~~~~~~~~~~~~~~~
+
+Query group counter which can be associated with multiple flows on a specified
+port.
+
+This function allows retrieving of group counters. Data
+is gathered by special actions which must be present in the flow rule
+definition.
+
+.. code-block:: c
+
+ int
+ rte_flow_query_group_count(uint16_t port_id,
+ uint32_t group_counter_id,
+ struct rte_flow_query_count *count,
+ struct rte_flow_error *error);
+
+Arguments:
+
+- ``port_id``: port identifier of Ethernet device.
+- ``group_counter_id``: group counter identifier.
+- ``count``: group counter parameters.
+- ``error``: perform verbose error reporting if not NULL. PMDs initialize
+ this structure in case of error only.
+
+Return values:
+
+- 0 on success, a negative errno value otherwise and ``rte_errno`` is set.
+
+
+
Isolated mode
-------------
@@ -229,3 +229,11 @@ EXPERIMENTAL {
rte_mtr_stats_update;
} DPDK_17.11;
+
+
+EXPERIMENTAL {
+ global:
+
+ rte_flow_query_group_count
+
+} DPDK_18.05;
@@ -418,3 +418,24 @@ rte_flow_copy(struct rte_flow_desc *desc, size_t len,
}
return 0;
}
+
+int __rte_experimental
+rte_flow_query_group_count(uint16_t port_id,
+ uint32_t group_count_id,
+ struct rte_flow_query_count *count,
+ struct rte_flow_error *error)
+{
+ struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+ const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
+
+ if (!ops)
+ return -rte_errno;
+ if (likely(!!ops->query_group_count))
+ return flow_err(port_id,
+ ops->query_group_count(dev, group_count_id,
+ count, error),
+ error);
+ return rte_flow_error_set(error, ENOSYS,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+ NULL, rte_strerror(ENOSYS));
+}
@@ -1010,7 +1010,19 @@ enum rte_flow_action_type {
*
* See struct rte_flow_action_security.
*/
- RTE_FLOW_ACTION_TYPE_SECURITY
+ RTE_FLOW_ACTION_TYPE_SECURITY,
+
+ /**
+ * Enable a shared flow group counter for flow. Group counters can be
+ * associated with multiples flows on the same port or on port within
+ * the same switch domain if supported by that device.
+ *
+ * Group counters can be retrieved and reset through
+ * rte_flow_query_group_count()
+ *
+ * See struct rte_flow_action_group_count.
+ */
+ RTE_FLOW_ACTION_TYPE_GROUP_COUNT
};
/**
@@ -1148,6 +1160,18 @@ struct rte_flow_action_security {
void *security_session; /**< Pointer to security session structure. */
};
+/**
+ * RTE_FLOW_ACTION_TYPE_GROUP_COUNT
+ *
+ * A packet/byte counter which can be shared across a group of flows programmed
+ * on the same port/switch domain.
+ *
+ * Non-terminating by default.
+ */
+struct rte_flow_action_group_count {
+ uint32_t id;
+};
+
/**
* Definition of a single action.
*
@@ -1476,6 +1500,36 @@ rte_flow_copy(struct rte_flow_desc *fd, size_t len,
const struct rte_flow_item *items,
const struct rte_flow_action *actions);
+
+/**
+ * Get hit/bytes count for group counter.
+ *
+ * A group counter is a counter which can be shared among multiple flows on a
+ * single port or among multiple flows on multiple ports within the same
+ * switch domain.
+ *
+ * In the case of ports within the same switch domain a global name space is
+ * assumed for group_count_id value.
+ *
+ * @param[in] port_id
+ * Port identifier of Ethernet device.
+ * @param[in] group_count_id
+ * Group counter identifier to query
+ * @param[out] count
+ * Group counter value
+ * @param[out] error
+ * Perform verbose error reporting if not NULL. PMDs initialize this
+ * structure in case of error only.
+ *
+ * @return
+ * Negative error code (errno value) and rte_errno is set.
+ */
+int __rte_experimental
+rte_flow_query_group_count(uint16_t port_id,
+ uint32_t group_count_id,
+ struct rte_flow_query_count *count,
+ struct rte_flow_error *error);
+
#ifdef __cplusplus
}
#endif
@@ -96,6 +96,12 @@ struct rte_flow_ops {
(struct rte_eth_dev *,
int,
struct rte_flow_error *);
+ /** See rte_flow_query_group_count(). */
+ int (*query_group_count)
+ (struct rte_eth_dev *,
+ uint32_t,
+ struct rte_flow_query_count *,
+ struct rte_flow_error *);
};
/**