test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases
@ 2016-01-21  6:42 Jingguo Fu
  2016-01-21  6:42 ` [dts] [DTS][PATCH 2/3] virtio: update vhost user cases Jingguo Fu
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Jingguo Fu @ 2016-01-21  6:42 UTC (permalink / raw)
  To: dts; +Cc: Jingguo Fu

1: optimize case
2: add get rx rate for generator
3: better way to check vhost.out file
Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_cuse_one_copy_one_vm.py | 438 +++++++++++++++++++++++++
 tests/TestSuite_vhost_cuse_sample.py          | 454 --------------------------
 tests/TestSuite_vhost_sample.py               | 425 ------------------------
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 425 ++++++++++++++++++++++++
 4 files changed, 863 insertions(+), 879 deletions(-)
 create mode 100644 tests/TestSuite_vhost_cuse_one_copy_one_vm.py
 delete mode 100644 tests/TestSuite_vhost_cuse_sample.py
 delete mode 100644 tests/TestSuite_vhost_sample.py
 create mode 100644 tests/TestSuite_vhost_user_one_copy_one_vm.py

diff --git a/tests/TestSuite_vhost_cuse_one_copy_one_vm.py b/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
new file mode 100644
index 0000000..bff5760
--- /dev/null
+++ b/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
@@ -0,0 +1,438 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2015 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.
+
+Vhost Cuse one-copy sample test suite.
+"""
+import os
+import dts
+import string
+import re
+import time
+from scapy.utils import wrpcap, rdpcap
+from test_case import TestCase
+from exception import VerifyFailure
+from settings import HEADER_SIZE
+from etgen import IxiaPacketGenerator
+from qemu_kvm import QEMUKvm
+
+
+class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
+
+    def set_up_all(self):
+        # To Extend IXIA packet generator method, call the tester's method.
+        self.tester.extend_external_packet_generator(TestVhostCuseOneCopyOneVm, self)
+
+        # Change config file to enable vhost-cuse compiled.
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=n/' ./config/common_linuxapp",
+            "# ",
+            30)
+        self.dut.build_install_dpdk(self.target)
+        self.dut.send_expect("cd ./lib/librte_vhost", "#", 30)
+        print self.dut.send_expect("make", "#", 30)
+        self.dut.send_expect("cd ./eventfd_link", "#", 30)
+        print self.dut.send_expect("make", "#", 30)
+        self.dut.send_expect("cd ~/dpdk", "#", 30)
+
+        # build the vhost sample in vhost-cuse mode.
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#")
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#")
+        out = self.dut.send_expect("make -C examples/vhost", "#")
+        self.verify("Error" not in out, "compilation error")
+        self.verify("No such file" not in out, "Not found file error")
+
+        # Build target with modified config file
+        self.dut.build_install_dpdk(self.target)
+
+        # Get and verify the ports
+        self.dut_ports = self.dut.get_ports()
+        self.verify(len(self.dut_ports) >= 1, "Insufficient ports for testing")
+
+        # Get the port's socket
+        self.pf = self.dut_ports[0]
+        netdev = self.dut.ports_info[self.pf]['port']
+        self.socket = netdev.get_nic_socket()
+        self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket)
+
+        # Set the params of vhost-cuse sample
+        self.vhost_app = "./examples/vhost/build/vhost-switch"
+        self.zero_copy = 0
+        self.vm2vm = 0
+        self.jumbo = 0
+        self.vhost_test = self.vhost_app + \
+            " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
+            " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
+
+        # Define the virtio/VM variables
+        self.virtio1 = "eth1"
+        self.virtio2 = "eth2"
+        self.virtio1_mac = "52:54:00:00:00:01"
+        self.virtio2_mac = "52:54:00:00:00:02"
+        self.src1 = "192.168.4.1"
+        self.src2 = "192.168.3.1"
+        self.dst1 = "192.168.3.1"
+        self.dst2 = "192.168.4.1"
+        self.vm_dut = None
+        self.virtio_cmd_params = \
+        'csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off'
+        # Define the table columns
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", "SendPackets(Mpps)", "LineRate(%)"]
+        self.memory_channel = 4
+
+    def set_up(self):
+        #
+        # Run before each test case.
+        #
+        # Launch vhost sample using default params
+
+        if "jumbo" in self.running_case:
+            self.jumbo = 1
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 2048, 5000, 9000]
+            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
+        else:
+            self.jumbo = 0
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
+            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
+                + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
+        self.dut.send_expect("rm -rf ./vhost.out", "#")
+
+        self.launch_vhost_sample()
+
+        # start VM with 2virtio
+        self.start_onevm()
+
+    def launch_vhost_sample(self):
+        #
+        # Launch the vhost sample with different parameters
+        #
+        self.coremask = dts.create_mask(self.cores)
+        self.vhostapp_testcmd = self.vhost_test % (
+            self.coremask, self.memory_channel, self.jumbo, self.zero_copy, self.vm2vm)
+        # Clean and prepare the vhost cuse modules
+        self.dut.send_expect("rm -rf /dev/vhost-net", "#", 20)
+        self.dut.send_expect("modprobe fuse", "#", 20)
+        self.dut.send_expect("modprobe cuse", "#", 20)
+        self.dut.send_expect("rmmod eventfd_link", "#", 20)
+        self.dut.send_expect(
+            "insmod lib/librte_vhost/eventfd_link/eventfd_link.ko",
+            "#",
+            20)
+        self.dut.send_expect(self.vhostapp_testcmd, "# ", 40)
+        time.sleep(30)
+        try:
+            print "Launch vhost sample\n"
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
+            if "Error" in out:
+                raise Exception("Launch vhost sample failed")
+        except Exception as e:
+            print dts.RED("Failed to launch vhost sample: %s" % str(e))
+
+    def start_onevm(self):
+        #
+        # Start One VM with 2 virtio devices
+        #
+
+        self.vm = QEMUKvm(self.dut, 'vm0', 'vhost_cuse_sample')
+        if "cuse" in self.running_case:
+            vm_params = {}
+            vm_params['driver'] = 'vhost-cuse'
+            vm_params['opt_mac'] = self.virtio1_mac
+            vm_params['opt_settings'] = self.virtio_cmd_params
+            self.vm.set_vm_device(**vm_params)
+
+            vm_params['opt_mac'] = self.virtio2_mac
+            vm_params['opt_settings'] = self.virtio_cmd_params
+            self.vm.set_vm_device(**vm_params)
+        try:
+            self.vm_dut = self.vm.start()
+            if self.vm_dut is None:
+                raise Exception("Set up VM ENV failed")
+        except Exception as e:
+            print dts.RED("Failure for %s" % str(e))
+
+        return True
+
+    def vm_testpmd_start(self):
+        #
+        # Start testpmd in vm
+        #
+        if self.vm_dut is not None:
+            # Start testpmd with user
+            self.vm_dut.send_expect(self.vm_testpmd, "testpmd>", 20)
+            # Start tx_first
+            self.vm_dut.send_expect("start tx_first", "testpmd>")
+
+    def clear_vhost_env(self):
+        #
+        # Kill all vhost sample, shutdown VM
+        #
+        if self.vm_dut:
+            self.vm_dut.kill_all()
+            time.sleep(1)
+        if self.vm:
+            self.vm.stop()
+            self.vm = None
+
+    def set_legacy_disablefw(self):
+        #
+        # Disable firewall and ip tables in legacy case
+        #
+        if self.vm_dut is not None:
+            self.vm_dut.send_expect("systemctl stop firewalld.service", "#")
+            self.vm_dut.send_expect("systemctl disable firewalld.service", "#")
+            self.vm_dut.send_expect("systemctl stop ip6tables.service", "#")
+            self.vm_dut.send_expect("systemctl disable ip6tables.service", "#")
+            self.vm_dut.send_expect("systemctl stop iptables.service", "#")
+            self.vm_dut.send_expect("systemctl disable iptables.service", "#")
+            self.vm_dut.send_expect(
+                "systemctl stop NetworkManager.service",
+                "#")
+            self.vm_dut.send_expect(
+                "systemctl disable NetworkManager.service",
+                "#")
+            self.vm_dut.send_expect(
+                "echo 1 >/proc/sys/net/ipv4/ip_forward",
+                "#")
+
+    def set_onevm_legacy_fwd(self):
+        if self.vm_dut is not None:
+            ifcfg = self.vm_dut.send_expect("ifconfig -a", "#", 10)
+            intfs = re.compile('eth\d').findall(ifcfg)
+            # Get the virito1/virtio2's interface names
+            for intf in intfs:
+                out_mac = self.vm_dut.send_expect(
+                    "ifconfig %s" %
+                    intf, "#", 10)
+                if self.virtio1_mac in out_mac:
+                    self.virtio1 = intf
+                if self.virtio2_mac in out_mac:
+                    self.virtio2 = intf
+            print "\nvirtio1's intf is %s" % self.virtio1
+            print "\nvirtio2's intf is %s" % self.virtio2
+            # Set the MTU for jumboframe enabled case
+            if self.jumbo == 1:
+                self.vm_dut.send_expect(
+                    "ifconfig %s mtu 9000" %
+                    self.virtio1, "#")
+                self.vm_dut.send_expect(
+                    "ifconfig %s mtu 9000" %
+                    self.virtio2, "#")
+            # Set the ipv4 fwd rules
+            self.vm_dut.send_expect(
+                "ip addr add 192.168.4.2/24 dev %s" %
+                self.virtio1, "#")
+            self.vm_dut.send_expect(
+                "ip addr add 192.168.3.2/24 dev %s" %
+                self.virtio2, "#")
+            self.vm_dut.send_expect(
+                "ip link set dev %s up" %
+                self.virtio1, "#")
+            self.vm_dut.send_expect(
+                "ip link set dev %s up" %
+                self.virtio2, "#")
+            self.vm_dut.send_expect(
+                "ip neigh add 192.168.4.1 lladdr 52:00:00:00:00:01 dev %s" %
+                self.virtio1, "#")
+            self.vm_dut.send_expect(
+                "ip neigh add 192.168.3.1 lladdr 52:00:00:00:00:02 dev %s" %
+                self.virtio2, "#")
+            self.vm_dut.send_expect("ip route show", "#")
+            print self.vm_dut.send_expect("arp -a", "#")
+
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, (recvbpsRate * 1.0 / 1000000)))
+
+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), str(pct)]
+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
+    def test_perf_cuse_one_vm_legacy_fwd(self):
+        #
+        # Test the performance of one vm with 2virtio devices in legacy fwd
+        #
+
+        self.vm_dut.restore_interfaces()
+        # Setup legacy env
+        self.set_legacy_disablefw()
+        self.set_onevm_legacy_fwd()
+        time.sleep(5)
+
+        self.dut.get_session_output(timeout=2)
+        # print "\nclean out1:", out1
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
+        # Get the VLAN ID for virtio
+        print "Check the vlan info: \n"
+        l1 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio1_mac)), out)
+        if len(l1) > 0:
+            vlan_id1 = l1[0]
+            print "vlan_id1 is ", vlan_id1
+        l2 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio2_mac)), out)
+        if len(l2) > 0:
+            vlan_id2 = l2[0]
+            print "vlan_id2 is ", vlan_id2
+
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
+        # Stop the Vhost sample
+        self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
+
+    def test_perf_cuse_one_vm_dpdk_fwd(self):
+        #
+        # Test the performance of one vm with 2virtio devices in legacy fwd
+        #
+
+        # start testpmd on VM
+        self.vm_testpmd_start()
+        time.sleep(5)
+        # Clean the output to make the next command can get correct answers
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
+        # Get the VLAN ID for virtio
+        print "\ncheck the vlan info: \n"
+        l1 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio1_mac)), out)
+        if len(l1) > 0:
+            vlan_id1 = l1[0]
+            print vlan_id1
+        l2 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio2_mac)), out)
+        if len(l2) > 0:
+            vlan_id2 = l2[0]
+            print vlan_id2
+
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
+
+        # Stop testpmd
+        self.vm_dut.send_expect("stop", "testpmd>")
+        time.sleep(1)
+        self.vm_dut.send_expect("quit", "# ")
+
+        # Stop the Vhost sample
+        self.dut.send_expect("killall -s INT vhost-switch", "#")
+
+    def test_perf_cuse_one_vm_legacy_fwd_jumboframe(self):
+        self.test_perf_cuse_one_vm_legacy_fwd()
+
+    def test_perf_cuse_one_vm_dpdk_fwd_jumboframe(self):
+        self.test_perf_cuse_one_vm_dpdk_fwd()
+
+    def tear_down(self):
+        #
+        # Run after each test case.
+        #
+        self.clear_vhost_env()
+        self.dut.kill_all()
+        time.sleep(2)
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        # Restore the config file and recompile the package
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE_VHOST_USER=y/' "
+            "./config/common_linuxapp",
+            "# ",
+            30)
+        self.dut.build_install_dpdk(self.target)
+        time.sleep(20)
diff --git a/tests/TestSuite_vhost_cuse_sample.py b/tests/TestSuite_vhost_cuse_sample.py
deleted file mode 100644
index 7666d2f..0000000
--- a/tests/TestSuite_vhost_cuse_sample.py
+++ /dev/null
@@ -1,454 +0,0 @@
-# BSD LICENSE
-#
-# Copyright(c) 2010-2015 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.
-
-Vhost Cuse one-copy sample test suite.
-"""
-import os
-import dts
-import string
-import re
-import time
-from scapy.utils import wrpcap, rdpcap
-from test_case import TestCase
-from exception import VerifyFailure
-from settings import HEADER_SIZE
-from etgen import IxiaPacketGenerator
-from qemu_kvm import QEMUKvm
-
-
-class TestVhostCUSESample(TestCase, IxiaPacketGenerator):
-
-    def set_up_all(self):
-        # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostCUSESample, self)
-
-        # Change config file to enable vhost-cuse compiled.
-        self.dut.send_expect(
-            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
-            "_VHOST_USER=n/' ./config/common_linuxapp",
-            "# ",
-            30)
-        self.dut.build_install_dpdk(self.target)
-        self.dut.send_expect("cd ./lib/librte_vhost", "#", 30)
-        print self.dut.send_expect("make", "#", 30)
-        self.dut.send_expect("cd ./eventfd_link", "#", 30)
-        print self.dut.send_expect("make", "#", 30)
-        self.dut.send_expect("cd ~/dpdk", "#", 30)
-
-        # build the vhost sample in vhost-cuse mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/' "
-            "./examples/vhost/main.c",
-            "#")
-        out = self.dut.send_expect("make -C examples/vhost", "#")
-        self.verify("Error" not in out, "compilation error")
-        self.verify("No such file" not in out, "Not found file error")
-
-        # Build target with modified config file
-        self.dut.build_install_dpdk(self.target)
-
-        # Get and verify the ports
-        self.dut_ports = self.dut.get_ports()
-        self.verify(len(self.dut_ports) >= 1, "Insufficient ports for testing")
-
-        # Get the port's socket
-        self.pf = self.dut_ports[0]
-        netdev = self.dut.ports_info[self.pf]['port']
-        self.socket = netdev.get_nic_socket()
-        self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket)
-
-        # Set the params of vhost-cuse sample
-        self.vhost_app = "./examples/vhost/build/vhost-switch"
-        self.zero_copy = 0
-        self.vm2vm = 0
-        self.jumbo = 0
-        self.vhost_test = self.vhost_app + \
-            " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
-            " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
-
-        # Define the virtio/VM variables
-        self.virtio1 = "eth1"
-        self.virtio2 = "eth2"
-        self.virtio1_mac = "52:54:00:00:00:01"
-        self.virtio2_mac = "52:54:00:00:00:02"
-        self.src1 = "192.168.4.1"
-        self.src2 = "192.168.3.1"
-        self.dst1 = "192.168.3.1"
-        self.dst2 = "192.168.4.1"
-        self.vm_dut = None
-        self.virtio_cmd_params = 'csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off'
-        # Define the table columns
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
-        self.memory_channel = 4
-
-    def set_up(self):
-        #
-        # Run before each test case.
-        #
-        # Launch vhost sample using default params
-
-        if "jumbo" in self.running_case:
-            self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
-            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + " -- -i --txqflags=0xf00 " \
-                + "--disable-hw-vlan-filter --max-pkt-len 9600"
-        else:
-            self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
-            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
-        self.dut.send_expect("rm -rf ./vhost.out", "#")
-
-        self.launch_vhost_sample()
-
-        # start VM with 2virtio
-        self.start_onevm()
-
-    def launch_vhost_sample(self):
-        #
-        # Launch the vhost sample with different parameters
-        #
-        self.coremask = dts.create_mask(self.cores)
-        self.vhostapp_testcmd = self.vhost_test % (
-            self.coremask, self.memory_channel, self.jumbo, self.zero_copy, self.vm2vm)
-        # Clean and prepare the vhost cuse modules
-        self.dut.send_expect("rm -rf /dev/vhost-net", "#", 20)
-        self.dut.send_expect("modprobe fuse", "#", 20)
-        self.dut.send_expect("modprobe cuse", "#", 20)
-        self.dut.send_expect("rmmod eventfd_link", "#", 20)
-        self.dut.send_expect(
-            "insmod lib/librte_vhost/eventfd_link/eventfd_link.ko",
-            "#",
-            20)
-        self.dut.send_expect(self.vhostapp_testcmd, "# ", 40)
-        time.sleep(30)
-        try:
-            print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_DATA: Procesing on",
-                20)
-            if "Error" in out:
-                raise Exception("Launch vhost sample failed")
-        except Exception as e:
-            print dts.RED("Failed to launch vhost sample: %s" % str(e))
-
-    def start_onevm(self):
-        #
-        # Start One VM with 2 virtio devices
-        #
-
-        self.vm = QEMUKvm(self.dut, 'vm0', 'vhost_sample')
-        if "cuse" in self.running_case:
-            vm_params = {}
-            vm_params['driver'] = 'vhost-cuse'
-            vm_params['opt_mac'] = self.virtio1_mac
-            vm_params['opt_settings'] = self.virtio_cmd_params
-            self.vm.set_vm_device(**vm_params)
-
-            vm_params['opt_mac'] = self.virtio2_mac
-            vm_params['opt_settings'] = self.virtio_cmd_params
-            self.vm.set_vm_device(**vm_params)
-        try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
-            if self.vm_dut is None:
-                raise Exception("Set up VM ENV failed")
-        except Exception as e:
-            print dts.RED("Failure for %s" % str(e))
-
-        return True
-
-    def vm_testpmd_start(self):
-        #
-        # Start testpmd in vm
-        #
-        if self.vm_dut is not None:
-            # Start testpmd with user
-            self.vm_dut.send_expect(self.vm_testpmd, "testpmd>", 20)
-            # Start tx_first
-            self.vm_dut.send_expect("start tx_first", "testpmd>")
-
-    def clear_vhost_env(self):
-        #
-        # Kill all vhost sample, shutdown VM
-        #
-        if self.vm_dut:
-            self.vm_dut.kill_all()
-            time.sleep(1)
-        if self.vm:
-            self.vm.stop()
-            self.vm = None
-
-    def set_legacy_disablefw(self):
-        #
-        # Disable firewall and ip tables in legacy case
-        #
-        if self.vm_dut is not None:
-            self.vm_dut.send_expect("systemctl stop firewalld.service", "#")
-            self.vm_dut.send_expect("systemctl disable firewalld.service", "#")
-            self.vm_dut.send_expect("systemctl stop ip6tables.service", "#")
-            self.vm_dut.send_expect("systemctl disable ip6tables.service", "#")
-            self.vm_dut.send_expect("systemctl stop iptables.service", "#")
-            self.vm_dut.send_expect("systemctl disable iptables.service", "#")
-            self.vm_dut.send_expect(
-                "systemctl stop NetworkManager.service",
-                "#")
-            self.vm_dut.send_expect(
-                "systemctl disable NetworkManager.service",
-                "#")
-            self.vm_dut.send_expect(
-                "echo 1 >/proc/sys/net/ipv4/ip_forward",
-                "#")
-
-    def set_onevm_legacy_fwd(self):
-        if self.vm_dut is not None:
-            ifcfg = self.vm_dut.send_expect("ifconfig -a", "#", 10)
-            intfs = re.compile('eth\d').findall(ifcfg)
-            # Get the virito1/virtio2's interface names
-            for intf in intfs:
-                out_mac = self.vm_dut.send_expect(
-                    "ifconfig %s" %
-                    intf, "#", 10)
-                if self.virtio1_mac in out_mac:
-                    self.virtio1 = intf
-                if self.virtio2_mac in out_mac:
-                    self.virtio2 = intf
-            print "\nvirtio1's intf is %s" % self.virtio1
-            print "\nvirtio2's intf is %s" % self.virtio2
-            # Set the MTU for jumboframe enabled case
-            if self.jumbo == 1:
-                self.vm_dut.send_expect(
-                    "ifconfig %s mtu 9000" %
-                    self.virtio1, "#")
-                self.vm_dut.send_expect(
-                    "ifconfig %s mtu 9000" %
-                    self.virtio2, "#")
-            # Set the ipv4 fwd rules
-            self.vm_dut.send_expect(
-                "ip addr add 192.168.4.2/24 dev %s" %
-                self.virtio1, "#")
-            self.vm_dut.send_expect(
-                "ip addr add 192.168.3.2/24 dev %s" %
-                self.virtio2, "#")
-            self.vm_dut.send_expect(
-                "ip link set dev %s up" %
-                self.virtio1, "#")
-            self.vm_dut.send_expect(
-                "ip link set dev %s up" %
-                self.virtio2, "#")
-            self.vm_dut.send_expect(
-                "ip neigh add 192.168.4.1 lladdr 52:00:00:00:00:01 dev %s" %
-                self.virtio1, "#")
-            self.vm_dut.send_expect(
-                "ip neigh add 192.168.3.1 lladdr 52:00:00:00:00:02 dev %s" %
-                self.virtio2, "#")
-            self.vm_dut.send_expect("ip route show", "#")
-            print self.vm_dut.send_expect("arp -a", "#")
-
-    def test_perf_cuse_one_vm_legacy_fwd(self):
-        #
-        # Test the performance of one vm with 2virtio devices in legacy fwd
-        #
-
-        self.vm_dut.restore_interfaces()
-        # Setup legacy env
-        self.set_legacy_disablefw()
-        self.set_onevm_legacy_fwd()
-
-        time.sleep(5)
-
-        out1 = self.dut.get_session_output(timeout=2)
-        # print "\nclean out1:", out1
-
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
-        print out
-        # Get the VLAN ID for virtio
-        print "\ncheck the vlan info: \n"
-        l1 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio1_mac)), out)
-        if len(l1) > 0:
-            vlan_id1 = l1[0]
-            print "vlan_id1 is ", vlan_id1
-        l2 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio2_mac)), out)
-        if len(l2) > 0:
-            vlan_id2 = l2[0]
-            print "vlan_id2 is ", vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost cuse"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
-        # Stop the Vhost sample
-        self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
-
-    def test_perf_cuse_one_vm_dpdk_fwd(self):
-        #
-        # Test the performance of one vm with 2virtio devices in legacy fwd
-        #
-
-        # start testpmd on VM
-        self.vm_testpmd_start()
-        time.sleep(5)
-        # Clean the output to make the next command can get correct answers
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
-        # Get the VLAN ID for virtio
-        print "\nout:", out
-        print "\ncheck the vlan info: \n"
-        l1 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio1_mac)), out)
-        if len(l1) > 0:
-            vlan_id1 = l1[0]
-            print vlan_id1
-        l2 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio2_mac)), out)
-        if len(l2) > 0:
-            vlan_id2 = l2[0]
-            print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost cuse"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-        # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
-        time.sleep(1)
-        self.vm_dut.send_expect("quit", "# ")
-
-        # Stop the Vhost sample
-        self.dut.send_expect("killall -s INT vhost-switch", "#")
-
-    def test_perf_cuse_one_vm_legacy_fwd_jumboframe(self):
-        self.test_perf_cuse_one_vm_legacy_fwd()
-
-    def test_perf_cuse_one_vm_dpdk_fwd_jumboframe(self):
-        self.test_perf_cuse_one_vm_dpdk_fwd()
-
-    def tear_down(self):
-        #
-        # Run after each test case.
-        #
-        self.clear_vhost_env()
-        self.dut.kill_all()
-        time.sleep(2)
-
-    def tear_down_all(self):
-        """
-        Run after each test suite.
-        """
-        # Restore the config file and recompile the package
-        self.dut.send_expect(
-            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE_VHOST_USER=y/' "
-            "./config/common_linuxapp",
-            "# ",
-            30)
-        self.dut.build_install_dpdk(self.target)
-        time.sleep(20)
diff --git a/tests/TestSuite_vhost_sample.py b/tests/TestSuite_vhost_sample.py
deleted file mode 100644
index 32e47ad..0000000
--- a/tests/TestSuite_vhost_sample.py
+++ /dev/null
@@ -1,425 +0,0 @@
-# BSD LICENSE
-#
-# Copyright(c) 2010-2015 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.
-
-Vhost user one-copy sample test suite.
-"""
-import os
-import dts
-import string
-import re
-import time
-from scapy.utils import wrpcap, rdpcap
-from test_case import TestCase
-from exception import VerifyFailure
-from settings import HEADER_SIZE
-from etgen import IxiaPacketGenerator
-from qemu_kvm import QEMUKvm
-
-
-class TestVhostSample(TestCase, IxiaPacketGenerator):
-
-    def set_up_all(self):
-        # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
-
-        # Build target with modified config file
-        self.dut.build_install_dpdk(self.target)
-
-        # Get and verify the ports
-        self.dut_ports = self.dut.get_ports()
-        self.verify(len(self.dut_ports) >= 1, "Insufficient ports for testing")
-
-        # Get the port's socket
-        self.pf = self.dut_ports[0]
-        netdev = self.dut.ports_info[self.pf]['port']
-        self.socket = netdev.get_nic_socket()
-        self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket)
-
-        # Set the params of vhost sample
-        self.vhost_app = "./examples/vhost/build/vhost-switch"
-        self.zero_copy = 0
-        self.vm2vm = 0
-        self.jumbo = 0
-
-        # Using file to save the vhost sample output since in jumboframe case,
-        # there will be lots of output
-        self.vhost_test = self.vhost_app + \
-            " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
-            " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
-        # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
-        out = self.dut.send_expect("make -C examples/vhost", "#")
-        self.verify("Error" not in out, "compilation error")
-        self.verify("No such file" not in out, "Not found file error")
-
-        # Define the virtio/VM variables
-        self.virtio1 = "eth1"
-        self.virtio2 = "eth2"
-        self.virtio1_mac = "52:54:00:00:00:01"
-        self.virtio2_mac = "52:54:00:00:00:02"
-        self.src1 = "192.168.4.1"
-        self.src2 = "192.168.3.1"
-        self.dst1 = "192.168.3.1"
-        self.dst2 = "192.168.4.1"
-        self.vm_dut = None
-
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
-        self.memory_channel = 4
-
-    def set_up(self):
-        #
-        # Run before each test case.
-        #
-        # Launch vhost sample using default params
-
-        if "jumbo" in self.running_case:
-            self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
-            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
-        else:
-            self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
-            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
-        self.dut.send_expect("rm -rf ./vhost.out", "#")
-
-        self.launch_vhost_sample()
-
-        print "Start VM with 2virtio\n"
-        # start VM with 2virtio
-        self.start_onevm()
-
-    def launch_vhost_sample(self):
-        #
-        # Launch the vhost sample with different parameters
-        #
-        self.coremask = dts.create_mask(self.cores)
-        self.vhostapp_testcmd = self.vhost_test % (
-            self.coremask, self.memory_channel, self.jumbo, self.zero_copy, self.vm2vm)
-        self.dut.send_expect(self.vhostapp_testcmd, "# ", 40)
-        time.sleep(30)
-        try:
-            print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
-            if "Error" in out:
-                raise Exception("Launch vhost sample failed")
-        except Exception as e:
-            print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
-
-    def start_onevm(self):
-        #
-        # Start One VM with 2 virtio devices
-        #
-
-        self.vm = QEMUKvm(self.dut, 'vm0', 'vhost_sample')
-        if "user" in self.running_case:
-            vm_params = {}
-            vm_params['driver'] = 'vhost-user'
-            vm_params['opt_path'] = './vhost-net'
-            vm_params['opt_mac'] = self.virtio1_mac
-            self.vm.set_vm_device(**vm_params)
-            vm_params['opt_mac'] = self.virtio2_mac
-            self.vm.set_vm_device(**vm_params)
-
-        try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
-            if self.vm_dut is None:
-                raise Exception("Set up VM ENV failed")
-        except Exception as e:
-            print dts.RED("Failure for %s" % str(e))
-
-        return True
-
-    def vm_testpmd_start(self):
-        #
-        # Start testpmd in vm
-        #
-        if self.vm_dut is not None:
-            # Start testpmd with user
-            self.vm_dut.send_expect(self.vm_testpmd, "testpmd>", 20)
-            # Start tx_first
-            self.vm_dut.send_expect("start tx_first", "testpmd>")
-
-    def clear_vhost_env(self):
-        #
-        # Kill all vhost sample, shutdown VM
-        #
-        if self.vm_dut:
-            self.vm_dut.kill_all()
-            time.sleep(1)
-        if self.vm:
-            self.vm.stop()
-            self.vm = None
-
-    def set_legacy_disablefw(self):
-        #
-        # Disable firewall and iptables in legacy case
-        #
-        if self.vm_dut is not None:
-            self.vm_dut.send_expect("systemctl stop firewalld.service", "#")
-            self.vm_dut.send_expect("systemctl disable firewalld.service", "#")
-            self.vm_dut.send_expect("systemctl stop ip6tables.service", "#")
-            self.vm_dut.send_expect("systemctl disable ip6tables.service", "#")
-            self.vm_dut.send_expect("systemctl stop iptables.service", "#")
-            self.vm_dut.send_expect("systemctl disable iptables.service", "#")
-            self.vm_dut.send_expect(
-                "systemctl stop NetworkManager.service",
-                "#")
-            self.vm_dut.send_expect(
-                "systemctl disable NetworkManager.service",
-                "#")
-            self.vm_dut.send_expect(
-                "echo 1 >/proc/sys/net/ipv4/ip_forward",
-                "#")
-
-    def set_onevm_legacy_fwd(self):
-        if self.vm_dut is not None:
-            ifcfg = self.vm_dut.send_expect("ifconfig -a", "#", 10)
-            intfs = re.compile('eth\d').findall(ifcfg)
-            # Find the virtio1 and virtio2's interface names
-            for intf in intfs:
-                out_mac = self.vm_dut.send_expect(
-                    "ifconfig %s" %
-                    intf, "#", 10)
-                if self.virtio1_mac in out_mac:
-                    self.virtio1 = intf
-                if self.virtio2_mac in out_mac:
-                    self.virtio2 = intf
-            print "\nvirtio1's intf is %s" % self.virtio1
-            print "\nvirtio2's intf is %s" % self.virtio2
-            # Set the mtu 9000 if jumboframe is enabled.
-            if self.jumbo == 1:
-                self.vm_dut.send_expect(
-                    "ifconfig %s mtu 9000" %
-                    self.virtio1, "#")
-                self.vm_dut.send_expect(
-                    "ifconfig %s mtu 9000" %
-                    self.virtio2, "#")
-            # Set up the ip address/ipv4 fwd tables
-            self.vm_dut.send_expect(
-                "ip addr add 192.168.4.2/24 dev %s" %
-                self.virtio1, "#")
-            self.vm_dut.send_expect(
-                "ip addr add 192.168.3.2/24 dev %s" %
-                self.virtio2, "#")
-            self.vm_dut.send_expect(
-                "ip link set dev %s up" %
-                self.virtio1, "#")
-            self.vm_dut.send_expect(
-                "ip link set dev %s up" %
-                self.virtio2, "#")
-            self.vm_dut.send_expect(
-                "ip neigh add 192.168.4.1 lladdr 52:00:00:00:00:01 dev %s" %
-                self.virtio1, "#")
-            self.vm_dut.send_expect(
-                "ip neigh add 192.168.3.1 lladdr 52:00:00:00:00:02 dev %s" %
-                self.virtio2, "#")
-            self.vm_dut.send_expect("ip route show", "#")
-            print self.vm_dut.send_expect("arp -a", "#")
-
-    def test_perf_user_one_vm_legacy_fwd(self):
-        #
-        # Test the performance of one vm with 2virtio devices in legacy fwd
-        #
-        # Restore the virtio interfaces to use legacy driver
-        self.vm_dut.restore_interfaces()
-
-        self.set_legacy_disablefw()
-        # Set the legacy fwd rules then get the VLAN id from vhost sample
-        # output
-        self.set_onevm_legacy_fwd()
-
-        time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
-        # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
-        l1 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio1_mac)), out)
-        if len(l1) > 0:
-            vlan_id1 = l1[0]
-            print "vlan_id1 is ", vlan_id1
-        l2 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio2_mac)), out)
-        if len(l2) > 0:
-            vlan_id2 = l2[0]
-            print "vlan_id2 is ", vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
-        # Stop the Vhost sample
-        self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
-
-    def test_perf_user_one_vm_dpdk_fwd(self):
-        #
-        # Test the performance of one vm with 2virtio devices in legacy fwd
-        #
-
-        # start testpmd on VM
-        self.vm_testpmd_start()
-        time.sleep(5)
-        # Clean the output to ensure the commands cat ./vhost.out can be sent
-        # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
-        # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
-        l1 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio1_mac)), out)
-        if len(l1) > 0:
-            vlan_id1 = l1[0]
-            print vlan_id1
-        l2 = re.findall(
-            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
-            (str(self.virtio2_mac)), out)
-        if len(l2) > 0:
-            vlan_id2 = l2[0]
-            print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-        # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
-        time.sleep(1)
-        self.vm_dut.send_expect("quit", "# ")
-
-        # Stop the Vhost sample
-        self.dut.send_expect("killall -s INT vhost-switch", "#")
-
-    def test_perf_user_one_vm_legacy_fwd_jumboframe(self):
-        self.test_perf_user_one_vm_legacy_fwd()
-
-    def test_perf_user_one_vm_dpdk_fwd_jumboframe(self):
-        self.test_perf_user_one_vm_dpdk_fwd()
-
-    def tear_down(self):
-        #
-        # Run after each test case.
-        #
-        self.clear_vhost_env()
-        self.dut.kill_all()
-        time.sleep(2)
-
-    def tear_down_all(self):
-        """
-        Run after each test suite.
-        """
-        pass
diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
new file mode 100644
index 0000000..32e47ad
--- /dev/null
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -0,0 +1,425 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2015 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.
+
+Vhost user one-copy sample test suite.
+"""
+import os
+import dts
+import string
+import re
+import time
+from scapy.utils import wrpcap, rdpcap
+from test_case import TestCase
+from exception import VerifyFailure
+from settings import HEADER_SIZE
+from etgen import IxiaPacketGenerator
+from qemu_kvm import QEMUKvm
+
+
+class TestVhostSample(TestCase, IxiaPacketGenerator):
+
+    def set_up_all(self):
+        # To Extend IXIA packet generator method, call the tester's method.
+        self.tester.extend_external_packet_generator(TestVhostSample, self)
+
+        # Build target with modified config file
+        self.dut.build_install_dpdk(self.target)
+
+        # Get and verify the ports
+        self.dut_ports = self.dut.get_ports()
+        self.verify(len(self.dut_ports) >= 1, "Insufficient ports for testing")
+
+        # Get the port's socket
+        self.pf = self.dut_ports[0]
+        netdev = self.dut.ports_info[self.pf]['port']
+        self.socket = netdev.get_nic_socket()
+        self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket)
+
+        # Set the params of vhost sample
+        self.vhost_app = "./examples/vhost/build/vhost-switch"
+        self.zero_copy = 0
+        self.vm2vm = 0
+        self.jumbo = 0
+
+        # Using file to save the vhost sample output since in jumboframe case,
+        # there will be lots of output
+        self.vhost_test = self.vhost_app + \
+            " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
+            " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
+        # build the vhost sample in vhost-user mode.
+        self.dut.send_expect(
+            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
+            " ./examples/vhost/main.c",
+            "#")
+        out = self.dut.send_expect("make -C examples/vhost", "#")
+        self.verify("Error" not in out, "compilation error")
+        self.verify("No such file" not in out, "Not found file error")
+
+        # Define the virtio/VM variables
+        self.virtio1 = "eth1"
+        self.virtio2 = "eth2"
+        self.virtio1_mac = "52:54:00:00:00:01"
+        self.virtio2_mac = "52:54:00:00:00:02"
+        self.src1 = "192.168.4.1"
+        self.src2 = "192.168.3.1"
+        self.dst1 = "192.168.3.1"
+        self.dst2 = "192.168.4.1"
+        self.vm_dut = None
+
+        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.memory_channel = 4
+
+    def set_up(self):
+        #
+        # Run before each test case.
+        #
+        # Launch vhost sample using default params
+
+        if "jumbo" in self.running_case:
+            self.jumbo = 1
+            self.frame_sizes = [
+                68,
+                128,
+                256,
+                512,
+                1024,
+                1280,
+                1518,
+                2048,
+                5000,
+                9000]
+            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
+                + \
+                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+        else:
+            self.jumbo = 0
+            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
+                + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
+        self.dut.send_expect("rm -rf ./vhost.out", "#")
+
+        self.launch_vhost_sample()
+
+        print "Start VM with 2virtio\n"
+        # start VM with 2virtio
+        self.start_onevm()
+
+    def launch_vhost_sample(self):
+        #
+        # Launch the vhost sample with different parameters
+        #
+        self.coremask = dts.create_mask(self.cores)
+        self.vhostapp_testcmd = self.vhost_test % (
+            self.coremask, self.memory_channel, self.jumbo, self.zero_copy, self.vm2vm)
+        self.dut.send_expect(self.vhostapp_testcmd, "# ", 40)
+        time.sleep(30)
+        try:
+            print "Launch vhost sample\n"
+            out = self.dut.send_expect(
+                "cat ./vhost.out",
+                "VHOST_CONFIG: bind to vhost-net",
+                20)
+            if "Error" in out:
+                raise Exception("Launch vhost sample failed")
+        except Exception as e:
+            print dts.RED("Failed to launch vhost sample: %s" % str(e))
+            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
+
+    def start_onevm(self):
+        #
+        # Start One VM with 2 virtio devices
+        #
+
+        self.vm = QEMUKvm(self.dut, 'vm0', 'vhost_sample')
+        if "user" in self.running_case:
+            vm_params = {}
+            vm_params['driver'] = 'vhost-user'
+            vm_params['opt_path'] = './vhost-net'
+            vm_params['opt_mac'] = self.virtio1_mac
+            self.vm.set_vm_device(**vm_params)
+            vm_params['opt_mac'] = self.virtio2_mac
+            self.vm.set_vm_device(**vm_params)
+
+        try:
+            self.vm_dut = self.vm.start(auto_portmap=False)
+            if self.vm_dut is None:
+                raise Exception("Set up VM ENV failed")
+        except Exception as e:
+            print dts.RED("Failure for %s" % str(e))
+
+        return True
+
+    def vm_testpmd_start(self):
+        #
+        # Start testpmd in vm
+        #
+        if self.vm_dut is not None:
+            # Start testpmd with user
+            self.vm_dut.send_expect(self.vm_testpmd, "testpmd>", 20)
+            # Start tx_first
+            self.vm_dut.send_expect("start tx_first", "testpmd>")
+
+    def clear_vhost_env(self):
+        #
+        # Kill all vhost sample, shutdown VM
+        #
+        if self.vm_dut:
+            self.vm_dut.kill_all()
+            time.sleep(1)
+        if self.vm:
+            self.vm.stop()
+            self.vm = None
+
+    def set_legacy_disablefw(self):
+        #
+        # Disable firewall and iptables in legacy case
+        #
+        if self.vm_dut is not None:
+            self.vm_dut.send_expect("systemctl stop firewalld.service", "#")
+            self.vm_dut.send_expect("systemctl disable firewalld.service", "#")
+            self.vm_dut.send_expect("systemctl stop ip6tables.service", "#")
+            self.vm_dut.send_expect("systemctl disable ip6tables.service", "#")
+            self.vm_dut.send_expect("systemctl stop iptables.service", "#")
+            self.vm_dut.send_expect("systemctl disable iptables.service", "#")
+            self.vm_dut.send_expect(
+                "systemctl stop NetworkManager.service",
+                "#")
+            self.vm_dut.send_expect(
+                "systemctl disable NetworkManager.service",
+                "#")
+            self.vm_dut.send_expect(
+                "echo 1 >/proc/sys/net/ipv4/ip_forward",
+                "#")
+
+    def set_onevm_legacy_fwd(self):
+        if self.vm_dut is not None:
+            ifcfg = self.vm_dut.send_expect("ifconfig -a", "#", 10)
+            intfs = re.compile('eth\d').findall(ifcfg)
+            # Find the virtio1 and virtio2's interface names
+            for intf in intfs:
+                out_mac = self.vm_dut.send_expect(
+                    "ifconfig %s" %
+                    intf, "#", 10)
+                if self.virtio1_mac in out_mac:
+                    self.virtio1 = intf
+                if self.virtio2_mac in out_mac:
+                    self.virtio2 = intf
+            print "\nvirtio1's intf is %s" % self.virtio1
+            print "\nvirtio2's intf is %s" % self.virtio2
+            # Set the mtu 9000 if jumboframe is enabled.
+            if self.jumbo == 1:
+                self.vm_dut.send_expect(
+                    "ifconfig %s mtu 9000" %
+                    self.virtio1, "#")
+                self.vm_dut.send_expect(
+                    "ifconfig %s mtu 9000" %
+                    self.virtio2, "#")
+            # Set up the ip address/ipv4 fwd tables
+            self.vm_dut.send_expect(
+                "ip addr add 192.168.4.2/24 dev %s" %
+                self.virtio1, "#")
+            self.vm_dut.send_expect(
+                "ip addr add 192.168.3.2/24 dev %s" %
+                self.virtio2, "#")
+            self.vm_dut.send_expect(
+                "ip link set dev %s up" %
+                self.virtio1, "#")
+            self.vm_dut.send_expect(
+                "ip link set dev %s up" %
+                self.virtio2, "#")
+            self.vm_dut.send_expect(
+                "ip neigh add 192.168.4.1 lladdr 52:00:00:00:00:01 dev %s" %
+                self.virtio1, "#")
+            self.vm_dut.send_expect(
+                "ip neigh add 192.168.3.1 lladdr 52:00:00:00:00:02 dev %s" %
+                self.virtio2, "#")
+            self.vm_dut.send_expect("ip route show", "#")
+            print self.vm_dut.send_expect("arp -a", "#")
+
+    def test_perf_user_one_vm_legacy_fwd(self):
+        #
+        # Test the performance of one vm with 2virtio devices in legacy fwd
+        #
+        # Restore the virtio interfaces to use legacy driver
+        self.vm_dut.restore_interfaces()
+
+        self.set_legacy_disablefw()
+        # Set the legacy fwd rules then get the VLAN id from vhost sample
+        # output
+        self.set_onevm_legacy_fwd()
+
+        time.sleep(5)
+        out_clean = self.dut.get_session_output(timeout=2)
+        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        # Get the VLAN ID for virtio
+        print out, "\ncheck the vlan info: \n"
+        l1 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio1_mac)), out)
+        if len(l1) > 0:
+            vlan_id1 = l1[0]
+            print "vlan_id1 is ", vlan_id1
+        l2 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio2_mac)), out)
+        if len(l2) > 0:
+            vlan_id2 = l2[0]
+            print "vlan_id2 is ", vlan_id2
+
+        dts.results_table_add_header(self.header_row)
+
+        # Create pcap file and ixia traffic
+        for frame_size in self.frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (
+                self.running_case, frame_size)
+            self.logger.info(info)
+
+            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
+            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
+
+            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
+            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
+            self.tester.scapy_execute()
+
+        # Capture the performance
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow2.pcap"))
+
+            _, pps = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            pps /= 1000000.0
+            linerate = self.wirespeed(self.nic, frame_size, 1)
+            pct = pps * 100 / linerate
+            scenario = self.running_case
+            mode = "vhost user"
+            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
+            dts.results_table_add_row(data_row)
+
+        dts.results_table_print()
+
+        # Stop the Vhost sample
+        self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
+
+    def test_perf_user_one_vm_dpdk_fwd(self):
+        #
+        # Test the performance of one vm with 2virtio devices in legacy fwd
+        #
+
+        # start testpmd on VM
+        self.vm_testpmd_start()
+        time.sleep(5)
+        # Clean the output to ensure the commands cat ./vhost.out can be sent
+        # and got answered correctly.
+        out_clean = self.dut.get_session_output(timeout=2)
+        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        # Get the VLAN ID for virtio
+        print out, "\ncheck the vlan info: \n"
+        l1 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio1_mac)), out)
+        if len(l1) > 0:
+            vlan_id1 = l1[0]
+            print vlan_id1
+        l2 = re.findall(
+            'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
+            (str(self.virtio2_mac)), out)
+        if len(l2) > 0:
+            vlan_id2 = l2[0]
+            print vlan_id2
+
+        dts.results_table_add_header(self.header_row)
+
+        # Create pcap file and ixia traffic
+        for frame_size in self.frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (
+                self.running_case, frame_size)
+            self.logger.info(info)
+
+            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
+            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
+            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
+            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
+            self.tester.scapy_execute()
+
+        # Capture the performance
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow1.pcap"))
+            tgenInput.append((port, port, "flow2.pcap"))
+
+            _, pps = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            pps /= 1000000.0
+            linerate = self.wirespeed(self.nic, frame_size, 1)
+            pct = pps * 100 / linerate
+            scenario = self.running_case
+            mode = "vhost user"
+            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
+            dts.results_table_add_row(data_row)
+
+        dts.results_table_print()
+        # Stop testpmd
+        print self.vm_dut.send_expect("stop", "testpmd>")
+        time.sleep(1)
+        self.vm_dut.send_expect("quit", "# ")
+
+        # Stop the Vhost sample
+        self.dut.send_expect("killall -s INT vhost-switch", "#")
+
+    def test_perf_user_one_vm_legacy_fwd_jumboframe(self):
+        self.test_perf_user_one_vm_legacy_fwd()
+
+    def test_perf_user_one_vm_dpdk_fwd_jumboframe(self):
+        self.test_perf_user_one_vm_dpdk_fwd()
+
+    def tear_down(self):
+        #
+        # Run after each test case.
+        #
+        self.clear_vhost_env()
+        self.dut.kill_all()
+        time.sleep(2)
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        pass
-- 
2.1.0

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

* [dts] [DTS][PATCH 2/3] virtio: update vhost user cases
  2016-01-21  6:42 [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Jingguo Fu
@ 2016-01-21  6:42 ` Jingguo Fu
  2016-01-21  7:58   ` Xu, Qian Q
  2016-01-21  6:42 ` [dts] [DTS][PATCH 3/3] virtio: update vhost cuse and user one vm cases Jingguo Fu
  2016-01-21  8:03 ` [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Xu, Qian Q
  2 siblings, 1 reply; 9+ messages in thread
From: Jingguo Fu @ 2016-01-21  6:42 UTC (permalink / raw)
  To: dts; +Cc: Jingguo Fu

    1: optimize case
    2: add get rx rate for generator
    3: better way to check vhost.out file

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 202 ++++++++++++--------------
 1 file changed, 94 insertions(+), 108 deletions(-)

diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 32e47ad..971d9c2 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -47,13 +47,18 @@ from etgen import IxiaPacketGenerator
 from qemu_kvm import QEMUKvm
 
 
-class TestVhostSample(TestCase, IxiaPacketGenerator):
+class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
 
     def set_up_all(self):
         # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
+        self.tester.extend_external_packet_generator(TestVhostUserOneCopyOneVm, self)
 
         # Build target with modified config file
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=y/' ./config/common_linuxapp",
+            "# ",
+            30)
         self.dut.build_install_dpdk(self.target)
 
         # Get and verify the ports
@@ -78,10 +83,16 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
             " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
         # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#", 10)
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#", 10)
         out = self.dut.send_expect("make -C examples/vhost", "#")
         self.verify("Error" not in out, "compilation error")
         self.verify("No such file" not in out, "Not found file error")
@@ -97,7 +108,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         self.dst2 = "192.168.4.1"
         self.vm_dut = None
 
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", "SendPackets(Mpps)", "LineRate(%)"]
         self.memory_channel = 4
 
     def set_up(self):
@@ -108,30 +119,19 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
 
         if "jumbo" in self.running_case:
             self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 2048, 5000, 9000]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
         else:
             self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
                 + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
         self.dut.send_expect("rm -rf ./vhost.out", "#")
 
         self.launch_vhost_sample()
 
-        print "Start VM with 2virtio\n"
         # start VM with 2virtio
         self.start_onevm()
 
@@ -146,15 +146,14 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         time.sleep(30)
         try:
             print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
 
     def start_onevm(self):
         #
@@ -172,7 +171,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm.set_vm_device(**vm_params)
 
         try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
+            self.vm_dut = self.vm.start()
             if self.vm_dut is None:
                 raise Exception("Set up VM ENV failed")
         except Exception as e:
@@ -267,23 +266,76 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm_dut.send_expect("ip route show", "#")
             print self.vm_dut.send_expect("arp -a", "#")
 
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, (recvbpsRate * 1.0 / 1000000)))
+
+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), str(pct)]
+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
     def test_perf_user_one_vm_legacy_fwd(self):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
         # Restore the virtio interfaces to use legacy driver
         self.vm_dut.restore_interfaces()
-
         self.set_legacy_disablefw()
         # Set the legacy fwd rules then get the VLAN id from vhost sample
         # output
         self.set_onevm_legacy_fwd()
-
         time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out)
@@ -297,41 +349,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -339,16 +357,18 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
-
         # start testpmd on VM
         self.vm_testpmd_start()
         time.sleep(5)
         # Clean the output to ensure the commands cat ./vhost.out can be sent
         # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out)
@@ -361,43 +381,9 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
+        self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
         self.vm_dut.send_expect("quit", "# ")
 
-- 
2.1.0

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

* [dts] [DTS][PATCH 3/3] virtio: update vhost cuse and user one vm cases
  2016-01-21  6:42 [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Jingguo Fu
  2016-01-21  6:42 ` [dts] [DTS][PATCH 2/3] virtio: update vhost user cases Jingguo Fu
@ 2016-01-21  6:42 ` Jingguo Fu
  2016-01-21  8:03 ` [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Xu, Qian Q
  2 siblings, 0 replies; 9+ messages in thread
From: Jingguo Fu @ 2016-01-21  6:42 UTC (permalink / raw)
  To: dts; +Cc: Jingguo Fu

1. fix get rx stat function
2. add stream
3. update notice info

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_cuse_one_copy_one_vm.py | 34 +++++++++++++++++----------
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 34 +++++++++++++++++----------
 2 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/tests/TestSuite_vhost_cuse_one_copy_one_vm.py b/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
index bff5760..22d531c 100644
--- a/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
@@ -162,13 +162,15 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
         self.dut.send_expect(self.vhostapp_testcmd, "# ", 40)
         time.sleep(30)
         try:
-            print "Launch vhost sample\n"
+            print "Launch vhost sample:"
             self.dut.session.copy_file_from("/root/dpdk/vhost.out")
             fp = open('./vhost.out', 'r')
             out = fp.read()
             fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
+            else:
+                print "Launch vhost sample finished"
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
 
@@ -252,8 +254,8 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
                     self.virtio1 = intf
                 if self.virtio2_mac in out_mac:
                     self.virtio2 = intf
-            print "\nvirtio1's intf is %s" % self.virtio1
-            print "\nvirtio2's intf is %s" % self.virtio2
+            print "Virtio1's intf is %s" % self.virtio1
+            print "Virtio2's intf is %s" % self.virtio2
             # Set the MTU for jumboframe enabled case
             if self.jumbo == 1:
                 self.vm_dut.send_expect(
@@ -309,22 +311,29 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
             recvbpsRate += int(out.strip())
             self.logger.info("Port %s: RX %f Mbps" % (port, (recvbpsRate * 1.0 / 1000000)))
 
+        self.hook_transmissoin_func()
+        self.send_expect("ixStopTransmit portList", "%", 30)
+
         return (txRate,recvRate)
 
-    def send_verify(self, case, frame_sizes, vlan_id1=0):
+    def send_verify(self, case, frame_sizes, vlan_id1=0, vlan_id2=0):
         dts.results_table_add_header(self.header_row)
         for frame_size in frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            info = "Running test %s, and %d frame size." % (case, frame_size)
             self.logger.info(info)
             payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
                 self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
-            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload)
+            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
+            self.tester.scapy_append('wrpcap("flow2.pcap", %s)' % flow2)
             self.tester.scapy_execute()
 
             tgenInput = []
             port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow.pcap"))
+            tgenInput.append((port, port, "flow1.pcap"))
+            tgenInput.append((port, port, "flow2.pcap"))
 
             recvpkt, sendpkt = self.tester.traffic_generator_throughput(
                 tgenInput, delay=15)
@@ -353,7 +362,7 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
         out = fp.read()
         fp.close()
         # Get the VLAN ID for virtio
-        print "Check the vlan info: \n"
+        print "Check the vlan info: "
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out)
@@ -367,7 +376,7 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1, vlan_id2)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -386,7 +395,7 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
         out = fp.read()
         fp.close()
         # Get the VLAN ID for virtio
-        print "\ncheck the vlan info: \n"
+        print "Check the vlan info: "
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out)
@@ -400,8 +409,7 @@ class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print vlan_id2
 
-        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1, vlan_id2)
         # Stop testpmd
         self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 971d9c2..e06d8e9 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -145,13 +145,15 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
         self.dut.send_expect(self.vhostapp_testcmd, "# ", 40)
         time.sleep(30)
         try:
-            print "Launch vhost sample\n"
+            print "Launch vhost sample:"
             self.dut.session.copy_file_from("/root/dpdk/vhost.out")
             fp = open('./vhost.out', 'r')
             out = fp.read()
             fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
+            else:
+                print "Launch vhost sample finished"
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
 
@@ -234,8 +236,8 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
                     self.virtio1 = intf
                 if self.virtio2_mac in out_mac:
                     self.virtio2 = intf
-            print "\nvirtio1's intf is %s" % self.virtio1
-            print "\nvirtio2's intf is %s" % self.virtio2
+            print "Virtio1's intf is %s" % self.virtio1
+            print "Virtio2's intf is %s" % self.virtio2
             # Set the mtu 9000 if jumboframe is enabled.
             if self.jumbo == 1:
                 self.vm_dut.send_expect(
@@ -291,22 +293,29 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
             recvbpsRate += int(out.strip())
             self.logger.info("Port %s: RX %f Mbps" % (port, (recvbpsRate * 1.0 / 1000000)))
 
+        self.hook_transmissoin_func()
+        self.send_expect("ixStopTransmit portList", "%", 30)
+
         return (txRate,recvRate)
 
-    def send_verify(self, case, frame_sizes, vlan_id1=0):
+    def send_verify(self, case, frame_sizes, vlan_id1=0, vlan_id2=0):
         dts.results_table_add_header(self.header_row)
         for frame_size in frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            info = "Running test %s, and %d frame size." % (case, frame_size)
             self.logger.info(info)
             payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
                 self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
-            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload)
+            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
+            self.tester.scapy_append('wrpcap("flow2.pcap", %s)' % flow2)
             self.tester.scapy_execute()
 
             tgenInput = []
             port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow.pcap"))
+            tgenInput.append((port, port, "flow1.pcap"))
+            tgenInput.append((port, port, "flow2.pcap"))
 
             recvpkt, sendpkt = self.tester.traffic_generator_throughput(
                 tgenInput, delay=15)
@@ -335,7 +344,7 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
         out = fp.read()
         fp.close()
         # Get the VLAN ID for virtio
-        print "Check the vlan info: \n"
+        print "Check the vlan info: "
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out)
@@ -349,7 +358,7 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1, vlan_id2)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -368,7 +377,7 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
         out = fp.read()
         fp.close()
         # Get the VLAN ID for virtio
-        print "Check the vlan info: \n"
+        print "Check the vlan info: "
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out)
@@ -381,7 +390,8 @@ class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
+
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1, vlan_id2)
         # Stop testpmd
         self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
-- 
2.1.0

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

* Re: [dts] [DTS][PATCH 2/3] virtio: update vhost user cases
  2016-01-21  6:42 ` [dts] [DTS][PATCH 2/3] virtio: update vhost user cases Jingguo Fu
@ 2016-01-21  7:58   ` Xu, Qian Q
  2016-01-21  9:03     ` Fu, JingguoX
  0 siblings, 1 reply; 9+ messages in thread
From: Xu, Qian Q @ 2016-01-21  7:58 UTC (permalink / raw)
  To: Fu, JingguoX, dts

See my comments below. 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX 
Sent: Thursday, January 21, 2016 2:43 PM
To: dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q; Fu, JingguoX
Subject: [DTS][PATCH 2/3] virtio: update vhost user cases

    1: optimize case
    2: add get rx rate for generator
    3: better way to check vhost.out file

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 202 ++++++++++++--------------
 1 file changed, 94 insertions(+), 108 deletions(-)

diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 32e47ad..971d9c2 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -47,13 +47,18 @@ from etgen import IxiaPacketGenerator  from qemu_kvm import QEMUKvm
 
 
-class TestVhostSample(TestCase, IxiaPacketGenerator):
+class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
 
     def set_up_all(self):
         # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
+        
+ self.tester.extend_external_packet_generator(TestVhostUserOneCopyOneVm
+ , self)
 
         # Build target with modified config file
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=y/' ./config/common_linuxapp",
+            "# ",
+            30)
         self.dut.build_install_dpdk(self.target)
 
         # Get and verify the ports
@@ -78,10 +83,16 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
             " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
         # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#", 10)
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#", 10)
         out = self.dut.send_expect("make -C examples/vhost", "#")
         self.verify("Error" not in out, "compilation error")
         self.verify("No such file" not in out, "Not found file error") @@ -97,7 +108,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         self.dst2 = "192.168.4.1"
         self.vm_dut = None
 
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", 
+ "SendPackets(Mpps)", "LineRate(%)"]

In fact, Recvpkt is the ixia sending traffic rate, sendpkt is the ixia received packet rate and the virtio/vhost throughput, the naming recvpkt is a little confusing, since we know we will send line rate traffic, no need list here. Suggest to remove recvpkt, and change sendpkt name as throughput, and if removed Test and mode, how do we know which case has the perf and which mode is using in the result check? 


         self.memory_channel = 4
 
     def set_up(self):
@@ -108,30 +119,19 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
 
         if "jumbo" in self.running_case:
             self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 
+ 2048, 5000, 9000]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
         else:
             self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
                 + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
         self.dut.send_expect("rm -rf ./vhost.out", "#")
 
         self.launch_vhost_sample()
 
-        print "Start VM with 2virtio\n"
         # start VM with 2virtio
         self.start_onevm()
 
@@ -146,15 +146,14 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         time.sleep(30)
         try:
             print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
Why remove this line? We need remove the module and ensure next time the app can be launched successfully, when exception happened, the sample will not remove the module. 
 
     def start_onevm(self):
         #
@@ -172,7 +171,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm.set_vm_device(**vm_params)
 
         try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
+            self.vm_dut = self.vm.start()
             if self.vm_dut is None:
                 raise Exception("Set up VM ENV failed")
         except Exception as e:
@@ -267,23 +266,76 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm_dut.send_expect("ip route show", "#")
             print self.vm_dut.send_expect("arp -a", "#")
 
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, 
+ (recvbpsRate * 1.0 / 1000000)))
+

+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), str(pct)]

+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
     def test_perf_user_one_vm_legacy_fwd(self):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
         # Restore the virtio interfaces to use legacy driver
         self.vm_dut.restore_interfaces()
-
         self.set_legacy_disablefw()
         # Set the legacy fwd rules then get the VLAN id from vhost sample
         # output
         self.set_onevm_legacy_fwd()
-
         time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -297,41 +349,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -339,16 +357,18 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
-
         # start testpmd on VM
         self.vm_testpmd_start()
         time.sleep(5)
         # Clean the output to ensure the commands cat ./vhost.out can be sent
         # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -361,43 +381,9 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
+        self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
         self.vm_dut.send_expect("quit", "# ")
 
--
2.1.0

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

* Re: [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases
  2016-01-21  6:42 [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Jingguo Fu
  2016-01-21  6:42 ` [dts] [DTS][PATCH 2/3] virtio: update vhost user cases Jingguo Fu
  2016-01-21  6:42 ` [dts] [DTS][PATCH 3/3] virtio: update vhost cuse and user one vm cases Jingguo Fu
@ 2016-01-21  8:03 ` Xu, Qian Q
  2 siblings, 0 replies; 9+ messages in thread
From: Xu, Qian Q @ 2016-01-21  8:03 UTC (permalink / raw)
  To: Fu, JingguoX, dts



Thanks
Qian


-----Original Message-----
From: Fu, JingguoX 
Sent: Thursday, January 21, 2016 2:43 PM
To: dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q; Fu, JingguoX
Subject: [DTS][PATCH 1/3] virtio: update vhost cuse cases

1: optimize case
2: add get rx rate for generator
3: better way to check vhost.out file
Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_cuse_one_copy_one_vm.py | 438 +++++++++++++++++++++++++
 tests/TestSuite_vhost_cuse_sample.py          | 454 --------------------------
 tests/TestSuite_vhost_sample.py               | 425 ------------------------
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 425 ++++++++++++++++++++++++
 4 files changed, 863 insertions(+), 879 deletions(-)
 create mode 100644 tests/TestSuite_vhost_cuse_one_copy_one_vm.py
 delete mode 100644 tests/TestSuite_vhost_cuse_sample.py
 delete mode 100644 tests/TestSuite_vhost_sample.py
 create mode 100644 tests/TestSuite_vhost_user_one_copy_one_vm.py

diff --git a/tests/TestSuite_vhost_cuse_one_copy_one_vm.py b/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
new file mode 100644
index 0000000..bff5760
--- /dev/null
+++ b/tests/TestSuite_vhost_cuse_one_copy_one_vm.py
@@ -0,0 +1,438 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2015 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.
+
+Vhost Cuse one-copy sample test suite.
+"""
+import os
+import dts
+import string
+import re
+import time
+from scapy.utils import wrpcap, rdpcap
+from test_case import TestCase
+from exception import VerifyFailure
+from settings import HEADER_SIZE
+from etgen import IxiaPacketGenerator
+from qemu_kvm import QEMUKvm
+
+
+class TestVhostCuseOneCopyOneVm(TestCase, IxiaPacketGenerator):
+
+    def set_up_all(self):
+        # To Extend IXIA packet generator method, call the tester's method.
+        self.tester.extend_external_packet_generator(TestVhostCuseOneCopyOneVm, self)
+
+        # Change config file to enable vhost-cuse compiled.
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=n/' ./config/common_linuxapp",
+            "# ",
+            30)
+        self.dut.build_install_dpdk(self.target)
+        self.dut.send_expect("cd ./lib/librte_vhost", "#", 30)
+        print self.dut.send_expect("make", "#", 30)
+        self.dut.send_expect("cd ./eventfd_link", "#", 30)
+        print self.dut.send_expect("make", "#", 30)
+        self.dut.send_expect("cd ~/dpdk", "#", 30)
+
+        # build the vhost sample in vhost-cuse mode.
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#")
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#")
+        out = self.dut.send_expect("make -C examples/vhost", "#")
+        self.verify("Error" not in out, "compilation error")
+        self.verify("No such file" not in out, "Not found file error")
+
+        # Build target with modified config file
+        self.dut.build_install_dpdk(self.target)
+
+        # Get and verify the ports
+        self.dut_ports = self.dut.get_ports()
+        self.verify(len(self.dut_ports) >= 1, "Insufficient ports for testing")
+
+        # Get the port's socket
+        self.pf = self.dut_ports[0]
+        netdev = self.dut.ports_info[self.pf]['port']
+        self.socket = netdev.get_nic_socket()
+        self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket)
+
+        # Set the params of vhost-cuse sample
+        self.vhost_app = "./examples/vhost/build/vhost-switch"
+        self.zero_copy = 0
+        self.vm2vm = 0
+        self.jumbo = 0
+        self.vhost_test = self.vhost_app + \
+            " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
+            " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
+
+        # Define the virtio/VM variables
+        self.virtio1 = "eth1"
+        self.virtio2 = "eth2"
+        self.virtio1_mac = "52:54:00:00:00:01"
+        self.virtio2_mac = "52:54:00:00:00:02"
+        self.src1 = "192.168.4.1"
+        self.src2 = "192.168.3.1"
+        self.dst1 = "192.168.3.1"
+        self.dst2 = "192.168.4.1"
+        self.vm_dut = None
+        self.virtio_cmd_params = \
+        'csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off'
+        # Define the table columns
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", "SendPackets(Mpps)", "LineRate(%)"]
+        self.memory_channel = 4
Similar comments as vhost-user, suggest to remove RecvPackets(Mpps). 

Qian 
Thx. 

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

* Re: [dts] [DTS][PATCH 2/3] virtio: update vhost user cases
  2016-01-21  7:58   ` Xu, Qian Q
@ 2016-01-21  9:03     ` Fu, JingguoX
  2016-01-22  1:55       ` Xu, Qian Q
  0 siblings, 1 reply; 9+ messages in thread
From: Fu, JingguoX @ 2016-01-21  9:03 UTC (permalink / raw)
  To: Xu, Qian Q, dts

Hi, qian

For self.dut.send_expect("rm -rf ./vhost-net", "#", 20), I found that sometimes it could not remove 
when the case failed at some different stages, so  I put it at set_up()  stage for each case, to 
make sure that when a new case start, it would not affect by the vhost-net from the prior case.

For recvpkt and send pkt, I think the logic as bellows:
For ixia, it will send packet to a virtio device, then the first virtio device will receive packets, and it will 
forward the packets to the second virtio device. At last, the second virtio will send out the packets it 
received, then from IXIA end, we see the receive rate. 
This logic based on the discussion with Ouyang Changchun originally. If we need to re-define it , maybe 
we can set a quickly discussion for it.

And at last, for the data table, originally we put the mode and case name to the table, we receive some 
comments for remove them. So now, it will disappear from the table. For my part, I don't think it necessary 
to put them into the table. Every  case has its own table, and it seems too much redundant info if put them
in the table.  


Thanks,
Jingguo Fu
-----Original Message-----
From: Xu, Qian Q 
Sent: Thursday, January 21, 2016 3:58 PM
To: Fu, JingguoX; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

See my comments below. 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX
Sent: Thursday, January 21, 2016 2:43 PM
To: dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q; Fu, JingguoX
Subject: [DTS][PATCH 2/3] virtio: update vhost user cases

    1: optimize case
    2: add get rx rate for generator
    3: better way to check vhost.out file

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 202 ++++++++++++--------------
 1 file changed, 94 insertions(+), 108 deletions(-)

diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 32e47ad..971d9c2 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -47,13 +47,18 @@ from etgen import IxiaPacketGenerator  from qemu_kvm import QEMUKvm
 
 
-class TestVhostSample(TestCase, IxiaPacketGenerator):
+class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
 
     def set_up_all(self):
         # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
+        
+ self.tester.extend_external_packet_generator(TestVhostUserOneCopyOneVm
+ , self)
 
         # Build target with modified config file
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=y/' ./config/common_linuxapp",
+            "# ",
+            30)
         self.dut.build_install_dpdk(self.target)
 
         # Get and verify the ports
@@ -78,10 +83,16 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
             " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
         # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#", 10)
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#", 10)
         out = self.dut.send_expect("make -C examples/vhost", "#")
         self.verify("Error" not in out, "compilation error")
         self.verify("No such file" not in out, "Not found file error") @@ -97,7 +108,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         self.dst2 = "192.168.4.1"
         self.vm_dut = None
 
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", 
+ "SendPackets(Mpps)", "LineRate(%)"]

In fact, Recvpkt is the ixia sending traffic rate, sendpkt is the ixia received packet rate and the virtio/vhost throughput, the naming recvpkt is a little confusing, since we know we will send line rate traffic, no need list here. Suggest to remove recvpkt, and change sendpkt name as throughput, and if removed Test and mode, how do we know which case has the perf and which mode is using in the result check? 


         self.memory_channel = 4
 
     def set_up(self):
@@ -108,30 +119,19 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
 
         if "jumbo" in self.running_case:
             self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 
+ 2048, 5000, 9000]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
         else:
             self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
                 + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
         self.dut.send_expect("rm -rf ./vhost.out", "#")
 
         self.launch_vhost_sample()
 
-        print "Start VM with 2virtio\n"
         # start VM with 2virtio
         self.start_onevm()
 
@@ -146,15 +146,14 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         time.sleep(30)
         try:
             print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
Why remove this line? We need remove the module and ensure next time the app can be launched successfully, when exception happened, the sample will not remove the module. 
 
     def start_onevm(self):
         #
@@ -172,7 +171,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm.set_vm_device(**vm_params)
 
         try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
+            self.vm_dut = self.vm.start()
             if self.vm_dut is None:
                 raise Exception("Set up VM ENV failed")
         except Exception as e:
@@ -267,23 +266,76 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm_dut.send_expect("ip route show", "#")
             print self.vm_dut.send_expect("arp -a", "#")
 
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, 
+ (recvbpsRate * 1.0 / 1000000)))
+

+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), 
+ str(pct)]

+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
     def test_perf_user_one_vm_legacy_fwd(self):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
         # Restore the virtio interfaces to use legacy driver
         self.vm_dut.restore_interfaces()
-
         self.set_legacy_disablefw()
         # Set the legacy fwd rules then get the VLAN id from vhost sample
         # output
         self.set_onevm_legacy_fwd()
-
         time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -297,41 +349,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -339,16 +357,18 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
-
         # start testpmd on VM
         self.vm_testpmd_start()
         time.sleep(5)
         # Clean the output to ensure the commands cat ./vhost.out can be sent
         # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -361,43 +381,9 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
+        self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
         self.vm_dut.send_expect("quit", "# ")
 
--
2.1.0

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

* Re: [dts] [DTS][PATCH 2/3] virtio: update vhost user cases
  2016-01-21  9:03     ` Fu, JingguoX
@ 2016-01-22  1:55       ` Xu, Qian Q
  2016-01-22  2:33         ` Fu, JingguoX
  2016-01-22  8:46         ` Fu, JingguoX
  0 siblings, 2 replies; 9+ messages in thread
From: Xu, Qian Q @ 2016-01-22  1:55 UTC (permalink / raw)
  To: Fu, JingguoX, dts

Jingguo
I'm fine with item1 and item3, but as to item2, the logic is correct and it's similar as we test PF performance, all nic port will RX ixia traffic and TX the traffic back to IXIA, when testing performance, we default take traffic is 100% Linerate, and the traffic return to IXIA is called throughput, since virtio/NIC port will do RX and TX, so if you say it's TX, it's not accurate, so we can say it's throughput which will not cause confusion. Does it make sense? 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX 
Sent: Thursday, January 21, 2016 5:03 PM
To: Xu, Qian Q; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

Hi, qian

For self.dut.send_expect("rm -rf ./vhost-net", "#", 20), I found that sometimes it could not remove when the case failed at some different stages, so  I put it at set_up()  stage for each case, to make sure that when a new case start, it would not affect by the vhost-net from the prior case.

For recvpkt and send pkt, I think the logic as bellows:
For ixia, it will send packet to a virtio device, then the first virtio device will receive packets, and it will forward the packets to the second virtio device. At last, the second virtio will send out the packets it received, then from IXIA end, we see the receive rate. 
This logic based on the discussion with Ouyang Changchun originally. If we need to re-define it , maybe we can set a quickly discussion for it.

And at last, for the data table, originally we put the mode and case name to the table, we receive some comments for remove them. So now, it will disappear from the table. For my part, I don't think it necessary to put them into the table. Every  case has its own table, and it seems too much redundant info if put them in the table.  


Thanks,
Jingguo Fu
-----Original Message-----
From: Xu, Qian Q
Sent: Thursday, January 21, 2016 3:58 PM
To: Fu, JingguoX; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

See my comments below. 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX
Sent: Thursday, January 21, 2016 2:43 PM
To: dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q; Fu, JingguoX
Subject: [DTS][PATCH 2/3] virtio: update vhost user cases

    1: optimize case
    2: add get rx rate for generator
    3: better way to check vhost.out file

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 202 ++++++++++++--------------
 1 file changed, 94 insertions(+), 108 deletions(-)

diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 32e47ad..971d9c2 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -47,13 +47,18 @@ from etgen import IxiaPacketGenerator  from qemu_kvm import QEMUKvm
 
 
-class TestVhostSample(TestCase, IxiaPacketGenerator):
+class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
 
     def set_up_all(self):
         # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
+        
+ self.tester.extend_external_packet_generator(TestVhostUserOneCopyOneVm
+ , self)
 
         # Build target with modified config file
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=y/' ./config/common_linuxapp",
+            "# ",
+            30)
         self.dut.build_install_dpdk(self.target)
 
         # Get and verify the ports
@@ -78,10 +83,16 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
             " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
         # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#", 10)
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#", 10)
         out = self.dut.send_expect("make -C examples/vhost", "#")
         self.verify("Error" not in out, "compilation error")
         self.verify("No such file" not in out, "Not found file error") @@ -97,7 +108,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         self.dst2 = "192.168.4.1"
         self.vm_dut = None
 
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", 
+ "SendPackets(Mpps)", "LineRate(%)"]

In fact, Recvpkt is the ixia sending traffic rate, sendpkt is the ixia received packet rate and the virtio/vhost throughput, the naming recvpkt is a little confusing, since we know we will send line rate traffic, no need list here. Suggest to remove recvpkt, and change sendpkt name as throughput, and if removed Test and mode, how do we know which case has the perf and which mode is using in the result check? 


         self.memory_channel = 4
 
     def set_up(self):
@@ -108,30 +119,19 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
 
         if "jumbo" in self.running_case:
             self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 
+ 2048, 5000, 9000]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
         else:
             self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
                 + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
         self.dut.send_expect("rm -rf ./vhost.out", "#")
 
         self.launch_vhost_sample()
 
-        print "Start VM with 2virtio\n"
         # start VM with 2virtio
         self.start_onevm()
 
@@ -146,15 +146,14 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         time.sleep(30)
         try:
             print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
Why remove this line? We need remove the module and ensure next time the app can be launched successfully, when exception happened, the sample will not remove the module. 
 
     def start_onevm(self):
         #
@@ -172,7 +171,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm.set_vm_device(**vm_params)
 
         try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
+            self.vm_dut = self.vm.start()
             if self.vm_dut is None:
                 raise Exception("Set up VM ENV failed")
         except Exception as e:
@@ -267,23 +266,76 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm_dut.send_expect("ip route show", "#")
             print self.vm_dut.send_expect("arp -a", "#")
 
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, 
+ (recvbpsRate * 1.0 / 1000000)))
+

+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), 
+ str(pct)]

+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
     def test_perf_user_one_vm_legacy_fwd(self):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
         # Restore the virtio interfaces to use legacy driver
         self.vm_dut.restore_interfaces()
-
         self.set_legacy_disablefw()
         # Set the legacy fwd rules then get the VLAN id from vhost sample
         # output
         self.set_onevm_legacy_fwd()
-
         time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -297,41 +349,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -339,16 +357,18 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
-
         # start testpmd on VM
         self.vm_testpmd_start()
         time.sleep(5)
         # Clean the output to ensure the commands cat ./vhost.out can be sent
         # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -361,43 +381,9 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
+        self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
         self.vm_dut.send_expect("quit", "# ")
 
--
2.1.0

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

* Re: [dts] [DTS][PATCH 2/3] virtio: update vhost user cases
  2016-01-22  1:55       ` Xu, Qian Q
@ 2016-01-22  2:33         ` Fu, JingguoX
  2016-01-22  8:46         ` Fu, JingguoX
  1 sibling, 0 replies; 9+ messages in thread
From: Fu, JingguoX @ 2016-01-22  2:33 UTC (permalink / raw)
  To: Xu, Qian Q, dts

Ok, as we discussion , I update the table head title by patch: virtio-update-virtio-data-table-head-title-format.patch

Thanks,
Jingguo Fu

-----Original Message-----
From: Xu, Qian Q 
Sent: Friday, January 22, 2016 9:55 AM
To: Fu, JingguoX; dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

Jingguo
I'm fine with item1 and item3, but as to item2, the logic is correct and it's similar as we test PF performance, all nic port will RX ixia traffic and TX the traffic back to IXIA, when testing performance, we default take traffic is 100% Linerate, and the traffic return to IXIA is called throughput, since virtio/NIC port will do RX and TX, so if you say it's TX, it's not accurate, so we can say it's throughput which will not cause confusion. Does it make sense? 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX
Sent: Thursday, January 21, 2016 5:03 PM
To: Xu, Qian Q; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

Hi, qian

For self.dut.send_expect("rm -rf ./vhost-net", "#", 20), I found that sometimes it could not remove when the case failed at some different stages, so  I put it at set_up()  stage for each case, to make sure that when a new case start, it would not affect by the vhost-net from the prior case.

For recvpkt and send pkt, I think the logic as bellows:
For ixia, it will send packet to a virtio device, then the first virtio device will receive packets, and it will forward the packets to the second virtio device. At last, the second virtio will send out the packets it received, then from IXIA end, we see the receive rate. 
This logic based on the discussion with Ouyang Changchun originally. If we need to re-define it , maybe we can set a quickly discussion for it.

And at last, for the data table, originally we put the mode and case name to the table, we receive some comments for remove them. So now, it will disappear from the table. For my part, I don't think it necessary to put them into the table. Every  case has its own table, and it seems too much redundant info if put them in the table.  


Thanks,
Jingguo Fu
-----Original Message-----
From: Xu, Qian Q
Sent: Thursday, January 21, 2016 3:58 PM
To: Fu, JingguoX; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

See my comments below. 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX
Sent: Thursday, January 21, 2016 2:43 PM
To: dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q; Fu, JingguoX
Subject: [DTS][PATCH 2/3] virtio: update vhost user cases

    1: optimize case
    2: add get rx rate for generator
    3: better way to check vhost.out file

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 202 ++++++++++++--------------
 1 file changed, 94 insertions(+), 108 deletions(-)

diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 32e47ad..971d9c2 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -47,13 +47,18 @@ from etgen import IxiaPacketGenerator  from qemu_kvm import QEMUKvm
 
 
-class TestVhostSample(TestCase, IxiaPacketGenerator):
+class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
 
     def set_up_all(self):
         # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
+        
+ self.tester.extend_external_packet_generator(TestVhostUserOneCopyOneVm
+ , self)
 
         # Build target with modified config file
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=y/' ./config/common_linuxapp",
+            "# ",
+            30)
         self.dut.build_install_dpdk(self.target)
 
         # Get and verify the ports
@@ -78,10 +83,16 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
             " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
         # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#", 10)
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#", 10)
         out = self.dut.send_expect("make -C examples/vhost", "#")
         self.verify("Error" not in out, "compilation error")
         self.verify("No such file" not in out, "Not found file error") @@ -97,7 +108,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         self.dst2 = "192.168.4.1"
         self.vm_dut = None
 
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", 
+ "SendPackets(Mpps)", "LineRate(%)"]

In fact, Recvpkt is the ixia sending traffic rate, sendpkt is the ixia received packet rate and the virtio/vhost throughput, the naming recvpkt is a little confusing, since we know we will send line rate traffic, no need list here. Suggest to remove recvpkt, and change sendpkt name as throughput, and if removed Test and mode, how do we know which case has the perf and which mode is using in the result check? 


         self.memory_channel = 4
 
     def set_up(self):
@@ -108,30 +119,19 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
 
         if "jumbo" in self.running_case:
             self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 
+ 2048, 5000, 9000]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
         else:
             self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
                 + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
         self.dut.send_expect("rm -rf ./vhost.out", "#")
 
         self.launch_vhost_sample()
 
-        print "Start VM with 2virtio\n"
         # start VM with 2virtio
         self.start_onevm()
 
@@ -146,15 +146,14 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         time.sleep(30)
         try:
             print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
Why remove this line? We need remove the module and ensure next time the app can be launched successfully, when exception happened, the sample will not remove the module. 
 
     def start_onevm(self):
         #
@@ -172,7 +171,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm.set_vm_device(**vm_params)
 
         try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
+            self.vm_dut = self.vm.start()
             if self.vm_dut is None:
                 raise Exception("Set up VM ENV failed")
         except Exception as e:
@@ -267,23 +266,76 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm_dut.send_expect("ip route show", "#")
             print self.vm_dut.send_expect("arp -a", "#")
 
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, 
+ (recvbpsRate * 1.0 / 1000000)))
+

+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), 
+ str(pct)]

+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
     def test_perf_user_one_vm_legacy_fwd(self):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
         # Restore the virtio interfaces to use legacy driver
         self.vm_dut.restore_interfaces()
-
         self.set_legacy_disablefw()
         # Set the legacy fwd rules then get the VLAN id from vhost sample
         # output
         self.set_onevm_legacy_fwd()
-
         time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -297,41 +349,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -339,16 +357,18 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
-
         # start testpmd on VM
         self.vm_testpmd_start()
         time.sleep(5)
         # Clean the output to ensure the commands cat ./vhost.out can be sent
         # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -361,43 +381,9 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
+        self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
         self.vm_dut.send_expect("quit", "# ")
 
--
2.1.0

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

* Re: [dts] [DTS][PATCH 2/3] virtio: update vhost user cases
  2016-01-22  1:55       ` Xu, Qian Q
  2016-01-22  2:33         ` Fu, JingguoX
@ 2016-01-22  8:46         ` Fu, JingguoX
  1 sibling, 0 replies; 9+ messages in thread
From: Fu, JingguoX @ 2016-01-22  8:46 UTC (permalink / raw)
  To: Xu, Qian Q, dts

Update by version 2 patches

Thanks,
Jingguo Fu

-----Original Message-----
From: Xu, Qian Q 
Sent: Friday, January 22, 2016 9:55 AM
To: Fu, JingguoX; dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

Jingguo
I'm fine with item1 and item3, but as to item2, the logic is correct and it's similar as we test PF performance, all nic port will RX ixia traffic and TX the traffic back to IXIA, when testing performance, we default take traffic is 100% Linerate, and the traffic return to IXIA is called throughput, since virtio/NIC port will do RX and TX, so if you say it's TX, it's not accurate, so we can say it's throughput which will not cause confusion. Does it make sense? 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX
Sent: Thursday, January 21, 2016 5:03 PM
To: Xu, Qian Q; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

Hi, qian

For self.dut.send_expect("rm -rf ./vhost-net", "#", 20), I found that sometimes it could not remove when the case failed at some different stages, so  I put it at set_up()  stage for each case, to make sure that when a new case start, it would not affect by the vhost-net from the prior case.

For recvpkt and send pkt, I think the logic as bellows:
For ixia, it will send packet to a virtio device, then the first virtio device will receive packets, and it will forward the packets to the second virtio device. At last, the second virtio will send out the packets it received, then from IXIA end, we see the receive rate. 
This logic based on the discussion with Ouyang Changchun originally. If we need to re-define it , maybe we can set a quickly discussion for it.

And at last, for the data table, originally we put the mode and case name to the table, we receive some comments for remove them. So now, it will disappear from the table. For my part, I don't think it necessary to put them into the table. Every  case has its own table, and it seems too much redundant info if put them in the table.  


Thanks,
Jingguo Fu
-----Original Message-----
From: Xu, Qian Q
Sent: Thursday, January 21, 2016 3:58 PM
To: Fu, JingguoX; dts@dpdk.org
Cc: Liu, Yong
Subject: RE: [DTS][PATCH 2/3] virtio: update vhost user cases

See my comments below. 

Thanks
Qian


-----Original Message-----
From: Fu, JingguoX
Sent: Thursday, January 21, 2016 2:43 PM
To: dts@dpdk.org
Cc: Liu, Yong; Xu, Qian Q; Fu, JingguoX
Subject: [DTS][PATCH 2/3] virtio: update vhost user cases

    1: optimize case
    2: add get rx rate for generator
    3: better way to check vhost.out file

Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
---
 tests/TestSuite_vhost_user_one_copy_one_vm.py | 202 ++++++++++++--------------
 1 file changed, 94 insertions(+), 108 deletions(-)

diff --git a/tests/TestSuite_vhost_user_one_copy_one_vm.py b/tests/TestSuite_vhost_user_one_copy_one_vm.py
index 32e47ad..971d9c2 100644
--- a/tests/TestSuite_vhost_user_one_copy_one_vm.py
+++ b/tests/TestSuite_vhost_user_one_copy_one_vm.py
@@ -47,13 +47,18 @@ from etgen import IxiaPacketGenerator  from qemu_kvm import QEMUKvm
 
 
-class TestVhostSample(TestCase, IxiaPacketGenerator):
+class TestVhostUserOneCopyOneVm(TestCase, IxiaPacketGenerator):
 
     def set_up_all(self):
         # To Extend IXIA packet generator method, call the tester's method.
-        self.tester.extend_external_packet_generator(TestVhostSample, self)
+        
+ self.tester.extend_external_packet_generator(TestVhostUserOneCopyOneVm
+ , self)
 
         # Build target with modified config file
+        self.dut.send_expect(
+            "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE"
+            "_VHOST_USER=y/' ./config/common_linuxapp",
+            "# ",
+            30)
         self.dut.build_install_dpdk(self.target)
 
         # Get and verify the ports
@@ -78,10 +83,16 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             " -c %s -n %d --socket-mem 1024,1024 -- -p 0x1 --mergeable %d" + \
             " --zero-copy %d --vm2vm %d 2 > ./vhost.out &"
         # build the vhost sample in vhost-user mode.
-        self.dut.send_expect(
-            "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/'"
-            " ./examples/vhost/main.c",
-            "#")
+        if self.nic in ['niantic']:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 128/' "
+                "./examples/vhost/main.c",
+                "#", 10)
+        else:
+            self.dut.send_expect(
+                "sed -i -e 's/#define MAX_QUEUES.*$/#define MAX_QUEUES 512/' "
+                "./examples/vhost/main.c",
+                "#", 10)
         out = self.dut.send_expect("make -C examples/vhost", "#")
         self.verify("Error" not in out, "compilation error")
         self.verify("No such file" not in out, "Not found file error") @@ -97,7 +108,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         self.dst2 = "192.168.4.1"
         self.vm_dut = None
 
-        self.header_row = ["Test", "Mode", "Frame", "Mpps", "% linerate"]
+        self.header_row = ["FrameSize(B)", "RecvPackets(Mpps)", 
+ "SendPackets(Mpps)", "LineRate(%)"]

In fact, Recvpkt is the ixia sending traffic rate, sendpkt is the ixia received packet rate and the virtio/vhost throughput, the naming recvpkt is a little confusing, since we know we will send line rate traffic, no need list here. Suggest to remove recvpkt, and change sendpkt name as throughput, and if removed Test and mode, how do we know which case has the perf and which mode is using in the result check? 


         self.memory_channel = 4
 
     def set_up(self):
@@ -108,30 +119,19 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
 
         if "jumbo" in self.running_case:
             self.jumbo = 1
-            self.frame_sizes = [
-                68,
-                128,
-                256,
-                512,
-                1024,
-                1280,
-                1518,
-                2048,
-                5000,
-                9000]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 
+ 2048, 5000, 9000]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
-                + \
-                " -- -i --txqflags=0xf00 --disable-hw-vlan-filter --max-pkt-len 9600"
+                + " -- -i --txqflags=0xf00 " \
+                + "--disable-hw-vlan-filter --max-pkt-len 9600"
         else:
             self.jumbo = 0
-            self.frame_sizes = [68, 128, 256, 512, 1024, 1280, 1518]
+            self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]
             self.vm_testpmd = "./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 3" \
                 + " -- -i --txqflags=0xf00 --disable-hw-vlan-filter"
         self.dut.send_expect("rm -rf ./vhost.out", "#")
 
         self.launch_vhost_sample()
 
-        print "Start VM with 2virtio\n"
         # start VM with 2virtio
         self.start_onevm()
 
@@ -146,15 +146,14 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         time.sleep(30)
         try:
             print "Launch vhost sample\n"
-            out = self.dut.send_expect(
-                "cat ./vhost.out",
-                "VHOST_CONFIG: bind to vhost-net",
-                20)
+            self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+            fp = open('./vhost.out', 'r')
+            out = fp.read()
+            fp.close()
             if "Error" in out:
                 raise Exception("Launch vhost sample failed")
         except Exception as e:
             print dts.RED("Failed to launch vhost sample: %s" % str(e))
-            self.dut.send_expect("rm -rf ./vhost-net", "#", 20)
Why remove this line? We need remove the module and ensure next time the app can be launched successfully, when exception happened, the sample will not remove the module. 
 
     def start_onevm(self):
         #
@@ -172,7 +171,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm.set_vm_device(**vm_params)
 
         try:
-            self.vm_dut = self.vm.start(auto_portmap=False)
+            self.vm_dut = self.vm.start()
             if self.vm_dut is None:
                 raise Exception("Set up VM ENV failed")
         except Exception as e:
@@ -267,23 +266,76 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             self.vm_dut.send_expect("ip route show", "#")
             print self.vm_dut.send_expect("arp -a", "#")
 
+    def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):
+        time.sleep(delay)
+        recvbpsRate = 0
+        recvRate = 0
+        txbpsRate = 0
+        txRate = 0
+        for port in tx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesSent', '%', 10)
+            txRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mpps" % (port, (txRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsSent', '%', 10)
+            txbpsRate += int(out.strip())
+            self.logger.info("Port %s: TX %f Mbps" % (port, (txbpsRate * 1.0 / 1000000)))
+        for port in rx_port_list:
+            self.stat_get_rate_stat_all_stats(port)
+            out = self.send_expect('stat cget -framesReceived', '%', 10)
+            recvRate += int(out.strip())
+            out = self.send_expect('stat cget -oversize', '%', 10)
+            recvRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mpps" % (port, (recvRate * 1.0 / 1000000)))
+            out = self.send_expect('stat cget -bitsReceived', '%', 10)
+            recvbpsRate += int(out.strip())
+            self.logger.info("Port %s: RX %f Mbps" % (port, 
+ (recvbpsRate * 1.0 / 1000000)))
+

+        return (txRate,recvRate)
+
+    def send_verify(self, case, frame_sizes, vlan_id1=0):
+        dts.results_table_add_header(self.header_row)
+        for frame_size in frame_sizes:
+            info = "Running test %s, and %d frame size.\n" % (case, frame_size)
+            self.logger.info(info)
+            payload = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
+            flow = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
+                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload)
+            self.tester.scapy_append('wrpcap("flow.pcap", %s)' % flow)
+            self.tester.scapy_execute()
+
+            tgenInput = []
+            port = self.tester.get_local_port(self.pf)
+            tgenInput.append((port, port, "flow.pcap"))
+
+            recvpkt, sendpkt = self.tester.traffic_generator_throughput(
+                tgenInput, delay=15)
+            recvpkt /= 1000000.0
+            sendpkt /= 1000000.0
+            pct = sendpkt * 100 / recvpkt
+            data_row = [frame_size, str(recvpkt), str(sendpkt), 
+ str(pct)]

+            dts.results_table_add_row(data_row)
+        dts.results_table_print()
+
     def test_perf_user_one_vm_legacy_fwd(self):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
         # Restore the virtio interfaces to use legacy driver
         self.vm_dut.restore_interfaces()
-
         self.set_legacy_disablefw()
         # Set the legacy fwd rules then get the VLAN id from vhost sample
         # output
         self.set_onevm_legacy_fwd()
-
         time.sleep(5)
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -297,41 +349,7 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
             vlan_id2 = l2[0]
             print "vlan_id2 is ", vlan_id2
 
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
-
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop the Vhost sample
         self.dut.send_expect("killall -s INT vhost-switch", "#", 20)
 
@@ -339,16 +357,18 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         #
         # Test the performance of one vm with 2virtio devices in legacy fwd
         #
-
         # start testpmd on VM
         self.vm_testpmd_start()
         time.sleep(5)
         # Clean the output to ensure the commands cat ./vhost.out can be sent
         # and got answered correctly.
-        out_clean = self.dut.get_session_output(timeout=2)
-        out = self.dut.send_expect("cat ./vhost.out", "# ", 20)
+        self.dut.get_session_output(timeout=2)
+        self.dut.session.copy_file_from("/root/dpdk/vhost.out")
+        fp = open('./vhost.out', 'r')
+        out = fp.read()
+        fp.close()
         # Get the VLAN ID for virtio
-        print out, "\ncheck the vlan info: \n"
+        print "Check the vlan info: \n"
         l1 = re.findall(
             'MAC_ADDRESS.*?%s.*?and.*?VLAN_TAG.*?(\d+).*?registered' %
             (str(self.virtio1_mac)), out) @@ -361,43 +381,9 @@ class TestVhostSample(TestCase, IxiaPacketGenerator):
         if len(l2) > 0:
             vlan_id2 = l2[0]
             print vlan_id2
-
-        dts.results_table_add_header(self.header_row)
-
-        # Create pcap file and ixia traffic
-        for frame_size in self.frame_sizes:
-            info = "Running test %s, and %d frame size.\n" % (
-                self.running_case, frame_size)
-            self.logger.info(info)
-
-            payload_size = frame_size - HEADER_SIZE['eth'] - HEADER_SIZE['ip']
-            flow1 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio1_mac, vlan_id1, self.src1, self.dst1, payload_size)
-            flow2 = '[Ether(dst="%s")/Dot1Q(vlan=%s)/IP(src="%s",dst="%s")/("X"*%d)]' % (
-                self.virtio2_mac, vlan_id2, self.src2, self.dst2, payload_size)
-            self.tester.scapy_append('wrpcap("flow1.pcap", %s)' % flow1)
-            self.tester.scapy_append('wrpcap("flow2.pcap",%s)' % flow2)
-            self.tester.scapy_execute()
-
-        # Capture the performance
-            tgenInput = []
-            port = self.tester.get_local_port(self.pf)
-            tgenInput.append((port, port, "flow1.pcap"))
-            tgenInput.append((port, port, "flow2.pcap"))
-
-            _, pps = self.tester.traffic_generator_throughput(
-                tgenInput, delay=15)
-            pps /= 1000000.0
-            linerate = self.wirespeed(self.nic, frame_size, 1)
-            pct = pps * 100 / linerate
-            scenario = self.running_case
-            mode = "vhost user"
-            data_row = [scenario, mode, frame_size, str(pps), str(pct)]
-            dts.results_table_add_row(data_row)
-
-        dts.results_table_print()
+        self.send_verify(self.running_case, self.frame_sizes, vlan_id1)
         # Stop testpmd
-        print self.vm_dut.send_expect("stop", "testpmd>")
+        self.vm_dut.send_expect("stop", "testpmd>")
         time.sleep(1)
         self.vm_dut.send_expect("quit", "# ")
 
--
2.1.0

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

end of thread, other threads:[~2016-01-22  8:48 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-21  6:42 [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Jingguo Fu
2016-01-21  6:42 ` [dts] [DTS][PATCH 2/3] virtio: update vhost user cases Jingguo Fu
2016-01-21  7:58   ` Xu, Qian Q
2016-01-21  9:03     ` Fu, JingguoX
2016-01-22  1:55       ` Xu, Qian Q
2016-01-22  2:33         ` Fu, JingguoX
2016-01-22  8:46         ` Fu, JingguoX
2016-01-21  6:42 ` [dts] [DTS][PATCH 3/3] virtio: update vhost cuse and user one vm cases Jingguo Fu
2016-01-21  8:03 ` [dts] [DTS][PATCH 1/3] virtio: update vhost cuse cases Xu, Qian Q

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