From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerin Jacob Subject: Re: [PATCH v4 2/2] ethdev: add traffic management API Date: Wed, 31 May 2017 19:15:11 +0530 Message-ID: <20170531134509.GA13104@jerin> References: <1488589820-206947-2-git-send-email-cristian.dumitrescu@intel.com> <1495213972-109148-1-git-send-email-cristian.dumitrescu@intel.com> <1495213972-109148-3-git-send-email-cristian.dumitrescu@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Cc: dev@dpdk.org, thomas.monjalon@6wind.com, balasubramanian.manoharan@cavium.com, hemant.agrawal@nxp.com, shreyansh.jain@nxp.com To: Cristian Dumitrescu Return-path: Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0084.outbound.protection.outlook.com [104.47.32.84]) by dpdk.org (Postfix) with ESMTP id C09F658CB for ; Wed, 31 May 2017 15:45:31 +0200 (CEST) Content-Disposition: inline In-Reply-To: <1495213972-109148-3-git-send-email-cristian.dumitrescu@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" -----Original Message----- > Date: Fri, 19 May 2017 18:12:52 +0100 > From: Cristian Dumitrescu > To: dev@dpdk.org > CC: thomas.monjalon@6wind.com, jerin.jacob@caviumnetworks.com, > balasubramanian.manoharan@cavium.com, hemant.agrawal@nxp.com, > shreyansh.jain@nxp.com > Subject: [PATCH v4 2/2] ethdev: add traffic management API > X-Mailer: git-send-email 2.7.4 > > This patch introduces the generic ethdev API for the traffic manager > capability, which includes: hierarchical scheduling, traffic shaping, > congestion management, packet marking. > > Main features: > - Exposed as ethdev plugin capability (similar to rte_flow) > - Capability query API per port, per level and per node > - Scheduling algorithms: Strict Priority (SP), Weighed Fair Queuing (WFQ) > - Traffic shaping: single/dual rate, private (per node) and shared (by > multiple nodes) shapers > - Congestion management for hierarchy leaf nodes: algorithms of tail drop, > head drop, WRED; private (per node) and shared (by multiple nodes) WRED > contexts > - Packet marking: IEEE 802.1q (VLAN DEI), IETF RFC 3168 (IPv4/IPv6 ECN for > TCP and SCTP), IETF RFC 2597 (IPv4 / IPv6 DSCP) > > Signed-off-by: Cristian Dumitrescu IMO, With this version, It is reached to a reasonable shape where we can start using it as a base for next-tm if there are no other reviewers for this feature. Two major comments, 1) IMO, We don't need a separate API for rte_tm_node_add_check_level() and rte_tm_node_add().We can just keep, rte_tm_node_add() and move the level check in common code. 2) There are a lot of doxygen rendering issues in this document. I will try to enumerate them inline. Please cross check the header file with "make doc-api-html" output. With above changes, Acked-by: Jerin Jacob > > MAINTAINERS | 4 + > lib/librte_ether/Makefile | 5 +- > lib/librte_ether/rte_ether_version.map | 30 + > lib/librte_ether/rte_tm.c | 448 ++++++++ > lib/librte_ether/rte_tm.h | 1923 ++++++++++++++++++++++++++++++++ > lib/librte_ether/rte_tm_driver.h | 373 +++++++ Missing doxygen hooks in doc/api/doxy-api-index.md [rte_tm] (@ref rte_tm.h), [rte_tm_driver] (@ref rte_tm_driver.h), > 6 files changed, 2782 insertions(+), 1 deletion(-) > create mode 100644 lib/librte_ether/rte_tm.c > create mode 100644 lib/librte_ether/rte_tm.h > create mode 100644 lib/librte_ether/rte_tm_driver.h > > diff --git a/MAINTAINERS b/MAINTAINERS > index afb4cab..cdaf2ac 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -240,6 +240,10 @@ Flow API > M: Adrien Mazarguil > F: lib/librte_ether/rte_flow* > > +Traffic Management API > +M: Cristian Dumitrescu > +F: lib/librte_ether/rte_tm* Add next-tm tree here. > + > Crypto API > M: Declan Doherty > F: lib/librte_cryptodev/ > diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile > index 93fdde1..db692ae 100644 > --- a/lib/librte_ether/Makefile > +++ b/lib/librte_ether/Makefile > @@ -1,6 +1,6 @@ > # BSD LICENSE > # > -# Copyright(c) 2010-2016 Intel Corporation. All rights reserved. > +# Copyright(c) 2010-2017 Intel Corporation. All rights reserved. Good to add them the name of other companies who contributed in the specification. > # All rights reserved. > # > # Redistribution and use in source and binary forms, with or without > @@ -45,6 +45,7 @@ LIBABIVER := 6 > > SRCS-y += rte_ethdev.c > SRCS-y += rte_flow.c > +SRCS-y += rte_tm.c > > + NULL, \ > + rte_strerror(ENOSYS)); \ > + \ > + ops->func; \ > +}) > + > +/* Get number of leaf nodes */ > +int > +rte_tm_get_number_of_leaf_nodes(uint8_t port_id, > + uint32_t *n_leaf_nodes, > + struct rte_tm_error *error) > +{ > + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; > + const struct rte_tm_ops *ops = > + rte_tm_ops_get(port_id, error); > + > + if (ops == NULL) > + return -rte_errno; > + > + if (n_leaf_nodes == NULL) { > + rte_tm_error_set(error, > + EINVAL, > + RTE_TM_ERROR_TYPE_UNSPECIFIED, > + NULL, > + rte_strerror(EINVAL)); > + return -rte_errno; > + } > + > + *n_leaf_nodes = dev->data->nb_tx_queues; > + return 0; > +} > + > +/* Check node type (leaf or non-leaf) */ > +int > +rte_tm_node_type_get(uint8_t port_id, > + uint32_t node_id, > + int *is_leaf, > + struct rte_tm_error *error) > +{ > + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; leaf node can be detected in the common code itself as it is 0 to dev->data->nb_tx_queues. > + return RTE_TM_FUNC(port_id, node_type_get)(dev, > + node_id, is_leaf, error); > +} > + > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#ifndef __INCLUDE_RTE_TM_H__ > +#define __INCLUDE_RTE_TM_H__ > + > +/** > + * @file > + * RTE Generic Traffic Manager API > + * > + * This interface provides the ability to configure the traffic manager in a > + * generic way. It includes features such as: hierarchical scheduling, > + * traffic shaping, congestion management, packet marking, etc. > + */ > + > +#include > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/** > + * Ethernet framing overhead. > + * > + * Overhead fields per Ethernet frame: > + * 1. Preamble: 7 bytes; > + * 2. Start of Frame Delimiter (SFD): 1 byte; > + * 3. Inter-Frame Gap (IFG): 12 bytes. > + * > + * One of the typical values for the *pkt_length_adjust* field of the shaper > + * profile. > + * > + * @see struct rte_tm_shaper_params > + * > + */ > +#define RTE_TM_ETH_FRAMING_OVERHEAD 20 > + > +/** > + * Ethernet framing overhead including the Frame Check Sequence (FCS) field. > + * Useful when FCS is generated and added at the end of the Ethernet frame on > + * TX side without any SW intervention. > + * > + * One of the typical values for the pkt_length_adjust field of the shaper > + * profile. > + * > + * @see struct rte_tm_shaper_params > + */ > +#define RTE_TM_ETH_FRAMING_OVERHEAD_FCS 24 > + > +/**< Invalid WRED profile ID */ > +#define RTE_TM_WRED_PROFILE_ID_NONE UINT32_MAX > + > +/**< Invalid shaper profile ID */ > +#define RTE_TM_SHAPER_PROFILE_ID_NONE UINT32_MAX > + > +/**< Node ID for the parent of the root node */ > +#define RTE_TM_NODE_ID_NULL UINT32_MAX > + > +/** > + * Color > + */ > +enum rte_tm_color { > + RTE_TM_GREEN = 0, /**< Green */ > + RTE_TM_YELLOW, /**< Yellow */ > + RTE_TM_RED, /**< Red */ > + RTE_TM_COLORS /**< Number of colors */ > +}; > + > +/** > + * Node statistics counter type > + */ > +enum rte_tm_stats_type { > + /**< Number of packets scheduled from current node. */ > + RTE_TM_STATS_N_PKTS = 1 << 0, > + > + /**< Number of bytes scheduled from current node. */ > + RTE_TM_STATS_N_BYTES = 1 << 1, > + > + /**< Number of green packets dropped by current leaf node. */ > + RTE_TM_STATS_N_PKTS_GREEN_DROPPED = 1 << 2, > + > + /**< Number of yellow packets dropped by current leaf node. */ > + RTE_TM_STATS_N_PKTS_YELLOW_DROPPED = 1 << 3, > + > + /**< Number of red packets dropped by current leaf node. */ > + RTE_TM_STATS_N_PKTS_RED_DROPPED = 1 << 4, > + > + /**< Number of green bytes dropped by current leaf node. */ > + RTE_TM_STATS_N_BYTES_GREEN_DROPPED = 1 << 5, > + > + /**< Number of yellow bytes dropped by current leaf node. */ > + RTE_TM_STATS_N_BYTES_YELLOW_DROPPED = 1 << 6, > + > + /**< Number of red bytes dropped by current leaf node. */ > + RTE_TM_STATS_N_BYTES_RED_DROPPED = 1 << 7, > + > + /**< Number of packets currently waiting in the packet queue of current > + * leaf node. > + */ > + RTE_TM_STATS_N_PKTS_QUEUED = 1 << 8, > + > + /**< Number of bytes currently waiting in the packet queue of current > + * leaf node. > + */ > + RTE_TM_STATS_N_BYTES_QUEUED = 1 << 9, > +}; > + > + * Node statistics counters > + */ > +struct rte_tm_node_stats { > + /**< Number of packets scheduled from current node. */ > + uint64_t n_pkts; Incorrect doxygen API HTML rendering. It is rendering as "< Number of packets scheduled from current node. ^^^ Looks like comment has to come below the "uint64_t n_pkts". Applicable across the header file. > + > + /**< Number of bytes scheduled from current node. */ > + uint64_t n_bytes; > + > + /**< Statistics counters for leaf nodes only. */ > + struct { > + /**< Number of packets dropped by current leaf node per each > + * color. > + */ > + uint64_t n_pkts_dropped[RTE_TM_COLORS]; > + > + /**< Number of bytes dropped by current leaf node per each > + * color. > + */ > + uint64_t n_bytes_dropped[RTE_TM_COLORS]; > + > + /**< Number of packets currently waiting in the packet queue of > + * current leaf node. > + */ > + uint64_t n_pkts_queued; > + > + /**< Number of bytes currently waiting in the packet queue of > + * current leaf node. > + */ > + uint64_t n_bytes_queued; > + } leaf; > +}; > + > +/** > + * Traffic manager dynamic updates > + */ > +enum rte_tm_dynamic_update_type { > + /**< Dynamic parent node update. The new parent node is located on same > + * hierarchy level as the former parent node. Consequently, the node > + * whose parent is changed preserves its hierarchy level. > + */ > + RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL = 1 << 0, > + > + /**< Dynamic parent node update. The new parent node is located on > + * different hierarchy level than the former parent node. Consequently, > + * the node whose parent is changed also changes its hierarchy level. > + */ > + RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL = 1 << 1, > + > + /**< Dynamic node add/delete. */ > + RTE_TM_UPDATE_NODE_ADD_DELETE = 1 << 2, > + > + /**< Suspend/resume nodes. */ > + RTE_TM_UPDATE_NODE_SUSPEND_RESUME = 1 << 3, > + > + /**< Dynamic switch between byte-based and packet-based WFQ weights. */ > + RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE = 1 << 4, > + > + /**< Dynamic update on number of SP priorities. */ > + RTE_TM_UPDATE_NODE_N_SP_PRIORITIES = 1 << 5, > + > + /**< Dynamic update of congestion management mode for leaf nodes. */ > + RTE_TM_UPDATE_NODE_CMAN = 1 << 6, > + > + /**< Dynamic update of the set of enabled stats counter types. */ > + RTE_TM_UPDATE_NODE_STATS = 1 << 7, > +}; > + > +/** > + * Traffic manager get number of leaf nodes > + * > + * Each leaf node sits on on top of a TX queue of the current Ethernet port. > + * Therefore, the set of leaf nodes is predefined, their number is always equal > + * to N (where N is the number of TX queues configured for the current port) > + * and their IDs are 0 .. (N-1). > + * > + * @param[in] port_id [in] can be treated as default to avoid mentioning [in] everywhere. > + * The port identifier of the Ethernet device. > + * @param[out] n_leaf_nodes > + * Number of leaf nodes for the current port. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > +/** > + * Traffic manager node delete > + * > + * Delete an existing node. This operation fails when this node currently has > + * at least one user (i.e. child node). > + * > + * When called before rte_tm_hierarchy_commit() invocation, this function is > + * typically used to define the initial start-up hierarchy for the port. > + * Provided that dynamic hierarchy updates are supported by the current port (as > + * advertised in the port capability set), this function can be also called > + * after the rte_tm_hierarchy_commit() invocation. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_ADD_DELETE > + */ > +int > +rte_tm_node_delete(uint8_t port_id, > + uint32_t node_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node suspend > + * > + * Suspend an existing node. While the node is in suspended state, no packet is > + * scheduled from this node and its descendants. The node exits the suspended > + * state through the node resume operation. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_tm_node_resume() > + * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME > + */ > +int > +rte_tm_node_suspend(uint8_t port_id, > + uint32_t node_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node resume > + * > + * Resume an existing node that is currently in suspended state. The node > + * entered the suspended state as result of a previous node suspend operation. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_tm_node_suspend() > + * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME > + */ > +int > +rte_tm_node_resume(uint8_t port_id, > + uint32_t node_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager hierarchy commit > + * > + * This function is called during the port initialization phase (before the > + * Ethernet port is started) to freeze the start-up hierarchy. > + * > + * This function typically performs the following steps: > + * a) It validates the start-up hierarchy that was previously defined for the > + * current port through successive rte_tm_node_add() invocations; > + * b) Assuming successful validation, it performs all the necessary port > + * specific configuration operations to install the specified hierarchy on > + * the current port, with immediate effect once the port is started. > + * > + * This function fails when the currently configured hierarchy is not supported > + * by the Ethernet port, in which case the user can abort or try out another > + * hierarchy configuration (e.g. a hierarchy with less leaf nodes), which can be > + * build from scratch (when *clear_on_fail* is enabled) or by modifying the > + * existing hierarchy configuration (when *clear_on_fail* is disabled). > + * > + * Note that this function can still fail due to other causes (e.g. not enough > + * memory available in the system, etc), even though the specified hierarchy is > + * supported in principle by the current port. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] clear_on_fail > + * On function call failure, hierarchy is cleared when this parameter is > + * non-zero and preserved when this parameter is equal to zero. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_tm_node_add() > + * @see rte_tm_node_delete() > + */ > +int > +rte_tm_hierarchy_commit(uint8_t port_id, > + int clear_on_fail, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node parent update > + * > + * Restriction for root node: its parent cannot be changed. > + * > + * This function can only be called after the rte_tm_hierarchy_commit() > + * invocation. Its success depends on the port support for this operation, as > + * advertised through the port capability set. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] parent_node_id > + * Node ID for the new parent. Needs to be valid. > + * @param[in] priority > + * Node priority. The highest node priority is zero. Used by the SP algorithm > + * running on the parent of the current node for scheduling this child node. > + * @param[in] weight > + * Node weight. The node weight is relative to the weight sum of all siblings > + * that have the same priority. The lowest weight is zero. Used by the WFQ > + * algorithm running on the parent of the current node for scheduling this > + * child node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL > + * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL > + */ > +int > +rte_tm_node_parent_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t parent_node_id, > + uint32_t priority, > + uint32_t weight, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node private shaper update > + * > + * Restriction for the root node: its private shaper profile needs to be valid > + * and single rate. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] shaper_profile_id > + * Shaper profile ID for the private shaper of the current node. Needs to be > + * either valid shaper profile ID or RTE_TM_SHAPER_PROFILE_ID_NONE, with > + * the latter disabling the private shaper of the current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. Missing the @see to point the capability. > + */ > +int > +rte_tm_node_shaper_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t shaper_profile_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node shared shapers update > + * > + * Restriction for root node: cannot use any shared rate shapers. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] shared_shaper_id > + * Shared shaper ID. Needs to be valid. > + * @param[in] add > + * Set to non-zero value to add this shared shaper to current node or to zero > + * to delete this shared shaper from current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. Missing the @see to point the capability. > + */ > +int > +rte_tm_node_shared_shaper_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t shared_shaper_id, > + int add, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node enabled statistics counters update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid. > + * @param[in] stats_mask > + * Mask of statistics counter types to be enabled for the current node. This > + * needs to be a subset of the statistics counter types available for the > + * current node. Any statistics counter type not included in this set is to > + * be disabled for the current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see enum rte_tm_stats_type > + * @see RTE_TM_UPDATE_NODE_STATS Incorrect doxygen API HTML rendering. > + */ > +int > +rte_tm_node_stats_update(uint8_t port_id, > + uint32_t node_id, > + uint64_t stats_mask, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node WFQ weight mode update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] wfq_weight_mode > + * WFQ weight mode for each SP priority. When NULL, it indicates that WFQ is > + * to be used for all priorities. When non-NULL, it points to a pre-allocated > + * array of *n_sp_priorities* values, with non-zero value for byte-mode and > + * zero for packet-mode. > + * @param[in] n_sp_priorities > + * Number of SP priorities. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE > + * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES > + */ > +int > +rte_tm_node_wfq_weight_mode_update(uint8_t port_id, > + uint32_t node_id, > + int *wfq_weight_mode, > + uint32_t n_sp_priorities, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node congestion management mode update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] cman > + * Congestion management mode. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see RTE_TM_UPDATE_NODE_CMAN > + */ > +int > +rte_tm_node_cman_update(uint8_t port_id, > + uint32_t node_id, > + enum rte_tm_cman_mode cman, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node private WRED context update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] wred_profile_id > + * WRED profile ID for the private WRED context of the current node. Needs to > + * be either valid WRED profile ID or RTE_TM_WRED_PROFILE_ID_NONE, with the > + * latter disabling the private WRED context of the current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + */ Missing the @see to point the capability. > +int > +rte_tm_node_wred_context_update(uint8_t port_id, > + uint32_t node_id, > + uint32_t wred_profile_id, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager node shared WRED context update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] node_id > + * Node ID. Needs to be valid leaf node ID. > + * @param[in] shared_wred_context_id > + * Shared WRED context ID. Needs to be valid. > + * @param[in] add > + * Set to non-zero value to add this shared WRED context to current node or > + * to zero to delete this shared WRED context from current node. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. Missing the @see to point the capability. > + * @see struct rte_tm_capabilities::mark_vlan_dei_supported > + */ > +int > +rte_tm_mark_vlan_dei(uint8_t port_id, > + int mark_green, > + int mark_yellow, > + int mark_red, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager packet marking - IPv4 / IPv6 ECN (IETF RFC 3168) > + * > + * IETF RFCs 2474 and 3168 reorganize the IPv4 Type of Service (TOS) field > + * (8 bits) and the IPv6 Traffic Class (TC) field (8 bits) into Differentiated > + * Services Codepoint (DSCP) field (6 bits) and Explicit Congestion > + * Notification (ECN) field (2 bits). The DSCP field is typically used to > + * encode the traffic class and/or drop priority (RFC 2597), while the ECN > + * field is used by RFC 3168 to implement a congestion notification mechanism > + * to be leveraged by transport layer protocols such as TCP and SCTP that have > + * congestion control mechanisms. > + * > + * When congestion is experienced, as alternative to dropping the packet, > + * routers can change the ECN field of input packets from 2'b01 or 2'b10 > + * (values indicating that source endpoint is ECN-capable) to 2'b11 (meaning > + * that congestion is experienced). The destination endpoint can use the > + * ECN-Echo (ECE) TCP flag to relay the congestion indication back to the > + * source endpoint, which acknowledges it back to the destination endpoint with > + * the Congestion Window Reduced (CWR) TCP flag. > + * > + * All IPv4/IPv6 packets of a given color with ECN set to 2’b01 or 2’b10 > + * carrying TCP or SCTP have their ECN set to 2’b11 if the marking feature is > + * enabled for the current color, otherwise the ECN field is left as is. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] mark_green > + * Set to non-zero value to enable marking of green packets and to zero to > + * disable it. > + * @param[in] mark_yellow > + * Set to non-zero value to enable marking of yellow packets and to zero to > + * disable it. > + * @param[in] mark_red > + * Set to non-zero value to enable marking of red packets and to zero to > + * disable it. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see struct rte_tm_capabilities::mark_ip_ecn_tcp_supported > + * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported > + */ > +int > +rte_tm_mark_ip_ecn(uint8_t port_id, > + int mark_green, > + int mark_yellow, > + int mark_red, > + struct rte_tm_error *error); > + > +/** > + * Traffic manager packet marking - IPv4 / IPv6 DSCP (IETF RFC 2597) > + * > + * IETF RFC 2597 maps the traffic class and the drop priority to the IPv4/IPv6 > + * Differentiated Services Codepoint (DSCP) field (6 bits). Here are the DSCP > + * values proposed by this RFC: > + * > + * Class 1 Class 2 Class 3 Class 4 > + * +----------+----------+----------+----------+ > + * Low Drop Prec | 001010 | 010010 | 011010 | 100010 | > + * Medium Drop Prec | 001100 | 010100 | 011100 | 100100 | > + * High Drop Prec | 001110 | 010110 | 011110 | 100110 | > + * +----------+----------+----------+----------+ Incorrect doxygen API HTML rendering.