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