From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id EDD531CFA4 for ; Fri, 6 Apr 2018 14:24:29 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Apr 2018 05:24:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,415,1517904000"; d="scan'208";a="30607853" Received: from awal-z170x.ir.intel.com ([163.33.210.59]) by fmsmga008.fm.intel.com with ESMTP; 06 Apr 2018 05:24:27 -0700 From: Declan Doherty To: dev@dpdk.org Cc: Declan Doherty Date: Fri, 6 Apr 2018 13:24:00 +0100 Message-Id: <1523017443-12414-2-git-send-email-declan.doherty@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1523017443-12414-1-git-send-email-declan.doherty@intel.com> References: <1523017443-12414-1-git-send-email-declan.doherty@intel.com> Subject: [dpdk-dev] [PATCH v3 1/4] ethdev: add group counter support to rte_flow X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Apr 2018 12:24:30 -0000 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 --- doc/guides/prog_guide/rte_flow.rst | 35 +++++++++++++++++++++ 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, 125 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 961943d..fd33d19 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1698,6 +1698,41 @@ 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. 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. + +.. 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 ------------- diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map index 34df6c8..cff6807 100644 --- a/lib/librte_ether/rte_ethdev_version.map +++ b/lib/librte_ether/rte_ethdev_version.map @@ -229,3 +229,11 @@ EXPERIMENTAL { rte_mtr_stats_update; } DPDK_17.11; + + +EXPERIMENTAL { + global: + + rte_flow_query_group_count + +} DPDK_18.05; diff --git a/lib/librte_ether/rte_flow.c b/lib/librte_ether/rte_flow.c index 38f2d27..e10b1d0 100644 --- a/lib/librte_ether/rte_flow.c +++ b/lib/librte_ether/rte_flow.c @@ -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)); +} diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index 13e4202..7d1f89d 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -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 }; /** @@ -1149,6 +1161,18 @@ struct rte_flow_action_security { }; /** + * 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. * * A list of actions is terminated by a END 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 diff --git a/lib/librte_ether/rte_flow_driver.h b/lib/librte_ether/rte_flow_driver.h index 7778c8e..ef09465 100644 --- a/lib/librte_ether/rte_flow_driver.h +++ b/lib/librte_ether/rte_flow_driver.h @@ -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 *); }; /** -- 2.7.4