From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id E7B3A8E83 for ; Tue, 29 Dec 2015 05:03:38 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 28 Dec 2015 20:03:37 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,493,1444719600"; d="scan'208";a="882612602" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga002.fm.intel.com with ESMTP; 28 Dec 2015 20:03:37 -0800 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id tBT43ZdC008082; Tue, 29 Dec 2015 12:03:35 +0800 Received: from shecgisg003.sh.intel.com (localhost [127.0.0.1]) by shecgisg003.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id tBT43W7W001529; Tue, 29 Dec 2015 12:03:35 +0800 Received: (from ypei@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id tBT43Wm1001525; Tue, 29 Dec 2015 12:03:32 +0800 From: Yulong Pei To: dts@dpdk.org Date: Tue, 29 Dec 2015 12:03:29 +0800 Message-Id: <1451361809-1494-1-git-send-email-yulong.pei@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dts] [PATCH] add vf reset test case X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Dec 2015 04:03:39 -0000 Signed-off-by: Yulong Pei --- 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