From: Jerin Jacob <jerin.jacob@caviumnetworks.com>
To: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Cc: dev@dpdk.org, thomas.monjalon@6wind.com,
balasubramanian.manoharan@cavium.com, hemant.agrawal@nxp.com,
shreyansh.jain@nxp.com
Subject: Re: [dpdk-dev] [PATCH v4 2/2] ethdev: add traffic management API
Date: Wed, 31 May 2017 19:15:11 +0530 [thread overview]
Message-ID: <20170531134509.GA13104@jerin> (raw)
In-Reply-To: <1495213972-109148-3-git-send-email-cristian.dumitrescu@intel.com>
-----Original Message-----
> Date: Fri, 19 May 2017 18:12:52 +0100
> From: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> 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 <cristian.dumitrescu@intel.com>
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 <jerin.jacob@caviumnetworks.com>
>
> 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 <adrien.mazarguil@6wind.com>
> F: lib/librte_ether/rte_flow*
>
> +Traffic Management API
> +M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> +F: lib/librte_ether/rte_tm*
Add next-tm tree here.
> +
> Crypto API
> M: Declan Doherty <declan.doherty@intel.com>
> 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 <stdint.h>
> +
> +#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.
next prev parent reply other threads:[~2017-05-31 13:45 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-04 1:10 [dpdk-dev] [PATCH v3 0/2] ethdev: abstraction layer for QoS hierarchical scheduler Cristian Dumitrescu
2017-03-04 1:10 ` [dpdk-dev] [PATCH v3 1/2] ethdev: add capability control API Cristian Dumitrescu
2017-03-06 10:32 ` Thomas Monjalon
2017-03-06 16:35 ` Dumitrescu, Cristian
2017-03-06 16:57 ` Thomas Monjalon
2017-03-06 18:28 ` Dumitrescu, Cristian
2017-03-06 20:21 ` Thomas Monjalon
2017-03-06 20:41 ` Wiles, Keith
2017-03-06 20:54 ` Stephen Hemminger
2017-03-07 10:14 ` Dumitrescu, Cristian
2017-03-07 12:56 ` Thomas Monjalon
2017-03-07 19:17 ` Wiles, Keith
2017-03-06 16:36 ` Dumitrescu, Cristian
2017-05-19 17:12 ` [dpdk-dev] [PATCH v4 0/2] ethdev: abstraction layer for QoS traffic management Cristian Dumitrescu
2017-05-19 17:12 ` [dpdk-dev] [PATCH v4 1/2] ethdev: add traffic management ops get API Cristian Dumitrescu
2017-06-09 16:51 ` [dpdk-dev] [PATCH v5 0/2] ethdev: abstraction layer for QoS traffic management Cristian Dumitrescu
2017-06-09 16:51 ` [dpdk-dev] [PATCH v5 1/2] ethdev: add traffic management ops get API Cristian Dumitrescu
2017-06-09 16:51 ` [dpdk-dev] [PATCH v5 2/2] ethdev: add traffic management API Cristian Dumitrescu
2017-06-12 3:36 ` Jerin Jacob
2017-06-12 10:24 ` Dumitrescu, Cristian
2017-06-12 13:35 ` [dpdk-dev] [PATCH v6 0/2] ethdev: abstraction layer for QoS traffic management Cristian Dumitrescu
2017-06-12 13:35 ` [dpdk-dev] [PATCH v6 1/2] ethdev: add traffic management ops get API Cristian Dumitrescu
2017-06-12 13:35 ` [dpdk-dev] [PATCH v6 2/2] ethdev: add traffic management API Cristian Dumitrescu
2017-06-27 13:24 ` [dpdk-dev] [PATCH v6 0/2] ethdev: abstraction layer for QoS traffic management Dumitrescu, Cristian
2017-05-19 17:12 ` [dpdk-dev] [PATCH v4 2/2] ethdev: add traffic management API Cristian Dumitrescu
2017-05-19 17:34 ` Stephen Hemminger
2017-05-22 14:25 ` Dumitrescu, Cristian
2017-05-24 11:28 ` Hemant Agrawal
2017-05-31 13:45 ` Jerin Jacob [this message]
2017-05-31 17:05 ` Manoharan, Balasubramanian
2017-03-04 1:10 ` [dpdk-dev] [PATCH v3 2/2] ethdev: add hierarchical scheduler API Cristian Dumitrescu
2017-03-06 10:38 ` Thomas Monjalon
2017-03-06 16:59 ` Dumitrescu, Cristian
2017-03-06 20:07 ` Thomas Monjalon
2017-03-07 19:29 ` Dumitrescu, Cristian
2017-03-08 9:51 ` O'Driscoll, Tim
2017-03-10 18:37 ` Dumitrescu, Cristian
2017-03-15 12:43 ` Thomas Monjalon
2017-03-16 16:23 ` Dumitrescu, Cristian
2017-03-16 17:29 ` Thomas Monjalon
2017-03-16 17:40 ` Dumitrescu, Cristian
2017-03-16 18:10 ` Thomas Monjalon
2017-03-16 19:06 ` Dumitrescu, Cristian
2017-03-24 19:55 ` Dumitrescu, Cristian
2017-03-06 16:15 ` Stephen Hemminger
2017-03-06 18:17 ` Dumitrescu, Cristian
2017-03-16 17:35 ` Thomas Monjalon
2017-03-30 10:32 ` Hemant Agrawal
2017-04-07 16:51 ` Dumitrescu, Cristian
2017-04-07 13:20 ` Jerin Jacob
2017-04-07 17:47 ` Dumitrescu, Cristian
2017-04-10 14:00 ` Jerin Jacob
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170531134509.GA13104@jerin \
--to=jerin.jacob@caviumnetworks.com \
--cc=balasubramanian.manoharan@cavium.com \
--cc=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=hemant.agrawal@nxp.com \
--cc=shreyansh.jain@nxp.com \
--cc=thomas.monjalon@6wind.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).