test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [PATCH V1] tests/multiprocess_iavf: synchronize case and testplan
@ 2022-06-24 15:47 Jiale Song
  2022-06-29  2:10 ` lijuan.tu
  0 siblings, 1 reply; 2+ messages in thread
From: Jiale Song @ 2022-06-24 15:47 UTC (permalink / raw)
  To: dts; +Cc: Jiale Song

1.testplan tests iavf multiprocesses, while script tests PF multiprocesses. testplan is not 
synchronized with the script. modify the script to synchronize testplan.
2.no perf case in testplan, delete perf case.

Signed-off-by: Jiale Song <songx.jiale@intel.com>
---
 tests/TestSuite_multiprocess_iavf.py | 529 ++++++++-------------------
 1 file changed, 144 insertions(+), 385 deletions(-)

diff --git a/tests/TestSuite_multiprocess_iavf.py b/tests/TestSuite_multiprocess_iavf.py
index 2e301367..bb8e0c98 100644
--- a/tests/TestSuite_multiprocess_iavf.py
+++ b/tests/TestSuite_multiprocess_iavf.py
@@ -1,6 +1,6 @@
 # BSD LICENSE
 #
-# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+# Copyright(c) 2022 Intel Corporation. All rights reserved.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -56,7 +56,7 @@ from .rte_flow_common import RssProcessing as rssprocess
 executions = []
 
 
-class TestMultiprocess(TestCase):
+class TestMultiprocessIavf(TestCase):
 
     support_nic = ["ICE_100G-E810C_QSFP", "ICE_25G-E810C_SFP", "ICE_25G-E810_XXV_SFP"]
 
@@ -90,11 +90,16 @@ class TestMultiprocess(TestCase):
         executions.append({"nprocs": 4, "cores": "1S/4C/1T", "pps": 0})
         executions.append({"nprocs": 8, "cores": "1S/4C/2T", "pps": 0})
 
-        self.eal_param = ""
-        for i in self.dut_ports:
-            self.eal_param += " -a %s" % self.dut.ports_info[i]["pci"]
-
-        self.eal_para = self.dut.create_eal_parameters(cores="1S/2C/1T")
+        self.dport_info0 = self.dut.ports_info[self.dut_ports[0]]
+        self.dport_ifaces = self.dport_info0["intf"]
+        self.create_vfs()
+        self.port_pci_list = []
+        for vf_port in self.sriov_vfs_port:
+            self.port_pci_list.append(vf_port.pci)
+
+        self.eal_para = self.dut.create_eal_parameters(
+            cores="1S/2C/1T", ports=self.port_pci_list
+        )
         # start new session to run secondary
         self.session_secondary = self.dut.new_session()
 
@@ -106,8 +111,7 @@ class TestMultiprocess(TestCase):
             self.output_path = os.sep.join([cur_path, self.logger.log_path])
         # create an instance to set stream field setting
         self.pktgen_helper = PacketGeneratorHelper()
-        self.dport_info0 = self.dut.ports_info[self.dut_ports[0]]
-        self.pci0 = self.dport_info0["pci"]
+
         self.tester_ifaces = [
             self.tester.get_interface(self.dut.ports_map[port])
             for port in self.dut_ports
@@ -122,6 +126,29 @@ class TestMultiprocess(TestCase):
         """
         pass
 
+    def create_vfs(self):
+        self.dut.bind_interfaces_linux(self.kdriver)
+        self.dut.generate_sriov_vfs_by_port(self.dut_ports[0], 2)
+        self.sriov_vfs_port = self.dut.ports_info[self.dut_ports[0]]["vfs_port"]
+        try:
+            for port in self.sriov_vfs_port:
+                port.bind_driver(self.drivername)
+            self.dut.send_expect("ifconfig {} up".format(self.dport_ifaces), "# ")
+            self.dut.send_expect(
+                "ip link set {} vf 0 mac {}".format(
+                    self.dport_ifaces, "00:11:22:33:44:55"
+                ),
+                "# ",
+            )
+        except Exception as e:
+            self.destroy_iavf()
+            raise Exception(e)
+
+    def destroy_iavf(self):
+        self.dut.destroy_sriov_vfs_by_port(self.dut_ports[0])
+        for port in self.sriov_vfs_port:
+            port.bind_driver(self.drivername)
+
     def launch_multi_testpmd(self, proc_type, queue_num, process_num, **kwargs):
         self.session_list = [
             self.dut.new_session("process_{}".format(i)) for i in range(process_num)
@@ -140,7 +167,7 @@ class TestMultiprocess(TestCase):
             if i != 0 and proc_type_list:
                 proc_type = proc_type_list[1]
             eal_param = "--proc-type={} -a {} --log-level=ice,7".format(
-                proc_type, self.pci0
+                proc_type, self.sriov_vfs_port[0].pci
             )
             param = "--rxq={0} --txq={0} --num-procs={1} --proc-id={2}".format(
                 queue_num, process_num, i
@@ -962,11 +989,14 @@ class TestMultiprocess(TestCase):
         session_list = [
             self.dut.new_session("process_{}".format(i)) for i in range(proc_num)
         ]
+        port_param = ""
+        for port_pci in self.port_pci_list:
+            port_param += " -a {}".format(port_pci)
         for i in range(proc_num):
             session_list[i].send_expect(
                 self.app_symmetric_mp
                 + " -l {} -n 4 --proc-type=auto {} -- -p {} --num-procs={} --proc-id={}".format(
-                    i + 1, self.eal_param, portMask, proc_num, i
+                    i + 1, port_param, portMask, proc_num, i
                 ),
                 "Finished Process Init",
             )
@@ -1098,7 +1128,9 @@ class TestMultiprocess(TestCase):
         pmd_2 = PmdOutput(self.dut, self.dut.new_session("process_2"))
         self.dut.init_reserved_core()
         cores = self.dut.get_reserved_core("2C", socket=1)
-        eal_param = "--proc-type={} -a {} --log-level=ice,7".format("auto", self.pci0)
+        eal_param = "--proc-type={} -a {} --log-level=ice,7".format(
+            "auto", self.sriov_vfs_port[0].pci
+        )
         param = "--rxq={0} --txq={0} --num-procs={1} --proc-id={2}".format(
             queue_num, process_num, 2
         )
@@ -1188,25 +1220,25 @@ class TestMultiprocess(TestCase):
         }
         mac_ipv4_pay_queue_index = {
             "sub_casename": "mac_ipv4_pay_queue_index",
-            "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 62 / mark id 4 / end",
+            "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 6 / mark id 4 / end",
             "packet": MAC_IPV4_PAY,
-            "check_param": {"port_id": 0, "queue": 62, "mark_id": 4},
+            "check_param": {"port_id": 0, "queue": 6, "mark_id": 4},
         }
         mac_ipv4_pay_drop = {
             "sub_casename": "mac_ipv4_pay_drop",
-            "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions drop / mark / end",
+            "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions drop / mark / end",
             "packet": MAC_IPV4_PAY,
             "check_param": {"port_id": 0, "drop": True},
         }
         mac_ipv4_pay_rss_queues = {
             "sub_casename": "mac_ipv4_pay_rss_queues",
-            "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 31 32 end / mark / end",
+            "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 10 11 end / mark / end",
             "packet": MAC_IPV4_PAY,
-            "check_param": {"port_id": 0, "queue": [31, 32]},
+            "check_param": {"port_id": 0, "queue": [10, 11]},
         }
         mac_ipv4_pay_mark_rss = {
             "sub_casename": "mac_ipv4_pay_mark_rss",
-            "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions mark / rss / end",
+            "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions mark / rss / end",
             "packet": MAC_IPV4_PAY,
             "check_param": {"port_id": 0, "mark_id": 0, "rss": True},
         }
@@ -1228,13 +1260,9 @@ class TestMultiprocess(TestCase):
         }
         mac_ipv4_tcp_toeplitz_basic_pkt = {
             "ipv4-tcp": [
-                'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
             ],
         }
-        mac_ipv4_tcp_toeplitz_non_basic_pkt = [
-            'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/UDP(sport=22,dport=23)/("X"*480)',
-            'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IPv6(src="ABAB:910B:6666:3457:8295:3333:1800:2929",dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=22,dport=23)/Raw("x"*80)',
-        ]
         mac_ipv4_tcp_l2_src = {
             "sub_casename": "mac_ipv4_tcp_l2_src",
             "port_id": 0,
@@ -1245,22 +1273,14 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E1", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.3", src="192.168.0.5")/TCP(sport=25,dport=99)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.3", src="192.168.0.5")/TCP(sport=25,dport=99)/("X"*480)',
                     "action": "check_hash_same",
                 },
             ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
-            ],
         }
         mac_ipv4_tcp_l2_dst = {
             "sub_casename": "mac_ipv4_tcp_l2_dst",
@@ -1272,25 +1292,9 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
-                    "action": "check_hash_different",
-                },
-                {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.3", src="192.168.0.5")/TCP(sport=25,dport=99)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E1", dst="00:11:22:33:44:55")/IP(dst="192.168.0.3", src="192.168.0.5")/TCP(sport=25,dport=99)/("X"*480)',
                     "action": "check_hash_same",
                 },
-                {
-                    "send_packet": mac_ipv4_tcp_toeplitz_non_basic_pkt,
-                    "action": "check_no_hash",
-                },
-            ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
             ],
         }
         mac_ipv4_tcp_l2src_l2dst = {
@@ -1303,33 +1307,9 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
-                    "action": "check_hash_different",
-                },
-                {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E1", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
-                {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
-                    "action": "check_hash_different",
-                },
-                {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.3", src="192.168.0.5")/TCP(sport=25,dport=99)/("X"*480)',
-                    "action": "check_hash_same",
-                },
-                {
-                    "send_packet": mac_ipv4_tcp_toeplitz_non_basic_pkt,
-                    "action": "check_no_hash",
-                },
-            ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
             ],
         }
         mac_ipv4_tcp_l3_src = {
@@ -1342,20 +1322,20 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=32,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_same",
                 },
-            ],
-            "post-test": [
                 {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=33)/("X"*480)',
+                    "action": "check_hash_same",
                 },
             ],
         }
@@ -1369,20 +1349,24 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=32,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=32,dport=33)/("X"*480)',
                     "action": "check_hash_same",
                 },
-            ],
-            "post-test": [
                 {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=33)/("X"*480)',
+                    "action": "check_hash_same",
                 },
             ],
         }
@@ -1396,24 +1380,28 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "action": "check_hash_different",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_same",
                 },
-            ],
-            "post-test": [
                 {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "action": "check_hash_same",
                 },
             ],
         }
@@ -1427,24 +1415,28 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "action": "check_hash_different",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_same",
                 },
-            ],
-            "post-test": [
                 {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
                 },
             ],
         }
@@ -1458,24 +1450,28 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "action": "check_hash_different",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_same",
                 },
-            ],
-            "post-test": [
                 {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "action": "check_hash_same",
                 },
             ],
         }
@@ -1489,24 +1485,28 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "action": "check_hash_different",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
+                },
+                {
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_same",
                 },
-            ],
-            "post-test": [
                 {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "action": "check_hash_same",
                 },
             ],
         }
@@ -1520,22 +1520,14 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.1.1", src="192.168.1.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.1.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_same",
                 },
             ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
-            ],
         }
         mac_ipv4_tcp_l4_dst = {
             "sub_casename": "mac_ipv4_tcp_l4_dst",
@@ -1547,22 +1539,14 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.1.1", src="192.168.1.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.1.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_same",
                 },
             ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
-            ],
         }
         mac_ipv4_tcp_all = {
             "sub_casename": "mac_ipv4_tcp_all",
@@ -1574,34 +1558,26 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=33)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=32,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_same",
                 },
             ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
-            ],
         }
         mac_ipv4_tcp_ipv4 = {
             "sub_casename": "mac_ipv4_tcp_ipv4",
@@ -1613,26 +1589,18 @@ class TestMultiprocess(TestCase):
                     "action": "save_hash",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.1.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:55", dst="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.1.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_different",
                 },
                 {
-                    "send_packet": 'Ether(src="00:11:22:33:44:53", dst="68:05:CA:BB:27:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+                    "send_packet": 'Ether(src="68:05:CA:BB:26:E0", dst="00:11:22:33:44:55")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
                     "action": "check_hash_same",
                 },
             ],
-            "post-test": [
-                {
-                    "send_packet": [
-                        mac_ipv4_tcp_toeplitz_basic_pkt["ipv4-tcp"][0],
-                    ],
-                    "action": "check_no_hash",
-                },
-            ],
         }
 
         case_list = [
@@ -1655,15 +1623,16 @@ class TestMultiprocess(TestCase):
     @check_supported_nic(support_nic)
     def test_multiprocess_with_rss_symmetric(self):
         pmd_param = {
-            "queue_num": 64,
+            "queue_num": 16,
             "proc_num": 2,
             "proc_type": "auto",
+            "symmetric": True,
         }
         packets = [
             'Ether(dst="00:11:22:33:44:55", src="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/("X"*480)',
             'Ether(dst="00:11:22:33:44:55", src="68:05:CA:BB:26:E0")/IP(dst="192.168.0.2", src="192.168.0.1")/("X"*480)',
-            'Ether(dst="00:11:22:33:44:55", src="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="12.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
-            'Ether(dst="00:11:22:33:44:55", src="68:05:CA:BB:26:E0")/IP(dst="192.168.0.2", src="12.168.0.1")/TCP(sport=22,dport=23)/("X"*480)',
+            'Ether(dst="00:11:22:33:44:55", src="68:05:CA:BB:26:E0")/IP(dst="192.168.0.1", src="192.168.0.2")/TCP(sport=22,dport=23)/("X"*480)',
+            'Ether(dst="00:11:22:33:44:55", src="68:05:CA:BB:26:E0")/IP(dst="192.168.0.2", src="192.168.0.1")/TCP(sport=22,dport=23)/("X"*480)',
         ]
         mac_ipv4_symmetric = {
             "sub_casename": "mac_ipv4_all",
@@ -1708,216 +1677,6 @@ class TestMultiprocess(TestCase):
         }
         self.rte_flow(mac_ipv4_symmetric, self.multiprocess_rss_data, **pmd_param)
 
-    def test_perf_multiprocess_performance(self):
-        """
-        Benchmark Multiprocess performance.
-        #"""
-        packet_count = 16
-        self.dut.send_expect("fg", "# ")
-        txPort = self.tester.get_local_port(self.dut_ports[0])
-        rxPort = self.tester.get_local_port(self.dut_ports[1])
-        mac = self.tester.get_mac(txPort)
-        dmac = self.dut.get_mac_address(self.dut_ports[0])
-        tgenInput = []
-
-        # create mutative src_ip+dst_ip package
-        for i in range(packet_count):
-            package = (
-                r'flows = [Ether(src="%s", dst="%s")/IP(src="192.168.1.%d", dst="192.168.1.%d")/("X"*26)]'
-                % (mac, dmac, i + 1, i + 2)
-            )
-            self.tester.scapy_append(package)
-            pcap = os.sep.join([self.output_path, "test_%d.pcap" % i])
-            self.tester.scapy_append('wrpcap("%s", flows)' % pcap)
-            tgenInput.append([txPort, rxPort, pcap])
-        self.tester.scapy_execute()
-
-        # run multiple symmetric_mp process
-        validExecutions = []
-        for execution in executions:
-            if len(self.dut.get_core_list(execution["cores"])) == execution["nprocs"]:
-                validExecutions.append(execution)
-
-        portMask = utils.create_mask(self.dut_ports)
-
-        for n in range(len(validExecutions)):
-            execution = validExecutions[n]
-            # get coreList form execution['cores']
-            coreList = self.dut.get_core_list(execution["cores"], socket=self.socket)
-            # to run a set of symmetric_mp instances, like test plan
-            dutSessionList = []
-            for index in range(len(coreList)):
-                dut_new_session = self.dut.new_session()
-                dutSessionList.append(dut_new_session)
-                # add -a option when tester and dut in same server
-                dut_new_session.send_expect(
-                    self.app_symmetric_mp
-                    + " -c %s --proc-type=auto %s -- -p %s --num-procs=%d --proc-id=%d"
-                    % (
-                        utils.create_mask([coreList[index]]),
-                        self.eal_param,
-                        portMask,
-                        execution["nprocs"],
-                        index,
-                    ),
-                    "Finished Process Init",
-                )
-
-            # clear streams before add new streams
-            self.tester.pktgen.clear_streams()
-            # run packet generator
-            streams = self.pktgen_helper.prepare_stream_from_tginput(
-                tgenInput, 100, None, self.tester.pktgen
-            )
-            _, pps = self.tester.pktgen.measure_throughput(stream_ids=streams)
-
-            execution["pps"] = pps
-
-            # close all symmetric_mp process
-            self.dut.send_expect("killall symmetric_mp", "# ")
-            # close all dut sessions
-            for dut_session in dutSessionList:
-                self.dut.close_session(dut_session)
-
-        # get rate and mpps data
-        for n in range(len(executions)):
-            self.verify(executions[n]["pps"] is not 0, "No traffic detected")
-        self.result_table_create(
-            [
-                "Num-procs",
-                "Sockets/Cores/Threads",
-                "Num Ports",
-                "Frame Size",
-                "%-age Line Rate",
-                "Packet Rate(mpps)",
-            ]
-        )
-
-        for execution in validExecutions:
-            self.result_table_add(
-                [
-                    execution["nprocs"],
-                    execution["cores"],
-                    2,
-                    64,
-                    execution["pps"] / float(100000000 / (8 * 84)),
-                    execution["pps"] / float(1000000),
-                ]
-            )
-
-        self.result_table_print()
-
-    def test_perf_multiprocess_client_serverperformance(self):
-        """
-        Benchmark Multiprocess client-server performance.
-        """
-        self.dut.kill_all()
-        self.dut.send_expect("fg", "# ")
-        txPort = self.tester.get_local_port(self.dut_ports[0])
-        rxPort = self.tester.get_local_port(self.dut_ports[1])
-        mac = self.tester.get_mac(txPort)
-
-        self.tester.scapy_append(
-            'dmac="%s"' % self.dut.get_mac_address(self.dut_ports[0])
-        )
-        self.tester.scapy_append('smac="%s"' % mac)
-        self.tester.scapy_append(
-            'flows = [Ether(src=smac, dst=dmac)/IP(src="192.168.1.1", dst="192.168.1.1")/("X"*26)]'
-        )
-
-        pcap = os.sep.join([self.output_path, "test.pcap"])
-        self.tester.scapy_append('wrpcap("%s", flows)' % pcap)
-        self.tester.scapy_execute()
-
-        validExecutions = []
-        for execution in executions:
-            if len(self.dut.get_core_list(execution["cores"])) == execution["nprocs"]:
-                validExecutions.append(execution)
-
-        for execution in validExecutions:
-            coreList = self.dut.get_core_list(execution["cores"], socket=self.socket)
-            # get core with socket parameter to specified which core dut used when tester and dut in same server
-            coreMask = utils.create_mask(
-                self.dut.get_core_list("1S/1C/1T", socket=self.socket)
-            )
-            portMask = utils.create_mask(self.dut_ports)
-            # specified mp_server core and add -a option when tester and dut in same server
-            self.dut.send_expect(
-                self.app_mp_server
-                + " -n %d -c %s %s -- -p %s -n %d"
-                % (
-                    self.dut.get_memory_channels(),
-                    coreMask,
-                    self.eal_param,
-                    portMask,
-                    execution["nprocs"],
-                ),
-                "Finished Process Init",
-                20,
-            )
-            self.dut.send_expect("^Z", "\r\n")
-            self.dut.send_expect("bg", "# ")
-
-            for n in range(execution["nprocs"]):
-                time.sleep(5)
-                # use next core as mp_client core, different from mp_server
-                coreMask = utils.create_mask([str(int(coreList[n]) + 1)])
-                self.dut.send_expect(
-                    self.app_mp_client
-                    + " -n %d -c %s --proc-type=secondary %s -- -n %d"
-                    % (self.dut.get_memory_channels(), coreMask, self.eal_param, n),
-                    "Finished Process Init",
-                )
-                self.dut.send_expect("^Z", "\r\n")
-                self.dut.send_expect("bg", "# ")
-
-            tgenInput = []
-            tgenInput.append([txPort, rxPort, pcap])
-
-            # clear streams before add new streams
-            self.tester.pktgen.clear_streams()
-            # run packet generator
-            streams = self.pktgen_helper.prepare_stream_from_tginput(
-                tgenInput, 100, None, self.tester.pktgen
-            )
-            _, pps = self.tester.pktgen.measure_throughput(stream_ids=streams)
-
-            execution["pps"] = pps
-            self.dut.kill_all()
-            time.sleep(5)
-
-        for n in range(len(executions)):
-            self.verify(executions[n]["pps"] is not 0, "No traffic detected")
-
-        self.result_table_create(
-            [
-                "Server threads",
-                "Server Cores/Threads",
-                "Num-procs",
-                "Sockets/Cores/Threads",
-                "Num Ports",
-                "Frame Size",
-                "%-age Line Rate",
-                "Packet Rate(mpps)",
-            ]
-        )
-
-        for execution in validExecutions:
-            self.result_table_add(
-                [
-                    1,
-                    "1S/1C/1T",
-                    execution["nprocs"],
-                    execution["cores"],
-                    2,
-                    64,
-                    execution["pps"] / float(100000000 / (8 * 84)),
-                    execution["pps"] / float(1000000),
-                ]
-            )
-
-        self.result_table_print()
-
     def set_fields(self):
         """set ip protocol field behavior"""
         fields_config = {
@@ -1943,4 +1702,4 @@ class TestMultiprocess(TestCase):
         Run after each test suite.
         """
         self.dut.kill_all()
-        pass
+        self.destroy_iavf()
-- 
2.17.1


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

* [dts] [PATCH V1] tests/multiprocess_iavf: synchronize case and testplan
  2022-06-24 15:47 [dts] [PATCH V1] tests/multiprocess_iavf: synchronize case and testplan Jiale Song
@ 2022-06-29  2:10 ` lijuan.tu
  0 siblings, 0 replies; 2+ messages in thread
From: lijuan.tu @ 2022-06-29  2:10 UTC (permalink / raw)
  To: dts, Jiale Song; +Cc: Jiale Song

On Fri, 24 Jun 2022 23:47:14 +0800, Jiale Song <songx.jiale@intel.com> wrote:
> 1.testplan tests iavf multiprocesses, while script tests PF multiprocesses. testplan is not 
> synchronized with the script. modify the script to synchronize testplan.
> 2.no perf case in testplan, delete perf case.
> 
> Signed-off-by: Jiale Song <songx.jiale@intel.com>


Applied, thanks

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

end of thread, other threads:[~2022-06-29  2:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-24 15:47 [dts] [PATCH V1] tests/multiprocess_iavf: synchronize case and testplan Jiale Song
2022-06-29  2:10 ` lijuan.tu

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).