xref: /f-stack/dpdk/lib/librte_ethdev/rte_tm.h (revision 16d80a6d)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2017 Intel Corporation.
5  *   Copyright(c) 2017 Cavium.
6  *   Copyright(c) 2017 NXP.
7  *   All rights reserved.
8  *
9  *   Redistribution and use in source and binary forms, with or without
10  *   modification, are permitted provided that the following conditions
11  *   are met:
12  *
13  *     * Redistributions of source code must retain the above copyright
14  *       notice, this list of conditions and the following disclaimer.
15  *     * Redistributions in binary form must reproduce the above copyright
16  *       notice, this list of conditions and the following disclaimer in
17  *       the documentation and/or other materials provided with the
18  *       distribution.
19  *     * Neither the name of Intel Corporation nor the names of its
20  *       contributors may be used to endorse or promote products derived
21  *       from this software without specific prior written permission.
22  *
23  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #ifndef __INCLUDE_RTE_TM_H__
37 #define __INCLUDE_RTE_TM_H__
38 
39 /**
40  * @file
41  * RTE Generic Traffic Manager API
42  *
43  * This interface provides the ability to configure the traffic manager in a
44  * generic way. It includes features such as: hierarchical scheduling,
45  * traffic shaping, congestion management, packet marking, etc.
46  *
47  * @warning
48  * @b EXPERIMENTAL: this API may change without prior notice
49  */
50 
51 #include <stdint.h>
52 
53 #include <rte_common.h>
54 
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58 
59 /**
60  * Ethernet framing overhead.
61  *
62  * Overhead fields per Ethernet frame:
63  * 1. Preamble:                                            7 bytes;
64  * 2. Start of Frame Delimiter (SFD):                      1 byte;
65  * 3. Inter-Frame Gap (IFG):                              12 bytes.
66  *
67  * One of the typical values for the *pkt_length_adjust* field of the shaper
68  * profile.
69  *
70  * @see struct rte_tm_shaper_params
71  */
72 #define RTE_TM_ETH_FRAMING_OVERHEAD                  20
73 
74 /**
75  * Ethernet framing overhead including the Frame Check Sequence (FCS) field.
76  * Useful when FCS is generated and added at the end of the Ethernet frame on
77  * TX side without any SW intervention.
78  *
79  * One of the typical values for the pkt_length_adjust field of the shaper
80  * profile.
81  *
82  * @see struct rte_tm_shaper_params
83  */
84 #define RTE_TM_ETH_FRAMING_OVERHEAD_FCS              24
85 
86 /**
87  * Invalid WRED profile ID.
88  *
89  * @see struct rte_tm_node_params
90  * @see rte_tm_node_add()
91  * @see rte_tm_node_wred_context_update()
92  */
93 #define RTE_TM_WRED_PROFILE_ID_NONE                  UINT32_MAX
94 
95 /**
96  *Invalid shaper profile ID.
97  *
98  * @see struct rte_tm_node_params
99  * @see rte_tm_node_add()
100  * @see rte_tm_node_shaper_update()
101  */
102 #define RTE_TM_SHAPER_PROFILE_ID_NONE                UINT32_MAX
103 
104 /**
105  * Node ID for the parent of the root node.
106  *
107  * @see rte_tm_node_add()
108  */
109 #define RTE_TM_NODE_ID_NULL                          UINT32_MAX
110 
111 /**
112  * Node level ID used to disable level ID checking.
113  *
114  * @see rte_tm_node_add()
115  */
116 #define RTE_TM_NODE_LEVEL_ID_ANY                     UINT32_MAX
117 
118 /**
119  * Color
120  */
121 enum rte_tm_color {
122 	RTE_TM_GREEN = 0, /**< Green */
123 	RTE_TM_YELLOW, /**< Yellow */
124 	RTE_TM_RED, /**< Red */
125 	RTE_TM_COLORS /**< Number of colors */
126 };
127 
128 /**
129  * Node statistics counter type
130  */
131 enum rte_tm_stats_type {
132 	/** Number of packets scheduled from current node. */
133 	RTE_TM_STATS_N_PKTS = 1 << 0,
134 
135 	/** Number of bytes scheduled from current node. */
136 	RTE_TM_STATS_N_BYTES = 1 << 1,
137 
138 	/** Number of green packets dropped by current leaf node.  */
139 	RTE_TM_STATS_N_PKTS_GREEN_DROPPED = 1 << 2,
140 
141 	/** Number of yellow packets dropped by current leaf node.  */
142 	RTE_TM_STATS_N_PKTS_YELLOW_DROPPED = 1 << 3,
143 
144 	/** Number of red packets dropped by current leaf node.  */
145 	RTE_TM_STATS_N_PKTS_RED_DROPPED = 1 << 4,
146 
147 	/** Number of green bytes dropped by current leaf node.  */
148 	RTE_TM_STATS_N_BYTES_GREEN_DROPPED = 1 << 5,
149 
150 	/** Number of yellow bytes dropped by current leaf node.  */
151 	RTE_TM_STATS_N_BYTES_YELLOW_DROPPED = 1 << 6,
152 
153 	/** Number of red bytes dropped by current leaf node.  */
154 	RTE_TM_STATS_N_BYTES_RED_DROPPED = 1 << 7,
155 
156 	/** Number of packets currently waiting in the packet queue of current
157 	 * leaf node.
158 	 */
159 	RTE_TM_STATS_N_PKTS_QUEUED = 1 << 8,
160 
161 	/** Number of bytes currently waiting in the packet queue of current
162 	 * leaf node.
163 	 */
164 	RTE_TM_STATS_N_BYTES_QUEUED = 1 << 9,
165 };
166 
167 /**
168  * Node statistics counters
169  */
170 struct rte_tm_node_stats {
171 	/** Number of packets scheduled from current node. */
172 	uint64_t n_pkts;
173 
174 	/** Number of bytes scheduled from current node. */
175 	uint64_t n_bytes;
176 
177 	/** Statistics counters for leaf nodes only. */
178 	struct {
179 		/** Number of packets dropped by current leaf node per each
180 		 * color.
181 		 */
182 		uint64_t n_pkts_dropped[RTE_TM_COLORS];
183 
184 		/** Number of bytes dropped by current leaf node per each
185 		 * color.
186 		 */
187 		uint64_t n_bytes_dropped[RTE_TM_COLORS];
188 
189 		/** Number of packets currently waiting in the packet queue of
190 		 * current leaf node.
191 		 */
192 		uint64_t n_pkts_queued;
193 
194 		/** Number of bytes currently waiting in the packet queue of
195 		 * current leaf node.
196 		 */
197 		uint64_t n_bytes_queued;
198 	} leaf;
199 };
200 
201 /**
202  * Traffic manager dynamic updates
203  */
204 enum rte_tm_dynamic_update_type {
205 	/** Dynamic parent node update. The new parent node is located on same
206 	 * hierarchy level as the former parent node. Consequently, the node
207 	 * whose parent is changed preserves its hierarchy level.
208 	 */
209 	RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL = 1 << 0,
210 
211 	/** Dynamic parent node update. The new parent node is located on
212 	 * different hierarchy level than the former parent node. Consequently,
213 	 * the node whose parent is changed also changes its hierarchy level.
214 	 */
215 	RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL = 1 << 1,
216 
217 	/** Dynamic node add/delete. */
218 	RTE_TM_UPDATE_NODE_ADD_DELETE = 1 << 2,
219 
220 	/** Suspend/resume nodes. */
221 	RTE_TM_UPDATE_NODE_SUSPEND_RESUME = 1 << 3,
222 
223 	/** Dynamic switch between byte-based and packet-based WFQ weights. */
224 	RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE = 1 << 4,
225 
226 	/** Dynamic update on number of SP priorities. */
227 	RTE_TM_UPDATE_NODE_N_SP_PRIORITIES = 1 << 5,
228 
229 	/** Dynamic update of congestion management mode for leaf nodes. */
230 	RTE_TM_UPDATE_NODE_CMAN = 1 << 6,
231 
232 	/** Dynamic update of the set of enabled stats counter types. */
233 	RTE_TM_UPDATE_NODE_STATS = 1 << 7,
234 };
235 
236 /**
237  * Traffic manager capabilities
238  */
239 struct rte_tm_capabilities {
240 	/** Maximum number of nodes. */
241 	uint32_t n_nodes_max;
242 
243 	/** Maximum number of levels (i.e. number of nodes connecting the root
244 	 * node with any leaf node, including the root and the leaf).
245 	 */
246 	uint32_t n_levels_max;
247 
248 	/** When non-zero, this flag indicates that all the non-leaf nodes
249 	 * (with the exception of the root node) have identical capability set.
250 	 */
251 	int non_leaf_nodes_identical;
252 
253 	/** When non-zero, this flag indicates that all the leaf nodes have
254 	 * identical capability set.
255 	 */
256 	int leaf_nodes_identical;
257 
258 	/** Maximum number of shapers, either private or shared. In case the
259 	 * implementation does not share any resources between private and
260 	 * shared shapers, it is typically equal to the sum of
261 	 * *shaper_private_n_max* and *shaper_shared_n_max*. The
262 	 * value of zero indicates that traffic shaping is not supported.
263 	 */
264 	uint32_t shaper_n_max;
265 
266 	/** Maximum number of private shapers. Indicates the maximum number of
267 	 * nodes that can concurrently have their private shaper enabled. The
268 	 * value of zero indicates that private shapers are not supported.
269 	 */
270 	uint32_t shaper_private_n_max;
271 
272 	/** Maximum number of private shapers that support dual rate shaping.
273 	 * Indicates the maximum number of nodes that can concurrently have
274 	 * their private shaper enabled with dual rate support. Only valid when
275 	 * private shapers are supported. The value of zero indicates that dual
276 	 * rate shaping is not available for private shapers. The maximum value
277 	 * is *shaper_private_n_max*.
278 	 */
279 	int shaper_private_dual_rate_n_max;
280 
281 	/** Minimum committed/peak rate (bytes per second) for any private
282 	 * shaper. Valid only when private shapers are supported.
283 	 */
284 	uint64_t shaper_private_rate_min;
285 
286 	/** Maximum committed/peak rate (bytes per second) for any private
287 	 * shaper. Valid only when private shapers are supported.
288 	 */
289 	uint64_t shaper_private_rate_max;
290 
291 	/** Maximum number of shared shapers. The value of zero indicates that
292 	 * shared shapers are not supported.
293 	 */
294 	uint32_t shaper_shared_n_max;
295 
296 	/** Maximum number of nodes that can share the same shared shaper.
297 	 * Only valid when shared shapers are supported.
298 	 */
299 	uint32_t shaper_shared_n_nodes_per_shaper_max;
300 
301 	/** Maximum number of shared shapers a node can be part of. This
302 	 * parameter indicates that there is at least one node that can be
303 	 * configured with this many shared shapers, which might not be true for
304 	 * all the nodes. Only valid when shared shapers are supported, in which
305 	 * case it ranges from 1 to *shaper_shared_n_max*.
306 	 */
307 	uint32_t shaper_shared_n_shapers_per_node_max;
308 
309 	/** Maximum number of shared shapers that can be configured with dual
310 	 * rate shaping. The value of zero indicates that dual rate shaping
311 	 * support is not available for shared shapers.
312 	 */
313 	uint32_t shaper_shared_dual_rate_n_max;
314 
315 	/** Minimum committed/peak rate (bytes per second) for any shared
316 	 * shaper. Only valid when shared shapers are supported.
317 	 */
318 	uint64_t shaper_shared_rate_min;
319 
320 	/** Maximum committed/peak rate (bytes per second) for any shared
321 	 * shaper. Only valid when shared shapers are supported.
322 	 */
323 	uint64_t shaper_shared_rate_max;
324 
325 	/** Minimum value allowed for packet length adjustment for any private
326 	 * or shared shaper.
327 	 */
328 	int shaper_pkt_length_adjust_min;
329 
330 	/** Maximum value allowed for packet length adjustment for any private
331 	 * or shared shaper.
332 	 */
333 	int shaper_pkt_length_adjust_max;
334 
335 	/** Maximum number of children nodes. This parameter indicates that
336 	 * there is at least one non-leaf node that can be configured with this
337 	 * many children nodes, which might not be true for all the non-leaf
338 	 * nodes.
339 	 */
340 	uint32_t sched_n_children_max;
341 
342 	/** Maximum number of supported priority levels. This parameter
343 	 * indicates that there is at least one non-leaf node that can be
344 	 * configured with this many priority levels for managing its children
345 	 * nodes, which might not be true for all the non-leaf nodes. The value
346 	 * of zero is invalid. The value of 1 indicates that only priority 0 is
347 	 * supported, which essentially means that Strict Priority (SP)
348 	 * algorithm is not supported.
349 	 */
350 	uint32_t sched_sp_n_priorities_max;
351 
352 	/** Maximum number of sibling nodes that can have the same priority at
353 	 * any given time, i.e. maximum size of the WFQ sibling node group. This
354 	 * parameter indicates there is at least one non-leaf node that meets
355 	 * this condition, which might not be true for all the non-leaf nodes.
356 	 * The value of zero is invalid. The value of 1 indicates that WFQ
357 	 * algorithm is not supported. The maximum value is
358 	 * *sched_n_children_max*.
359 	 */
360 	uint32_t sched_wfq_n_children_per_group_max;
361 
362 	/** Maximum number of priority levels that can have more than one child
363 	 * node at any given time, i.e. maximum number of WFQ sibling node
364 	 * groups that have two or more members. This parameter indicates there
365 	 * is at least one non-leaf node that meets this condition, which might
366 	 * not be true for all the non-leaf nodes. The value of zero states that
367 	 * WFQ algorithm is not supported. The value of 1 indicates that
368 	 * (*sched_sp_n_priorities_max* - 1) priority levels have at most one
369 	 * child node, so there can be only one priority level with two or
370 	 * more sibling nodes making up a WFQ group. The maximum value is:
371 	 * min(floor(*sched_n_children_max* / 2), *sched_sp_n_priorities_max*).
372 	 */
373 	uint32_t sched_wfq_n_groups_max;
374 
375 	/** Maximum WFQ weight. The value of 1 indicates that all sibling nodes
376 	 * with same priority have the same WFQ weight, so WFQ is reduced to FQ.
377 	 */
378 	uint32_t sched_wfq_weight_max;
379 
380 	/** WRED packet mode support. When non-zero, this parameter indicates
381 	 * that there is at least one leaf node that supports the WRED packet
382 	 * mode, which might not be true for all the leaf nodes. In packet
383 	 * mode, the WRED thresholds specify the queue length in packets, as
384 	 * opposed to bytes.
385 	 */
386 	int cman_wred_packet_mode_supported;
387 
388 	/** WRED byte mode support. When non-zero, this parameter indicates that
389 	 * there is at least one leaf node that supports the WRED byte mode,
390 	 * which might not be true for all the leaf nodes. In byte mode, the
391 	 * WRED thresholds specify the queue length in bytes, as opposed to
392 	 * packets.
393 	 */
394 	int cman_wred_byte_mode_supported;
395 
396 	/** Head drop algorithm support. When non-zero, this parameter
397 	 * indicates that there is at least one leaf node that supports the head
398 	 * drop algorithm, which might not be true for all the leaf nodes.
399 	 */
400 	int cman_head_drop_supported;
401 
402 	/** Maximum number of WRED contexts, either private or shared. In case
403 	 * the implementation does not share any resources between private and
404 	 * shared WRED contexts, it is typically equal to the sum of
405 	 * *cman_wred_context_private_n_max* and
406 	 * *cman_wred_context_shared_n_max*. The value of zero indicates that
407 	 * WRED is not supported.
408 	 */
409 	uint32_t cman_wred_context_n_max;
410 
411 	/** Maximum number of private WRED contexts. Indicates the maximum
412 	 * number of leaf nodes that can concurrently have their private WRED
413 	 * context enabled. The value of zero indicates that private WRED
414 	 * contexts are not supported.
415 	 */
416 	uint32_t cman_wred_context_private_n_max;
417 
418 	/** Maximum number of shared WRED contexts. The value of zero
419 	 * indicates that shared WRED contexts are not supported.
420 	 */
421 	uint32_t cman_wred_context_shared_n_max;
422 
423 	/** Maximum number of leaf nodes that can share the same WRED context.
424 	 * Only valid when shared WRED contexts are supported.
425 	 */
426 	uint32_t cman_wred_context_shared_n_nodes_per_context_max;
427 
428 	/** Maximum number of shared WRED contexts a leaf node can be part of.
429 	 * This parameter indicates that there is at least one leaf node that
430 	 * can be configured with this many shared WRED contexts, which might
431 	 * not be true for all the leaf nodes. Only valid when shared WRED
432 	 * contexts are supported, in which case it ranges from 1 to
433 	 * *cman_wred_context_shared_n_max*.
434 	 */
435 	uint32_t cman_wred_context_shared_n_contexts_per_node_max;
436 
437 	/** Support for VLAN DEI packet marking (per color). */
438 	int mark_vlan_dei_supported[RTE_TM_COLORS];
439 
440 	/** Support for IPv4/IPv6 ECN marking of TCP packets (per color). */
441 	int mark_ip_ecn_tcp_supported[RTE_TM_COLORS];
442 
443 	/** Support for IPv4/IPv6 ECN marking of SCTP packets (per color). */
444 	int mark_ip_ecn_sctp_supported[RTE_TM_COLORS];
445 
446 	/** Support for IPv4/IPv6 DSCP packet marking (per color). */
447 	int mark_ip_dscp_supported[RTE_TM_COLORS];
448 
449 	/** Set of supported dynamic update operations.
450 	 * @see enum rte_tm_dynamic_update_type
451 	 */
452 	uint64_t dynamic_update_mask;
453 
454 	/** Set of supported statistics counter types.
455 	 * @see enum rte_tm_stats_type
456 	 */
457 	uint64_t stats_mask;
458 };
459 
460 /**
461  * Traffic manager level capabilities
462  */
463 struct rte_tm_level_capabilities {
464 	/** Maximum number of nodes for the current hierarchy level. */
465 	uint32_t n_nodes_max;
466 
467 	/** Maximum number of non-leaf nodes for the current hierarchy level.
468 	 * The value of 0 indicates that current level only supports leaf
469 	 * nodes. The maximum value is *n_nodes_max*.
470 	 */
471 	uint32_t n_nodes_nonleaf_max;
472 
473 	/** Maximum number of leaf nodes for the current hierarchy level. The
474 	 * value of 0 indicates that current level only supports non-leaf
475 	 * nodes. The maximum value is *n_nodes_max*.
476 	 */
477 	uint32_t n_nodes_leaf_max;
478 
479 	/** When non-zero, this flag indicates that all the non-leaf nodes on
480 	 * this level have identical capability set. Valid only when
481 	 * *n_nodes_nonleaf_max* is non-zero.
482 	 */
483 	int non_leaf_nodes_identical;
484 
485 	/** When non-zero, this flag indicates that all the leaf nodes on this
486 	 * level have identical capability set. Valid only when
487 	 * *n_nodes_leaf_max* is non-zero.
488 	 */
489 	int leaf_nodes_identical;
490 
491 	RTE_STD_C11
492 	union {
493 		/** Items valid only for the non-leaf nodes on this level. */
494 		struct {
495 			/** Private shaper support. When non-zero, it indicates
496 			 * there is at least one non-leaf node on this level
497 			 * with private shaper support, which may not be the
498 			 * case for all the non-leaf nodes on this level.
499 			 */
500 			int shaper_private_supported;
501 
502 			/** Dual rate support for private shaper. Valid only
503 			 * when private shaper is supported for the non-leaf
504 			 * nodes on the current level. When non-zero, it
505 			 * indicates there is at least one non-leaf node on this
506 			 * level with dual rate private shaper support, which
507 			 * may not be the case for all the non-leaf nodes on
508 			 * this level.
509 			 */
510 			int shaper_private_dual_rate_supported;
511 
512 			/** Minimum committed/peak rate (bytes per second) for
513 			 * private shapers of the non-leaf nodes of this level.
514 			 * Valid only when private shaper is supported on this
515 			 * level.
516 			 */
517 			uint64_t shaper_private_rate_min;
518 
519 			/** Maximum committed/peak rate (bytes per second) for
520 			 * private shapers of the non-leaf nodes on this level.
521 			 * Valid only when private shaper is supported on this
522 			 * level.
523 			 */
524 			uint64_t shaper_private_rate_max;
525 
526 			/** Maximum number of shared shapers that any non-leaf
527 			 * node on this level can be part of. The value of zero
528 			 * indicates that shared shapers are not supported by
529 			 * the non-leaf nodes on this level. When non-zero, it
530 			 * indicates there is at least one non-leaf node on this
531 			 * level that meets this condition, which may not be the
532 			 * case for all the non-leaf nodes on this level.
533 			 */
534 			uint32_t shaper_shared_n_max;
535 
536 			/** Maximum number of children nodes. This parameter
537 			 * indicates that there is at least one non-leaf node on
538 			 * this level that can be configured with this many
539 			 * children nodes, which might not be true for all the
540 			 * non-leaf nodes on this level.
541 			 */
542 			uint32_t sched_n_children_max;
543 
544 			/** Maximum number of supported priority levels. This
545 			 * parameter indicates that there is at least one
546 			 * non-leaf node on this level that can be configured
547 			 * with this many priority levels for managing its
548 			 * children nodes, which might not be true for all the
549 			 * non-leaf nodes on this level. The value of zero is
550 			 * invalid. The value of 1 indicates that only priority
551 			 * 0 is supported, which essentially means that Strict
552 			 * Priority (SP) algorithm is not supported on this
553 			 * level.
554 			 */
555 			uint32_t sched_sp_n_priorities_max;
556 
557 			/** Maximum number of sibling nodes that can have the
558 			 * same priority at any given time, i.e. maximum size of
559 			 * the WFQ sibling node group. This parameter indicates
560 			 * there is at least one non-leaf node on this level
561 			 * that meets this condition, which may not be true for
562 			 * all the non-leaf nodes on this level. The value of
563 			 * zero is invalid. The value of 1 indicates that WFQ
564 			 * algorithm is not supported on this level. The maximum
565 			 * value is *sched_n_children_max*.
566 			 */
567 			uint32_t sched_wfq_n_children_per_group_max;
568 
569 			/** Maximum number of priority levels that can have
570 			 * more than one child node at any given time, i.e.
571 			 * maximum number of WFQ sibling node groups that
572 			 * have two or more members. This parameter indicates
573 			 * there is at least one non-leaf node on this level
574 			 * that meets this condition, which might not be true
575 			 * for all the non-leaf nodes. The value of zero states
576 			 * that WFQ algorithm is not supported on this level.
577 			 * The value of 1 indicates that
578 			 * (*sched_sp_n_priorities_max* - 1) priority levels on
579 			 * this level have at most one child node, so there can
580 			 * be only one priority level with two or more sibling
581 			 * nodes making up a WFQ group on this level. The
582 			 * maximum value is:
583 			 * min(floor(*sched_n_children_max* / 2),
584 			 * *sched_sp_n_priorities_max*).
585 			 */
586 			uint32_t sched_wfq_n_groups_max;
587 
588 			/** Maximum WFQ weight. The value of 1 indicates that
589 			 * all sibling nodes on this level with same priority
590 			 * have the same WFQ weight, so on this level WFQ is
591 			 * reduced to FQ.
592 			 */
593 			uint32_t sched_wfq_weight_max;
594 
595 			/** Mask of statistics counter types supported by the
596 			 * non-leaf nodes on this level. Every supported
597 			 * statistics counter type is supported by at least one
598 			 * non-leaf node on this level, which may not be true
599 			 * for all the non-leaf nodes on this level.
600 			 * @see enum rte_tm_stats_type
601 			 */
602 			uint64_t stats_mask;
603 		} nonleaf;
604 
605 		/** Items valid only for the leaf nodes on this level. */
606 		struct {
607 			/** Private shaper support. When non-zero, it indicates
608 			 * there is at least one leaf node on this level with
609 			 * private shaper support, which may not be the case for
610 			 * all the leaf nodes on this level.
611 			 */
612 			int shaper_private_supported;
613 
614 			/** Dual rate support for private shaper. Valid only
615 			 * when private shaper is supported for the leaf nodes
616 			 * on this level. When non-zero, it indicates there is
617 			 * at least one leaf node on this level with dual rate
618 			 * private shaper support, which may not be the case for
619 			 * all the leaf nodes on this level.
620 			 */
621 			int shaper_private_dual_rate_supported;
622 
623 			/** Minimum committed/peak rate (bytes per second) for
624 			 * private shapers of the leaf nodes of this level.
625 			 * Valid only when private shaper is supported for the
626 			 * leaf nodes on this level.
627 			 */
628 			uint64_t shaper_private_rate_min;
629 
630 			/** Maximum committed/peak rate (bytes per second) for
631 			 * private shapers of the leaf nodes on this level.
632 			 * Valid only when private shaper is supported for the
633 			 * leaf nodes on this level.
634 			 */
635 			uint64_t shaper_private_rate_max;
636 
637 			/** Maximum number of shared shapers that any leaf node
638 			 * on this level can be part of. The value of zero
639 			 * indicates that shared shapers are not supported by
640 			 * the leaf nodes on this level. When non-zero, it
641 			 * indicates there is at least one leaf node on this
642 			 * level that meets this condition, which may not be the
643 			 * case for all the leaf nodes on this level.
644 			 */
645 			uint32_t shaper_shared_n_max;
646 
647 			/** WRED packet mode support. When non-zero, this
648 			 * parameter indicates that there is at least one leaf
649 			 * node on this level that supports the WRED packet
650 			 * mode, which might not be true for all the leaf
651 			 * nodes. In packet mode, the WRED thresholds specify
652 			 * the queue length in packets, as opposed to bytes.
653 			 */
654 			int cman_wred_packet_mode_supported;
655 
656 			/** WRED byte mode support. When non-zero, this
657 			 * parameter indicates that there is at least one leaf
658 			 * node on this level that supports the WRED byte mode,
659 			 * which might not be true for all the leaf nodes. In
660 			 * byte mode, the WRED thresholds specify the queue
661 			 * length in bytes, as opposed to packets.
662 			 */
663 			int cman_wred_byte_mode_supported;
664 
665 			/** Head drop algorithm support. When non-zero, this
666 			 * parameter indicates that there is at least one leaf
667 			 * node on this level that supports the head drop
668 			 * algorithm, which might not be true for all the leaf
669 			 * nodes on this level.
670 			 */
671 			int cman_head_drop_supported;
672 
673 			/** Private WRED context support. When non-zero, it
674 			 * indicates there is at least one node on this level
675 			 * with private WRED context support, which may not be
676 			 * true for all the leaf nodes on this level.
677 			 */
678 			int cman_wred_context_private_supported;
679 
680 			/** Maximum number of shared WRED contexts that any
681 			 * leaf node on this level can be part of. The value of
682 			 * zero indicates that shared WRED contexts are not
683 			 * supported by the leaf nodes on this level. When
684 			 * non-zero, it indicates there is at least one leaf
685 			 * node on this level that meets this condition, which
686 			 * may not be the case for all the leaf nodes on this
687 			 * level.
688 			 */
689 			uint32_t cman_wred_context_shared_n_max;
690 
691 			/** Mask of statistics counter types supported by the
692 			 * leaf nodes on this level. Every supported statistics
693 			 * counter type is supported by at least one leaf node
694 			 * on this level, which may not be true for all the leaf
695 			 * nodes on this level.
696 			 * @see enum rte_tm_stats_type
697 			 */
698 			uint64_t stats_mask;
699 		} leaf;
700 	};
701 };
702 
703 /**
704  * Traffic manager node capabilities
705  */
706 struct rte_tm_node_capabilities {
707 	/** Private shaper support for the current node. */
708 	int shaper_private_supported;
709 
710 	/** Dual rate shaping support for private shaper of current node.
711 	 * Valid only when private shaper is supported by the current node.
712 	 */
713 	int shaper_private_dual_rate_supported;
714 
715 	/** Minimum committed/peak rate (bytes per second) for private
716 	 * shaper of current node. Valid only when private shaper is supported
717 	 * by the current node.
718 	 */
719 	uint64_t shaper_private_rate_min;
720 
721 	/** Maximum committed/peak rate (bytes per second) for private
722 	 * shaper of current node. Valid only when private shaper is supported
723 	 * by the current node.
724 	 */
725 	uint64_t shaper_private_rate_max;
726 
727 	/** Maximum number of shared shapers the current node can be part of.
728 	 * The value of zero indicates that shared shapers are not supported by
729 	 * the current node.
730 	 */
731 	uint32_t shaper_shared_n_max;
732 
733 	RTE_STD_C11
734 	union {
735 		/** Items valid only for non-leaf nodes. */
736 		struct {
737 			/** Maximum number of children nodes. */
738 			uint32_t sched_n_children_max;
739 
740 			/** Maximum number of supported priority levels. The
741 			 * value of zero is invalid. The value of 1 indicates
742 			 * that only priority 0 is supported, which essentially
743 			 * means that Strict Priority (SP) algorithm is not
744 			 * supported.
745 			 */
746 			uint32_t sched_sp_n_priorities_max;
747 
748 			/** Maximum number of sibling nodes that can have the
749 			 * same priority at any given time, i.e. maximum size
750 			 * of the WFQ sibling node group. The value of zero
751 			 * is invalid. The value of 1 indicates that WFQ
752 			 * algorithm is not supported. The maximum value is
753 			 * *sched_n_children_max*.
754 			 */
755 			uint32_t sched_wfq_n_children_per_group_max;
756 
757 			/** Maximum number of priority levels that can have
758 			 * more than one child node at any given time, i.e.
759 			 * maximum number of WFQ sibling node groups that have
760 			 * two or more members. The value of zero states that
761 			 * WFQ algorithm is not supported. The value of 1
762 			 * indicates that (*sched_sp_n_priorities_max* - 1)
763 			 * priority levels have at most one child node, so there
764 			 * can be only one priority level with two or more
765 			 * sibling nodes making up a WFQ group. The maximum
766 			 * value is: min(floor(*sched_n_children_max* / 2),
767 			 * *sched_sp_n_priorities_max*).
768 			 */
769 			uint32_t sched_wfq_n_groups_max;
770 
771 			/** Maximum WFQ weight. The value of 1 indicates that
772 			 * all sibling nodes with same priority have the same
773 			 * WFQ weight, so WFQ is reduced to FQ.
774 			 */
775 			uint32_t sched_wfq_weight_max;
776 		} nonleaf;
777 
778 		/** Items valid only for leaf nodes. */
779 		struct {
780 			/** WRED packet mode support for current node. */
781 			int cman_wred_packet_mode_supported;
782 
783 			/** WRED byte mode support for current node. */
784 			int cman_wred_byte_mode_supported;
785 
786 			/** Head drop algorithm support for current node. */
787 			int cman_head_drop_supported;
788 
789 			/** Private WRED context support for current node. */
790 			int cman_wred_context_private_supported;
791 
792 			/** Maximum number of shared WRED contexts the current
793 			 * node can be part of. The value of zero indicates that
794 			 * shared WRED contexts are not supported by the current
795 			 * node.
796 			 */
797 			uint32_t cman_wred_context_shared_n_max;
798 		} leaf;
799 	};
800 
801 	/** Mask of statistics counter types supported by the current node.
802 	 * @see enum rte_tm_stats_type
803 	 */
804 	uint64_t stats_mask;
805 };
806 
807 /**
808  * Congestion management (CMAN) mode
809  *
810  * This is used for controlling the admission of packets into a packet queue or
811  * group of packet queues on congestion. On request of writing a new packet
812  * into the current queue while the queue is full, the *tail drop* algorithm
813  * drops the new packet while leaving the queue unmodified, as opposed to *head
814  * drop* algorithm, which drops the packet at the head of the queue (the oldest
815  * packet waiting in the queue) and admits the new packet at the tail of the
816  * queue.
817  *
818  * The *Random Early Detection (RED)* algorithm works by proactively dropping
819  * more and more input packets as the queue occupancy builds up. When the queue
820  * is full or almost full, RED effectively works as *tail drop*. The *Weighted
821  * RED* algorithm uses a separate set of RED thresholds for each packet color.
822  */
823 enum rte_tm_cman_mode {
824 	RTE_TM_CMAN_TAIL_DROP = 0, /**< Tail drop */
825 	RTE_TM_CMAN_HEAD_DROP, /**< Head drop */
826 	RTE_TM_CMAN_WRED, /**< Weighted Random Early Detection (WRED) */
827 };
828 
829 /**
830  * Random Early Detection (RED) profile
831  */
832 struct rte_tm_red_params {
833 	/** Minimum queue threshold */
834 	uint64_t min_th;
835 
836 	/** Maximum queue threshold */
837 	uint64_t max_th;
838 
839 	/** Inverse of packet marking probability maximum value (maxp), i.e.
840 	 * maxp_inv = 1 / maxp
841 	 */
842 	uint16_t maxp_inv;
843 
844 	/** Negated log2 of queue weight (wq), i.e. wq = 1 / (2 ^ wq_log2) */
845 	uint16_t wq_log2;
846 };
847 
848 /**
849  * Weighted RED (WRED) profile
850  *
851  * Multiple WRED contexts can share the same WRED profile. Each leaf node with
852  * WRED enabled as its congestion management mode has zero or one private WRED
853  * context (only one leaf node using it) and/or zero, one or several shared
854  * WRED contexts (multiple leaf nodes use the same WRED context). A private
855  * WRED context is used to perform congestion management for a single leaf
856  * node, while a shared WRED context is used to perform congestion management
857  * for a group of leaf nodes.
858  *
859  * @see struct rte_tm_capabilities::cman_wred_packet_mode_supported
860  * @see struct rte_tm_capabilities::cman_wred_byte_mode_supported
861  */
862 struct rte_tm_wred_params {
863 	/** One set of RED parameters per packet color */
864 	struct rte_tm_red_params red_params[RTE_TM_COLORS];
865 
866 	/** When non-zero, the *min_th* and *max_th* thresholds are specified
867 	 * in packets (WRED packet mode). When zero, the *min_th* and *max_th*
868 	 * thresholds are specified in bytes (WRED byte mode)
869 	 */
870 	int packet_mode;
871 };
872 
873 /**
874  * Token bucket
875  */
876 struct rte_tm_token_bucket {
877 	/** Token bucket rate (bytes per second) */
878 	uint64_t rate;
879 
880 	/** Token bucket size (bytes), a.k.a. max burst size */
881 	uint64_t size;
882 };
883 
884 /**
885  * Shaper (rate limiter) profile
886  *
887  * Multiple shaper instances can share the same shaper profile. Each node has
888  * zero or one private shaper (only one node using it) and/or zero, one or
889  * several shared shapers (multiple nodes use the same shaper instance).
890  * A private shaper is used to perform traffic shaping for a single node, while
891  * a shared shaper is used to perform traffic shaping for a group of nodes.
892  *
893  * Single rate shapers use a single token bucket. A single rate shaper can be
894  * configured by setting the rate of the committed bucket to zero, which
895  * effectively disables this bucket. The peak bucket is used to limit the rate
896  * and the burst size for the current shaper.
897  *
898  * Dual rate shapers use both the committed and the peak token buckets. The
899  * rate of the peak bucket has to be bigger than zero, as well as greater than
900  * or equal to the rate of the committed bucket.
901  */
902 struct rte_tm_shaper_params {
903 	/** Committed token bucket */
904 	struct rte_tm_token_bucket committed;
905 
906 	/** Peak token bucket */
907 	struct rte_tm_token_bucket peak;
908 
909 	/** Signed value to be added to the length of each packet for the
910 	 * purpose of shaping. Can be used to correct the packet length with
911 	 * the framing overhead bytes that are also consumed on the wire (e.g.
912 	 * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
913 	 */
914 	int32_t pkt_length_adjust;
915 };
916 
917 /**
918  * Node parameters
919  *
920  * Each non-leaf node has multiple inputs (its children nodes) and single output
921  * (which is input to its parent node). It arbitrates its inputs using Strict
922  * Priority (SP) and Weighted Fair Queuing (WFQ) algorithms to schedule input
923  * packets to its output while observing its shaping (rate limiting)
924  * constraints.
925  *
926  * Algorithms such as Weighted Round Robin (WRR), Byte-level WRR, Deficit WRR
927  * (DWRR), etc. are considered approximations of the WFQ ideal and are
928  * assimilated to WFQ, although an associated implementation-dependent trade-off
929  * on accuracy, performance and resource usage might exist.
930  *
931  * Children nodes with different priorities are scheduled using the SP algorithm
932  * based on their priority, with zero (0) as the highest priority. Children with
933  * the same priority are scheduled using the WFQ algorithm according to their
934  * weights. The WFQ weight of a given child node is relative to the sum of the
935  * weights of all its sibling nodes that have the same priority, with one (1) as
936  * the lowest weight. For each SP priority, the WFQ weight mode can be set as
937  * either byte-based or packet-based.
938  *
939  * Each leaf node sits on top of a TX queue of the current Ethernet port. Hence,
940  * the leaf nodes are predefined, with their node IDs set to 0 .. (N-1), where N
941  * is the number of TX queues configured for the current Ethernet port. The
942  * non-leaf nodes have their IDs generated by the application.
943  */
944 struct rte_tm_node_params {
945 	/** Shaper profile for the private shaper. The absence of the private
946 	 * shaper for the current node is indicated by setting this parameter
947 	 * to RTE_TM_SHAPER_PROFILE_ID_NONE.
948 	 */
949 	uint32_t shaper_profile_id;
950 
951 	/** User allocated array of valid shared shaper IDs. */
952 	uint32_t *shared_shaper_id;
953 
954 	/** Number of shared shaper IDs in the *shared_shaper_id* array. */
955 	uint32_t n_shared_shapers;
956 
957 	RTE_STD_C11
958 	union {
959 		/** Parameters only valid for non-leaf nodes. */
960 		struct {
961 			/** WFQ weight mode for each SP priority. When NULL, it
962 			 * indicates that WFQ is to be used for all priorities.
963 			 * When non-NULL, it points to a pre-allocated array of
964 			 * *n_sp_priorities* values, with non-zero value for
965 			 * byte-mode and zero for packet-mode.
966 			 */
967 			int *wfq_weight_mode;
968 
969 			/** Number of SP priorities. */
970 			uint32_t n_sp_priorities;
971 		} nonleaf;
972 
973 		/** Parameters only valid for leaf nodes. */
974 		struct {
975 			/** Congestion management mode */
976 			enum rte_tm_cman_mode cman;
977 
978 			/** WRED parameters (only valid when *cman* is set to
979 			 * WRED).
980 			 */
981 			struct {
982 				/** WRED profile for private WRED context. The
983 				 * absence of a private WRED context for the
984 				 * current leaf node is indicated by value
985 				 * RTE_TM_WRED_PROFILE_ID_NONE.
986 				 */
987 				uint32_t wred_profile_id;
988 
989 				/** User allocated array of shared WRED context
990 				 * IDs. When set to NULL, it indicates that the
991 				 * current leaf node should not currently be
992 				 * part of any shared WRED contexts.
993 				 */
994 				uint32_t *shared_wred_context_id;
995 
996 				/** Number of elements in the
997 				 * *shared_wred_context_id* array. Only valid
998 				 * when *shared_wred_context_id* is non-NULL,
999 				 * in which case it should be non-zero.
1000 				 */
1001 				uint32_t n_shared_wred_contexts;
1002 			} wred;
1003 		} leaf;
1004 	};
1005 
1006 	/** Mask of statistics counter types to be enabled for this node. This
1007 	 * needs to be a subset of the statistics counter types available for
1008 	 * the current node. Any statistics counter type not included in this
1009 	 * set is to be disabled for the current node.
1010 	 * @see enum rte_tm_stats_type
1011 	 */
1012 	uint64_t stats_mask;
1013 };
1014 
1015 /**
1016  * Verbose error types.
1017  *
1018  * Most of them provide the type of the object referenced by struct
1019  * rte_tm_error::cause.
1020  */
1021 enum rte_tm_error_type {
1022 	RTE_TM_ERROR_TYPE_NONE, /**< No error. */
1023 	RTE_TM_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
1024 	RTE_TM_ERROR_TYPE_CAPABILITIES,
1025 	RTE_TM_ERROR_TYPE_LEVEL_ID,
1026 	RTE_TM_ERROR_TYPE_WRED_PROFILE,
1027 	RTE_TM_ERROR_TYPE_WRED_PROFILE_GREEN,
1028 	RTE_TM_ERROR_TYPE_WRED_PROFILE_YELLOW,
1029 	RTE_TM_ERROR_TYPE_WRED_PROFILE_RED,
1030 	RTE_TM_ERROR_TYPE_WRED_PROFILE_ID,
1031 	RTE_TM_ERROR_TYPE_SHARED_WRED_CONTEXT_ID,
1032 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE,
1033 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_RATE,
1034 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_SIZE,
1035 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_RATE,
1036 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_SIZE,
1037 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PKT_ADJUST_LEN,
1038 	RTE_TM_ERROR_TYPE_SHAPER_PROFILE_ID,
1039 	RTE_TM_ERROR_TYPE_SHARED_SHAPER_ID,
1040 	RTE_TM_ERROR_TYPE_NODE_PARENT_NODE_ID,
1041 	RTE_TM_ERROR_TYPE_NODE_PRIORITY,
1042 	RTE_TM_ERROR_TYPE_NODE_WEIGHT,
1043 	RTE_TM_ERROR_TYPE_NODE_PARAMS,
1044 	RTE_TM_ERROR_TYPE_NODE_PARAMS_SHAPER_PROFILE_ID,
1045 	RTE_TM_ERROR_TYPE_NODE_PARAMS_SHARED_SHAPER_ID,
1046 	RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_SHAPERS,
1047 	RTE_TM_ERROR_TYPE_NODE_PARAMS_WFQ_WEIGHT_MODE,
1048 	RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SP_PRIORITIES,
1049 	RTE_TM_ERROR_TYPE_NODE_PARAMS_CMAN,
1050 	RTE_TM_ERROR_TYPE_NODE_PARAMS_WRED_PROFILE_ID,
1051 	RTE_TM_ERROR_TYPE_NODE_PARAMS_SHARED_WRED_CONTEXT_ID,
1052 	RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_WRED_CONTEXTS,
1053 	RTE_TM_ERROR_TYPE_NODE_PARAMS_STATS,
1054 	RTE_TM_ERROR_TYPE_NODE_ID,
1055 };
1056 
1057 /**
1058  * Verbose error structure definition.
1059  *
1060  * This object is normally allocated by applications and set by PMDs, the
1061  * message points to a constant string which does not need to be freed by
1062  * the application, however its pointer can be considered valid only as long
1063  * as its associated DPDK port remains configured. Closing the underlying
1064  * device or unloading the PMD invalidates it.
1065  *
1066  * Both cause and message may be NULL regardless of the error type.
1067  */
1068 struct rte_tm_error {
1069 	enum rte_tm_error_type type; /**< Cause field and error type. */
1070 	const void *cause; /**< Object responsible for the error. */
1071 	const char *message; /**< Human-readable error message. */
1072 };
1073 
1074 /**
1075  * Traffic manager get number of leaf nodes
1076  *
1077  * Each leaf node sits on on top of a TX queue of the current Ethernet port.
1078  * Therefore, the set of leaf nodes is predefined, their number is always equal
1079  * to N (where N is the number of TX queues configured for the current port)
1080  * and their IDs are 0 .. (N-1).
1081  *
1082  * @param[in] port_id
1083  *   The port identifier of the Ethernet device.
1084  * @param[out] n_leaf_nodes
1085  *   Number of leaf nodes for the current port.
1086  * @param[out] error
1087  *   Error details. Filled in only on error, when not NULL.
1088  * @return
1089  *   0 on success, non-zero error code otherwise.
1090  */
1091 int
1092 rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
1093 	uint32_t *n_leaf_nodes,
1094 	struct rte_tm_error *error);
1095 
1096 /**
1097  * Traffic manager node ID validate and type (i.e. leaf or non-leaf) get
1098  *
1099  * The leaf nodes have predefined IDs in the range of 0 .. (N-1), where N is
1100  * the number of TX queues of the current Ethernet port. The non-leaf nodes
1101  * have their IDs generated by the application outside of the above range,
1102  * which is reserved for leaf nodes.
1103  *
1104  * @param[in] port_id
1105  *   The port identifier of the Ethernet device.
1106  * @param[in] node_id
1107  *   Node ID value. Needs to be valid.
1108  * @param[out] is_leaf
1109  *   Set to non-zero value when node is leaf and to zero otherwise (non-leaf).
1110  * @param[out] error
1111  *   Error details. Filled in only on error, when not NULL.
1112  * @return
1113  *   0 on success, non-zero error code otherwise.
1114  */
1115 int
1116 rte_tm_node_type_get(uint16_t port_id,
1117 	uint32_t node_id,
1118 	int *is_leaf,
1119 	struct rte_tm_error *error);
1120 
1121 /**
1122  * Traffic manager capabilities get
1123  *
1124  * @param[in] port_id
1125  *   The port identifier of the Ethernet device.
1126  * @param[out] cap
1127  *   Traffic manager capabilities. Needs to be pre-allocated and valid.
1128  * @param[out] error
1129  *   Error details. Filled in only on error, when not NULL.
1130  * @return
1131  *   0 on success, non-zero error code otherwise.
1132  */
1133 int
1134 rte_tm_capabilities_get(uint16_t port_id,
1135 	struct rte_tm_capabilities *cap,
1136 	struct rte_tm_error *error);
1137 
1138 /**
1139  * Traffic manager level capabilities get
1140  *
1141  * @param[in] port_id
1142  *   The port identifier of the Ethernet device.
1143  * @param[in] level_id
1144  *   The hierarchy level identifier. The value of 0 identifies the level of the
1145  *   root node.
1146  * @param[out] cap
1147  *   Traffic manager level capabilities. Needs to be pre-allocated and valid.
1148  * @param[out] error
1149  *   Error details. Filled in only on error, when not NULL.
1150  * @return
1151  *   0 on success, non-zero error code otherwise.
1152  */
1153 int
1154 rte_tm_level_capabilities_get(uint16_t port_id,
1155 	uint32_t level_id,
1156 	struct rte_tm_level_capabilities *cap,
1157 	struct rte_tm_error *error);
1158 
1159 /**
1160  * Traffic manager node capabilities get
1161  *
1162  * @param[in] port_id
1163  *   The port identifier of the Ethernet device.
1164  * @param[in] node_id
1165  *   Node ID. Needs to be valid.
1166  * @param[out] cap
1167  *   Traffic manager node capabilities. Needs to be pre-allocated and valid.
1168  * @param[out] error
1169  *   Error details. Filled in only on error, when not NULL.
1170  * @return
1171  *   0 on success, non-zero error code otherwise.
1172  */
1173 int
1174 rte_tm_node_capabilities_get(uint16_t port_id,
1175 	uint32_t node_id,
1176 	struct rte_tm_node_capabilities *cap,
1177 	struct rte_tm_error *error);
1178 
1179 /**
1180  * Traffic manager WRED profile add
1181  *
1182  * Create a new WRED profile with ID set to *wred_profile_id*. The new profile
1183  * is used to create one or several WRED contexts.
1184  *
1185  * @param[in] port_id
1186  *   The port identifier of the Ethernet device.
1187  * @param[in] wred_profile_id
1188  *   WRED profile ID for the new profile. Needs to be unused.
1189  * @param[in] profile
1190  *   WRED profile parameters. Needs to be pre-allocated and valid.
1191  * @param[out] error
1192  *   Error details. Filled in only on error, when not NULL.
1193  * @return
1194  *   0 on success, non-zero error code otherwise.
1195  *
1196  * @see struct rte_tm_capabilities::cman_wred_context_n_max
1197  */
1198 int
1199 rte_tm_wred_profile_add(uint16_t port_id,
1200 	uint32_t wred_profile_id,
1201 	struct rte_tm_wred_params *profile,
1202 	struct rte_tm_error *error);
1203 
1204 /**
1205  * Traffic manager WRED profile delete
1206  *
1207  * Delete an existing WRED profile. This operation fails when there is
1208  * currently at least one user (i.e. WRED context) of this WRED profile.
1209  *
1210  * @param[in] port_id
1211  *   The port identifier of the Ethernet device.
1212  * @param[in] wred_profile_id
1213  *   WRED profile ID. Needs to be the valid.
1214  * @param[out] error
1215  *   Error details. Filled in only on error, when not NULL.
1216  * @return
1217  *   0 on success, non-zero error code otherwise.
1218  *
1219  * @see struct rte_tm_capabilities::cman_wred_context_n_max
1220  */
1221 int
1222 rte_tm_wred_profile_delete(uint16_t port_id,
1223 	uint32_t wred_profile_id,
1224 	struct rte_tm_error *error);
1225 
1226 /**
1227  * Traffic manager shared WRED context add or update
1228  *
1229  * When *shared_wred_context_id* is invalid, a new WRED context with this ID is
1230  * created by using the WRED profile identified by *wred_profile_id*.
1231  *
1232  * When *shared_wred_context_id* is valid, this WRED context is no longer using
1233  * the profile previously assigned to it and is updated to use the profile
1234  * identified by *wred_profile_id*.
1235  *
1236  * A valid shared WRED context can be assigned to several hierarchy leaf nodes
1237  * configured to use WRED as the congestion management mode.
1238  *
1239  * @param[in] port_id
1240  *   The port identifier of the Ethernet device.
1241  * @param[in] shared_wred_context_id
1242  *   Shared WRED context ID
1243  * @param[in] wred_profile_id
1244  *   WRED profile ID. Needs to be the valid.
1245  * @param[out] error
1246  *   Error details. Filled in only on error, when not NULL.
1247  * @return
1248  *   0 on success, non-zero error code otherwise.
1249  *
1250  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
1251  */
1252 int
1253 rte_tm_shared_wred_context_add_update(uint16_t port_id,
1254 	uint32_t shared_wred_context_id,
1255 	uint32_t wred_profile_id,
1256 	struct rte_tm_error *error);
1257 
1258 /**
1259  * Traffic manager shared WRED context delete
1260  *
1261  * Delete an existing shared WRED context. This operation fails when there is
1262  * currently at least one user (i.e. hierarchy leaf node) of this shared WRED
1263  * context.
1264  *
1265  * @param[in] port_id
1266  *   The port identifier of the Ethernet device.
1267  * @param[in] shared_wred_context_id
1268  *   Shared WRED context ID. Needs to be the valid.
1269  * @param[out] error
1270  *   Error details. Filled in only on error, when not NULL.
1271  * @return
1272  *   0 on success, non-zero error code otherwise.
1273  *
1274  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
1275  */
1276 int
1277 rte_tm_shared_wred_context_delete(uint16_t port_id,
1278 	uint32_t shared_wred_context_id,
1279 	struct rte_tm_error *error);
1280 
1281 /**
1282  * Traffic manager shaper profile add
1283  *
1284  * Create a new shaper profile with ID set to *shaper_profile_id*. The new
1285  * shaper profile is used to create one or several shapers.
1286  *
1287  * @param[in] port_id
1288  *   The port identifier of the Ethernet device.
1289  * @param[in] shaper_profile_id
1290  *   Shaper profile ID for the new profile. Needs to be unused.
1291  * @param[in] profile
1292  *   Shaper profile parameters. Needs to be pre-allocated and valid.
1293  * @param[out] error
1294  *   Error details. Filled in only on error, when not NULL.
1295  * @return
1296  *   0 on success, non-zero error code otherwise.
1297  *
1298  * @see struct rte_tm_capabilities::shaper_n_max
1299  */
1300 int
1301 rte_tm_shaper_profile_add(uint16_t port_id,
1302 	uint32_t shaper_profile_id,
1303 	struct rte_tm_shaper_params *profile,
1304 	struct rte_tm_error *error);
1305 
1306 /**
1307  * Traffic manager shaper profile delete
1308  *
1309  * Delete an existing shaper profile. This operation fails when there is
1310  * currently at least one user (i.e. shaper) of this shaper profile.
1311  *
1312  * @param[in] port_id
1313  *   The port identifier of the Ethernet device.
1314  * @param[in] shaper_profile_id
1315  *   Shaper profile ID. Needs to be the valid.
1316  * @param[out] error
1317  *   Error details. Filled in only on error, when not NULL.
1318  * @return
1319  *   0 on success, non-zero error code otherwise.
1320  *
1321  * @see struct rte_tm_capabilities::shaper_n_max
1322  */
1323 int
1324 rte_tm_shaper_profile_delete(uint16_t port_id,
1325 	uint32_t shaper_profile_id,
1326 	struct rte_tm_error *error);
1327 
1328 /**
1329  * Traffic manager shared shaper add or update
1330  *
1331  * When *shared_shaper_id* is not a valid shared shaper ID, a new shared shaper
1332  * with this ID is created using the shaper profile identified by
1333  * *shaper_profile_id*.
1334  *
1335  * When *shared_shaper_id* is a valid shared shaper ID, this shared shaper is
1336  * no longer using the shaper profile previously assigned to it and is updated
1337  * to use the shaper profile identified by *shaper_profile_id*.
1338  *
1339  * @param[in] port_id
1340  *   The port identifier of the Ethernet device.
1341  * @param[in] shared_shaper_id
1342  *   Shared shaper ID
1343  * @param[in] shaper_profile_id
1344  *   Shaper profile ID. Needs to be the valid.
1345  * @param[out] error
1346  *   Error details. Filled in only on error, when not NULL.
1347  * @return
1348  *   0 on success, non-zero error code otherwise.
1349  *
1350  * @see struct rte_tm_capabilities::shaper_shared_n_max
1351  */
1352 int
1353 rte_tm_shared_shaper_add_update(uint16_t port_id,
1354 	uint32_t shared_shaper_id,
1355 	uint32_t shaper_profile_id,
1356 	struct rte_tm_error *error);
1357 
1358 /**
1359  * Traffic manager shared shaper delete
1360  *
1361  * Delete an existing shared shaper. This operation fails when there is
1362  * currently at least one user (i.e. hierarchy node) of this shared shaper.
1363  *
1364  * @param[in] port_id
1365  *   The port identifier of the Ethernet device.
1366  * @param[in] shared_shaper_id
1367  *   Shared shaper ID. Needs to be the valid.
1368  * @param[out] error
1369  *   Error details. Filled in only on error, when not NULL.
1370  * @return
1371  *   0 on success, non-zero error code otherwise.
1372  *
1373  * @see struct rte_tm_capabilities::shaper_shared_n_max
1374  */
1375 int
1376 rte_tm_shared_shaper_delete(uint16_t port_id,
1377 	uint32_t shared_shaper_id,
1378 	struct rte_tm_error *error);
1379 
1380 /**
1381  * Traffic manager node add
1382  *
1383  * Create new node and connect it as child of an existing node. The new node is
1384  * further identified by *node_id*, which needs to be unused by any of the
1385  * existing nodes. The parent node is identified by *parent_node_id*, which
1386  * needs to be the valid ID of an existing non-leaf node. The parent node is
1387  * going to use the provided SP *priority* and WFQ *weight* to schedule its new
1388  * child node.
1389  *
1390  * This function has to be called for both leaf and non-leaf nodes. In the case
1391  * of leaf nodes (i.e. *node_id* is within the range of 0 .. (N-1), with N as
1392  * the number of configured TX queues of the current port), the leaf node is
1393  * configured rather than created (as the set of leaf nodes is predefined) and
1394  * it is also connected as child of an existing node.
1395  *
1396  * The first node that is added becomes the root node and all the nodes that
1397  * are subsequently added have to be added as descendants of the root node. The
1398  * parent of the root node has to be specified as RTE_TM_NODE_ID_NULL and there
1399  * can only be one node with this parent ID (i.e. the root node). Further
1400  * restrictions for root node: needs to be non-leaf, its private shaper profile
1401  * needs to be valid and single rate, cannot use any shared shapers.
1402  *
1403  * When called before rte_tm_hierarchy_commit() invocation, this function is
1404  * typically used to define the initial start-up hierarchy for the port.
1405  * Provided that dynamic hierarchy updates are supported by the current port (as
1406  * advertised in the port capability set), this function can be also called
1407  * after the rte_tm_hierarchy_commit() invocation.
1408  *
1409  * @param[in] port_id
1410  *   The port identifier of the Ethernet device.
1411  * @param[in] node_id
1412  *   Node ID. Needs to be unused by any of the existing nodes.
1413  * @param[in] parent_node_id
1414  *   Parent node ID. Needs to be the valid.
1415  * @param[in] priority
1416  *   Node priority. The highest node priority is zero. Used by the SP algorithm
1417  *   running on the parent of the current node for scheduling this child node.
1418  * @param[in] weight
1419  *   Node weight. The node weight is relative to the weight sum of all siblings
1420  *   that have the same priority. The lowest weight is one. Used by the WFQ
1421  *   algorithm running on the parent of the current node for scheduling this
1422  *   child node.
1423  * @param[in] level_id
1424  *   Level ID that should be met by this node. The hierarchy level of the
1425  *   current node is already fully specified through its parent node (i.e. the
1426  *   level of this node is equal to the level of its parent node plus one),
1427  *   therefore the reason for providing this parameter is to enable the
1428  *   application to perform step-by-step checking of the node level during
1429  *   successive invocations of this function. When not desired, this check can
1430  *   be disabled by assigning value RTE_TM_NODE_LEVEL_ID_ANY to this parameter.
1431  * @param[in] params
1432  *   Node parameters. Needs to be pre-allocated and valid.
1433  * @param[out] error
1434  *   Error details. Filled in only on error, when not NULL.
1435  * @return
1436  *   0 on success, non-zero error code otherwise.
1437  *
1438  * @see rte_tm_hierarchy_commit()
1439  * @see RTE_TM_UPDATE_NODE_ADD_DELETE
1440  * @see RTE_TM_NODE_LEVEL_ID_ANY
1441  * @see struct rte_tm_capabilities
1442  */
1443 int
1444 rte_tm_node_add(uint16_t port_id,
1445 	uint32_t node_id,
1446 	uint32_t parent_node_id,
1447 	uint32_t priority,
1448 	uint32_t weight,
1449 	uint32_t level_id,
1450 	struct rte_tm_node_params *params,
1451 	struct rte_tm_error *error);
1452 
1453 /**
1454  * Traffic manager node delete
1455  *
1456  * Delete an existing node. This operation fails when this node currently has
1457  * at least one user (i.e. child node).
1458  *
1459  * When called before rte_tm_hierarchy_commit() invocation, this function is
1460  * typically used to define the initial start-up hierarchy for the port.
1461  * Provided that dynamic hierarchy updates are supported by the current port (as
1462  * advertised in the port capability set), this function can be also called
1463  * after the rte_tm_hierarchy_commit() invocation.
1464  *
1465  * @param[in] port_id
1466  *   The port identifier of the Ethernet device.
1467  * @param[in] node_id
1468  *   Node ID. Needs to be valid.
1469  * @param[out] error
1470  *   Error details. Filled in only on error, when not NULL.
1471  * @return
1472  *   0 on success, non-zero error code otherwise.
1473  *
1474  * @see RTE_TM_UPDATE_NODE_ADD_DELETE
1475  */
1476 int
1477 rte_tm_node_delete(uint16_t port_id,
1478 	uint32_t node_id,
1479 	struct rte_tm_error *error);
1480 
1481 /**
1482  * Traffic manager node suspend
1483  *
1484  * Suspend an existing node. While the node is in suspended state, no packet is
1485  * scheduled from this node and its descendants. The node exits the suspended
1486  * state through the node resume operation.
1487  *
1488  * @param[in] port_id
1489  *   The port identifier of the Ethernet device.
1490  * @param[in] node_id
1491  *   Node ID. Needs to be valid.
1492  * @param[out] error
1493  *   Error details. Filled in only on error, when not NULL.
1494  * @return
1495  *   0 on success, non-zero error code otherwise.
1496  *
1497  * @see rte_tm_node_resume()
1498  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
1499  */
1500 int
1501 rte_tm_node_suspend(uint16_t port_id,
1502 	uint32_t node_id,
1503 	struct rte_tm_error *error);
1504 
1505 /**
1506  * Traffic manager node resume
1507  *
1508  * Resume an existing node that is currently in suspended state. The node
1509  * entered the suspended state as result of a previous node suspend operation.
1510  *
1511  * @param[in] port_id
1512  *   The port identifier of the Ethernet device.
1513  * @param[in] node_id
1514  *   Node ID. Needs to be valid.
1515  * @param[out] error
1516  *   Error details. Filled in only on error, when not NULL.
1517  * @return
1518  *   0 on success, non-zero error code otherwise.
1519  *
1520  * @see rte_tm_node_suspend()
1521  * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
1522  */
1523 int
1524 rte_tm_node_resume(uint16_t port_id,
1525 	uint32_t node_id,
1526 	struct rte_tm_error *error);
1527 
1528 /**
1529  * Traffic manager hierarchy commit
1530  *
1531  * This function is called during the port initialization phase (before the
1532  * Ethernet port is started) to freeze the start-up hierarchy.
1533  *
1534  * This function typically performs the following steps:
1535  *    a) It validates the start-up hierarchy that was previously defined for the
1536  *       current port through successive rte_tm_node_add() invocations;
1537  *    b) Assuming successful validation, it performs all the necessary port
1538  *       specific configuration operations to install the specified hierarchy on
1539  *       the current port, with immediate effect once the port is started.
1540  *
1541  * This function fails when the currently configured hierarchy is not supported
1542  * by the Ethernet port, in which case the user can abort or try out another
1543  * hierarchy configuration (e.g. a hierarchy with less leaf nodes), which can be
1544  * build from scratch (when *clear_on_fail* is enabled) or by modifying the
1545  * existing hierarchy configuration (when *clear_on_fail* is disabled).
1546  *
1547  * Note that this function can still fail due to other causes (e.g. not enough
1548  * memory available in the system, etc), even though the specified hierarchy is
1549  * supported in principle by the current port.
1550  *
1551  * @param[in] port_id
1552  *   The port identifier of the Ethernet device.
1553  * @param[in] clear_on_fail
1554  *   On function call failure, hierarchy is cleared when this parameter is
1555  *   non-zero and preserved when this parameter is equal to zero.
1556  * @param[out] error
1557  *   Error details. Filled in only on error, when not NULL.
1558  * @return
1559  *   0 on success, non-zero error code otherwise.
1560  *
1561  * @see rte_tm_node_add()
1562  * @see rte_tm_node_delete()
1563  */
1564 int
1565 rte_tm_hierarchy_commit(uint16_t port_id,
1566 	int clear_on_fail,
1567 	struct rte_tm_error *error);
1568 
1569 /**
1570  * Traffic manager node parent update
1571  *
1572  * This function may be used to move a node and its children to a different
1573  * parent.  Additionally, if the new parent is the same as the current parent,
1574  * this function will update the priority/weight of an existing node.
1575  *
1576  * Restriction for root node: its parent cannot be changed.
1577  *
1578  * This function can only be called after the rte_tm_hierarchy_commit()
1579  * invocation. Its success depends on the port support for this operation, as
1580  * advertised through the port capability set.
1581  *
1582  * @param[in] port_id
1583  *   The port identifier of the Ethernet device.
1584  * @param[in] node_id
1585  *   Node ID. Needs to be valid.
1586  * @param[in] parent_node_id
1587  *   Node ID for the new parent. Needs to be valid.
1588  * @param[in] priority
1589  *   Node priority. The highest node priority is zero. Used by the SP algorithm
1590  *   running on the parent of the current node for scheduling this child node.
1591  * @param[in] weight
1592  *   Node weight. The node weight is relative to the weight sum of all siblings
1593  *   that have the same priority. The lowest weight is zero. Used by the WFQ
1594  *   algorithm running on the parent of the current node for scheduling this
1595  *   child node.
1596  * @param[out] error
1597  *   Error details. Filled in only on error, when not NULL.
1598  * @return
1599  *   0 on success, non-zero error code otherwise.
1600  *
1601  * @see RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL
1602  * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL
1603  */
1604 int
1605 rte_tm_node_parent_update(uint16_t port_id,
1606 	uint32_t node_id,
1607 	uint32_t parent_node_id,
1608 	uint32_t priority,
1609 	uint32_t weight,
1610 	struct rte_tm_error *error);
1611 
1612 /**
1613  * Traffic manager node private shaper update
1614  *
1615  * Restriction for the root node: its private shaper profile needs to be valid
1616  * and single rate.
1617  *
1618  * @param[in] port_id
1619  *   The port identifier of the Ethernet device.
1620  * @param[in] node_id
1621  *   Node ID. Needs to be valid.
1622  * @param[in] shaper_profile_id
1623  *   Shaper profile ID for the private shaper of the current node. Needs to be
1624  *   either valid shaper profile ID or RTE_TM_SHAPER_PROFILE_ID_NONE, with
1625  *   the latter disabling the private shaper of the current node.
1626  * @param[out] error
1627  *   Error details. Filled in only on error, when not NULL.
1628  * @return
1629  *   0 on success, non-zero error code otherwise.
1630  *
1631  * @see struct rte_tm_capabilities::shaper_private_n_max
1632  */
1633 int
1634 rte_tm_node_shaper_update(uint16_t port_id,
1635 	uint32_t node_id,
1636 	uint32_t shaper_profile_id,
1637 	struct rte_tm_error *error);
1638 
1639 /**
1640  * Traffic manager node shared shapers update
1641  *
1642  * Restriction for root node: cannot use any shared rate shapers.
1643  *
1644  * @param[in] port_id
1645  *   The port identifier of the Ethernet device.
1646  * @param[in] node_id
1647  *   Node ID. Needs to be valid.
1648  * @param[in] shared_shaper_id
1649  *   Shared shaper ID. Needs to be valid.
1650  * @param[in] add
1651  *   Set to non-zero value to add this shared shaper to current node or to zero
1652  *   to delete this shared shaper from current node.
1653  * @param[out] error
1654  *   Error details. Filled in only on error, when not NULL.
1655  * @return
1656  *   0 on success, non-zero error code otherwise.
1657  *
1658  * @see struct rte_tm_capabilities::shaper_shared_n_max
1659  */
1660 int
1661 rte_tm_node_shared_shaper_update(uint16_t port_id,
1662 	uint32_t node_id,
1663 	uint32_t shared_shaper_id,
1664 	int add,
1665 	struct rte_tm_error *error);
1666 
1667 /**
1668  * Traffic manager node enabled statistics counters update
1669  *
1670  * @param[in] port_id
1671  *   The port identifier of the Ethernet device.
1672  * @param[in] node_id
1673  *   Node ID. Needs to be valid.
1674  * @param[in] stats_mask
1675  *   Mask of statistics counter types to be enabled for the current node. This
1676  *   needs to be a subset of the statistics counter types available for the
1677  *   current node. Any statistics counter type not included in this set is to
1678  *   be disabled for the current node.
1679  * @param[out] error
1680  *   Error details. Filled in only on error, when not NULL.
1681  * @return
1682  *   0 on success, non-zero error code otherwise.
1683  *
1684  * @see enum rte_tm_stats_type
1685  * @see RTE_TM_UPDATE_NODE_STATS
1686  */
1687 int
1688 rte_tm_node_stats_update(uint16_t port_id,
1689 	uint32_t node_id,
1690 	uint64_t stats_mask,
1691 	struct rte_tm_error *error);
1692 
1693 /**
1694  * Traffic manager node WFQ weight mode update
1695  *
1696  * @param[in] port_id
1697  *   The port identifier of the Ethernet device.
1698  * @param[in] node_id
1699  *   Node ID. Needs to be valid non-leaf node ID.
1700  * @param[in] wfq_weight_mode
1701  *   WFQ weight mode for each SP priority. When NULL, it indicates that WFQ is
1702  *   to be used for all priorities. When non-NULL, it points to a pre-allocated
1703  *   array of *n_sp_priorities* values, with non-zero value for byte-mode and
1704  *   zero for packet-mode.
1705  * @param[in] n_sp_priorities
1706  *   Number of SP priorities.
1707  * @param[out] error
1708  *   Error details. Filled in only on error, when not NULL.
1709  * @return
1710  *   0 on success, non-zero error code otherwise.
1711  *
1712  * @see RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE
1713  * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES
1714  */
1715 int
1716 rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
1717 	uint32_t node_id,
1718 	int *wfq_weight_mode,
1719 	uint32_t n_sp_priorities,
1720 	struct rte_tm_error *error);
1721 
1722 /**
1723  * Traffic manager node congestion management mode update
1724  *
1725  * @param[in] port_id
1726  *   The port identifier of the Ethernet device.
1727  * @param[in] node_id
1728  *   Node ID. Needs to be valid leaf node ID.
1729  * @param[in] cman
1730  *   Congestion management mode.
1731  * @param[out] error
1732  *   Error details. Filled in only on error, when not NULL.
1733  * @return
1734  *   0 on success, non-zero error code otherwise.
1735  *
1736  * @see RTE_TM_UPDATE_NODE_CMAN
1737  */
1738 int
1739 rte_tm_node_cman_update(uint16_t port_id,
1740 	uint32_t node_id,
1741 	enum rte_tm_cman_mode cman,
1742 	struct rte_tm_error *error);
1743 
1744 /**
1745  * Traffic manager node private WRED context update
1746  *
1747  * @param[in] port_id
1748  *   The port identifier of the Ethernet device.
1749  * @param[in] node_id
1750  *   Node ID. Needs to be valid leaf node ID.
1751  * @param[in] wred_profile_id
1752  *   WRED profile ID for the private WRED context of the current node. Needs to
1753  *   be either valid WRED profile ID or RTE_TM_WRED_PROFILE_ID_NONE, with the
1754  *   latter disabling the private WRED context of the current node.
1755  * @param[out] error
1756  *   Error details. Filled in only on error, when not NULL.
1757  * @return
1758  *   0 on success, non-zero error code otherwise.
1759   *
1760  * @see struct rte_tm_capabilities::cman_wred_context_private_n_max
1761 */
1762 int
1763 rte_tm_node_wred_context_update(uint16_t port_id,
1764 	uint32_t node_id,
1765 	uint32_t wred_profile_id,
1766 	struct rte_tm_error *error);
1767 
1768 /**
1769  * Traffic manager node shared WRED context update
1770  *
1771  * @param[in] port_id
1772  *   The port identifier of the Ethernet device.
1773  * @param[in] node_id
1774  *   Node ID. Needs to be valid leaf node ID.
1775  * @param[in] shared_wred_context_id
1776  *   Shared WRED context ID. Needs to be valid.
1777  * @param[in] add
1778  *   Set to non-zero value to add this shared WRED context to current node or
1779  *   to zero to delete this shared WRED context from current node.
1780  * @param[out] error
1781  *   Error details. Filled in only on error, when not NULL.
1782  * @return
1783  *   0 on success, non-zero error code otherwise.
1784  *
1785  * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
1786  */
1787 int
1788 rte_tm_node_shared_wred_context_update(uint16_t port_id,
1789 	uint32_t node_id,
1790 	uint32_t shared_wred_context_id,
1791 	int add,
1792 	struct rte_tm_error *error);
1793 
1794 /**
1795  * Traffic manager node statistics counters read
1796  *
1797  * @param[in] port_id
1798  *   The port identifier of the Ethernet device.
1799  * @param[in] node_id
1800  *   Node ID. Needs to be valid.
1801  * @param[out] stats
1802  *   When non-NULL, it contains the current value for the statistics counters
1803  *   enabled for the current node.
1804  * @param[out] stats_mask
1805  *   When non-NULL, it contains the mask of statistics counter types that are
1806  *   currently enabled for this node, indicating which of the counters
1807  *   retrieved with the *stats* structure are valid.
1808  * @param[in] clear
1809  *   When this parameter has a non-zero value, the statistics counters are
1810  *   cleared (i.e. set to zero) immediately after they have been read,
1811  *   otherwise the statistics counters are left untouched.
1812  * @param[out] error
1813  *   Error details. Filled in only on error, when not NULL.
1814  * @return
1815  *   0 on success, non-zero error code otherwise.
1816  *
1817  * @see enum rte_tm_stats_type
1818  */
1819 int
1820 rte_tm_node_stats_read(uint16_t port_id,
1821 	uint32_t node_id,
1822 	struct rte_tm_node_stats *stats,
1823 	uint64_t *stats_mask,
1824 	int clear,
1825 	struct rte_tm_error *error);
1826 
1827 /**
1828  * Traffic manager packet marking - VLAN DEI (IEEE 802.1Q)
1829  *
1830  * IEEE 802.1p maps the traffic class to the VLAN Priority Code Point (PCP)
1831  * field (3 bits), while IEEE 802.1q maps the drop priority to the VLAN Drop
1832  * Eligible Indicator (DEI) field (1 bit), which was previously named Canonical
1833  * Format Indicator (CFI).
1834  *
1835  * All VLAN frames of a given color get their DEI bit set if marking is enabled
1836  * for this color; otherwise, their DEI bit is left as is (either set or not).
1837  *
1838  * @param[in] port_id
1839  *   The port identifier of the Ethernet device.
1840  * @param[in] mark_green
1841  *   Set to non-zero value to enable marking of green packets and to zero to
1842  *   disable it.
1843  * @param[in] mark_yellow
1844  *   Set to non-zero value to enable marking of yellow packets and to zero to
1845  *   disable it.
1846  * @param[in] mark_red
1847  *   Set to non-zero value to enable marking of red packets and to zero to
1848  *   disable it.
1849  * @param[out] error
1850  *   Error details. Filled in only on error, when not NULL.
1851  * @return
1852  *   0 on success, non-zero error code otherwise.
1853  *
1854  * @see struct rte_tm_capabilities::mark_vlan_dei_supported
1855  */
1856 int
1857 rte_tm_mark_vlan_dei(uint16_t port_id,
1858 	int mark_green,
1859 	int mark_yellow,
1860 	int mark_red,
1861 	struct rte_tm_error *error);
1862 
1863 /**
1864  * Traffic manager packet marking - IPv4 / IPv6 ECN (IETF RFC 3168)
1865  *
1866  * IETF RFCs 2474 and 3168 reorganize the IPv4 Type of Service (TOS) field
1867  * (8 bits) and the IPv6 Traffic Class (TC) field (8 bits) into Differentiated
1868  * Services Codepoint (DSCP) field (6 bits) and Explicit Congestion
1869  * Notification (ECN) field (2 bits). The DSCP field is typically used to
1870  * encode the traffic class and/or drop priority (RFC 2597), while the ECN
1871  * field is used by RFC 3168 to implement a congestion notification mechanism
1872  * to be leveraged by transport layer protocols such as TCP and SCTP that have
1873  * congestion control mechanisms.
1874  *
1875  * When congestion is experienced, as alternative to dropping the packet,
1876  * routers can change the ECN field of input packets from 2'b01 or 2'b10
1877  * (values indicating that source endpoint is ECN-capable) to 2'b11 (meaning
1878  * that congestion is experienced). The destination endpoint can use the
1879  * ECN-Echo (ECE) TCP flag to relay the congestion indication back to the
1880  * source endpoint, which acknowledges it back to the destination endpoint with
1881  * the Congestion Window Reduced (CWR) TCP flag.
1882  *
1883  * All IPv4/IPv6 packets of a given color with ECN set to 2’b01 or 2’b10
1884  * carrying TCP or SCTP have their ECN set to 2’b11 if the marking feature is
1885  * enabled for the current color, otherwise the ECN field is left as is.
1886  *
1887  * @param[in] port_id
1888  *   The port identifier of the Ethernet device.
1889  * @param[in] mark_green
1890  *   Set to non-zero value to enable marking of green packets and to zero to
1891  *   disable it.
1892  * @param[in] mark_yellow
1893  *   Set to non-zero value to enable marking of yellow packets and to zero to
1894  *   disable it.
1895  * @param[in] mark_red
1896  *   Set to non-zero value to enable marking of red packets and to zero to
1897  *   disable it.
1898  * @param[out] error
1899  *   Error details. Filled in only on error, when not NULL.
1900  * @return
1901  *   0 on success, non-zero error code otherwise.
1902  *
1903  * @see struct rte_tm_capabilities::mark_ip_ecn_tcp_supported
1904  * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported
1905  */
1906 int
1907 rte_tm_mark_ip_ecn(uint16_t port_id,
1908 	int mark_green,
1909 	int mark_yellow,
1910 	int mark_red,
1911 	struct rte_tm_error *error);
1912 
1913 /**
1914  * Traffic manager packet marking - IPv4 / IPv6 DSCP (IETF RFC 2597)
1915  *
1916  * IETF RFC 2597 maps the traffic class and the drop priority to the IPv4/IPv6
1917  * Differentiated Services Codepoint (DSCP) field (6 bits). Here are the DSCP
1918  * values proposed by this RFC:
1919  *
1920  * <pre>                   Class 1    Class 2    Class 3    Class 4   </pre>
1921  * <pre>                 +----------+----------+----------+----------+</pre>
1922  * <pre>Low Drop Prec    |  001010  |  010010  |  011010  |  100010  |</pre>
1923  * <pre>Medium Drop Prec |  001100  |  010100  |  011100  |  100100  |</pre>
1924  * <pre>High Drop Prec   |  001110  |  010110  |  011110  |  100110  |</pre>
1925  * <pre>                 +----------+----------+----------+----------+</pre>
1926  *
1927  * There are 4 traffic classes (classes 1 .. 4) encoded by DSCP bits 1 and 2,
1928  * as well as 3 drop priorities (low/medium/high) encoded by DSCP bits 3 and 4.
1929  *
1930  * All IPv4/IPv6 packets have their color marked into DSCP bits 3 and 4 as
1931  * follows: green mapped to Low Drop Precedence (2’b01), yellow to Medium
1932  * (2’b10) and red to High (2’b11). Marking needs to be explicitly enabled
1933  * for each color; when not enabled for a given color, the DSCP field of all
1934  * packets with that color is left as is.
1935  *
1936  * @param[in] port_id
1937  *   The port identifier of the Ethernet device.
1938  * @param[in] mark_green
1939  *   Set to non-zero value to enable marking of green packets and to zero to
1940  *   disable it.
1941  * @param[in] mark_yellow
1942  *   Set to non-zero value to enable marking of yellow packets and to zero to
1943  *   disable it.
1944  * @param[in] mark_red
1945  *   Set to non-zero value to enable marking of red packets and to zero to
1946  *   disable it.
1947  * @param[out] error
1948  *   Error details. Filled in only on error, when not NULL.
1949  * @return
1950  *   0 on success, non-zero error code otherwise.
1951  *
1952  * @see struct rte_tm_capabilities::mark_ip_dscp_supported
1953  */
1954 int
1955 rte_tm_mark_ip_dscp(uint16_t port_id,
1956 	int mark_green,
1957 	int mark_yellow,
1958 	int mark_red,
1959 	struct rte_tm_error *error);
1960 
1961 #ifdef __cplusplus
1962 }
1963 #endif
1964 
1965 #endif /* __INCLUDE_RTE_TM_H__ */
1966