test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [PATCH V1 1/2] Add a new testsuite TestSuite_metering_and_policing.py to tests
@ 2018-12-12  4:51 Wenjie Li
  2018-12-12  4:51 ` [dts] [PATCH V1 2/2] Add a new test plan metering_and_policing_test_plan.rst to test_plans Wenjie Li
  0 siblings, 1 reply; 2+ messages in thread
From: Wenjie Li @ 2018-12-12  4:51 UTC (permalink / raw)
  To: dts; +Cc: Wenjie Li

Add a new testsuite "TestSuite_metering_and_policing.py" to tests.

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>

---
 tests/TestSuite_metering_and_policing.py | 978 +++++++++++++++++++++++
 1 file changed, 978 insertions(+)
 create mode 100644 tests/TestSuite_metering_and_policing.py

diff --git a/tests/TestSuite_metering_and_policing.py b/tests/TestSuite_metering_and_policing.py
new file mode 100644
index 0000000..174ccde
--- /dev/null
+++ b/tests/TestSuite_metering_and_policing.py
@@ -0,0 +1,978 @@
+#BSD LICENSE
+#
+# Copyright(c) 2010-2016 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.
+Test metering_and_policing.
+"""
+import utils
+import string
+import time
+import re
+from test_case import TestCase
+from plotting import Plotting
+from settings import HEADER_SIZE
+from dut import Dut
+
+
+class TestMeteringAndPolicing(TestCase):
+
+    def copy_config_files_to_dut(self):
+        """
+        Copy firmware.cli, dscp_*.sh from tester to DUT.
+        """
+        pass
+
+
+    def update_firmware_cli(self, caseID):
+        """
+        Update firmware.cli.
+        """
+        self.ori_firmware_cli = "/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli"
+        if len(self.dut_ports) == 4:
+            self.ori_firmware_cli = "/root/dpdk/drivers/net/softnic/meter_and_policing_firmware_4ports.cli"
+        self.new_firmware_cli = "%s-%s" % (self.ori_firmware_cli, caseID)
+        self.dut.send_expect("rm -f %s" % (self.new_firmware_cli), "#", 5)
+        self.dut.send_expect("cp %s %s" % (self.ori_firmware_cli, self.new_firmware_cli), "#", 5)
+        thread_id = 5
+
+        self.dut.send_expect("sed -i -e 's/^.*link LINK0 dev.*$/link LINK0 dev %s/g' %s" %(self.dut_p0_pci, self.new_firmware_cli), "#", 5)
+        self.dut.send_expect("sed -i -e 's/^.*link LINK1 dev.*$/link LINK1 dev %s/g' %s" %(self.dut_p1_pci, self.new_firmware_cli), "#", 5)
+        if len(self.dut_ports) == 4:
+            self.dut.send_expect("sed -i -e 's/^.*link LINK2 dev.*$/link LINK2 dev %s/g' %s" %(self.dut_p2_pci, self.new_firmware_cli), "#", 5)
+            self.dut.send_expect("sed -i -e 's/^.*link LINK3 dev.*$/link LINK3 dev %s/g' %s" %(self.dut_p3_pci, self.new_firmware_cli), "#", 5)
+
+        # table action
+        if caseID == 8:
+            self.dut.send_expect("sed -i -e 's/^.*table action profile AP0.*$/table action profile AP0 ipv6 offset 270 fwd meter trtcm tc 1 stats pkts/g' %s" % self.new_firmware_cli, "#", 5)
+        else:
+            self.dut.send_expect("sed -i -e 's/^.*table action profile AP0.*$/table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts/g' %s" % self.new_firmware_cli, "#", 5)
+
+        # pipeline RX table
+        if caseID == 7:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table match.*$/pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 65K action AP0/g' %s" % self.new_firmware_cli, "#", 5)
+        elif caseID == 8:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table match.*$/pipeline RX table match acl ipv6 offset 270 size 4K action AP0/g' %s" % self.new_firmware_cli, "#", 5)
+        else:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table match.*$/pipeline RX table match acl ipv4 offset 270 size 4K action AP0/g' %s" % self.new_firmware_cli, "#", 5)
+
+        # use .sh file as RX table
+        if caseID == 10:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table 0 dscp.*$/pipeline RX table 0 dscp \/root\/dpdk\/drivers\/net\/softnic\/dscp_red.sh/g' %s" % self.new_firmware_cli, "#", 5)
+        elif caseID == 11:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table 0 dscp.*$/pipeline RX table 0 dscp \/root\/dpdk\/drivers\/net\/softnic\/dscp_yellow.sh/g' %s" % self.new_firmware_cli, "#", 5)
+        elif caseID == 12:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table 0 dscp.*$/pipeline RX table 0 dscp \/root\/dpdk\/drivers\/net\/softnic\/dscp_green.sh/g' %s" % self.new_firmware_cli, "#", 5)
+        elif caseID == 13:
+            self.dut.send_expect("sed -i -e 's/^.*pipeline RX table 0 dscp.*$/pipeline RX table 0 dscp \/root\/dpdk\/drivers\/net\/softnic\/dscp_default.sh/g' %s" % self.new_firmware_cli, "#", 5)
+        self.dut.send_expect("sed -i -e 's/thread 25/thread %s/g' %s" % (thread_id, self.new_firmware_cli), "#", 5)
+
+
+    def start_testpmd(self, filename):
+        """
+        Start testpmd.
+        """
+        if len(self.dut_ports) == 2:
+            portmask = "0x4"
+        if len(self.dut_ports) == 4:
+            portmask = "0x10"
+        self.path = "./%s/app/testpmd" %(self.target)
+        cmd = self.path + " -l 3-5 -n %d --vdev 'net_softnic0,firmware=%s,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=%d --txq=%d --portmask=%s" % (self.dut.get_memory_channels(), filename, self.port_id, self.port_id, portmask)
+        self.dut.send_expect(cmd, "testpmd>", 60)
+
+
+    def add_port_meter_profile(self, profile_id, cbs=400, pbs=500):
+        """
+        Add port meter profile (trTCM rfc2968).
+        """
+        cir = 3125000000
+        pir = 3125000000
+        self.dut.send_expect("add port meter profile trtcm_rfc2698 %d %d %d %d %d %d" %(self.port_id, profile_id, cir, pir, cbs, pbs),"testpmd>",60)
+
+
+    def create_port_meter(self, mtr_id, profile_id, gyrd_action):
+        """
+        Create new meter object for the ethernet device.
+        """
+        self.dut.send_expect("create port meter %d %d %d yes %s" %(self.port_id, mtr_id, profile_id, gyrd_action),"testpmd>",60)
+
+
+    def create_flow_rule(self, ret_id, ip_ver, protocol, spec_id,  mtr_id, queue_index_id):
+        """
+        Create flow rule based on port meter.
+        """
+        if ip_ver == "ipv4":
+            src_mask = "255.255.255.255"
+            dst_mask = "255.255.255.255"
+            src_ip = "1.10.11.12"
+            dst_ip = "2.20.21.22"
+        if ip_ver == "ipv6":
+            src_mask = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
+            dst_mask = "0:0:0:0:0:0:0:0"
+            src_ip = "ABCD:EF01:2345:6789:ABCD:EF01:2345:5789"
+            dst_ip = "0:0:0:0:0:0:0:0"
+        protocol = protocol.lower()
+        if protocol == "tcp":
+            proto_id = 6
+        if protocol == "udp":
+            proto_id = 17
+        if protocol == "sctp":
+            proto_id = 132
+
+        out = self.dut.send_expect("flow create %d group 0 ingress pattern eth / %s proto mask 255 src mask %s dst mask %s src spec %s dst spec %s proto spec %d / %s src mask 65535 dst mask 65535 src spec %d dst spec %d / end actions meter mtr_id %d / queue index %d / end" %(self.port_id, ip_ver, src_mask, dst_mask, src_ip, dst_ip, proto_id, protocol, spec_id, spec_id, mtr_id, queue_index_id), "testpmd>", 60)
+        if ret_id == 1:
+            self.verify("Flow rule #" in out, "flow create fail")
+        else:
+            self.verify("METER: Meter already attached to a flow: Invalid argument" in out, "flow create fail")
+
+
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+        """
+        self.dut_ports = self.dut.get_ports()
+        self.port_nums = 2
+        self.verify(len(self.dut_ports) >= self.port_nums,
+                    "Insufficient ports for speed testing")
+
+        self.dut_p0_pci = self.dut.get_port_pci(self.dut_ports[0])
+        self.dut_p1_pci = self.dut.get_port_pci(self.dut_ports[1])
+
+        self.dut_p0_mac = self.dut.get_mac_address(self.dut_ports[0])
+        self.dut_p1_mac = self.dut.get_mac_address(self.dut_ports[1])
+
+        self.pf0_interface = self.dut.ports_info[self.dut_ports[0]]['intf']
+        self.pf1_interface = self.dut.ports_info[self.dut_ports[1]]['intf']
+
+        if len(self.dut_ports) == 4:
+            self.dut_p2_pci = self.dut.get_port_pci(self.dut_ports[2])
+            self.dut_p3_pci = self.dut.get_port_pci(self.dut_ports[3])
+
+            self.dut_p2_mac = self.dut.get_mac_address(self.dut_ports[2])
+            self.dut_p3_mac = self.dut.get_mac_address(self.dut_ports[3])
+
+            self.pf2_interface = self.dut.ports_info[self.dut_ports[2]]['intf']
+            self.pf3_interface = self.dut.ports_info[self.dut_ports[3]]['intf']
+
+        self.port_id = len(self.dut_ports)
+        self.copy_config_files_to_dut()
+
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+        pass
+
+
+    def scapy_send_packet(self, ip_ver, protocol, fwd_port, pktsize):
+        """
+        Send a packet to port
+        """
+        time.sleep(1)
+        source_port = self.tester.get_interface(self.tester.get_local_port(self.dut_ports[0]))
+        protocol = protocol.upper()
+        if ip_ver == "ipv4":
+            src_ip = "1.10.11.12"
+            dst_ip = "2.20.21.22"
+            tag = "IP"
+            if protocol == "TCP":
+                proto_str = "proto=6"
+            if protocol == "UDP":
+                proto_str = "proto=17"
+            if protocol == "SCTP":
+                proto_str = "proto=132"
+
+        if ip_ver == "ipv6":
+            src_ip = "ABCD:EF01:2345:6789:ABCD:EF01:2345:5789"
+            dst_ip = "2001::1"
+            tag = "IPv6"
+            if protocol == "TCP":
+                proto_str = "nh=6"
+            if protocol == "UDP":
+                proto_str = "nh=17"
+
+        self.tester.scapy_append('sendp([Ether(dst="%s")/%s(src="%s",dst="%s",%s)/%s(sport=%d,dport=%d)/Raw(load="P"*%d)], iface="%s")' % (self.dut_p0_mac, tag, src_ip, dst_ip, proto_str, protocol, fwd_port, fwd_port, pktsize, source_port))
+        self.tester.scapy_execute()
+        time.sleep(1)
+
+
+    def send_packet_and_check(self, ip_ver, protocol, fwd_port, pktsize, expect_port):
+        """
+        Send packet and check the stats
+        """
+        rx_before = []
+        tx_before = []
+        for i in range (0, len(self.dut_ports)):
+            output = self.dut.send_expect("show port stats %d" %(i),"testpmd>",60)
+            rx_before.append(re.compile('RX-packets:\s+(.*?)\s+?').findall(output, re.S))
+            tx_before.append(re.compile('TX-packets:\s+(.*?)\s+?').findall(output, re.S))
+
+        print("="*150)
+        print(rx_before, tx_before)
+        self.scapy_send_packet(ip_ver, protocol, fwd_port, pktsize)
+
+        rx_after = []
+        tx_after = []
+        for i in range (0, len(self.dut_ports)):
+            output = self.dut.send_expect("show port stats %d" %(i),"testpmd>",60)
+            rx_after.append(re.compile('RX-packets:\s+(.*?)\s+?').findall(output, re.S))
+            tx_after.append(re.compile('TX-packets:\s+(.*?)\s+?').findall(output, re.S))
+
+        print(rx_after, tx_after)
+        rx_packets_port = []
+        tx_packets_port = []
+        for i in range (0, len(self.dut_ports)):
+            temp1 = int(rx_after[i][0]) - int(rx_before[i][0])
+            temp2 = int(tx_after[i][0]) - int(tx_before[i][0])
+            rx_packets_port.append(temp1)
+            tx_packets_port.append(temp2)
+
+        if expect_port == i:
+            self.verify(int(rx_packets_port[0]) == int(tx_packets_port[i]) == 1, "Wrong: can't forward package to port %d " % expect_port)
+        if expect_port == -1:
+            for i in range (0, len(self.dut_ports)):
+                self.verify(int(rx_packets_port[0]) == 1 and int(tx_packets_port[i]) == 0, "Wrong: the packet is not dropped")
+
+
+    def test_ipv4_ACL_table_RFC2698_GYR(self):
+        """
+        Test Case 1: ipv4 ACL table RFC2698 GYR
+        """
+        self.update_firmware_cli(caseID=1)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+
+    def test_ipv4_ACL_table_RFC2698_GYD(self):
+        """
+        Test Case 2: ipv4 ACL table RFC2698 GYD
+        """
+        self.update_firmware_cli(caseID=2)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+
+    def test_ipv4_ACL_table_RFC2698_GDR(self):
+        """
+        Test Case 3: ipv4 ACL table RFC2698 GDR
+        """
+        self.update_firmware_cli(caseID=3)
+
+        cbs = 400
+        pbs = 500
+        protocol = "SCTP"
+        head = 32
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="sctp", spec_id=2, mtr_id=0, queue_index_id=1)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt1, expect_port=1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt4, expect_port=1)
+
+
+    def test_ipv4_ACL_table_RFC2698_DYR(self):
+        """
+        Test Case 4: ipv4 ACL table RFC2698 DYR
+        """
+        self.update_firmware_cli(caseID=4)
+
+        cbs = 400
+        pbs = 500
+        protocol = "UDP"
+        head = 28
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="udp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+
+    def test_ipv4_ACL_table_RFC2698_DDD(self):
+        """
+        Test Case 5: ipv4 ACL table RFC2698 DDD
+        """
+        self.update_firmware_cli(caseID=5)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="d d d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+
+    def test_ipv4_with_same_cbs_and_pbs_GDR(self):
+        """
+        Test Case 6: ipv4 with same cbs and pbs GDR
+        """
+        self.update_firmware_cli(caseID=6)
+
+        cbs = 500
+        pbs = 500
+        protocol = "SCTP"
+        head = 32
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="sctp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt2, expect_port=0)
+
+
+    def test_ipv4_HASH_table_RFC2698(self):
+        """
+        Test Case 7: ipv4 HASH table RFC2698
+        """
+        self.update_firmware_cli(caseID=7)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        # test 1 'g y r 0 0 0'
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+        self.dut.send_expect("quit", "#", 30)
+
+        # test 2 'g y d 0 0 0'
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+        self.dut.send_expect("quit", "#", 30)
+
+        # test 5 'd d d 0 0 0'
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="d d d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+        self.dut.send_expect("quit", "#", 30)
+
+        # test 3 'g d r 0 0 0'
+        protocol = "SCTP"
+        head = 32
+
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="sctp", spec_id=2, mtr_id=0, queue_index_id=1)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt1, expect_port=1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="sctp", fwd_port=2, pktsize=pkt4, expect_port=1)
+        self.dut.send_expect("quit", "#", 30)
+
+        # test 4 'd y r 0 0 0'
+        protocol = "UDP"
+        head = 28
+
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="udp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="udp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+        self.dut.send_expect("quit", "#", 30)
+
+
+    def test_ipv6_ACL_table_RFC2698(self):
+        """
+        Test Case 8: ipv6 ACL table RFC2698
+        """
+        self.update_firmware_cli(caseID=8)
+
+        cbs = 400
+        pbs = 500
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv6", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+        self.create_flow_rule(ret_id=1, ip_ver="ipv6", protocol="udp", spec_id=2, mtr_id=1, queue_index_id=1)
+        self.dut.send_expect("start","testpmd>",60)
+
+        protocol = "TCP"
+        head = 60
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.send_packet_and_check(ip_ver="ipv6", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv6", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv6", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv6", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        protocol = "UDP"
+        head = 48
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.send_packet_and_check(ip_ver="ipv6", protocol="udp", fwd_port=2, pktsize=pkt1, expect_port=1)
+        self.send_packet_and_check(ip_ver="ipv6", protocol="udp", fwd_port=2, pktsize=pkt2, expect_port=1)
+        self.send_packet_and_check(ip_ver="ipv6", protocol="udp", fwd_port=2, pktsize=pkt3, expect_port=1)
+        self.send_packet_and_check(ip_ver="ipv6", protocol="udp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+
+    def test_ipv4_multiple_meter_and_profile(self):
+        """
+        Test Case 9: multiple meter and profile
+        """
+        self.update_firmware_cli(caseID=9)
+
+        if len(self.dut_ports) == 4:
+            self.start_testpmd(self.new_firmware_cli)
+            self.add_port_meter_profile(profile_id=0, cbs=400, pbs=500)
+            self.add_port_meter_profile(profile_id=1, cbs=300, pbs=400)
+            self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+            self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="g y d 0 0 0")
+            self.create_port_meter(mtr_id=2, profile_id=0, gyrd_action="g d r 0 0 0")
+            self.create_port_meter(mtr_id=3, profile_id=0, gyrd_action="d y r 0 0 0")
+            self.create_port_meter(mtr_id=4, profile_id=1, gyrd_action="g y d 0 0 0")
+            self.create_port_meter(mtr_id=5, profile_id=1, gyrd_action="g d r 0 0 0")
+            self.create_port_meter(mtr_id=6, profile_id=1, gyrd_action="d y r 0 0 0")
+            self.create_port_meter(mtr_id=128, profile_id=1, gyrd_action="d d d 0 0 0")
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=0, mtr_id=0, queue_index_id=0)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=1, mtr_id=1, queue_index_id=1)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=2, queue_index_id=2)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=3, mtr_id=3, queue_index_id=3)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=4, mtr_id=4, queue_index_id=0)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=5, mtr_id=5, queue_index_id=1)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=6, mtr_id=6, queue_index_id=2)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=7, mtr_id=128, queue_index_id=3)
+            self.create_flow_rule(ret_id=0, ip_ver="ipv4", protocol="tcp", spec_id=8, mtr_id=128, queue_index_id=0)
+            self.dut.send_expect("start", "testpmd>", 120)
+            output = self.dut.send_expect("flow list %d" % (self.port_id), "testpmd>", 120)
+            print(output)
+
+            cbs = 400
+            pbs = 500
+            protocol = "TCP"
+            head = 40
+            pkt1 = pbs - head + 1
+            pkt2 = pbs - head
+            pkt3 = cbs - head + 1
+            pkt4 = cbs - head
+
+            # group 0
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt1, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt2, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt3, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt4, expect_port=0)
+            # group 1
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt1, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt2, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt3, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt4, expect_port=1)
+            # group 2
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=2)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=2)
+            # group 3
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt1, expect_port=3)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt2, expect_port=3)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt3, expect_port=3)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt4, expect_port=-1)
+
+            cbs = 300
+            pbs = 400
+            protocol = "TCP"
+            head = 40
+            pkt1 = pbs - head + 1
+            pkt2 = pbs - head
+            pkt3 = cbs - head + 1
+            pkt4 = cbs - head
+
+            # group 4
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt1, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt2, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt3, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt4, expect_port=0)
+            # group 5
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt1, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt2, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt3, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt4, expect_port=1)
+            # group 6
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt1, expect_port=2)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt2, expect_port=2)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt3, expect_port=2)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt4, expect_port=-1)
+            # group 7
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt1, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt2, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt3, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt4, expect_port=-1)
+
+        if len(self.dut_ports) == 2:
+            self.start_testpmd(self.new_firmware_cli)
+            self.add_port_meter_profile(profile_id=0, cbs=400, pbs=500)
+            self.add_port_meter_profile(profile_id=1, cbs=300, pbs=400)
+            self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+            self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="g y d 0 0 0")
+            self.create_port_meter(mtr_id=2, profile_id=0, gyrd_action="g d r 0 0 0")
+            self.create_port_meter(mtr_id=3, profile_id=0, gyrd_action="d y r 0 0 0")
+            self.create_port_meter(mtr_id=4, profile_id=1, gyrd_action="g y d 0 0 0")
+            self.create_port_meter(mtr_id=5, profile_id=1, gyrd_action="g d r 0 0 0")
+            self.create_port_meter(mtr_id=6, profile_id=1, gyrd_action="d y r 0 0 0")
+            self.create_port_meter(mtr_id=128, profile_id=1, gyrd_action="d d d 0 0 0")
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=0, mtr_id=0, queue_index_id=0)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=1, mtr_id=1, queue_index_id=1)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=2, queue_index_id=0)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=3, mtr_id=3, queue_index_id=1)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=4, mtr_id=4, queue_index_id=0)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=5, mtr_id=5, queue_index_id=1)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=6, mtr_id=6, queue_index_id=0)
+            self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=7, mtr_id=128, queue_index_id=1)
+            self.create_flow_rule(ret_id=0, ip_ver="ipv4", protocol="tcp", spec_id=8, mtr_id=128, queue_index_id=0)
+            self.dut.send_expect("start", "testpmd>", 120)
+            output = self.dut.send_expect("flow list %d" % (self.port_id), "testpmd>", 120)
+            print(output)
+
+            cbs = 400
+            pbs = 500
+            protocol = "TCP"
+            head = 40
+            pkt1 = pbs - head + 1
+            pkt2 = pbs - head
+            pkt3 = cbs - head + 1
+            pkt4 = cbs - head
+
+            # group 0
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt1, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt2, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt3, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=0, pktsize=pkt4, expect_port=0)
+            # group 1
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt1, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt2, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt3, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=1, pktsize=pkt4, expect_port=1)
+            # group 2
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+            # group 3
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt1, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt2, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt3, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=3, pktsize=pkt4, expect_port=-1)
+
+            cbs = 300
+            pbs = 400
+            protocol = "TCP"
+            head = 40
+            pkt1 = pbs - head + 1
+            pkt2 = pbs - head
+            pkt3 = cbs - head + 1
+            pkt4 = cbs - head
+
+            # group 4
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt1, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt2, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt3, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=4, pktsize=pkt4, expect_port=0)
+            # group 5
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt1, expect_port=1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt2, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt3, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=5, pktsize=pkt4, expect_port=1)
+            # group 6
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt1, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt2, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt3, expect_port=0)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=6, pktsize=pkt4, expect_port=-1)
+            # group 7
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt1, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt2, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt3, expect_port=-1)
+            self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=7, pktsize=pkt4, expect_port=-1)
+
+
+    def test_ipv4_RFC2698_pre_colored_red_by_DSCP_table(self):
+        """
+        Test Case 10: ipv4 RFC2698 pre-colored red by DSCP table
+        """
+        self.update_firmware_cli(caseID=10)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        # test 0: GYR
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 1: GYD
+        self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=1, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+        # test 2: GDR
+        self.create_port_meter(mtr_id=2, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=2, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 3: DYR
+        self.create_port_meter(mtr_id=3, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=3, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+
+    def test_ipv4_RFC2698_pre_colored_yellow_by_DSCP_table(self):
+        """
+        Test Case 11: ipv4 RFC2698 pre-colored yellow by DSCP table
+        """
+        self.update_firmware_cli(caseID=11)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        # test 0: GYR
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 1: GYD
+        self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=1, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 2: GDR
+        self.create_port_meter(mtr_id=2, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=2, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+        # test 3: DYR
+        self.create_port_meter(mtr_id=3, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=3, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+
+    def test_ipv4_RFC2698_pre_colored_green_by_DSCP_table(self):
+        """
+        Test Case 12: ipv4 RFC2698 pre-colored green by DSCP table
+        """
+        self.update_firmware_cli(caseID=12)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        # test 0: GYR
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 1: GYD
+        self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=1, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 2: GDR
+        self.create_port_meter(mtr_id=2, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=2, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 3: DYR
+        self.create_port_meter(mtr_id=3, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=3, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+
+    def test_ipv4_RFC2698_pre_colored_default_by_DSCP_table(self):
+        """
+        Test Case 13: ipv4 RFC2698 pre-colored by default DSCP table
+        """
+        self.update_firmware_cli(caseID=13)
+
+        cbs = 400
+        pbs = 500
+        protocol = "TCP"
+        head = 40
+        pkt1 = pbs - head + 1
+        pkt2 = pbs - head
+        pkt3 = cbs - head + 1
+        pkt4 = cbs - head
+
+        self.start_testpmd(self.new_firmware_cli)
+        self.add_port_meter_profile(profile_id=0, cbs=cbs, pbs=pbs)
+        self.dut.send_expect("start", "testpmd>", 5)
+
+        # test 0: GYR
+        self.create_port_meter(mtr_id=0, profile_id=0, gyrd_action="g y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=0, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 1: GYD
+        self.create_port_meter(mtr_id=1, profile_id=0, gyrd_action="g y d 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=1, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 2: GDR
+        self.create_port_meter(mtr_id=2, profile_id=0, gyrd_action="g d r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=2, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=-1)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=0)
+
+        # test 3: DYR
+        self.create_port_meter(mtr_id=3, profile_id=0, gyrd_action="d y r 0 0 0")
+        self.create_flow_rule(ret_id=1, ip_ver="ipv4", protocol="tcp", spec_id=2, mtr_id=3, queue_index_id=0)
+
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt1, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt2, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt3, expect_port=0)
+        self.send_packet_and_check(ip_ver="ipv4", protocol="tcp", fwd_port=2, pktsize=pkt4, expect_port=-1)
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        self.dut.kill_all()
+        time.sleep(2)
+
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        pass
+
-- 
2.17.2

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

* [dts] [PATCH V1 2/2] Add a new test plan metering_and_policing_test_plan.rst to test_plans.
  2018-12-12  4:51 [dts] [PATCH V1 1/2] Add a new testsuite TestSuite_metering_and_policing.py to tests Wenjie Li
@ 2018-12-12  4:51 ` Wenjie Li
  0 siblings, 0 replies; 2+ messages in thread
From: Wenjie Li @ 2018-12-12  4:51 UTC (permalink / raw)
  To: dts; +Cc: Wenjie Li

Add a new test plan "metering_and_policing_test_plan.rst" to test_plans.

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>

---
 .../metering_and_policing_test_plan.rst       | 587 ++++++++++++++++++
 1 file changed, 587 insertions(+)
 create mode 100644 test_plans/metering_and_policing_test_plan.rst

diff --git a/test_plans/metering_and_policing_test_plan.rst b/test_plans/metering_and_policing_test_plan.rst
new file mode 100644
index 0000000..55c07ab
--- /dev/null
+++ b/test_plans/metering_and_policing_test_plan.rst
@@ -0,0 +1,587 @@
+===========
+softnic PMD
+===========
+
+Description
+===========
+The SoftNIC allows building custom NIC pipelines in SW. The Soft NIC pipeline
+is configurable through firmware (DPDK Packet Framework script).
+
+In RFC2698, the behavior of the Meter is specified as below:
+When a packet of size B bytes arrives at time t, the following
+happens if the trTCM is configured to operate:
+in the Color-Blind mode:
+. If Tp(t)-B < 0, the packet is red, else
+. If Tc(t)-B < 0, the packet is yellow and Tp is decremented by B, else
+. The packet is green and both Tp and Tc are decremented by B.
+in the Color-Aware mode:
+. If the packet has been precolored as red or if Tp(t)-B < 0,
+  the packet is red, else
+. If the packet has been precolored as yellow or if Tc(t)-B < 0,
+  the packet is yellow and Tp is decremented by B, else
+. The packet is green and both Tp and Tc are decremented by B.
+
+DPDK meter library (librte_meter) implements these two mode separately
+and made through different APIs. In table meter action implementation,
+always color aware mode API is invoked regardless of dscp table.
+
+Prerequisites
+================
+The DUT must have four 10G Ethernet ports connected to four ports on
+Tester that are controlled by the Scapy packet generator,
+
+dut_port_0 <---> tester_port_0
+dut_port_1 <---> tester_port_1
+dut_port_2 <---> tester_port_2
+dut_port_3 <---> tester_port_3
+
+Assume four DUT 10G Ethernet ports' pci device id is as the following,
+
+dut_port_0 : "0000:05:00.0"
+dut_port_1 : "0000:05:00.1"
+dut_port_2 : "0000:05:00.2"
+dut_port_3 : "0000:05:00.3"
+
+Bind them to dpdk igb_uio driver,
+
+./usertools/dpdk-devbind.py -b igb_uio 05:00.0 05:00.1
+
+1. change ./drivers/net/softnic/firmware.cli to meet the specific test environment.
+
+2. start softnic with following command line,
+
+./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 \
+--vdev 'net_softnic0,firmware=./drivers/net/softnic/firmware.cli,cpu_id=1,conn_port=8086' \
+-- -i --forward-mode=softnic --portmask=0x10
+testpmd> start
+
+3. start softnic with default hierarchy Qos with following command line,
+
+./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 \
+--vdev 'net_softnic0,firmware=./drivers/net/softnic/firmware.cli,cpu_id=1,conn_port=8086' \
+-- -i --forward-mode=softnic --portmask=0x10
+testpmd> set port tm hierarchy default 1
+testpmd> start
+
+Test Case 1: ipv4 ACL table RFC2698 GYR
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+a)send a packet larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+the packet was forwarded to port 0.
+b)send a packet not larger than PBS but larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+the packet was forwarded to port 0.
+c)send a packet not larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+the packet was forwarded to port 0.
+
+Notes: the CBS/PBS includes IP header(20 bytes) and TCP header(20 bytes).
+So when the payload is 460 bytes, the IP packet is 500 bytes. 
+ 
+Test Case 2: ipv4 ACL table RFC2698 GYD
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g y d 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+a)send a packet larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+The packet was dropped.
+b)send a packet not larger than PBS but larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+the packet was forwarded to port 0.
+c)send a packet not larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+the packet was forwarded to port 0.
+
+Test Case 3: ipv4 ACL table RFC2698 GDR
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g d r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 132 / sctp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 1 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and SCTP dport/sport.
+a)send a packet larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=132)/SCTP(sport=2,dport=2)/Raw(load="P"*469)], iface="ens160f0")
+the packet was forwarded to port 1.
+b)send a packet not larger than PBS but larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=132)/SCTP(sport=2,dport=2)/Raw(load="P"*468)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=132)/SCTP(sport=2,dport=2)/Raw(load="P"*369)], iface="ens160f0")
+The packets was dropped.
+
+c)send a packet not larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=132)/SCTP(sport=2,dport=2)/Raw(load="P"*368)], iface="ens160f0")
+the packet was forwarded to port 1.
+
+Notes: the CBS/PBS includes IP header(20 bytes) and SCTP header(12 bytes).
+So when the payload is 468 bytes, the IP packet is 500 bytes.
+
+Test Case 4: ipv4 ACL table RFC2698 DYR
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes d y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 17 / udp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+a)send a packet larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=17)/UDP(sport=2,dport=2)/Raw(load="P"*473)], iface="ens160f0")
+the packet was forwarded to port 0.
+b)send a packet not larger than PBS but larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=17)/UDP(sport=2,dport=2)/Raw(load="P"*373)], iface="ens160f0")
+the packet was forwarded to port 0.
+c)send a packet not larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=17)/UDP(sport=2,dport=2)/Raw(load="P"*372)], iface="ens160f0")
+The packet was dropped.
+
+Notes: the CBS/PBS includes IP header(20 bytes) and UDP header(8 bytes).
+So when the payload is 472 bytes, the IP packet is 500 bytes.
+
+Test Case 5: ipv4 ACL table RFC2698 DDD
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes d d d 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+a)send a packet larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+The packet was dropped.
+b)send a packet not larger than PBS but larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+The packet was dropped.
+c)send a packet not larger than CBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+The packet was dropped.
+
+Test Case 6: ipv4 with same CBS and PBS GDR
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 500 500
+testpmd> create port meter 2 0 0 yes g d r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+a)send a packet larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+the packet was forwarded to port 0.
+b)send a packet not larger than PBS
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+the packet was forwarded to port 0.
+
+Test Case 7: ipv4 HASH table RFC2698
+======================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 65K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table,
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+a)GYR
+testpmd> create port meter 2 0 0 yes g y r 0 0 0
+b)GYD
+testpmd> create port meter 2 0 0 yes g y d 0 0 0
+c)GDR
+testpmd> create port meter 2 0 0 yes g d r 0 0 0
+d)DYR
+testpmd> create port meter 2 0 0 yes d y r 0 0 0
+e)DDD
+testpmd> create port meter 2 0 0 yes d d d 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+Send packets same as ACL table, there will be the same result with ACL table.
+
+Test Case 8: ipv6 ACL table RFC2698
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv6 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv6 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table,
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g y d 0 0 0
+testpmd> create port meter 2 1 0 yes d y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 dst spec 0:0:0:0:0:0:0:0 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 / udp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 1 / queue index 1 / end
+testpmd> start
+testpmd> flow list 2
+ID      Group   Prio    Attr    Rule
+0       0       0       i--     ETH IPV6 TCP => METER QUEUE
+1       0       0       i--     ETH IPV6 UDP => METER QUEUE
+
+3. Configure the packets with specified src/dst IPv6 address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IPv6(src="ABCD:EF01:2345:6789:ABCD:EF01:2345:5789",dst="2001::1",nh=6)/TCP(sport=2,dport=2)/Raw(load="P"*441)], iface="ens160f0")
+The packet was dropped.
+sendp([Ether(dst="00:00:00:00:01:00")/IPv6(src="ABCD:EF01:2345:6789:ABCD:EF01:2345:5789",dst="2001::1",nh=6)/TCP(sport=2,dport=2)/Raw(load="P"*440)], iface="ens160f0")
+the packet was forwarded to port 0.
+sendp([Ether(dst="00:00:00:00:01:00")/IPv6(src="ABCD:EF01:2345:6789:ABCD:EF01:2345:5789",dst="2001::1",nh=6)/TCP(sport=2,dport=2)/Raw(load="P"*340)], iface="ens160f0")
+the packet was forwarded to port 0.
+sendp([Ether(dst="00:00:00:00:01:00")/IPv6(src="ABCD:EF01:2345:6789:ABCD:EF01:2345:5789",dst="2001::1",nh=17)/UDP(sport=2,dport=2)/Raw(load="P"*453)], iface="ens160f0")
+the packet was forwarded to port 1.
+sendp([Ether(dst="00:00:00:00:01:00")/IPv6(src="ABCD:EF01:2345:6789:ABCD:EF01:2345:5789",dst="2001::1",nh=17)/UDP(sport=2,dport=2)/Raw(load="P"*353)], iface="ens160f0")
+the packet was forwarded to port 1.
+sendp([Ether(dst="00:00:00:00:01:00")/IPv6(src="ABCD:EF01:2345:6789:ABCD:EF01:2345:5789",dst="2001::1",nh=17)/UDP(sport=2,dport=2)/Raw(load="P"*352)], iface="ens160f0")
+The packet was dropped.
+
+Notes: TCP header covers 20 bytes, UDP header covers 8 bytes.
+the CBS/PBS includes IPv6 header(40 bytes) and TCP/UDP header(20/8 bytes).
+So when the payload of IPv6-TCP packet is 440 bytes, the IPv6 packet is 500 bytes.
+when the payload of IPv6-UDP packet is 452 bytes, the IPv6 packet is 500 bytes.
+
+Test Case 9: multiple meter and profile
+=====================================
+1. Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic, configure 4 ports,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=4 --txq=4 --portmask=0x10
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 4 0 3125000000 3125000000 400 500
+testpmd> add port meter profile trtcm_rfc2698 4 1 3125000000 3125000000 300 400
+testpmd> create port meter 4 0 0 yes g y r 0 0 0
+testpmd> create port meter 4 1 0 yes g y d 0 0 0
+testpmd> create port meter 4 2 0 yes g d r 0 0 0
+testpmd> create port meter 4 3 0 yes d y r 0 0 0
+testpmd> create port meter 4 4 1 yes g y d 0 0 0
+testpmd> create port meter 4 5 1 yes g d r 0 0 0
+testpmd> create port meter 4 6 1 yes d y r 0 0 0
+testpmd> create port meter 4 128 1 yes d d d 0 0 0
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 0 dst spec 0 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 1 dst spec 1 / end actions meter mtr_id 1 / queue index 1 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 2 / queue index 2 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 3 dst spec 3 / end actions meter mtr_id 3 / queue index 3 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 4 dst spec 4 / end actions meter mtr_id 4 / queue index 0 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 5 dst spec 5 / end actions meter mtr_id 5 / queue index 1 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 6 dst spec 6 / end actions meter mtr_id 6 / queue index 2 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 7 dst spec 7 / end actions meter mtr_id 128 / queue index 3 / end
+testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 8 dst spec 8 / end actions meter mtr_id 128 / queue index 0 / end
+the last flow can't be created successfully with "METER: Meter already attached to a flow: Invalid argument"
+testpmd> start
+testpmd> flow list 4
+ID      Group   Prio    Attr    Rule
+0       0       0       i--     ETH IPV4 TCP => METER QUEUE
+1       0       0       i--     ETH IPV4 TCP => METER QUEUE
+2       0       0       i--     ETH IPV4 TCP => METER QUEUE
+3       0       0       i--     ETH IPV4 TCP => METER QUEUE
+4       0       0       i--     ETH IPV4 TCP => METER QUEUE
+5       0       0       i--     ETH IPV4 TCP => METER QUEUE
+6       0       0       i--     ETH IPV4 TCP => METER QUEUE
+7       0       0       i--     ETH IPV4 TCP => METER QUEUE
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+pkt1: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=0,dport=0)/Raw(load="P"*461)], iface="ens160f0")
+pkt2: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=0,dport=0)/Raw(load="P"*460)], iface="ens160f0")
+pkt3: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=0,dport=0)/Raw(load="P"*360)], iface="ens160f0")
+pkt1/2/3 were forwarded to port 0
+pkt4: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=1,dport=1)/Raw(load="P"*461)], iface="ens160f0")
+pkt5: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=1,dport=1)/Raw(load="P"*460)], iface="ens160f0")
+pkt6: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=1,dport=1)/Raw(load="P"*360)], iface="ens160f0")
+pkt4 was dropped, pkt5/6 were forwarded to port1
+pkt7: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+pkt8: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+pkt9: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*361)], iface="ens160f0")
+pkt10: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+pkt8/9 were dropped, pkt7/10 were forwarded to port2
+pkt11: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=3,dport=3)/Raw(load="P"*461)], iface="ens160f0")
+pkt12: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=3,dport=3)/Raw(load="P"*361)], iface="ens160f0")
+pkt13: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=3,dport=3)/Raw(load="P"*360)], iface="ens160f0")
+pkt13 was dropped, pkt11/12 were forwarded to port3
+pkt14: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=4,dport=4)/Raw(load="P"*361)], iface="ens160f0")
+pkt15: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=4,dport=4)/Raw(load="P"*360)], iface="ens160f0")
+pkt16: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=4,dport=4)/Raw(load="P"*260)], iface="ens160f0")
+pkt14 was dropped, pkt15/16 were forwarded to port0
+pkt17: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=5,dport=5)/Raw(load="P"*361)], iface="ens160f0")
+pkt18: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=5,dport=5)/Raw(load="P"*360)], iface="ens160f0")
+pkt19: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=5,dport=5)/Raw(load="P"*261)], iface="ens160f0")
+pkt20: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=5,dport=5)/Raw(load="P"*260)], iface="ens160f0")
+pkt18/19 were dropped, pkt17/20 were forwarded to port1
+pkt21: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=6,dport=6)/Raw(load="P"*361)], iface="ens160f0")
+pkt22: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=6,dport=6)/Raw(load="P"*261)], iface="ens160f0")
+pkt23: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=6,dport=6)/Raw(load="P"*260)], iface="ens160f0")
+pkt23 was dropped, pkt21/22 were forwarded to port2
+pkt24: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=7,dport=7)/Raw(load="P"*361)], iface="ens160f0")
+pkt25: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=7,dport=7)/Raw(load="P"*261)], iface="ens160f0")
+pkt26: sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=7,dport=7)/Raw(load="P"*260)], iface="ens160f0")
+pkt24/25/26 were dropped
+
+Notes: if create one flow with a mtr_id, then create the flow again with another mtr_id,
+the last flow rule will overlap the previous one.
+so the first flow rule will not take effect, just the last one can take effect. 
+
+Test Case 10: ipv4 RFC2698 pre-colored red by DSCP table
+====================================================
+1. Set the DSCP table in dscp.sh,
+set all the packets from every tc and every queue to red color.
+
+Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+pipeline RX table 0 dscp /root/dpdk/drivers/net/softnic/dscp_red.sh
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were forwarded to port 0.
+
+4. create another meter to drop all the packets with red color,
+testpmd> create port meter 2 1 0 yes g y d 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 1 / queue index 0 / end
+
+5. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were dropped.
+
+6. create another meter to drop all the packets with yellow color,
+testpmd> create port meter 2 2 0 yes g d r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 2 / queue index 0 / end
+
+7. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were forwarded to port 0
+
+8. create another meter to drop all the packets with green color,
+testpmd> create port meter 2 3 0 yes d y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 3 / queue index 0 / end
+
+9. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were forwarded to port 0
+
+Test Case 11: ipv4 RFC2698 pre-colored yellow by DSCP table
+====================================================
+1. Set the DSCP table in dscp.sh,
+set all the packets from every tc and every queue to yellow color.
+
+Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+pipeline RX table 0 dscp /root/dpdk/drivers/net/softnic/dscp_yellow.sh
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were forwarded to port 0.
+
+4. create another meter to drop all the packets with red color,
+testpmd> create port meter 2 1 0 yes g y d 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 1 / queue index 0 / end
+
+5. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+pkt1 was dropped.
+pkt2 and pkt3 were forwarded to port 0.
+
+6. create another meter to drop all the packets with yellow color,
+testpmd> create port meter 2 2 0 yes g d r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 2 / queue index 0 / end
+
+7. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+pkt1 was forwarded to port 0.
+pkt2 and pkt3 were dropped.
+
+8. create another meter to drop all the packets with green color,
+testpmd> create port meter 2 3 0 yes d y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 3 / queue index 0 / end
+
+9. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were forwarded to port 0
+
+Test Case 12: ipv4 RFC2698 pre-colored green by DSCP table
+====================================================
+1. Set the DSCP table in dscp.sh,
+set all the packets from every tc and every queue to green color.
+
+Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+pipeline RX table 0 dscp /root/dpdk/drivers/net/softnic/dscp_green.sh
+flowapi map group 0 ingress pipeline RX table 0
+
+2. start softnic,
+./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0,firmware=/root/dpdk/drivers/net/softnic/meter_and_policing_firmware.cli,cpu_id=0,conn_port=8086' -- -i --forward-mode=softnic --rxq=2 --txq=2 --portmask=0x4
+
+Add rules to table, set CBS to 400 bytes, PBS to 500 bytes
+testpmd> add port meter profile trtcm_rfc2698 2 0 3125000000 3125000000 400 500
+testpmd> create port meter 2 0 0 yes g y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 0 / queue index 0 / end
+testpmd> start
+
+3. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+All the packets were forwarded to port 0.
+
+4. create another meter to drop all the packets with red color,
+testpmd> create port meter 2 1 0 yes g y d 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 1 / queue index 0 / end
+
+5. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+pkt1 was dropped.
+pkt2 and pkt3 were forwarded to port 0.
+
+6. create another meter to drop all the packets with yellow color,
+testpmd> create port meter 2 2 0 yes g d r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 2 / queue index 0 / end
+
+7. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+pkt1 and pkt3 were forwarded to port 0.
+pkt2 was dropped.
+
+8. create another meter to drop all the packets with green color,
+testpmd> create port meter 2 3 0 yes d y r 0 0 0
+testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.12 dst spec 2.20.21.22 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 2 dst spec 2 / end actions meter mtr_id 3 / queue index 0 / end
+
+9. Configure the packets with specified src/dst IP address and TCP dport/sport.
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*461)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*460)], iface="ens160f0")
+sendp([Ether(dst="00:00:00:00:01:00")/IP(src='1.10.11.12',dst='2.20.21.22',proto=6)/TCP(sport=2,dport=2)/Raw(load="P"*360)], iface="ens160f0")
+pkt1 and pkt2 were forwarded to port 0.
+pkt3 was dropped.
+
+Test Case 13: ipv4 RFC2698 pre-colored by default DSCP table
+====================================================
+1. Set the DSCP table in dscp.sh,
+The default DSCP table translate all input packets dscp values (0...64) to 0 0 0
+which means traffic class 0, queue id 0 , color 0 (i.e green). 
+
+Edit meter_and_policing_firmware.cli to change "table action" and "pipeline table" as below,
+
+table action profile AP0 ipv4 offset 270 fwd meter trtcm tc 1 stats pkts
+pipeline RX table match acl ipv4 offset 270 size 4K action AP0
+pipeline RX table 0 dscp /root/dpdk/drivers/net/softnic/dscp_default.sh
+flowapi map group 0 ingress pipeline RX table 0
+
+execute the steps2-9 of the case pre-colored green by DSCP table,
+got the same result.
-- 
2.17.2

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

end of thread, other threads:[~2018-12-12  4:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-12  4:51 [dts] [PATCH V1 1/2] Add a new testsuite TestSuite_metering_and_policing.py to tests Wenjie Li
2018-12-12  4:51 ` [dts] [PATCH V1 2/2] Add a new test plan metering_and_policing_test_plan.rst to test_plans Wenjie Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).