test suite reviews and discussions
 help / color / mirror / Atom feed
From: Yulong Pei <yulong.pei@intel.com>
To: dts@dpdk.org
Subject: [dts] [PATCH] add vf reset test case
Date: Tue, 29 Dec 2015 12:03:29 +0800	[thread overview]
Message-ID: <1451361809-1494-1-git-send-email-yulong.pei@intel.com> (raw)

Signed-off-by: Yulong Pei <yulong.pei@intel.com>
---
 conf/vf_packet_rxtx.cfg                 |  19 ++++
 test_plans/vf_packet_rxtx_test_plan.rst |  72 ++++++++++++++
 tests/TestSuite_vf_packet_rxtx.py       | 160 +++++++++++++++++++++++++++++++-
 3 files changed, 248 insertions(+), 3 deletions(-)

diff --git a/conf/vf_packet_rxtx.cfg b/conf/vf_packet_rxtx.cfg
index 986d289..20db90c 100644
--- a/conf/vf_packet_rxtx.cfg
+++ b/conf/vf_packet_rxtx.cfg
@@ -103,3 +103,22 @@ vnc =
     displayNum=1;
 daemon =
     enable=yes;
+
+[vm1]
+cpu =
+    model=host,number=4,cpupin=9 10 11 12;
+disk =
+    file=/home/image/sriov-fc20-2.img;
+login =
+    user=root,password=tester;
+net =
+   type=nic,opt_vlan=1;
+   type=user,opt_vlan=1;
+monitor =
+    port=;
+qga =
+    enable=yes;
+vnc =
+    displayNum=2;
+daemon =
+    enable=yes;
diff --git a/test_plans/vf_packet_rxtx_test_plan.rst b/test_plans/vf_packet_rxtx_test_plan.rst
index f9ea736..6a70e20 100644
--- a/test_plans/vf_packet_rxtx_test_plan.rst
+++ b/test_plans/vf_packet_rxtx_test_plan.rst
@@ -98,3 +98,75 @@ testpmd> start
 
 6. get mac address of one VF and use it as dest mac, using scapy to send 2000 random packets from tester,
 verify the packets can be received by one VF and can be forward to another VF correctly.
+
+Test Case 2: VF reset test
+==============================================
+
+1. got the pci device id of DUT, for example,
+
+./dpdk_nic_bind.py --st
+
+0000:81:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f0 drv=i40e unused=
+0000:81:00.1 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f1 drv=i40e unused=
+
+2. create 3 VFs from 1 PF,
+
+echo 3 > /sys/bus/pci/devices/0000\:81\:00.0/sriov_numvfs
+./dpdk_nic_bind.py --st
+
+0000:81:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f0 drv=i40e unused=igb_uio
+0000:81:00.1 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f1 drv=i40e unused=igb_uio
+0000:81:02.0 'XL710/X710 Virtual Function' unused=
+0000:81:02.1 'XL710/X710 Virtual Function' unused=
+0000:81:02.2 'XL710/X710 Virtual Function' unused=
+
+3. detach VFs from the host, bind them to pci-stub driver,
+
+virsh nodedev-detach pci_0000_81_02_0;
+virsh nodedev-detach pci_0000_81_02_1;
+virsh nodedev-detach pci_0000_81_02_2;
+
+./dpdk_nic_bind.py --st
+
+0000:81:02.0 'XL710/X710 Virtual Function' if= drv=pci-stub unused=igb_uio
+0000:81:02.1 'XL710/X710 Virtual Function' if= drv=pci-stub unused=igb_uio
+0000:81:02.2 'XL710/X710 Virtual Function' if= drv=pci-stub unused=igb_uio
+
+4. passthrough VFs 81:02.0 & 81:02.1 to vm0, passthrough VF 81:02.2 to vm1, start vm0 & vm1
+
+/usr/bin/qemu-system-x86_64  -name vm0 -enable-kvm \
+-cpu host -smp 4 -m 2048 -drive file=/home/image/sriov-fc20-1.img -vnc :1 \
+-device pci-assign,host=81:02.0,id=pt_0 \
+-device pci-assign,host=81:02.1,id=pt_1
+ 
+/usr/bin/qemu-system-x86_64  -name vm1 -enable-kvm \
+-cpu host -smp 4 -m 2048 -drive file=/home/image/sriov-fc20-1.img -vnc :1 \
+-device pci-assign,host=81:02.2,id=pt_0 \
+
+5. login vm0, got VFs pci device id in vm0, assume they are 00:06.0 & 00:07.0, bind them to igb_uio driver,
+and then start testpmd, set it in mac forward mode,
+
+./tools/dpdk_nic_bind.py --bind=igb_uio 00:06.0 00:07.0
+./x86_64-native-linuxapp-gcc/app/testpmd -c 0x0f -n 4 -w 00:06.0 -w 00:07.0 -- -i --portmask=0x3 --txqflags=0
+
+testpmd> set fwd mac
+testpmd> start
+
+on tester, use scapy, sending packets to vf0 in vm0 in infinite loop.
+
+6. login vm1, got VF pci device id in vm1, assume it is 00:06.0, bind them to igb_uio driver, start testpmd,
+
+./tools/dpdk_nic_bind.py --bind=igb_uio 00:06.0
+./x86_64-native-linuxapp-gcc/app/testpmd -c 0x0f -n 4 -w 00:06.0 -- -i --portmask=0x1 --txqflags=0
+
+in testpmd, run vf port stop/start 1000 times to trigger vf reset 1000 times,
+
+testpmd> port stop all
+testpmd> port start all
+
+7. on tester, kill scapy to stop sending packets to vf0 in vm0, then check the following stats of 
+vf0 and vf1 in vm0 to make sure it is correct,
+
+vf0_stats, RX-packets != 0, RX-errors == 0
+vf1_stats, TX-packets != 0, TX-errors == 0
+vf0-RX-packets == vf1-TX-packets
diff --git a/tests/TestSuite_vf_packet_rxtx.py b/tests/TestSuite_vf_packet_rxtx.py
index 19bc331..9c150b2 100644
--- a/tests/TestSuite_vf_packet_rxtx.py
+++ b/tests/TestSuite_vf_packet_rxtx.py
@@ -18,10 +18,12 @@ class TestVfPacketRxtx(TestCase):
         self.dut_ports = self.dut.get_ports(self.nic)
         self.verify(len(self.dut_ports) > 1, "Insufficient ports")
         self.vm0 = None
+        self.vm1 = None
 
     def set_up(self):
 
         self.setup_2pf_2vf_1vm_env_flag = 0
+        self.setup_3vf_2vm_env_flag = 0
 
     def setup_2pf_2vf_1vm_env(self, driver='default'):
 
@@ -98,16 +100,14 @@ class TestVfPacketRxtx(TestCase):
 
         self.setup_2pf_2vf_1vm_env_flag = 0
 
-######1. test case for kernel pf and dpdk vf 2pf_2vf_1vm scenario
+######1. test case for kernel pf and dpdk vf 2pf_2vf_1vm scenario packet rx tx.
 
     def test_kernel_2pf_2vf_1vm(self):
 
         self.setup_2pf_2vf_1vm_env(driver='')
 
         self.vm0_dut_ports = self.vm_dut_0.get_ports('any')
-
         port_id_0 = 0
-
         self.vm0_testpmd = PmdOutput(self.vm_dut_0)
         self.vm0_testpmd.start_testpmd(VM_CORES_MASK)
         self.vm0_testpmd.execute_cmd('show port info all')
@@ -130,16 +130,170 @@ class TestVfPacketRxtx(TestCase):
         result = self.tester.check_random_pkts(tgen_ports, allow_miss=False, params=pkt_param)
         self.verify(result != False, "VF0 failed to forward packets to VF1")
 
+    def setup_3vf_2vm_env(self, driver='default'):
+
+        self.used_dut_port = self.dut_ports[0]
+        self.dut.generate_sriov_vfs_by_port(self.used_dut_port, 3, driver=driver)
+        self.sriov_vfs_port = self.dut.ports_info[self.used_dut_port]['vfs_port']
+
+        try:
+
+            for port in self.sriov_vfs_port:
+                print port.pci
+                port.bind_driver('pci-stub')
+
+            time.sleep(1)
+            vf0_prop = {'opt_host': self.sriov_vfs_port[0].pci}
+            vf1_prop = {'opt_host': self.sriov_vfs_port[1].pci}
+            vf2_prop = {'opt_host': self.sriov_vfs_port[2].pci}
+
+            for port_id in self.dut_ports:
+                if port_id == self.used_dut_port:
+                    continue
+                port = self.dut.ports_info[port_id]['port']
+                port.bind_driver()
+
+            if driver == 'igb_uio':
+                self.host_testpmd = PmdOutput(self.dut)
+                eal_param = '-b %(vf0)s -b %(vf1)s -b %(vf2)s' % {'vf0': self.sriov_vfs_port[0].pci,
+                                                                  'vf1': self.sriov_vfs_port[1].pci,
+                                                                  'vf2': self.sriov_vfs_port[2].pci}
+                self.host_testpmd.start_testpmd("1S/2C/2T", eal_param=eal_param)
+
+            # set up VM0 ENV
+            self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_packet_rxtx')
+            self.vm0.set_vm_device(driver='pci-assign', **vf0_prop)
+            self.vm0.set_vm_device(driver='pci-assign', **vf1_prop)
+            self.vm_dut_0 = self.vm0.start()
+            if self.vm_dut_0 is None:
+                raise Exception("Set up VM0 ENV failed!")
+            # set up VM1 ENV
+            self.vm1 = QEMUKvm(self.dut, 'vm1', 'vf_packet_rxtx')
+            self.vm1.set_vm_device(driver='pci-assign', **vf2_prop)
+            self.vm_dut_1 = self.vm1.start()
+            if self.vm_dut_1 is None:
+                raise Exception("Set up VM1 ENV failed!")
+
+            self.setup_3vf_2vm_env_flag = 1
+        except Exception as e:
+            self.destroy_3vf_2vm_env()
+            raise Exception(e)
+
+    def destroy_3vf_2vm_env(self):
+        if getattr(self, 'vm0', None):
+            self.vm0_testpmd.execute_cmd('stop')
+            self.vm0_testpmd.execute_cmd('quit', '# ')
+            self.vm0_testpmd = None
+            self.vm0_dut_ports = None
+            self.vm_dut_0 = None
+            self.vm0.stop()
+            self.vm0 = None
+
+        if getattr(self, 'vm1', None):
+            self.vm1_testpmd.execute_cmd('stop')
+            self.vm1_testpmd.execute_cmd('quit', '# ')
+            self.vm1_testpmd = None
+            self.vm1_dut_ports = None
+            self.vm_dut_1 = None
+            self.vm1.stop()
+            self.vm1 = None
+
+        if getattr(self, 'host_testpmd', None):
+            self.host_testpmd.execute_cmd('quit', '# ')
+            self.host_testpmd = None
+
+        if getattr(self, 'used_dut_port', None):
+            self.dut.destroy_sriov_vfs_by_port(self.used_dut_port)
+            port = self.dut.ports_info[self.used_dut_port]['port']
+            port.bind_driver()
+            self.used_dut_port = None
+
+        for port_id in self.dut_ports:
+            port = self.dut.ports_info[port_id]['port']
+            port.bind_driver()
+
+        self.setup_3vf_2vm_env_flag = 0
+
+    def test_vf_reset(self):
+
+        self.setup_3vf_2vm_env(driver='')
+
+        self.vm0_dut_ports = self.vm_dut_0.get_ports('any')
+        self.vm1_dut_ports = self.vm_dut_1.get_ports('any')
+
+        port_id_0 = 0
+        port_id_1 = 1
+
+        self.vm0_testpmd = PmdOutput(self.vm_dut_0)
+        self.vm0_testpmd.start_testpmd(VM_CORES_MASK)
+        self.vm0_testpmd.execute_cmd('show port info all')
+        pmd0_vf0_mac = self.vm0_testpmd.get_port_mac(port_id_0)
+        self.vm0_testpmd.execute_cmd('set fwd mac')
+        self.vm0_testpmd.execute_cmd('start')
+
+        time.sleep(2)
+
+        self.vm1_testpmd = PmdOutput(self.vm_dut_1)
+        self.vm1_testpmd.start_testpmd(VM_CORES_MASK)
+        self.vm1_testpmd.execute_cmd('show port info all')
+
+        tx_port = self.tester.get_local_port(self.dut_ports[0])
+        rx_port = tx_port
+
+        dst_mac = pmd0_vf0_mac
+        src_mac = self.tester.get_mac(tx_port)
+
+        itf = self.tester.get_interface(tx_port)
+
+        self.tester.send_expect("echo '#!/usr/bin/python' > send_pkt_loop.py", "# ")
+        self.tester.send_expect("echo 'from scapy.all import *' >> send_pkt_loop.py", "# ")
+        cmd = 'sendp([Ether(dst="%s", src="%s")/IP(len=46)], iface="%s", loop=1)' % (dst_mac, src_mac, itf)
+        self.tester.send_expect("echo '%s' >> send_pkt_loop.py" % cmd, "# ")
+        self.tester.send_expect("chmod +x send_pkt_loop.py", "# ")
+        self.tester.send_expect("cat send_pkt_loop.py", "# ")
+        self.tester.send_expect("./send_pkt_loop.py &", "# ")
+
+        #vf port stop/start can trigger reset action
+        for num in range(10):
+            self.vm1_testpmd.execute_cmd('port stop all')
+            time.sleep(0.1)
+            self.vm1_testpmd.execute_cmd('port start all')
+            time.sleep(0.1)
+
+        self.tester.send_expect("killall send_pkt_loop.py", "# ")
+
+        pmd0_vf0_stats = self.vm0_testpmd.get_pmd_stats(port_id_0)
+        pmd0_vf1_stats = self.vm0_testpmd.get_pmd_stats(port_id_1)
+
+        vf0_rx_cnt = pmd0_vf0_stats['RX-packets']
+        self.verify(vf0_rx_cnt != 0, "no packet was received by vm0_VF0")
+    
+        vf0_rx_err = pmd0_vf0_stats['RX-errors']
+        self.verify(vf0_rx_err == 0, "vm0_VF0 rx-errors")
+    
+        vf1_tx_cnt = pmd0_vf1_stats['TX-packets']
+        self.verify(vf1_tx_cnt != 0, "no packet was transmitted by vm0_VF1")
+
+        vf1_tx_err = pmd0_vf1_stats['TX-errors']
+        self.verify(vf1_tx_err == 0, "vm0_VF0 tx-errors")
+
+        self.verify(vf0_rx_cnt == vf1_tx_cnt, "vm0_VF0 failed to forward packets to vm0_VF1 when reset vm1_VF0 frequently")
+
     def tear_down(self):
 
         if self.setup_2pf_2vf_1vm_env_flag == 1:
             self.destroy_2pf_2vf_1vm_env()
+        if self.setup_3vf_2vm_env_flag == 1:
+            self.destroy_3vf_2vm_env()
 
     def tear_down_all(self):
 
         if getattr(self, 'vm0', None):
             self.vm0.stop()
 
+        if getattr(self, 'vm1', None):
+            self.vm1.stop()
+
         for port_id in self.dut_ports:
             self.dut.destroy_sriov_vfs_by_port(port_id)
 
-- 
2.1.0

             reply	other threads:[~2015-12-29  4:03 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-29  4:03 Yulong Pei [this message]
2016-01-06  1:51 ` Liu, Yong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1451361809-1494-1-git-send-email-yulong.pei@intel.com \
    --to=yulong.pei@intel.com \
    --cc=dts@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).