test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts][PATCH V4 0/1] tests/cvl_dcf_qos: upload script
@ 2021-11-19  8:03 Yufen Mo
  2021-11-19  8:03 ` [dts][PATCH V4 1/1] " Yufen Mo
  2021-11-23  2:16 ` [dts][PATCH V4 0/1] " Peng, Yuan
  0 siblings, 2 replies; 4+ messages in thread
From: Yufen Mo @ 2021-11-19  8:03 UTC (permalink / raw)
  To: dts, yuan.peng; +Cc: Yufen Mo


v4: 
 - change all the stream rate percentage to 100 when send packets synchronously 
 - change ip src port maximum value to 255 
 - add check function when set port tm hierarchy commit 

v3: 
 -  fix wrong vf number creation 
 -  remove kernel not support content 

v2: 
 -  add delete_qos_setting test case 
 -  add queue mapping checking 
 -  add queue packet number ratio checking 
 -  set ip layer port field to random value 

v1: 
 - CVL configure QoS for vf/vsi in DCF. 

Yufen Mo (1):
  tests/cvl_dcf_qos: upload script

 tests/TestSuite_cvl_dcf_qos.py | 2984 ++++++++++++++++++++++++++++++++
 1 file changed, 2984 insertions(+)
 create mode 100644 tests/TestSuite_cvl_dcf_qos.py

-- 
2.21.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dts][PATCH V4 1/1] tests/cvl_dcf_qos: upload script
  2021-11-19  8:03 [dts][PATCH V4 0/1] tests/cvl_dcf_qos: upload script Yufen Mo
@ 2021-11-19  8:03 ` Yufen Mo
  2021-11-23 14:20   ` Tu, Lijuan
  2021-11-23  2:16 ` [dts][PATCH V4 0/1] " Peng, Yuan
  1 sibling, 1 reply; 4+ messages in thread
From: Yufen Mo @ 2021-11-19  8:03 UTC (permalink / raw)
  To: dts, yuan.peng; +Cc: Yufen Mo


CVL configure QoS for vf/vsi in DCF.

Signed-off-by: Yufen Mo <yufengx.mo@intel.com>
---
 tests/TestSuite_cvl_dcf_qos.py | 2984 ++++++++++++++++++++++++++++++++
 1 file changed, 2984 insertions(+)
 create mode 100644 tests/TestSuite_cvl_dcf_qos.py

diff --git a/tests/TestSuite_cvl_dcf_qos.py b/tests/TestSuite_cvl_dcf_qos.py
new file mode 100644
index 00000000..7b230b1a
--- /dev/null
+++ b/tests/TestSuite_cvl_dcf_qos.py
@@ -0,0 +1,2984 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2021 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+DPDK Test suite cvl_dcf_qos
+CVL configure QoS for vf/vsi in DCF
+Support ETS-based QoS configuration, including Arbiters configuration (strict priority, WFQ)
+and BW Allocation and limitation.
+"""
+import os
+import re
+import time
+import traceback
+import operator
+from copy import deepcopy
+from pprint import pformat
+
+
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import TRANSMIT_CONT
+from framework.pmd_output import PmdOutput
+from framework.settings import NICS, get_nic_name, HEADER_SIZE
+from framework.exception import VerifyFailure
+
+
+class TestCvlDcfQos(TestCase):
+
+    def d_con(self, cmd):
+        _cmd = [cmd, '# ', 15] if isinstance(cmd, str) else cmd
+        return self.dut.send_expect(*_cmd)
+
+    def d_a_con(self, cmds):
+        prompt = "# "
+        if isinstance(cmds, str):
+            _cmd = [cmds, prompt, 20]
+            return self.dut.alt_session.send_expect(*_cmd)
+        else:
+            return [self.dut.alt_session.send_expect(_cmd, prompt, 20) for _cmd in cmds]
+
+    def pmd_con(self, cmds):
+        prompt = "testpmd> "
+        if isinstance(cmds, str):
+            _cmd = [cmds, prompt, 20]
+            return self.d_con(_cmd)
+        else:
+            outputs = []
+            for _cmd in cmds:
+                if isinstance(_cmd, list):
+                    _cmd, func = _cmd
+                    output = self.d_con([_cmd, prompt, 10])
+                    if func and callable(func):
+                        func(output)
+                else:
+                    output = self.d_con([_cmd, prompt, 10])
+                outputs.append(output)
+            return outputs
+
+    def get_pkt_len(self, frame_size):
+        HEADER_SIZE['vlan'] = 4
+        headers_size = sum([HEADER_SIZE[x] for x in ['eth', 'ip', 'vlan', 'udp']])
+        pktlen = frame_size - headers_size
+        return pktlen
+
+    def config_stream(self, fields, frame_size):
+        vlan_id, pri, mac = fields + [None] * (3 - len(fields))
+        dmac = mac or "00:11:22:33:44:55"
+        pkt_name = 'VLAN_UDP'
+        pkt_config = {
+            'type': pkt_name.upper(),
+            'pkt_layers': {
+                'ether': {'dst': dmac},
+                'vlan': {'vlan': vlan_id, 'prio': pri},
+                'raw': {'payload': ['58'] * self.get_pkt_len(frame_size)}}}
+        values = pkt_config
+        pkt_type = values.get('type')
+        pkt_layers = values.get('pkt_layers')
+        pkt = Packet(pkt_type=pkt_type)
+        for layer in list(pkt_layers.keys()):
+            pkt.config_layer(layer, pkt_layers[layer])
+        return pkt.pktgen.pkt
+
+    def add_stream_to_pktgen(self, txport, rxport, send_pkts, option):
+        stream_ids = []
+        for pkt in send_pkts:
+            _option = deepcopy(option)
+            _option['pcap'] = pkt
+            stream_id = self.tester.pktgen.add_stream(txport, rxport, send_pkts[0])
+            self.tester.pktgen.config_stream(stream_id, _option)
+            stream_ids.append(stream_id)
+        return stream_ids
+
+    def traffic(self, option):
+        txport = option.get('tx_intf')
+        rxport = option.get('rx_intf')
+        rate_percent = option.get('rate_percent', float(100))
+        duration = option.get('duration', 20)
+        send_pkts = option.get('stream') or []
+        self.tester.pktgen.clear_streams()
+        s_option = {
+            'stream_config': {
+                'txmode': {},
+                'transmit_mode': TRANSMIT_CONT,
+                'rate': rate_percent, },
+            'fields_config': {
+                'ip': {
+                    'src': {
+                        'start': '198.18.0.0',
+                        'end': '198.18.0.255',
+                        'step': 1,
+                        'action': 'random', },
+                    }, },
+        }
+        stream_ids = self.add_stream_to_pktgen(
+            txport, rxport, send_pkts, s_option)
+        traffic_opt = {
+            'method': 'throughput',
+            'duration': duration,
+            'interval': duration - 5,
+            'callback': self.testpmd_query_stats,
+        }
+        result = self.tester.pktgen.measure(stream_ids, traffic_opt)
+        return result
+
+    def check_traffic(self, stream_configs, traffic_tasks, frame_size=68):
+        tester_rx_port_id = tester_tx_port_id = self.tester.get_local_port(self.dut_ports[0])
+        duration = 20
+        results = []
+        _traffic_tasks = traffic_tasks[:]
+        for index, traffic_task in enumerate(_traffic_tasks):
+            stream_ids, rate_percent, _ = traffic_task
+            streams = []
+            for idx in stream_ids:
+                streams.append(self.config_stream(stream_configs[idx], frame_size))
+            ports_topo = {
+                'tx_intf': tester_tx_port_id,
+                'rx_intf': tester_rx_port_id,
+                'stream': streams,
+                'duration': duration,
+                'rate_percent': rate_percent,
+            }
+            result = self.traffic(ports_topo)
+            queue_stats = self.get_queue_packets_stats()
+            results.append([result, self.pmd_stat, queue_stats])
+            time.sleep(5)
+
+        for traffic_task, _result in zip(_traffic_tasks, results):
+            stream_ids, _, expected_t = traffic_task
+            result, pmd_stat, queue_stats = _result
+
+            if not isinstance(expected_t, list):
+                expected_t = [expected_t]
+            for _expected_t in expected_t:
+                _expected_t = list(_expected_t) + [None] * (3 - len(_expected_t))
+                status = self.is_expected_throughput(_expected_t, pmd_stat)
+                msg = (
+                    f'{pformat(traffic_task)}'
+                    " not get expected throughput value, real is: "
+                    f'{pformat(pmd_stat)}')
+                self.verify(status, msg)
+        return results
+
+    def is_expected_throughput(self, expected, pmd_stat):
+        _expected, unit, port = expected
+        port = port or 1
+        real_stat = pmd_stat.get(f'port {port}', {})
+        if unit == "rGbps":
+            key = 'rx_bps'
+        else:
+            key = 'tx_bps'
+        real_bps = real_stat.get(key) or 0
+        if real_bps == 0 and _expected == 0:
+            return True
+        if not _expected:
+            return False
+        bias = 10
+        if unit == "MBps":
+            return (100 * (real_bps / 8 / 1e6 - _expected) / _expected) < abs(bias)
+        elif unit == "-MBps":
+            return real_bps / 8 / 1e6 < _expected
+        elif unit in ["Gbps", "rGbps"]:
+            return (100 * (real_bps / 1e9 - _expected) / _expected) < abs(bias)
+        return True
+
+    def get_custom_nic_port(self, nic_name, num=None):
+        cnt = 0
+        for dut_port_id in self.dut.get_ports():
+            port_type = self.dut.ports_info[dut_port_id]['type']
+            intf = self.dut.ports_info[dut_port_id]['intf']
+            pci = self.dut.ports_info[dut_port_id]['pci']
+            _nic_name = get_nic_name(port_type)
+            if _nic_name in nic_name:
+                if num and cnt != num:
+                    cnt += 1
+                    continue
+                return dut_port_id, intf, pci
+        return None, None, None
+
+    def pf_preset(self, num=None):
+        self.nic_100g, self.nic100G_intf, self.nic100g_pci = self.get_custom_nic_port([
+            'columbiaville_100g', ], num=num)
+        self.nic_25g, self.nic25G_intf, self.nic25g_pci = self.get_custom_nic_port([
+            'columbiaville_25gx2', ])
+        msg = "not enough nics for testing"
+        self.verify(self.nic_100g is not None and self.nic_25g is not None, msg)
+        port_obj = self.dut.ports_info[self.nic_100g]['port']
+        port_obj.bind_driver(port_obj.default_driver)
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"lldptool -T -i {self.nic25G_intf} -V ETS-CFG willing=no",
+            f"lldptool -T -i {self.nic100G_intf} -V ETS-CFG willing=no", ]
+        self.d_a_con(cmds)
+        port_obj = self.dut.ports_info[self.nic_25g]['port']
+        port_obj.bind_driver(port_obj.default_driver)
+
+    def pf_restore(self):
+        port_obj = self.dut.ports_info[self.nic_100g]['port']
+        port_obj.bind_driver(self.drivername)
+        port_obj = self.dut.ports_info[self.nic_25g]['port']
+        port_obj.bind_driver(self.drivername)
+
+    def vf_init(self):
+        self.cur_vf_config = {}
+        self.vf_ports_info = {}
+        self.valports = []
+
+    def vf_create(self, valports, vf_num=2):
+        vf_config = {
+            "valports": valports or [self.nic_100g],
+            "vf_num": vf_num,
+        }
+        if operator.eq(vf_config, self.cur_vf_config) and self.vf_ports_info:
+            return
+        elif self.vf_ports_info:
+            self.vf_destroy()
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"rmmod {self.drivername}",
+            f"modprobe {self.drivername}", ]
+        self.d_a_con(cmds)
+        for index, port_id in enumerate(valports):
+            port_obj = self.dut.ports_info[port_id]['port']
+            pf_driver = port_obj.default_driver
+            self.dut.generate_sriov_vfs_by_port(port_id, vf_num, driver=pf_driver)
+            pf_pci = port_obj.pci
+            sriov_vfs_port = self.dut.ports_info[port_id].get('vfs_port')
+            if not sriov_vfs_port:
+                msg = f"failed to create vf on dut port {pf_pci}"
+                self.logger.error(msg)
+                continue
+            for port in sriov_vfs_port:
+                port.bind_driver(driver=self.drivername)
+            self.vf_ports_info[port_id] = {
+                'pf_pci': pf_pci,
+                'vfs_pci': port_obj.get_sriov_vfs_pci(), }
+            time.sleep(1)
+            pf_intf = port_obj.get_interface_name()
+            cmd = ';'.join([
+                f"ifconfig {pf_intf} up",
+                f"ethtool {pf_intf} | grep Speed", ])
+            self.d_a_con(cmd)
+            set_mac = "00:11:22:33:44:55" if index == 0 else "00:11:22:33:44:66"
+            set_mac_cmd = f"ip link set {pf_intf} vf 1 mac {set_mac}"
+            cmds = [
+                set_mac_cmd if vf_num == 2 else "echo 'set mac in next step'",
+                f"ip link set dev {pf_intf} vf 0 trust on", ]
+            self.d_a_con(cmds)
+        self.cur_vf_config = vf_config
+
+    def vf_destroy(self):
+        if not self.vf_ports_info:
+            return
+        for port_id, _ in self.vf_ports_info.items():
+            port_obj = self.dut.ports_info[port_id]['port']
+            pf_intf = port_obj.get_interface_name()
+            cmd = f"ip link set dev {pf_intf} vf 0 trust off"
+            self.d_a_con(cmd)
+            self.dut.destroy_sriov_vfs_by_port(port_id)
+            pf_driver = port_obj.default_driver
+            port_obj.bind_driver(pf_driver)
+        self.vf_ports_info = {}
+        self.cur_vf_config = {}
+        cmds = [
+            "rmmod ice",
+            "modprobe ice", ]
+        self.d_a_con(cmds)
+
+    def testpmd_query_stats(self):
+        output = self.pmd_con('show port stats all')
+        if not output:
+            return
+        port_pat = '.*NIC statistics for (port \d+) .*'
+        rx_pat = '.*Rx-pps:\s+(\d+)\s+Rx-bps:\s+(\d+).*'
+        tx_pat = '.*Tx-pps:\s+(\d+)\s+Tx-bps:\s+(\d+).*'
+        port = re.findall(port_pat, output, re.M)
+        rx = re.findall(rx_pat, output, re.M)
+        tx = re.findall(tx_pat, output, re.M)
+        if not port or not rx or not tx:
+            return
+        stat = {}
+        for port_id, (rx_pps, rx_bps), (tx_pps, tx_bps) in zip(port, rx, tx):
+            stat[port_id] = {
+                'rx_pps': float(rx_pps),
+                'rx_bps': float(rx_bps),
+                'tx_pps': float(tx_pps),
+                'tx_bps': float(tx_bps),
+                }
+        self.pmd_stat = stat
+
+    def get_queue_packets_stats(self):
+        output = self.pmd_con('stop')
+        self.pmd_con('start')
+        pat_k = r"Forward Stats for RX Port= ([0-9]+)/Queue= ([0-9]+)\s+-> TX Port= ([0-9]+)/Queue= ([0-9]+)"
+        pat_v = r"RX-packets: ([0-9]+)\s+TX-packets: ([0-9]+)\s+TX-dropped: ([0-9]+)"
+        k_result = re.findall(pat_k, output, re.M)
+        v_result = re.findall(pat_v, output, re.M)
+        if not k_result or not v_result:
+            return {}
+        stats = dict(zip(k_result, v_result))
+        return stats
+
+    def check_queue(self, expecteds, reals):
+        if not expecteds:
+            return
+        if not isinstance(expecteds, list):
+            expecteds = [expecteds]
+        queue_map_grp = []
+        for expected in expecteds:
+            queue_map_grp += [
+                tuple([str(item) for item in [
+                    expected[0][0], queue_id, expected[0][1], queue_id]])
+                for queue_id in expected[1]]
+        for real, _ in reals.items():
+            if real not in queue_map_grp:
+                msg = (
+                    " not get expected queue mapping, real is: "
+                    f'{pformat(reals)}')
+                self.verify(False, msg)
+
+    def check_queue_pkts_ratio(self, expected, result):
+        total_pkts = 0
+        for key, value in result.items():
+            total_pkts += int(value[1])
+        ratio = []
+        for queue in expected:
+            if isinstance(queue[0], list):
+                e_keys = []
+                for _queue in queue[0]:
+                    topo = [str(i) for i in _queue[0]]
+                    queue_ids = [str(i) for i in _queue[1]]
+                    e_keys += [(topo[0], queue_id, topo[1], queue_id, ) for queue_id in queue_ids]
+            else:
+                topo = [str(i) for i in queue[0]]
+                queue_ids = [str(i) for i in queue[1]]
+                e_keys = [(topo[0], queue_id, topo[1], queue_id, ) for queue_id in queue_ids]
+            e_total = 0
+            for key, value in result.items():
+                if key in e_keys:
+                    e_total += int(value[1])
+            if not e_total:
+                ratio.append(0)
+                continue
+            percentage = 100 * e_total/total_pkts
+            ratio.append(percentage)
+        bias = 10
+        for idx, queue in enumerate(expected):
+            percentage = 100 * queue[2] / sum([i[2] for i in expected])
+
+            _bias = 100 * abs(ratio[idx] - percentage)/percentage
+            self.logger.info((ratio[idx], percentage))
+            if _bias < bias:
+                continue
+            else:
+                msg = 'can not get expected queue ratio'
+                self.verify(False, msg)
+
+    def testpmd_init(self):
+        self.pmd_output = PmdOutput(self.dut)
+        self.is_pmd_on = False
+
+    def testpmd_start(self, vfs_group):
+        allow_list = []
+        for vfs in vfs_group:
+            for idx, vf in enumerate(vfs):
+                addr = f"{vf},cap=dcf" if idx == 0 else vf
+                allow_list.append(addr)
+        eal_param = " ".join(allow_list)
+        param = (
+            "{xq} "
+            "{nb-cores} "
+            "{topo}").format(**{
+                "xq": "--txq=8 --rxq=8",
+                "nb-cores": "--nb-cores=8",
+                "topo": "--port-topology=loop" if len(vfs_group) == 1 else "",
+            })
+        self.pmd_output.start_testpmd(
+            cores="1S/9C/1T",
+            param=param,
+            **{"ports": allow_list}
+        )
+        self.is_pmd_on = True
+
+    def testpmd_close(self):
+        if not self.is_pmd_on:
+            return
+        try:
+            self.pmd_con('stop')
+            self.d_con(['quit', '# ', 30])
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+        self.is_pmd_on = False
+
+    def check_output(self, expected, output):
+        if isinstance(expected, str):
+            expected = [expected]
+        for _expected in expected:
+            self.verify(
+                _expected in output,
+                f"expected <{_expected}> message not display")
+
+    def check_error_output(self, output):
+        msg = "'port tm hierarchy commit' failed to set"
+        self.verify('error' not in output.lower(), msg)
+        self.verify('fail' not in output.lower(), msg)
+
+    def strict_mode_check_peak_tb_rate_preset(self, vfs_grp, dcb_cmd=None, if_op='up',
+                                              commit_check=True):
+        cmds = [
+            dcb_cmd or f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} {if_op}", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output if commit_check else None],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 no", self.check_error_output if commit_check else None],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+
+    def verify_strict_mode_check_peak_tb_rate(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 no", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 2],
+            [0, 5],
+            [0, 3],
+            [0, 4], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+            [[1], 25, (2, 'MBps')],
+            [[2], 25, (4, 'MBps')],
+            [[3], 25, (4, 'MBps')],
+            [[0, 1, 2, 3], 100, (10, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+        queue_mapping = [
+            ((1, 1), range(4)),
+            ((1, 1), range(4)),
+            ((1, 1), (4, 5)),
+            ((1, 1), (6, 7)),
+            None,
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 no", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start",
+        ]
+        self.pmd_con(cmds)
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+            [[1], 25, (2, 'MBps')],
+            [[2], 25, (4, 'MBps')],
+            [[3], 25, (0, 'MBps')],
+            [[0, 1, 2, 3], 100, (6, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+
+    def verify_ets_mode_check_peak_tb_rate(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,0,1,1,1,1 --tcbw 20,80,0,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf} --ieee --up2tc 0,0,0,0,1,1,1,1 --tcbw 20,80,0,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+
+        def pmd_cmds(pir=None):
+            return [
+                "set portlist 0,2,1,3",
+                "show config fwd",
+                "port stop all",
+                f"add port tm node shaper profile 0 1 10000000 0 {pir or 4000000000} 0 0 0",
+                "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+                "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+                "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 0 2 800 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 0 3 800 0 1 2 1 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 0 yes", self.check_error_output],
+                f"add port tm node shaper profile 2 1 10000000 0 {pir or 1000000000} 0 0 0",
+                "add port tm nonleaf node 2 1000 -1 0 1 0 -1 1 0 0",
+                "add port tm nonleaf node 2 900 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 800 1000 0 1 1 -1 1 0 0",
+                "add port tm leaf node 2 0 900 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 2 1 900 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 2 2 800 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 2 3 800 0 1 2 1 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 2 yes", self.check_error_output],
+                "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+                "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+                "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 1 yes", self.check_error_output],
+                "add port tm nonleaf node 3 1000 -1 0 1 0 0 1 0 0",
+                "add port tm nonleaf node 3 900 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 800 1000 0 1 1 0 1 0 0",
+                "add port tm leaf node 3 0 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 1 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 2 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 3 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 4 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 5 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 6 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 7 800 0 1 2 0 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 3 yes", self.check_error_output],
+                "port start all",
+                "set fwd mac",
+                "start",
+            ]
+
+        self.pmd_con(pmd_cmds())
+        stream_configs = [
+            [0, 0],
+            [0, 4], ]
+        traffic_tasks = [
+            [[0], 50, (7.3, 'Gbps', 3)],
+            [[1], 50, (7.3, 'Gbps', 3)],
+            [[0, 1], 100, (7.3, 'Gbps', 3)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.pmd_con('stop')
+        self.testpmd_close()
+
+        queue_mapping = [
+            ((1, 3), range(4)),
+            ((1, 3), range(4, 8)),
+            None,
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+        expected = [
+            ((1, 3), range(4), 20),
+            ((1, 3), range(4, 8), 80),
+        ]
+        self.check_queue_pkts_ratio(expected, results[-1][2])
+        time.sleep(5)
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,0,1,1,1,1 --tcbw 20,80,0,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf} --ieee --up2tc 0,0,0,0,1,1,1,1 --tcbw 20,80,0,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        self.pmd_con(pmd_cmds(500000000))
+        traffic_tasks = [
+            [[0], 50, (3.95, 'Gbps', 3)],
+            [[1], 50, (3.95, 'Gbps', 3)],
+            [[0, 1], 100, (7.27, 'Gbps', 3)],
+        ]
+        result = self.check_traffic(stream_configs, traffic_tasks)
+        self.pmd_con('stop')
+        self.testpmd_close()
+
+    def verify_strict_mode_check_cmit_tb_rate(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,1,0,0,0,0 --tcbw 10,90,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf} --ieee --up2tc 0,0,0,1,0,0,0,0 --tcbw 10,90,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "set portlist 0,2,1,3",
+            "show config fwd",
+            "port stop all",
+            "add port tm node shaper profile 0 1 10000000 0 4000000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm node shaper profile 2 1 10000000 0 1000000000 0 0 0",
+            "add port tm nonleaf node 2 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 2 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 2 800 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 2 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 2 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 2 2 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 2 3 800 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 2 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "add port tm nonleaf node 3 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 3 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 3 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 3 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 3 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 3], ]
+        traffic_tasks = [
+            [[0], 50, (7.3, 'Gbps', 3)],
+            [[1], 50, (7.3, 'Gbps', 3)],
+            [[0, 1], 100, (7.3, 'Gbps', 3)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.pmd_con('stop')
+        self.testpmd_close()
+
+        queue_mapping = [
+            ((1, 3), range(4)),
+            ((1, 3), range(4, 8)),
+            None,
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+
+    def verify_ets_mode_check_TC_throughput_min_BW_allocation(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,1,1,2,2,2,2 --tcbw 1,10,89,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf}  --ieee --up2tc 0,0,1,1,2,2,2,2 --tcbw 1,10,89,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "set portlist 0,2,1,3",
+            "show config fwd",
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000000 0 4000000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm node shaper profile 2 1 100000000 0 1000000000 0 0 0",
+            "add port tm node shaper profile 2 2 100000000 0 150000000 0 0 0",
+            "add port tm nonleaf node 2 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 2 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 2 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 2 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 2 0 900 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 2 1 900 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 2 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 2 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 2 4 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 2 5 700 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 2 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "add port tm nonleaf node 3 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 3 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 3 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 3 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 3 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 3 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 1],
+            [0, 2],
+            [0, 3],
+            [0, 4],
+            [0, 5],
+            [0, 6],
+            [0, 7], ]
+        traffic_tasks = [
+            [[0], 12.5, (1.2, 'Gbps', 3)],
+            [[1], 12.5, (1.2, 'Gbps', 3)],
+            [[2], 12.5, (1.2, 'Gbps', 3)],
+            [[3], 12.5, (1.2, 'Gbps', 3)],
+            [[4], 12.5, (8, 'Gbps', 3)],
+            [[5], 12.5, (8, 'Gbps', 3)],
+            [[6], 12.5, (8, 'Gbps', 3)],
+            [[7], 12.5, (8, 'Gbps', 3)],
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (9.7, 'Gbps', 1)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=1024)
+        queue_mapping = [
+            ((1, 3), range(2)),
+            ((1, 3), range(2)),
+            ((1, 3), range(2, 6)),
+            ((1, 3), range(2, 6)),
+            ((1, 3), (6, 7)),
+            ((1, 3), (6, 7)),
+            ((1, 3), (6, 7)),
+            ((1, 3), (6, 7)),
+            None,
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+        time.sleep(10)
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (7.273, 'Gbps', 1)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+        expected = [
+            ((1, 3), range(2), 1),
+            ((1, 3), range(2, 6), 9),
+            ((1, 3), range(6, 8), 89),
+        ]
+        self.check_queue_pkts_ratio(expected, results[-1][2])
+
+    def verify_iavf_VFs_strict_mode_check_peak_tb_rate(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ip link set dev {self.nic100G_intf} vf 0 trust on",
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55",
+            f"ip link set {self.nic100G_intf} vf 2 mac 00:11:22:33:44:66", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 -1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 -1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 6 700 0 1 2 -1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 7 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 8 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "add port tm nonleaf node 2 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 2 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 2 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 2 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 2 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 2 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 1, '00:11:22:33:44:55'],
+            [0, 2, '00:11:22:33:44:55'],
+            [0, 3, '00:11:22:33:44:55'],
+            [0, 4, '00:11:22:33:44:55'],
+
+            [0, 1, '00:11:22:33:44:66'],
+            [0, 2, '00:11:22:33:44:66'],
+            [0, 3, '00:11:22:33:44:66'],
+            [0, 4, '00:11:22:33:44:66'], ]
+        traffic_tasks = [
+            [[0], 12.5, (2, 'MBps')],
+            [[1], 12.5, (2, 'MBps')],
+            [[2], 12.5, (4, 'MBps')],
+            [[3], 12.5, (2, 'MBps')],
+            [[4], 12.5, (2, 'MBps', 2)],
+            [[5], 12.5, (2, 'MBps', 2)],
+            [[6], 12.5, (2, 'MBps', 2)],
+            [[7], 12.5, (4, 'MBps', 2)],
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (12.5, 'Gbps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+
+        expected = [
+            ((1, 1), range(2)),
+            ((1, 1), range(2)),
+            ((1, 1), range(2, 4)),
+            ((1, 1), range(4, 8)),
+            ((1, 2), range(2)),
+            ((1, 2), range(2)),
+            ((1, 2), range(2, 6)),
+            ((1, 2), range(6, 8)),
+            None,
+        ]
+        expected = [
+            ((1, 1), range(2), 16),
+            ((1, 1), range(2, 4), 32),
+            ((1, 1), range(4, 8), 16),
+            ((2, 2), range(2), 16),
+            ((2, 2), range(2, 6), 16),
+            ((2, 2), range(6, 8), 32),
+        ]
+        self.check_queue_pkts_ratio(expected, results[-1][2])
+
+    def verify_iavf_VFs_strict_mode_check_cmit_tb_rate(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,1,0,0,0,0 --tcbw 20,80,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf} --ieee --up2tc 0,0,0,1,0,0,0,0 --tcbw 20,80,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            "sleep 5",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up",
+            "sleep 5",
+            f"ip link set dev {self.nic100G_intf} vf 0 trust on",
+            "sleep 5",
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55",
+            f"ip link set {self.nic100G_intf} vf 2 mac 00:11:22:33:44:66",
+            "sleep 5",
+            f"ip link set dev {self.nic25G_intf} vf 0 trust on",
+            "sleep 5",
+            f"ip link set {self.nic25G_intf} vf 1 mac 00:11:22:33:44:77",
+            f"ip link set {self.nic25G_intf} vf 2 mac 00:11:22:33:44:88",
+            "sleep 5",
+         ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "set portlist 0,3,1,4,2,5",
+            "show config fwd",
+            "port stop all",
+            "add port tm node shaper profile 0 1 100000000 0 4000000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 800 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm node shaper profile 3 1 100000000 0 500000000 0 0 0",
+            "add port tm nonleaf node 3 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 3 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 3 800 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 3 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 2 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 3 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 4 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 5 800 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 3 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 no", self.check_error_output],
+            "add port tm nonleaf node 4 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 4 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 4 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 4 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 4 no", self.check_error_output],
+            "add port tm nonleaf node 2 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 2 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 2 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 2 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 2 no", self.check_error_output],
+            "add port tm nonleaf node 5 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 5 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 5 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 5 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 5 no", self.check_error_output], ]
+        self.pmd_con(cmds)
+        time.sleep(15)
+        cmds = [
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        time.sleep(15)
+        stream_configs = [
+            [0, 2, '00:11:22:33:44:55'],
+            [0, 3, '00:11:22:33:44:55'],
+            [0, 2, '00:11:22:33:44:66'],
+            [0, 3, '00:11:22:33:44:66'],
+        ]
+        traffic_tasks = [
+            [[0, 1, 2, 3, ], 100, [(3.64, 'Gbps', 4), (3.64, 'Gbps', 5)]],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.pmd_con('stop')
+        self.testpmd_close()
+
+    def verify_iavf_VFs_ets_mode(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        cmds = [
+            f"ip link set dev {self.nic100G_intf} vf 0 trust on",
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55",
+            f"ip link set {self.nic100G_intf} vf 2 mac 00:11:22:33:44:66",
+            f"ip link set dev {self.nic25G_intf} vf 0 trust on",
+            f"ip link set {self.nic25G_intf} vf 1 mac 00:11:22:33:44:77",
+            f"ip link set {self.nic25G_intf} vf 2 mac 00:11:22:33:44:88",
+         ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "set portlist 0,3,1,4,2,5",
+            "show config fwd",
+            "port stop all",
+            "add port tm node shaper profile 0 1 0 0 0 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 6 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 7 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 8 700 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm node shaper profile 3 1 0 0 0 0 0 0",
+            "add port tm nonleaf node 3 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 3 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 3 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 3 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 3 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 2 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 3 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 4 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 5 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 6 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 7 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 3 8 700 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 3 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "add port tm nonleaf node 2 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 2 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 2 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 2 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 2 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 2 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 2 yes", self.check_error_output],
+            "add port tm nonleaf node 4 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 4 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 4 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 4 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 4 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 4 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 5 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 4 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 4 yes", self.check_error_output],
+            "add port tm nonleaf node 5 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 5 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 5 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 5 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 5 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 5 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 5 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        time.sleep(25)
+        stream_configs = [
+            [0, 1, '00:11:22:33:44:55'],
+            [0, 2, '00:11:22:33:44:55'],
+            [0, 3, '00:11:22:33:44:55'],
+            [0, 4, '00:11:22:33:44:55'],
+            [0, 1, '00:11:22:33:44:66'],
+            [0, 2, '00:11:22:33:44:66'],
+            [0, 3, '00:11:22:33:44:66'],
+            [0, 4, '00:11:22:33:44:66'], ]
+        traffic_tasks = [
+            [[0], 12.5, (7.27, 'Gbps', 4)],
+            [[1], 12.5, (7.27, 'Gbps', 4)],
+            [[2], 12.5, (7.27, 'Gbps', 4)],
+            [[3], 12.5, (7.27, 'Gbps', 4)],
+            [[4], 12.5, (7.27, 'Gbps', 5)],
+            [[5], 12.5, (7.27, 'Gbps', 5)],
+            [[6], 12.5, (7.27, 'Gbps', 5)],
+            [[7], 12.5, (7.27, 'Gbps', 5)],
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, [(3.63, 'Gbps', 4), (3.63, 'Gbps', 5)]],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+        expected = [
+            ([[(1, 4), range(2)], [(2, 5), range(2)]], None, 1),
+            ([[(1, 4), range(2, 4)], [(2, 5), range(2, 6)]], None, 3),
+            ([[(1, 4), range(4, 8)], [(2, 5), range(6, 8)]], None, 6),
+        ]
+        self.check_queue_pkts_ratio(expected, results[-1][2])
+
+    def verify_strict_mode_8_TCs(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,1,2,3,4,5,6,7 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 400000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 200000000 0 0 0",
+            "add port tm node shaper profile 0 3 1000000 0 100000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 600 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 500 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 400 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 300 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 200 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 6 600 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 7 600 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 8 500 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 9 500 0 1 2 3 0 0xffffffff 0 0",
+            "add port tm leaf node 0 10 400 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 11 400 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 12 300 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 13 300 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 14 200 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 15 200 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 600 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 500 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 400 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 300 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 200 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 600 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 500 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 400 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 300 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 200 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 1],
+            [0, 2],
+            [0, 3],
+            [0, 4],
+            [0, 5],
+            [0, 6],
+            [0, 7], ]
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (10, 'Gbps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+        time.sleep(10)
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,1,2,3,4,5,6,7 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 1780000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 600 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 500 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 400 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 300 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 200 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 6 600 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 7 600 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 8 500 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 9 500 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 10 400 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 11 400 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 12 300 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 13 300 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 14 200 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 15 200 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 600 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 500 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 400 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 300 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 200 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 600 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 500 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 400 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 300 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 200 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (25, 'Gbps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.pmd_con('stop')
+        time.sleep(5)
+        self.pmd_con('start')
+        time.sleep(10)
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (100, 'Gbps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=1024)
+        self.testpmd_close()
+
+    def verify_strict_mode_1_TC(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,0,0,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 1000000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 900 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 1],
+            [0, 2],
+            [0, 3],
+            [0, 4],
+            [0, 5],
+            [0, 6],
+            [0, 7], ]
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (8, 'Gbps')],
+            [[0], 12.5, (8, 'Gbps')], ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=1024)
+        self.testpmd_close()
+
+    def verify_ets_mode_8_TCs(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,1,2,3,4,5,6,7 --tcbw 5,10,15,10,20,1,30,9 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf}  --ieee --up2tc 0,1,2,3,4,5,6,7 --tcbw 5,10,15,10,20,1,30,9 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+
+        def pmd_cmds(opts):
+            return [
+                "set portlist 0,2,1,3",
+                "show config fwd",
+                "port stop all",
+                "add port tm node shaper profile 0 1 1000000 0 4000000000 0 0 0",
+                "add port tm node shaper profile 0 2 1000000 0 2000000000 0 0 0",
+                "add port tm node shaper profile 0 3 1000000 0 1000000000 0 0 0",
+                "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+                "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 600 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 500 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 400 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 300 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 0 200 1000 0 1 1 -1 1 0 0",
+                "add port tm leaf node 0 0 900 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 1 900 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 2 800 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 3 800 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 4 700 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 5 700 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 6 600 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 7 600 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 8 500 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 9 500 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 0 10 400 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 0 11 400 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 0 12 300 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 0 13 300 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 0 14 200 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 0 15 200 0 1 2 1 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 0 yes", self.check_error_output],
+                opts[0],
+                opts[1],
+                opts[2],
+                "add port tm nonleaf node 2 1000 -1 0 1 0 -1 1 0 0",
+                "add port tm nonleaf node 2 900 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 800 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 700 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 600 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 500 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 400 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 300 1000 0 1 1 -1 1 0 0",
+                "add port tm nonleaf node 2 200 1000 0 1 1 -1 1 0 0",
+                "add port tm leaf node 2 0 900 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 1 900 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 2 800 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 3 800 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 4 700 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 5 700 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 6 600 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 7 600 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 8 500 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 9 500 0 1 2 3 0 0xffffffff 0 0",
+                "add port tm leaf node 2 10 400 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 2 11 400 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 2 12 300 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 2 13 300 0 1 2 2 0 0xffffffff 0 0",
+                "add port tm leaf node 2 14 200 0 1 2 1 0 0xffffffff 0 0",
+                "add port tm leaf node 2 15 200 0 1 2 1 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 2 yes", self.check_error_output],
+                "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+                "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 600 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 500 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 400 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 300 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 1 200 1000 0 1 1 0 1 0 0",
+                "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 1 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 2 700 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 3 600 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 4 500 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 5 400 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 6 300 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 1 7 200 0 1 2 0 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 1 yes", self.check_error_output],
+                "add port tm nonleaf node 3 1000 -1 0 1 0 0 1 0 0",
+                "add port tm nonleaf node 3 900 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 800 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 700 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 600 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 500 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 400 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 300 1000 0 1 1 0 1 0 0",
+                "add port tm nonleaf node 3 200 1000 0 1 1 0 1 0 0",
+                "add port tm leaf node 3 0 900 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 1 800 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 2 700 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 3 600 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 4 500 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 5 400 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 6 300 0 1 2 0 0 0xffffffff 0 0",
+                "add port tm leaf node 3 7 200 0 1 2 0 0 0xffffffff 0 0",
+                ["port tm hierarchy commit 3 yes", self.check_error_output],
+                "port start all",
+                "set fwd mac",
+                "start", ]
+
+        opts = [
+            "add port tm node shaper profile 2 1 1000000 0 400000000 0 0 0",
+            "add port tm node shaper profile 2 2 1000000 0 200000000 0 0 0",
+            "add port tm node shaper profile 2 3 1000000 0 100000000 0 0 0", ]
+        self.pmd_con(pmd_cmds(opts))
+        stream_configs = [
+            [0, 0],
+            [0, 1],
+            [0, 2],
+            [0, 3],
+            [0, 4],
+            [0, 5],
+            [0, 6],
+            [0, 7], ]
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (7.3, 'Gbps', 3)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+        time.sleep(5)
+        self.testpmd_start(vfs_grp)
+        opts = [
+            "add port tm node shaper profile 2 1 1000000 0 100000000 0 0 0",
+            "add port tm node shaper profile 2 2 1000000 0 250000000 0 0 0",
+            "add port tm node shaper profile 2 3 1000000 0 100000000 0 0 0", ]
+        self.pmd_con(pmd_cmds(opts))
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (7.3, 'Gbps', 3)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+        time.sleep(5)
+        self.testpmd_start(vfs_grp)
+        opts = [
+            "add port tm node shaper profile 2 1 0 0 0 0 0 0",
+            "add port tm node shaper profile 2 2 0 0 0 0 0 0",
+            "add port tm node shaper profile 2 3 0 0 0 0 0 0", ]
+        self.pmd_con(pmd_cmds(opts))
+        traffic_tasks = [
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (7.3, 'Gbps', 3)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+
+        expected = [
+            ((1, 3), [0], 5),
+            ((1, 3), [1], 10),
+            ((1, 3), [2], 15),
+            ((1, 3), [3], 10),
+            ((1, 3), [4], 20),
+            ((1, 3), [5], 1),
+            ((1, 3), [6], 30),
+            ((1, 3), [7], 9),
+        ]
+        self.check_queue_pkts_ratio(expected, results[-1][2])
+
+    def verify_ets_mode_1_TC(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,0,0,0,0,0 --tcbw 100,0,0,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"{self.dcbgetset} {self.nic25G_intf}  --ieee --up2tc 0,0,0,0,0,0,0,0 --tcbw 100,0,0,0,0,0,0,0 --tsa 2,2,2,2,2,2,2,2 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ifconfig {self.nic25G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "set portlist 0,2,1,3",
+            "show config fwd",
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 10000000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 900 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "add port tm node shaper profile 2 1 1000000 0 1000000000 0 0 0",
+            "add port tm nonleaf node 2 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 2 900 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 2 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 2 1 900 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 2 yes", self.check_error_output],
+            "add port tm nonleaf node 3 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 3 900 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 3 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 4 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 5 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 6 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 3 7 900 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 3 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 1],
+            [0, 2],
+            [0, 3],
+            [0, 4],
+            [0, 5],
+            [0, 6],
+            [0, 7], ]
+        traffic_tasks = [
+            [[0], 12.5, (7.3, 'Gbps', 3)],
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (7.3, 'Gbps', 3)],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+
+    def verify_query_qos_setting(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 no", self.check_error_output],
+            "port start all", ]
+        self.pmd_con(cmds)
+        cmds = [
+            "show port tm cap 1", ]
+        self.pmd_con(cmds)
+        cmds = [
+            "show port tm level cap 1 0",
+            "show port tm level cap 1 1",
+            "show port tm level cap 1 2", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            'cap.nonleaf.shaper_private_rate_min 0',
+            'cap.nonleaf.shaper_private_rate_max 12500000000', ]
+        [self.check_output(expected, output) for output in outputs]
+        cmds = [
+            "show port tm node cap 1 900",
+            "show port tm node cap 1 800",
+            "show port tm node cap 1 1", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            ['cap.shaper_private_rate_min 1000000',
+             'cap.shaper_private_rate_max 2000000', ],
+            ['cap.shaper_private_rate_min 1000000',
+             'cap.shaper_private_rate_max 4000000', ],
+            "node parameter null: not support capability get (error 22)", ]
+        [self.check_output(_expected, output)
+         for _expected, output in zip(expected, outputs)]
+        cmds = [
+            "show port tm node type 1 0",
+            "show port tm node type 1 900",
+            "show port tm node type 1 1000", ]
+        outputs = self.pmd_con(cmds)
+        expected_types = ['leaf node', 'nonleaf node', 'nonleaf node']
+        [self.check_output(_expected, output)
+         for _expected, output in zip(expected_types, outputs)]
+        self.testpmd_close()
+
+    def verify_pf_reset(self, vfs_grp):
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp)
+        stream_configs = [
+            [0, 2], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')], ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+        pci = str(int(self.nic100g_pci[5:7]) - 1)
+        cmds = [
+            f"echo 1 > /sys/devices/pci0000:{pci}/0000:{pci}:00.0/{self.nic100g_pci}/reset", ]
+        self.d_a_con(cmds)
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp, commit_check=False)
+        stream_configs = [
+            [0, 2], ]
+        traffic_tasks = [
+            [[0], 25, (0, 'MBps')], ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+
+    def verify_vf_reset(self, vfs_grp):
+        cmds = [
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:66", ]
+        self.d_a_con(cmds)
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp)
+        cmds = [
+            "port stop 1",
+            "port reset 1",
+            "port start 1",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 2, "00:11:22:33:44:66"],
+            [0, 5, "00:11:22:33:44:66"],
+            [0, 3, "00:11:22:33:44:66"],
+            [0, 4, "00:11:22:33:44:66"], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+            [[1], 25, (2, 'MBps')],
+            [[2], 25, (4, 'MBps')],
+            [[3], 25, (4, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+        cmds = [
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55", ]
+        self.d_a_con(cmds)
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp)
+        stream_configs = [
+            [0, 2],
+            [0, 5],
+            [0, 3],
+            [0, 4], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+            [[1], 25, (2, 'MBps')],
+            [[2], 25, (4, 'MBps')],
+            [[3], 25, (4, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+
+    def verify_link_status_change(self, vfs_grp):
+        cmds = [
+            f"ifconfig {self.nic100G_intf} down", ]
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp, if_op='down')
+        stream_configs = [
+            [0, 2], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+        cmds = [
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp)
+        stream_configs = [
+            [0, 2], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+
+    def verify_DCB_setting_TC_change(self, vfs_grp):
+        cmd = f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,40,50,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0"
+        self.strict_mode_check_peak_tb_rate_preset(vfs_grp, dcb_cmd=cmd)
+        stream_configs = [
+            [0, 2],
+            [0, 5],
+            [0, 3],
+            [0, 4], ]
+        traffic_tasks = [
+            [[0], 25, (2, 'MBps')],
+            [[1], 25, (2, 'MBps')],
+            [[2], 25, (4, 'MBps')],
+            [[3], 25, (4, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks)
+        self.testpmd_close()
+
+        queue_mapping = [
+            ((1, 1), range(4)),
+            ((1, 1), range(4)),
+            ((1, 1), range(4, 6)),
+            ((1, 1), range(6, 8)),
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+
+    def negative_case_for_requested_vf_preset(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,0,0,0,0 --tcbw 20,80,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ip link set dev {self.nic100G_intf} vf 0 trust on",
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmd = "port stop all"
+        self.pmd_con(cmd)
+
+    def verify_Requested_VF_id_is_valid(self, vfs_grp):
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 900 0 1 2 1 0 0xffffffff 0 0",
+        ]
+        outputs = self.pmd_con(cmds)
+        expected = "node id: too many VSI for one TC (error 33)"
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_Valid_number_of_TCs_for_the_target_VF(self, vfs_grp):
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 63000 0 12500000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "ice_dcf_commit_check(): Not all enabled TC nodes are set",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm node shaper profile 0 1 63000 0 12500000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 2 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "ice_dcf_commit_check(): Not all VFs are binded to TC1",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0", ]
+        outputs = self.pmd_con(cmds)
+        expected = "shaper profile id field (node params): shaper profile not exist (error 23)"
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_Valid_Min_and_Max_values(self, vfs_grp):
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 62999 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800000 0 1 2 2 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "ice_dcf_execute_virtchnl_cmd(): No response (1 times) or return failure (-5) for cmd 37",
+            "ice_dcf_set_vf_bw(): fail to execute command VIRTCHNL_OP_DCF_CONFIG_BW",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 63000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800000 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output], ]
+        outputs = self.pmd_con(cmds)
+        self.testpmd_close()
+        msg = "failed to set commands"
+        self.verify(all(['error' not in output.lower() for output in outputs]), msg)
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 2001000 0 2000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800000 0 1 2 1 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "ice_dcf_execute_virtchnl_cmd(): No response (1 times) or return failure (-5) for cmd 37",
+            "ice_dcf_set_vf_bw(): fail to execute command VIRTCHNL_OP_DCF_CONFIG_BW",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 2000000 0 2000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800000 0 1 2 1 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        self.testpmd_close()
+        msg = "failed to set commands"
+        self.verify(all(['error' not in output.lower() for output in outputs]), msg)
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000000 0 12000000000 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800000 0 1 2 1 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = "ice_dcf_validate_tc_bw(): Total value of TC0 min bandwidth and other TCs' max bandwidth 104000000kbps should be less than port link speed 100000000kbps"
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_Valid_Min_and_Max_values_02(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,0,0,0,0 --tcbw 20,80,0,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ip link set dev {self.nic100G_intf} vf 0 trust on",
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55",
+            f"ip link set {self.nic100G_intf} vf 2 mac 00:11:22:33:44:66", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 10000000 0 1000000000 0 0 0",
+            "add port tm node shaper profile 0 2 10000000 0 8500000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 800 0 1 2 2 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "ice_dcf_validate_tc_bw(): Total value of TC0 min bandwidth and other TCs' max bandwidth 136160000kbps should be less than port link speed 100000000kbps",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_Valid_Min_and_Max_values_03(self, vfs_grp):
+        self.negative_case_for_requested_vf_preset(vfs_grp)
+        cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 0 0 0 0 0 0",
+            "add port tm nonleaf node 0 1000000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900000 1000000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800000 1000000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800000 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800000 0 1 2 1 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 3], ]
+        traffic_tasks = [
+            [[0], 100, (100, 'Gbps')],
+            [[1], 100, (100, 'Gbps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=1024)
+        self.testpmd_close()
+        queue_mapping = [
+            ((1, 1), range(4)),
+            ((1, 1), range(4, 8)),
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+
+    def negative_case_for_req_vf_to_update_its_queue_to_tc_mapping_preset(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up",
+            f"ip link set dev {self.nic100G_intf} vf 0 trust on",
+            f"ip link set {self.nic100G_intf} vf 1 mac 00:11:22:33:44:55", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmd = "port stop all"
+        self.pmd_con(cmd)
+
+    def verify_Total_number_of_queue_pairs_match_to_what_the_VF_is_allocated(self, vfs_grp):
+        self.negative_case_for_req_vf_to_update_its_queue_to_tc_mapping_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "port tm hierarchy commit 1 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "iavf_hierarchy_commit(): queue node is less than allocated queue pairs",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 8 700 0 1 2 0 0 0xffffffff 0 0",
+        ]
+        outputs = self.pmd_con(cmds)
+        expected = "num strict priorities field (node params): SP priority not supported (error 27)"
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_Number_of_TCs_match_is_less_than_TC_enabled_on_the_VF(self, vfs_grp):
+        self.negative_case_for_req_vf_to_update_its_queue_to_tc_mapping_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "port tm hierarchy commit 0 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "ice_dcf_commit_check(): Not all VFs are binded to TC2",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            "port tm hierarchy commit 1 yes", ]
+        outputs = self.pmd_con(cmds)
+        expected = [
+            "iavf_hierarchy_commit(): Does not set VF vsi nodes to all TCs",
+            "no error: (no stated reason) (error 0)", ]
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            "port tm hierarchy commit 1 yes", ]
+        outputs = self.pmd_con(cmds)
+        msg = "failed to set commands"
+        self.verify(all(['error' not in output.lower() for output in outputs]), msg)
+        stream_configs = [
+            [0, 0],
+            [0, 3], ]
+        traffic_tasks = [
+            [[0], 100, (100, 'rGbps')],
+            [[1], 100, (100, 'rGbps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=1024)
+        self.testpmd_close()
+        queue_mapping = [
+            ((1, 1), range(4)),
+            ((1, 1), range(4, 8)),
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+
+    def verify_Number_of_TCs_match_is_more_than_TC_enabled_on_the_VF(self, vfs_grp):
+        self.negative_case_for_req_vf_to_update_its_queue_to_tc_mapping_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 600 1000 0 1 1 -1 1 0 0", ]
+        outputs = self.pmd_con(cmds)
+        expected = "node id: too many TCs (error 33)"
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 6 600 0 1 2 2 0 0xffffffff 0 0", ]
+        outputs = self.pmd_con(cmds)
+        expected = "parent node id: parent not exist (error 19)"
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 600 1000 0 1 1 0 1 0 0", ]
+        outputs = self.pmd_con(cmds)
+        expected = "node id: too many TCs (error 33)"
+        self.check_output(expected, outputs[-1])
+        cmds = [
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 600 0 1 2 0 0 0xffffffff 0 0", ]
+        outputs = self.pmd_con(cmds)
+        expected = "parent node id: parent not exist (error 19)"
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_overlap_between_queue_to_TC_mapping(self, vfs_grp):
+        self.negative_case_for_req_vf_to_update_its_queue_to_tc_mapping_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 800 0 1 2 0 0 0xffffffff 0 0", ]
+        outputs = self.pmd_con(cmds)
+        expected = "node id: node id already used (error 33)"
+        self.check_output(expected, outputs[-1])
+        self.testpmd_close()
+
+    def verify_Non_contiguous_TC_setting_in_queue_mapping(self, vfs_grp):
+        self.negative_case_for_req_vf_to_update_its_queue_to_tc_mapping_preset(vfs_grp)
+        cmds = [
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 yes", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 800 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 yes", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 2],
+            [0, 5],
+            [0, 3],
+            [0, 4], ]
+        traffic_tasks = [
+            [[0, 1], 100, (2, 'MBps')],
+            [[2], 25, (4, 'MBps')],
+            [[3], 25, (4, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=68)
+        self.testpmd_close()
+        queue_mapping = [
+            ((1, 1), range(2)),
+            ((1, 1), range(2, 4)),
+            ((1, 1), range(4, 8)),
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+
+    def verify_different_vlan_ID(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf}  --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        cmds = [
+            "port stop all",
+            "vlan set filter on 1",
+            "rx_vlan add 1 1",
+            "rx_vlan add 2 1",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 0 no", self.check_error_output],
+            "add port tm nonleaf node 1 1000 -1 0 1 0 0 1 0 0",
+            "add port tm nonleaf node 1 900 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 800 1000 0 1 1 0 1 0 0",
+            "add port tm nonleaf node 1 700 1000 0 1 1 0 1 0 0",
+            "add port tm leaf node 1 0 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 1 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 2 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 3 900 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 4 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 5 800 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 6 700 0 1 2 0 0 0xffffffff 0 0",
+            "add port tm leaf node 1 7 700 0 1 2 0 0 0xffffffff 0 0",
+            ["port tm hierarchy commit 1 no", self.check_error_output],
+            "port start all",
+            "set fwd mac",
+            "start", ]
+        self.pmd_con(cmds)
+        stream_configs = [
+            [0, 0],
+            [0, 1],
+            [0, 3],
+            [0, 4],
+            [1, 0],
+            [1, 3],
+            [2, 2],
+            [2, 4], ]
+        traffic_tasks = [
+            [[0, 1, 4, 6], 100, (2, 'MBps')],
+            [[2, 5], 25, (4, 'MBps')],
+            [[3, 7], 25, (4, 'MBps')],
+            [[0, 1, 2, 3, 4, 5, 6, 7], 100, (10, 'MBps')],
+        ]
+        results = self.check_traffic(stream_configs, traffic_tasks, frame_size=1024)
+        self.testpmd_close()
+        queue_mapping = [
+            ((1, 1), range(4)),
+            ((1, 1), range(4, 6)),
+            ((1, 1), range(6, 8)),
+            None,
+        ]
+        [self.check_queue(expected, real[2]) for expected, real in zip(queue_mapping, results)]
+
+    def verify_delete_qos_setting(self, vfs_grp):
+        cmds = [
+            f"{self.dcbgetset} {self.nic100G_intf} --ieee --up2tc 0,0,0,1,2,0,0,0 --tcbw 10,30,60,0,0,0,0,0 --tsa 0,0,0,0,0,0,0,0 --pfc 0,0,0,0,0,0,0,0",
+            f"ifconfig {self.nic100G_intf} up", ]
+        self.d_a_con(cmds)
+        self.testpmd_start(vfs_grp)
+        step2_cmds = [
+            "port stop all",
+            "add port tm node shaper profile 0 1 1000000 0 2000000 0 0 0",
+            "add port tm node shaper profile 0 2 1000000 0 4000000 0 0 0",
+            "add port tm nonleaf node 0 1000 -1 0 1 0 -1 1 0 0",
+            "add port tm nonleaf node 0 900 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 800 1000 0 1 1 -1 1 0 0",
+            "add port tm nonleaf node 0 700 1000 0 1 1 -1 1 0 0",
+            "add port tm leaf node 0 0 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 1 900 0 1 2 1 0 0xffffffff 0 0",
+            "add port tm leaf node 0 2 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 3 800 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 4 700 0 1 2 2 0 0xffffffff 0 0",
+            "add port tm leaf node 0 5 700 0 1 2 2 0 0xffffffff 0 0",
+        ]
+        self.pmd_con(step2_cmds)
+
+        cmd = "del port tm node 0 1000"
+        output = self.pmd_con(cmd)
+        expected = [
+            "node id: cannot delete a node which has children (error 33)", ]
+        self.check_output(expected, output)
+
+        cmd = "del port tm node 0 700"
+        output = self.pmd_con(cmd)
+        expected = [
+            "node id: cannot delete a node which has children (error 33)", ]
+        self.check_output(expected, output)
+
+        cmd = "del port tm node shaper profile 0 1"
+        output = self.pmd_con(cmd)
+        expected = [
+            "shaper profile null: profile in use (error 10)", ]
+        self.check_output(expected, output)
+
+        cmds = [
+            "del port tm node 0 5",
+            "del port tm node 0 4",
+            "del port tm node 0 3",
+            "del port tm node 0 2",
+            "del port tm node 0 1",
+            "del port tm node 0 0",
+            "del port tm node 0 700",
+            "del port tm node 0 800",
+            "del port tm node 0 900",
+            "del port tm node 0 1000",
+            "del port tm node shaper profile 0 1",
+            "del port tm node shaper profile 0 2", ]
+        outputs = self.pmd_con(cmds)
+        msg = "failed to set commands"
+        self.verify(all(['error' not in output.lower() for output in outputs]), msg)
+
+        self.pmd_con(step2_cmds)
+        cmd = "port tm hierarchy commit 0 no"
+        self.pmd_con(cmd)
+        cmd = "del port tm node 0 5"
+        output = self.pmd_con(cmd)
+        expected = [
+            "cause unspecified: already committed (error 1)", ]
+        self.check_output(expected, output)
+
+        self.testpmd_close()
+
+    def suite_init(self):
+        self.dcbgetset = 'dcbgetset'
+        self.pf_preset()
+        self.vf_init()
+        self.testpmd_init()
+        self.pmd_stat = None
+
+    #
+    # Test cases.
+    #
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+        """
+        self.dut_ports = self.dut.get_ports(self.nic)
+        self.suite_init()
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        self.dut.kill_all()
+        self.pf_restore()
+
+    def test_perf_strict_mode_check_peak_tb_rate(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_strict_mode_check_peak_tb_rate(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_ets_mode_check_peak_tb_rate(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_ets_mode_check_peak_tb_rate(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_strict_mode_check_cmit_tb_rate(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_strict_mode_check_cmit_tb_rate(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_ets_mode_check_TC_throughput_min_BW_allocation(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_ets_mode_check_TC_throughput_min_BW_allocation(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_iavf_VFs_strict_mode_check_peak_tb_rate(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 3])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_iavf_VFs_strict_mode_check_peak_tb_rate(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_iavf_VFs_strict_mode_check_cmit_tb_rate(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 3])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_iavf_VFs_strict_mode_check_cmit_tb_rate(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_iavf_VFs_ets_mode(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 3])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_iavf_VFs_ets_mode(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_strict_mode_8_TCs(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_strict_mode_8_TCs(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_strict_mode_1_TC(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_strict_mode_1_TC(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_ets_mode_8_TCs(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_ets_mode_8_TCs(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_ets_mode_1_TC(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g, self.nic_25g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_ets_mode_1_TC(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_query_qos_setting(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_query_qos_setting(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_pf_reset(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_pf_reset(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_vf_reset(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_vf_reset(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_link_status_change(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_link_status_change(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_DCB_setting_TC_change(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_DCB_setting_TC_change(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Requested_VF_id_is_valid(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Requested_VF_id_is_valid(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Valid_number_of_TCs_for_the_target_VF(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Valid_number_of_TCs_for_the_target_VF(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Valid_Min_and_Max_values(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Valid_Min_and_Max_values(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+        try:
+            self.vf_create(*[[self.nic_100g], 3])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Valid_Min_and_Max_values_02(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Valid_Min_and_Max_values_03(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Total_number_of_queue_pairs_match_to_what_the_VF_is_allocated(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Total_number_of_queue_pairs_match_to_what_the_VF_is_allocated(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Number_of_TCs_match_is_less_than_TC_enabled_on_the_VF(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Number_of_TCs_match_is_less_than_TC_enabled_on_the_VF(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Number_of_TCs_match_is_more_than_TC_enabled_on_the_VF(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Number_of_TCs_match_is_more_than_TC_enabled_on_the_VF(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_overlap_between_queue_to_TC_mapping(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_overlap_between_queue_to_TC_mapping(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_Non_contiguous_TC_setting_in_queue_mapping(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_Non_contiguous_TC_setting_in_queue_mapping(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_different_vlan_ID(self):
+        except_content = None
+        try:
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_different_vlan_ID(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+        if except_content:
+            raise VerifyFailure(except_content)
+
+    def test_perf_delete_qos_setting(self):
+        except_content = None
+        try:
+            self.vf_init()
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_delete_qos_setting(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+
+        try:
+            self.pf_preset(num=1)
+            self.vf_init()
+            self.vf_create(*[[self.nic_100g], 2])
+            vfs_group = [
+                info.get('vfs_pci') for _, info in self.vf_ports_info.items()]
+            self.verify_delete_qos_setting(vfs_group)
+        except Exception as e:
+            self.logger.error(traceback.format_exc())
+            except_content = e
+        finally:
+            self.testpmd_close()
+            self.vf_destroy()
+
+        self.pf_preset()
+        self.vf_init()
+
+        if except_content:
+            raise VerifyFailure(except_content)
-- 
2.21.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: [dts][PATCH V4 0/1] tests/cvl_dcf_qos: upload script
  2021-11-19  8:03 [dts][PATCH V4 0/1] tests/cvl_dcf_qos: upload script Yufen Mo
  2021-11-19  8:03 ` [dts][PATCH V4 1/1] " Yufen Mo
@ 2021-11-23  2:16 ` Peng, Yuan
  1 sibling, 0 replies; 4+ messages in thread
From: Peng, Yuan @ 2021-11-23  2:16 UTC (permalink / raw)
  To: Mo, YufengX, dts

Acked-by Peng, Yuan <yuan.peng@intel.com>

-----Original Message-----
From: Mo, YufengX <yufengx.mo@intel.com> 
Sent: Friday, November 19, 2021 4:04 PM
To: dts@dpdk.org; Peng, Yuan <yuan.peng@intel.com>
Cc: Mo, YufengX <yufengx.mo@intel.com>
Subject: [dts][PATCH V4 0/1] tests/cvl_dcf_qos: upload script 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: [dts][PATCH V4 1/1] tests/cvl_dcf_qos: upload script
  2021-11-19  8:03 ` [dts][PATCH V4 1/1] " Yufen Mo
@ 2021-11-23 14:20   ` Tu, Lijuan
  0 siblings, 0 replies; 4+ messages in thread
From: Tu, Lijuan @ 2021-11-23 14:20 UTC (permalink / raw)
  To: Mo, YufengX, dts, Peng, Yuan; +Cc: Mo, YufengX

> -----Original Message-----
> From: Yufen Mo <yufengx.mo@intel.com>
> Sent: 2021年11月19日 16:04
> To: dts@dpdk.org; Peng, Yuan <yuan.peng@intel.com>
> Cc: Mo, YufengX <yufengx.mo@intel.com>
> Subject: [dts][PATCH V4 1/1] tests/cvl_dcf_qos: upload script
> 
> 
> CVL configure QoS for vf/vsi in DCF.
> 
> Signed-off-by: Yufen Mo <yufengx.mo@intel.com>

Applied, thanks

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-11-23 14:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-19  8:03 [dts][PATCH V4 0/1] tests/cvl_dcf_qos: upload script Yufen Mo
2021-11-19  8:03 ` [dts][PATCH V4 1/1] " Yufen Mo
2021-11-23 14:20   ` Tu, Lijuan
2021-11-23  2:16 ` [dts][PATCH V4 0/1] " Peng, Yuan

test suite reviews and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://inbox.dpdk.org/dts/0 dts/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dts dts/ http://inbox.dpdk.org/dts \
		dts@dpdk.org
	public-inbox-index dts

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dts


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git