1.. SPDX-License-Identifier: BSD-3-Clause 2 Copyright(c) 2017 Marvell International Ltd. 3 Copyright(c) 2017 Semihalf. 4 5.. _mvpp2_poll_mode_driver: 6 7MVPP2 Poll Mode Driver 8====================== 9 10The MVPP2 PMD (**librte_net_mvpp2**) provides poll mode driver support 11for the Marvell PPv2 (Packet Processor v2) 1/10 Gbps adapter. 12 13Detailed information about SoCs that use PPv2 can be obtained here: 14 15* https://www.marvell.com/embedded-processors/armada-70xx/ 16* https://www.marvell.com/embedded-processors/armada-80xx/ 17 18 19Features 20-------- 21 22Features of the MVPP2 PMD are: 23 24- Speed capabilities 25- Link status 26- Tx Queue start/stop 27- MTU update 28- Jumbo frame 29- Promiscuous mode 30- Allmulticast mode 31- Unicast MAC filter 32- Multicast MAC filter 33- RSS hash 34- VLAN filter 35- CRC offload 36- L3 checksum offload 37- L4 checksum offload 38- Packet type parsing 39- Basic stats 40- :ref:`Extended stats <extstats>` 41- RX flow control 42- Scattered TX frames 43- :ref:`QoS <extconf>` 44- :ref:`Flow API <flowapi>` 45- :ref:`Traffic metering and policing <mtrapi>` 46- :ref:`Traffic Management API <tmapi>` 47 48Limitations 49----------- 50 51- Number of lcores is limited to 9 by MUSDK internal design. If more lcores 52 need to be allocated, locking will have to be considered. Number of available 53 lcores can be changed via ``MRVL_MUSDK_HIFS_RESERVED`` define in 54 ``mrvl_ethdev.c`` source file. 55 56- Flushing vlans added for filtering is not possible due to MUSDK missing 57 functionality. Current workaround is to reset board so that PPv2 has a 58 chance to start in a sane state. 59 60- MUSDK architecture does not support changing configuration in run time. 61 All necessary configurations should be done before first dev_start(). 62 63- RX queue start/stop is not supported. 64 65- Current implementation does not support replacement of buffers in the HW buffer pool 66 at run time, so it is responsibility of the application to ensure that MTU does not exceed the configured buffer size. 67 68- Configuring TX flow control currently is not supported. 69 70- In current implementation, mechanism for acknowledging transmitted packets (``tx_done_cleanup``) is not supported. 71 72- Running more than one DPDK-MUSDK application simultaneously is not supported. 73 74 75Prerequisites 76------------- 77 78- Custom Linux Kernel sources 79 80 .. code-block:: console 81 82 git clone https://github.com/MarvellEmbeddedProcessors/linux-marvell.git -b linux-4.4.120-armada-18.09 83 84- Out of tree `mvpp2x_sysfs` kernel module sources 85 86 .. code-block:: console 87 88 git clone https://github.com/MarvellEmbeddedProcessors/mvpp2x-marvell.git -b mvpp2x-armada-18.09 89 90- MUSDK (Marvell User-Space SDK) sources 91 92 .. code-block:: console 93 94 git clone https://github.com/MarvellEmbeddedProcessors/musdk-marvell.git -b musdk-release-SDK-10.3.5.0-PR2 95 96 MUSDK is a light-weight library that provides direct access to Marvell's 97 PPv2 (Packet Processor v2). Alternatively prebuilt MUSDK library can be 98 requested from `Marvell Extranet <https://extranet.marvell.com>`_. Once 99 approval has been granted, library can be found by typing ``musdk`` in 100 the search box. 101 102 To get better understanding of the library one can consult documentation 103 available in the ``doc`` top level directory of the MUSDK sources. 104 105- DPDK environment 106 107 Follow the DPDK :ref:`Getting Started Guide for Linux <linux_gsg>` to setup 108 DPDK environment. 109 110 111Building MUSDK 112-------------- 113 114Driver needs precompiled MUSDK library during compilation. 115 116.. code-block:: console 117 118 export CROSS_COMPILE=<toolchain>/bin/aarch64-linux-gnu- 119 ./bootstrap 120 ./configure --host=aarch64-linux-gnu 121 make install 122 123MUSDK will be installed to `usr/local` under current directory. 124For the detailed build instructions please consult ``doc/musdk_get_started.txt``. 125 126 127Building DPDK 128------------- 129 130Add path to libmusdk.pc in PKG_CONFIG_PATH environment variable. 131 132.. code-block:: console 133 134 export PKG_CONFIG_PATH=$<musdk_install_dir>/lib/pkgconfig/:$PKG_CONFIG_PATH 135 136 meson setup build --cross-file config/arm/arm64_armada_linux_gcc 137 ninja -C build 138 139 140Usage Example 141------------- 142 143MVPP2 PMD requires extra out of tree kernel modules to function properly. 144`musdk_cma` sources are part of the MUSDK. Please consult 145``doc/musdk_get_started.txt`` for the detailed build instructions. 146For `mvpp2x_sysfs` please consult ``Documentation/pp22_sysfs.txt`` for the 147detailed build instructions. 148 149.. code-block:: console 150 151 insmod musdk_cma.ko 152 insmod mvpp2x_sysfs.ko 153 154Additionally interfaces used by DPDK application need to be put up: 155 156.. code-block:: console 157 158 ip link set eth0 up 159 ip link set eth2 up 160 161In order to run testpmd example application following command can be used: 162 163.. code-block:: console 164 165 ./dpdk-testpmd --vdev=eth_mvpp2,iface=eth0,iface=eth2 -c 7 -- \ 166 --burst=128 --txd=2048 --rxd=1024 --rxq=2 --txq=2 --nb-cores=2 \ 167 -i -a --rss-udp 168 169.. _extstats: 170 171Extended stats 172-------------- 173 174MVPP2 PMD supports the following extended statistics: 175 176 - ``rx_bytes``: number of RX bytes 177 - ``rx_packets``: number of RX packets 178 - ``rx_unicast_packets``: number of RX unicast packets 179 - ``rx_errors``: number of RX MAC errors 180 - ``rx_fullq_dropped``: number of RX packets dropped due to full RX queue 181 - ``rx_bm_dropped``: number of RX packets dropped due to no available buffers in the HW pool 182 - ``rx_early_dropped``: number of RX packets that were early dropped 183 - ``rx_fifo_dropped``: number of RX packets dropped due to RX fifo overrun 184 - ``rx_cls_dropped``: number of RX packets dropped by classifier 185 - ``tx_bytes``: number of TX bytes 186 - ``tx_packets``: number of TX packets 187 - ``tx_unicast_packets``: number of TX unicast packets 188 - ``tx_errors``: number of TX MAC errors 189 190 191.. _extconf: 192 193External Configuration 194---------------------- 195 196Several driver configuration (e.g. QoS) can be done through external configuration file. Path to the 197file must be given as `cfg` in driver's vdev parameter list. 198 199Configuration syntax 200~~~~~~~~~~~~~~~~~~~~ 201 202.. code-block:: console 203 204 [policer <policer_id>] 205 token_unit = <token_unit> 206 color = <color_mode> 207 cir = <cir> 208 ebs = <ebs> 209 cbs = <cbs> 210 211 [parser udf <udf_id>] 212 proto = <proto> 213 field = <field> 214 key = <key> 215 mask = <mask> 216 offset = <offset> 217 218 [port <portnum> default] 219 start_hdr = <start_hdr> 220 forward_bad_frames = <forward_bad_frames> 221 fill_bpool_buffs = <fill_bpool_buffs> 222 default_tc = <default_tc> 223 mapping_priority = <mapping_priority> 224 225 rate_limit_enable = <rate_limit_enable> 226 rate_limit = <rate_limit> 227 burst_size = <burst_size> 228 229 default_policer = <policer_id> 230 231 [port <portnum> tc <traffic_class>] 232 rxq = <rx_queue_list> 233 pcp = <pcp_list> 234 dscp = <dscp_list> 235 default_color = <default_color> 236 237 [port <portnum> tc <traffic_class>] 238 rxq = <rx_queue_list> 239 pcp = <pcp_list> 240 dscp = <dscp_list> 241 242 [port <portnum> txq <txqnum>] 243 sched_mode = <sched_mode> 244 wrr_weight = <wrr_weight> 245 246 rate_limit_enable = <rate_limit_enable> 247 rate_limit = <rate_limit> 248 burst_size = <burst_size> 249 250Where: 251 252- ``<udf_id>``: Logical UDF id. 253 254- ``<proto>``: Indicate the preceding hdr before the UDF header (`eth` or `udp`). 255 256- ``<field>``: Indicate the field of the <proto> hdr (`type` (eth) or `dport` (udp). 257 258- ``<key>``: UDF key in string format starting with '0x'. 259 260- ``<mask>``: UDF mask in string format starting with '0x'. 261 262- ``<offset>``: Starting UDF offset from the <proto> hdr. 263 264- ``<portnum>``: DPDK Port number (0..n). 265 266- ``<start_hdr>``: Indicate what is the start header mode (`none` (eth), `dsa`, `ext_dsa` or `custom`). 267 268- ``<forward_bad_frames>``: Indicate whether to forward or drop l2 bad packets (0 or 1). 269 270- ``<fill_bpool_buffs>``: Control the amount of refill buffers (default is 64). 271 272- ``<default_tc>``: Default traffic class (e.g. 0) 273 274- ``<mapping_priority>``: QoS priority for mapping (`ip`, `vlan`, `ip/vlan` or `vlan/ip`). 275 276- ``<traffic_class>``: Traffic Class to be configured. 277 278- ``<rx_queue_list>``: List of DPDK RX queues (e.g. 0 1 3-4) 279 280- ``<pcp_list>``: List of PCP values to handle in particular TC (e.g. 0 1 3-4 7). 281 282- ``<dscp_list>``: List of DSCP values to handle in particular TC (e.g. 0-12 32-48 63). 283 284- ``<default_policer>``: Id of the policer configuration section to be used as default. 285 286- ``<policer_id>``: Id of the policer configuration section (0..31). 287 288- ``<token_unit>``: Policer token unit (`bytes` or `packets`). 289 290- ``<color_mode>``: Policer color mode (`aware` or `blind`). 291 292- ``<cir>``: Committed information rate in unit of kilo bits per second (data rate) or packets per second. 293 294- ``<cbs>``: Committed burst size in unit of kilo bytes or number of packets. 295 296- ``<ebs>``: Excess burst size in unit of kilo bytes or number of packets. 297 298- ``<default_color>``: Default color for specific tc. 299 300- ``<rate_limit_enable>``: Enables per port or per txq rate limiting (`0`/`1` to disable/enable). 301 302- ``<rate_limit>``: Committed information rate, in kilo bits per second. 303 304- ``<burst_size>``: Committed burst size, in kilo bytes. 305 306- ``<sched_mode>``: Egress scheduler mode (`wrr` or `sp`). 307 308- ``<wrr_weight>``: Txq weight. 309 310Setting PCP/DSCP values for the default TC is not required. All PCP/DSCP 311values not assigned explicitly to particular TC will be handled by the 312default TC. 313 314Configuration file example 315^^^^^^^^^^^^^^^^^^^^^^^^^^ 316 317.. code-block:: console 318 319 [policer 0] 320 token_unit = bytes 321 color = blind 322 cir = 100000 323 ebs = 64 324 cbs = 64 325 326 [port 0 default] 327 default_tc = 0 328 mapping_priority = ip 329 330 rate_limit_enable = 1 331 rate_limit = 1000 332 burst_size = 2000 333 334 [port 0 tc 0] 335 rxq = 0 1 336 337 [port 0 txq 0] 338 sched_mode = wrr 339 wrr_weight = 10 340 341 [port 0 txq 1] 342 sched_mode = wrr 343 wrr_weight = 100 344 345 [port 0 txq 2] 346 sched_mode = sp 347 348 [port 0 tc 1] 349 rxq = 2 350 pcp = 5 6 7 351 dscp = 26-38 352 353 [port 1 default] 354 default_tc = 0 355 mapping_priority = vlan/ip 356 357 default_policer = 0 358 359 [port 1 tc 0] 360 rxq = 0 361 dscp = 10 362 363 [port 1 tc 1] 364 rxq = 1 365 dscp = 11-20 366 367 [port 1 tc 2] 368 rxq = 2 369 dscp = 30 370 371 [port 1 txq 0] 372 rate_limit_enable = 1 373 rate_limit = 10000 374 burst_size = 2000 375 376Configuration file example with UDF 377^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 378 379.. code-block:: console 380 381 [parser udf 0] 382 proto = eth 383 field = type 384 key = 0x8842 385 mask = 0xffff 386 offset = 6 387 388Usage example 389^^^^^^^^^^^^^ 390 391.. code-block:: console 392 393 ./dpdk-testpmd --vdev=eth_mvpp2,iface=eth0,iface=eth2,cfg=/home/user/mrvl.conf \ 394 -c 7 -- -i -a --disable-hw-vlan-strip --rxq=3 --txq=3 395 396.. _flowapi: 397 398Flow API 399-------- 400 401PPv2 offers packet classification capabilities via classifier engine which 402can be configured via generic flow API offered by DPDK. 403 404The :ref:`flow_isolated_mode` is supported. 405 406For an additional description please refer to DPDK :doc:`../prog_guide/ethdev/flow_offload`. 407 408Supported flow actions 409~~~~~~~~~~~~~~~~~~~~~~ 410 411Following flow action items are supported by the driver: 412 413* DROP 414* QUEUE 415* METER 416 417Supported flow items 418~~~~~~~~~~~~~~~~~~~~ 419 420Following flow items and their respective fields are supported by the driver: 421 422* ETH 423 424 * source MAC 425 * destination MAC 426 * ethertype 427 428* VLAN 429 430 * PCP 431 * VID 432 433* IPV4 434 435 * DSCP 436 * protocol 437 * source address 438 * destination address 439 440* IPV6 441 442 * flow label 443 * next header 444 * source address 445 * destination address 446 447* UDP 448 449 * source port 450 * destination port 451 452* TCP 453 454 * source port 455 * destination port 456 457Classifier match engine 458~~~~~~~~~~~~~~~~~~~~~~~ 459 460Classifier has an internal match engine which can be configured to 461operate in either exact or maskable mode. 462 463Mode is selected upon creation of the first unique flow rule as follows: 464 465* maskable, if key size is up to 8 bytes. 466* exact, otherwise, i.e for keys bigger than 8 bytes. 467 468Where the key size equals the number of bytes of all fields specified 469in the flow items. 470 471.. table:: Examples of key size calculation 472 473 +----------------------------------------------------------------------------+-------------------+-------------+ 474 | Flow pattern | Key size in bytes | Used engine | 475 +============================================================================+===================+=============+ 476 | ETH (destination MAC) / VLAN (VID) | 6 + 2 = 8 | Maskable | 477 +----------------------------------------------------------------------------+-------------------+-------------+ 478 | VLAN (VID) / IPV4 (source address) | 2 + 4 = 6 | Maskable | 479 +----------------------------------------------------------------------------+-------------------+-------------+ 480 | TCP (source port, destination port) | 2 + 2 = 4 | Maskable | 481 +----------------------------------------------------------------------------+-------------------+-------------+ 482 | VLAN (priority) / IPV4 (source address) | 1 + 4 = 5 | Maskable | 483 +----------------------------------------------------------------------------+-------------------+-------------+ 484 | IPV4 (destination address) / UDP (source port, destination port) | 6 + 2 + 2 = 10 | Exact | 485 +----------------------------------------------------------------------------+-------------------+-------------+ 486 | VLAN (VID) / IPV6 (flow label, destination address) | 2 + 3 + 16 = 21 | Exact | 487 +----------------------------------------------------------------------------+-------------------+-------------+ 488 | IPV4 (DSCP, source address, destination address) | 1 + 4 + 4 = 9 | Exact | 489 +----------------------------------------------------------------------------+-------------------+-------------+ 490 | IPV6 (flow label, source address, destination address) | 3 + 16 + 16 = 35 | Exact | 491 +----------------------------------------------------------------------------+-------------------+-------------+ 492 493From the user perspective maskable mode means that masks specified 494via flow rules are respected. In case of exact match mode, masks 495which do not provide exact matching (all bits masked) are ignored. 496 497If the flow matches more than one classifier rule the first 498(with the lowest index) matched takes precedence. 499 500Flow rules usage example 501~~~~~~~~~~~~~~~~~~~~~~~~ 502 503Before proceeding run testpmd user application: 504 505.. code-block:: console 506 507 ./dpdk-testpmd --vdev=eth_mvpp2,iface=eth0,iface=eth2 -c 3 -- -i --p 3 -a --disable-hw-vlan-strip 508 509Example #1 510^^^^^^^^^^ 511 512.. code-block:: console 513 514 testpmd> flow create 0 ingress pattern eth src is 10:11:12:13:14:15 / end actions drop / end 515 516In this case key size is 6 bytes thus maskable type is selected. Testpmd 517will set mask to ff:ff:ff:ff:ff:ff i.e traffic explicitly matching 518above rule will be dropped. 519 520Example #2 521^^^^^^^^^^ 522 523.. code-block:: console 524 525 testpmd> flow create 0 ingress pattern ipv4 src spec 10.10.10.0 src mask 255.255.255.0 / tcp src spec 0x10 src mask 0x10 / end action drop / end 526 527In this case key size is 8 bytes thus maskable type is selected. 528Flows which have IPv4 source addresses ranging from 10.10.10.0 to 10.10.10.255 529and tcp source port set to 16 will be dropped. 530 531Example #3 532^^^^^^^^^^ 533 534.. code-block:: console 535 536 testpmd> flow create 0 ingress pattern vlan vid spec 0x10 vid mask 0x10 / ipv4 src spec 10.10.1.1 src mask 255.255.0.0 dst spec 11.11.11.1 dst mask 255.255.255.0 / end actions drop / end 537 538In this case key size is 10 bytes thus exact type is selected. 539Even though each item has partial mask set, masks will be ignored. 540As a result only flows with VID set to 16 and IPv4 source and destination 541addresses set to 10.10.1.1 and 11.11.11.1 respectively will be dropped. 542 543Limitations 544~~~~~~~~~~~ 545 546Following limitations need to be taken into account while creating flow rules: 547 548* For IPv4 exact match type the key size must be up to 12 bytes. 549* For IPv6 exact match type the key size must be up to 36 bytes. 550* Following fields cannot be partially masked (all masks are treated as 551 if they were exact): 552 553 * ETH: ethertype 554 * VLAN: PCP, VID 555 * IPv4: protocol 556 * IPv6: next header 557 * TCP/UDP: source port, destination port 558 559* Only one classifier table can be created thus all rules in the table 560 have to match table format. Table format is set during creation of 561 the first unique flow rule. 562* Up to 5 fields can be specified per flow rule. 563* Up to 20 flow rules can be added. 564 565For additional information about classifier please consult 566``doc/musdk_cls_user_guide.txt``. 567 568.. _mtrapi: 569 570Traffic metering and policing 571----------------------------- 572 573MVPP2 PMD supports DPDK traffic metering and policing that allows the following: 574 575#. Meter ingress traffic. 576 577#. Do policing. 578 579#. Gather statistics. 580 581For an additional description please refer to DPDK :doc:`../prog_guide/ethdev/traffic_metering_and_policing`. 582 583The policer objects defined by this feature can work with the default policer defined via config file as described in :ref:`QoS Support <extconf>`. 584 585Limitations 586~~~~~~~~~~~ 587 588The following capabilities are not supported: 589 590- MTR object meter DSCP table update 591- MTR object policer action update 592- MTR object enabled statistics 593 594Usage example 595~~~~~~~~~~~~~ 596 597#. Run testpmd user app: 598 599 .. code-block:: console 600 601 ./dpdk-testpmd --vdev=eth_mvpp2,iface=eth0,iface=eth2 -c 6 -- -i -p 3 -a --txd 1024 --rxd 1024 602 603#. Create meter profile: 604 605 .. code-block:: console 606 607 testpmd> add port meter profile 0 0 srtcm_rfc2697 2000 256 256 608 609#. Create meter: 610 611 .. code-block:: console 612 613 testpmd> create port meter 0 0 0 yes d d d 0 1 0 614 615#. Create flow rule witch meter attached: 616 617 .. code-block:: console 618 619 testpmd> flow create 0 ingress pattern ipv4 src is 10.10.10.1 / end actions meter mtr_id 0 / end 620 621For a detailed usage description please refer to "Traffic Metering and Policing" section in DPDK :doc:`Testpmd Runtime Functions <../testpmd_app_ug/testpmd_funcs>`. 622 623 624 625.. _tmapi: 626 627Traffic Management API 628---------------------- 629 630MVPP2 PMD supports generic DPDK Traffic Management API which allows to 631configure the following features: 632 633#. Hierarchical scheduling 634 635#. Traffic shaping 636 637#. Congestion management 638 639#. Packet marking 640 641Internally TM is represented by a hierarchy (tree) of nodes. 642Node which has a parent is called a leaf whereas node without 643parent is called a non-leaf (root). 644MVPP2 PMD supports two level hierarchy where level 0 represents ports and level 1 represents tx queues of a given port. 645 646.. figure:: img/mvpp2_tm.* 647 648Nodes hold following types of settings: 649 650- for egress scheduler configuration: weight 651- for egress rate limiter: private shaper 652- bitmask indicating which statistics counters will be read 653 654Hierarchy is always constructed from the top, i.e first a root node is added 655then some number of leaf nodes. Number of leaf nodes cannot exceed number 656of configured tx queues. 657 658After hierarchy is complete it can be committed. 659 660 661For an additional description please refer to DPDK :doc:`../prog_guide/ethdev/traffic_management`. 662 663Limitations 664~~~~~~~~~~~ 665 666The following capabilities are not supported: 667 668- Traffic manager WRED profile and WRED context 669- Traffic manager shared shaper update 670- Traffic manager packet marking 671- Maximum number of levels in hierarchy is 2 672- Currently dynamic change of a hierarchy is not supported 673 674Usage example 675~~~~~~~~~~~~~ 676 677For a detailed usage description please refer to "Traffic Management" section in DPDK :doc:`../testpmd_app_ug/testpmd_funcs`. 678 679#. Run testpmd as follows: 680 681 .. code-block:: console 682 683 ./dpdk-testpmd --vdev=net_mrvl,iface=eth0,iface=eth2,cfg=./qos_config -c 7 -- \ 684 -i -p 3 --disable-hw-vlan-strip --rxq 3 --txq 3 --txd 1024 --rxd 1024 685 686#. Stop all ports: 687 688 .. code-block:: console 689 690 testpmd> port stop all 691 692#. Add shaper profile: 693 694 .. code-block:: console 695 696 testpmd> add port tm node shaper profile 0 0 900000 70000 0 697 698 Parameters have following meaning:: 699 700 0 - Id of a port. 701 0 - Id of a new shaper profile. 702 900000 - Shaper rate in bytes/s. 703 70000 - Bucket size in bytes. 704 0 - Packet length adjustment - ignored. 705 706#. Add non-leaf node for port 0: 707 708 .. code-block:: console 709 710 testpmd> add port tm nonleaf node 0 3 -1 0 0 0 0 0 1 3 0 711 712 Parameters have following meaning:: 713 714 0 - Id of a port 715 3 - Id of a new node. 716 -1 - Indicate that root does not have a parent. 717 0 - Priority of the node. 718 0 - Weight of the node. 719 0 - Id of a level. Since this is a root 0 is passed. 720 0 - Id of the shaper profile. 721 0 - Number of SP priorities. 722 3 - Enable statistics for both number of transmitted packets and bytes. 723 0 - Number of shared shapers. 724 725#. Add leaf node for tx queue 0: 726 727 .. code-block:: console 728 729 testpmd> add port tm leaf node 0 0 3 0 30 1 -1 0 0 1 0 730 731 Parameters have following meaning:: 732 733 0 - Id of a port. 734 0 - Id of a new node. 735 3 - Id of the parent node. 736 0 - Priority of a node. 737 30 - WRR weight. 738 1 - Id of a level. Since this is a leaf node 1 is passed. 739 -1 - Id of a shaper. -1 indicates that shaper is not attached. 740 0 - Congestion management is not supported. 741 0 - Congestion management is not supported. 742 1 - Enable statistics counter for number of transmitted packets. 743 0 - Number of shared shapers. 744 745#. Add leaf node for tx queue 1: 746 747 .. code-block:: console 748 749 testpmd> add port tm leaf node 0 1 3 0 60 1 -1 0 0 1 0 750 751 Parameters have following meaning:: 752 753 0 - Id of a port. 754 1 - Id of a new node. 755 3 - Id of the parent node. 756 0 - Priority of a node. 757 60 - WRR weight. 758 1 - Id of a level. Since this is a leaf node 1 is passed. 759 -1 - Id of a shaper. -1 indicates that shaper is not attached. 760 0 - Congestion management is not supported. 761 0 - Congestion management is not supported. 762 1 - Enable statistics counter for number of transmitted packets. 763 0 - Number of shared shapers. 764 765#. Add leaf node for tx queue 2: 766 767 .. code-block:: console 768 769 testpmd> add port tm leaf node 0 2 3 0 99 1 -1 0 0 1 0 770 771 Parameters have following meaning:: 772 773 0 - Id of a port. 774 2 - Id of a new node. 775 3 - Id of the parent node. 776 0 - Priority of a node. 777 99 - WRR weight. 778 1 - Id of a level. Since this is a leaf node 1 is passed. 779 -1 - Id of a shaper. -1 indicates that shaper is not attached. 780 0 - Congestion management is not supported. 781 0 - Congestion management is not supported. 782 1 - Enable statistics counter for number of transmitted packets. 783 0 - Number of shared shapers. 784 785#. Commit hierarchy: 786 787 .. code-block:: console 788 789 testpmd> port tm hierarchy commit 0 no 790 791 Parameters have following meaning:: 792 793 0 - Id of a port. 794 no - Do not flush TM hierarchy if commit fails. 795 796#. Start all ports 797 798 .. code-block:: console 799 800 testpmd> port start all 801 802 803 804#. Enable forwarding 805 806 .. code-block:: console 807 808 testpmd> start 809