From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 39772567A for ; Mon, 11 Jan 2016 03:49:17 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP; 10 Jan 2016 18:49:16 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,550,1444719600"; d="scan'208";a="878694150" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga001.fm.intel.com with ESMTP; 10 Jan 2016 18:49:16 -0800 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id u0B2nDfx022625; Mon, 11 Jan 2016 10:49:13 +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 u0B2nAVF006994; Mon, 11 Jan 2016 10:49:12 +0800 Received: (from qxu10@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id u0B2nARG006990; Mon, 11 Jan 2016 10:49:10 +0800 From: Qian Xu To: dts@dpdk.org Date: Mon, 11 Jan 2016 10:49:09 +0800 Message-Id: <1452480549-6958-1-git-send-email-qian.q.xu@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dts] [PATCH v2] add vf mac filter test automation script and plan 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: Mon, 11 Jan 2016 02:49:18 -0000 This patch will add vf test plan,script and config file. VF MAC filter test case is as below: 1. Kernel PF using ip link set command to set VF MAC address, then check mac filter works or not. Also check negative case that sending packets with wrong MAC to ensure mac filter works. 2. Kernel PF will not set MAC address for VF, VF MAC address is randomly generated. Sending packets to the VF mac address to ensure mac filter works. Also using mac_addr add command in testpmd to add a new mac address, then check if the packets with this new mac address can be RX/TX. Also check traffic with wrong MAC address will not be RXed. Signed-off-by: Qian Xu diff --git a/conf/vf_macfilter.cfg b/conf/vf_macfilter.cfg new file mode 100644 index 0000000..856b712 --- /dev/null +++ b/conf/vf_macfilter.cfg @@ -0,0 +1,105 @@ +# QEMU options +# name +# name: vm0 +# +# enable_kvm +# enable: [yes | no] +# +# cpu +# model: [host | core2duo | ...] +# usage: +# choose model value from the command +# qemu-system-x86_64 -cpu help +# number: '4' #number of vcpus +# cpupin: '3 4 5 6' # host cpu list +# +# mem +# size: 1024 +# +# disk +# file: /path/to/image/test.img +# +# net +# type: [nic | user | tap | bridge | ...] +# nic +# opt_vlan: 0 +# note: Default is 0. +# opt_macaddr: 00:00:00:00:01:01 +# note: if creating a nic, it`s better to specify a MAC, +# else it will get a random number. +# opt_model:["e1000" | "virtio" | "i82551" | ...] +# note: Default is e1000. +# opt_name: 'nic1' +# opt_addr: '' +# note: PCI cards only. +# opt_vectors: +# note: This option currently only affects virtio cards. +# user +# opt_vlan: 0 +# note: default is 0. +# opt_hostfwd: [tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport +# note: If not specified, it will be setted automatically. +# tap +# opt_vlan: 0 +# note: default is 0. +# opt_br: br0 +# note: if choosing tap, need to specify bridge name, +# else it will be br0. +# opt_script: QEMU_IFUP_PATH +# note: if not specified, default is self.QEMU_IFUP_PATH. +# opt_downscript: QEMU_IFDOWN_PATH +# note: if not specified, default is self.QEMU_IFDOWN_PATH. +# +# device +# driver: [pci-assign | virtio-net-pci | ...] +# pci-assign +# prop_host: 08:00.0 +# prop_addr: 00:00:00:00:01:02 +# virtio-net-pci +# prop_netdev: mynet1 +# prop_id: net1 +# prop_mac: 00:00:00:00:01:03 +# prop_bus: pci.0 +# prop_addr: 0x3 +# +# monitor +# port: 6061 +# note: if adding monitor to vm, need to specicy +# this port, else it will get a free port +# on the host machine. +# +# qga +# enable: [yes | no] +# +# serial_port +# enable: [yes | no] +# +# vnc +# displayNum: 1 +# note: you can choose a number not used on the host. +# +# daemon +# enable: 'yes' +# note: +# By default VM will start with the daemonize status. +# Not support starting it on the stdin now. + +# vm configuration for pmd sriov case +[vm0] +cpu = + model=host,number=4,cpupin=5 6 7 8; +disk = + file=/home/img/sriov-fc20-1.img; +login = + user=root,password=tester; +net = + type=nic,opt_vlan=0; + type=user,opt_vlan=0; +monitor = + port=; +qga = + enable=yes; +vnc = + displayNum=1; +daemon = + enable=yes; diff --git a/test_plans/vf_macfilter_test_plan.rst b/test_plans/vf_macfilter_test_plan.rst new file mode 100644 index 0000000..7a95d2b --- /dev/null +++ b/test_plans/vf_macfilter_test_plan.rst @@ -0,0 +1,194 @@ +.. Copyright (c) <2015>, Intel Corporation + 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. + + +Test Case 1: test_kernel_2pf_2vf_1vm_iplink_macfilter +===================================================== + +1. Get 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 2 VFs from 2 PFs, and set the VF MAC address at PF0:: + +echo 1 > /sys/bus/pci/devices/0000\:81\:00.0/sriov_numvfs +echo 1 > /sys/bus/pci/devices/0000\:81\:00.1/sriov_numvfs + +./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= +0000:81:02.0 'XL710/X710 Virtual Function' unused= +0000:81:0a.0 'XL710/X710 Virtual Function' unused= + +ip link set ens259f0 vf 0 mac 00:11:22:33:44:55 + +3. Detach VFs from the host, bind them to pci-stub driver:: + +/sbin/modprobe pci-stub + +using `lspci -nn|grep -i ethernet` got VF device id, for example "8086 154c", + +echo "8086 154c" > /sys/bus/pci/drivers/pci-stub/new_id +echo 0000:81:02.0 > /sys/bus/pci/devices/0000:08:02.0/driver/unbind +echo 0000:81:02.0 > /sys/bus/pci/drivers/pci-stub/bind + +echo "8086 154c" > /sys/bus/pci/drivers/pci-stub/new_id +echo 0000:81:0a.0 > /sys/bus/pci/devices/0000:08:0a.0/driver/unbind +echo 0000:81:0a.0 > /sys/bus/pci/drivers/pci-stub/bind + +or using the following more easy way, + +virsh nodedev-detach pci_0000_81_02_0; +virsh nodedev-detach pci_0000_81_0a_0; + +./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= +0000:81:02.0 'XL710/X710 Virtual Function' if= drv=pci-stub unused= +0000:81:0a.0 'XL710/X710 Virtual Function' if= drv=pci-stub unused= + +it can be seen that VFs 81:02.0 & 81:0a.0 's driver is pci-stub. + +4. Passthrough VFs 81:02.0 & 81:0a.0 to vm0, and start vm0:: + +/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:0a.0,id=pt_1 + +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, enable CRC strip, disable promisc mode,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> port stop all +testpmd> port config all crc-strip on +testpmd> port start all +testpmd> set promisc all off +testpmd> set fwd mac +testpmd> start + +6. Use scapy to send 100 random packets with ip link set MAC to VF, verify the packets can be received by one +VF and can be forward to another VF correctly. + +7. Also use scapy to send 100 random packets with a wrong MAC to VF, verify the packets can't be received by one +VF and can be forward to another VF correctly. + +Test Case 2: test_kernel_2pf_2vf_1vm_mac_add_filter +=================================================== + +1. Get 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 2 VFs from 2 PFs, and don't set the VF MAC address at PF0:: + +echo 1 > /sys/bus/pci/devices/0000\:81\:00.0/sriov_numvfs +echo 1 > /sys/bus/pci/devices/0000\:81\:00.1/sriov_numvfs + +./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= +0000:81:02.0 'XL710/X710 Virtual Function' unused= +0000:81:0a.0 'XL710/X710 Virtual Function' unused= + +3. Detach VFs from the host, bind them to pci-stub driver:: + +/sbin/modprobe pci-stub + +using `lspci -nn|grep -i ethernet` to get VF device id, for example "8086 154c", + +echo "8086 154c" > /sys/bus/pci/drivers/pci-stub/new_id +echo 0000:81:02.0 > /sys/bus/pci/devices/0000:08:02.0/driver/unbind +echo 0000:81:02.0 > /sys/bus/pci/drivers/pci-stub/bind + +echo "8086 154c" > /sys/bus/pci/drivers/pci-stub/new_id +echo 0000:81:0a.0 > /sys/bus/pci/devices/0000:08:0a.0/driver/unbind +echo 0000:81:0a.0 > /sys/bus/pci/drivers/pci-stub/bind + +or using the following more easy way, + +virsh nodedev-detach pci_0000_81_02_0; +virsh nodedev-detach pci_0000_81_0a_0; + +./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= +0000:81:02.0 'XL710/X710 Virtual Function' if= drv=pci-stub unused= +0000:81:0a.0 'XL710/X710 Virtual Function' if= drv=pci-stub unused= + +it can be seen that VFs 81:02.0 & 81:0a.0 's driver is pci-stub. + +4. Passthrough VFs 81:02.0 & 81:0a.0 to vm0, and start vm0:: + +/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:0a.0,id=pt_1 + +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, enable CRC strip on VF, disable promisc mode, add a new MAC to VF0 and then start:: + +./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> port stop all +testpmd> port config all crc-strip on +testpmd> port start all +testpmd> set promisc all off +testpmd> mac_addr add 0 00:11:22:33:44:55 +testpmd> set fwd mac +testpmd> start + +Note: In Jan,2016, i40e doesn't support mac_addr add operation, so the case will be failed for FVL/Fort park NICs. + +6. Use scapy to send 100 random packets with current VF0's MAC, verify the packets can be received by one +VF and can be forward to another VF correctly. + +7. Use scapy to send 100 random packets with new added VF0's MAC, verify the packets can be received by one +VF and can be forward to another VF correctly. + +8. Use scapy to send 100 random packets with a wrong MAC to VF0, verify the packets can't be received by one +VF and can be forward to another VF correctly. + + + + diff --git a/tests/TestSuite_vf_macfilter.py b/tests/TestSuite_vf_macfilter.py new file mode 100644 index 0000000..1f7fbfb --- /dev/null +++ b/tests/TestSuite_vf_macfilter.py @@ -0,0 +1,224 @@ +# + +import re +import time + +import dts +from qemu_kvm import QEMUKvm +from test_case import TestCase +from pmd_output import PmdOutput + +VM_CORES_MASK = 'all' + + +class TestVfMacFilter(TestCase): + + def set_up_all(self): + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) > 1, "Insufficient ports") + self.vm0 = None + self.pf0_vf0_mac = "00:12:34:56:78:01" + self.iplinkset = True + + def set_up(self): + + self.setup_2pf_2vf_1vm_env_flag = 0 + + def setup_2pf_2vf_1vm_env(self, driver='default'): + + self.used_dut_port_0 = self.dut_ports[0] + self.dut.generate_sriov_vfs_by_port(self.used_dut_port_0, 1, driver=driver) + self.sriov_vfs_port_0 = self.dut.ports_info[self.used_dut_port_0]['vfs_port'] + pf_intf0 = self.dut.ports_info[0]['port'].get_interface_name() + + if self.iplinkset: + self.dut.send_expect("ip link set %s vf 0 mac %s" %(pf_intf0, self.pf0_vf0_mac), "#") + + self.used_dut_port_1 = self.dut_ports[1] + self.dut.generate_sriov_vfs_by_port(self.used_dut_port_1, 1, driver=driver) + self.sriov_vfs_port_1 = self.dut.ports_info[self.used_dut_port_1]['vfs_port'] + + + try: + + for port in self.sriov_vfs_port_0: + port.bind_driver('pci-stub') + + for port in self.sriov_vfs_port_1: + port.bind_driver('pci-stub') + + time.sleep(1) + vf0_prop = {'opt_host': self.sriov_vfs_port_0[0].pci} + vf1_prop = {'opt_host': self.sriov_vfs_port_1[0].pci} + + if driver == 'igb_uio': + # start testpmd without the two VFs on the host + self.host_testpmd = PmdOutput(self.dut) + eal_param = '-b %(vf0)s -b %(vf1)s' % {'vf0': self.sriov_vfs_port_0[0].pci, + 'vf1': self.sriov_vfs_port_1[0].pci} + self.host_testpmd.start_testpmd("1S/2C/2T", eal_param=eal_param) + + # set up VM0 ENV + self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_macfilter') + 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!") + + self.setup_2pf_2vf_1vm_env_flag = 1 + except Exception as e: + self.destroy_2pf_2vf_1vm_env() + raise Exception(e) + + def destroy_2pf_2vf_1vm_env(self): + if getattr(self, 'vm0', None): + #destroy testpmd in vm0 + self.vm0_testpmd.execute_cmd('stop') + self.vm0_testpmd.execute_cmd('quit', '# ') + self.vm0_testpmd = None + self.vm0_dut_ports = None + #destroy vm0 + self.vm0.stop() + self.vm0 = None + + if getattr(self, 'host_testpmd', None): + self.host_testpmd.execute_cmd('quit', '# ') + self.host_testpmd = None + + if getattr(self, 'used_dut_port_0', None): + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_0) + port = self.dut.ports_info[self.used_dut_port_0]['port'] + port.bind_driver() + self.used_dut_port_0 = None + + if getattr(self, 'used_dut_port_1', None): + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_1) + port = self.dut.ports_info[self.used_dut_port_1]['port'] + port.bind_driver() + self.used_dut_port_1 = None + + for port_id in self.dut_ports: + port = self.dut.ports_info[port_id]['port'] + port.bind_driver() + + self.setup_2pf_2vf_1vm_env_flag = 0 + +######1. test case for kernel pf and dpdk vf 2pf_2vf_1vm MAC filter scenario +###### kernel pf will first run 'ip link set pf_interface vf 0 mac xx:xx:xx:xx:xx:xx, then +###### in the vm, send packets with this MAC to VF, check if the MAC filter works. Also +###### send the packets with wrong MAC address to VF, check if the VF will not RX the packets. + + def test_kernel_2pf_2vf_1vm_iplink_macfilter(self): + + self.setup_2pf_2vf_1vm_env(driver='') + + self.vm0_dut_ports = self.vm_dut_0.get_ports('any') + self.vm0_testpmd = PmdOutput(self.vm_dut_0) + self.vm0_testpmd.start_testpmd(VM_CORES_MASK) + # Get VF's MAC + pmd_vf0_mac = self.vm0_testpmd.get_port_mac(0) + vf0_wrongmac = "00:11:22:33:48:55" + self.vm0_testpmd.execute_cmd('port stop all') + self.vm0_testpmd.execute_cmd('port config all crc-strip on') + self.vm0_testpmd.execute_cmd('port start all') + self.vm0_testpmd.execute_cmd('set promisc all off') + self.vm0_testpmd.execute_cmd('set fwd mac') + self.vm0_testpmd.execute_cmd('start') + + time.sleep(2) + + tgen_ports = [] + tx_port = self.tester.get_local_port(self.dut_ports[0]) + rx_port = self.tester.get_local_port(self.dut_ports[1]) + tgen_ports.append((tx_port, rx_port)) + dst_mac = self.pf0_vf0_mac + src_mac = self.tester.get_mac(tx_port) + pkt_param=[("ether", {'dst': dst_mac, 'src': src_mac})] + + print "\nfirst send packets to the kernel PF set MAC, expected result is RX packets=TX packets\n" + result1 = self.tester.check_random_pkts(tgen_ports, pktnum=100, allow_miss=False, params=pkt_param) + print "\nshow port stats in testpmd for double check: \n", self.vm0_testpmd.execute_cmd('show port stats all') + self.verify(result1 != False, "VF0 failed to forward packets to VF1") + + print "\nSecondly, negative test, send packets to a wrong MAC, expected result is RX packets=0\n" + dst_mac = vf0_wrongmac + pkt_param=[("ether", {'dst': dst_mac, 'src': src_mac})] + result2 = self.tester.check_random_pkts(tgen_ports, pktnum=100, allow_miss=False, params=pkt_param) + print "\nshow port stats in testpmd for double check: \n", self.vm0_testpmd.execute_cmd('show port stats all') + self.verify(result2 != True, "VF0 failed to forward packets to VF1") + +#######2. test case for kernel pf and dpdk vf 2pf_2vf_1vm MAC filter scenario. +####### kernel pf will not set MAC address and the VF will get a random generated MAC +####### in the testpmd in VM, and then add VF mac address in the testpmd,for example, VF_MAC1 +####### then send packets to the VF with the random generated MAC and the new added VF_MAC1 +####### and the expected result is that all packets can be RXed and TXed. What's more, send +####### packets with a wrong MAC address to the VF will not received by the VF. + + def test_kernel_2pf_2vf_1vm_mac_add_filter(self): + + self.iplinkset = False + self.setup_2pf_2vf_1vm_env(driver='') + + self.vm0_dut_ports = self.vm_dut_0.get_ports('any') + self.vm0_testpmd = PmdOutput(self.vm_dut_0) + self.vm0_testpmd.start_testpmd(VM_CORES_MASK) + + # Get VF0 port MAC address + pmd_vf0_mac = self.vm0_testpmd.get_port_mac(0) + vf0_setmac = "00:11:22:33:44:55" + vf0_wrongmac = "00:11:22:33:48:55" + self.vm0_testpmd.execute_cmd('port stop all') + self.vm0_testpmd.execute_cmd('port config all crc-strip on') + self.vm0_testpmd.execute_cmd('port start all') + self.vm0_testpmd.execute_cmd('set promisc all off') + ret = self.vm0_testpmd.execute_cmd('mac_addr add 0 %s' %vf0_setmac) + # check the operation is supported or not. + print ret + + self.vm0_testpmd.execute_cmd('set fwd mac') + self.vm0_testpmd.execute_cmd('start') + + time.sleep(2) + + tgen_ports = [] + tx_port = self.tester.get_local_port(self.dut_ports[0]) + rx_port = self.tester.get_local_port(self.dut_ports[1]) + tgen_ports.append((tx_port, rx_port)) + src_mac = self.tester.get_mac(tx_port) + dst_mac = pmd_vf0_mac + pkt_param=[("ether", {'dst': dst_mac, 'src': src_mac})] + + print "\nfirst send packets to the random generated VF MAC, expected result is RX packets=TX packets\n" + result1 = self.tester.check_random_pkts(tgen_ports, pktnum=100, allow_miss=False, params=pkt_param) + print "\nshow port stats in testpmd for double check: \n", self.vm0_testpmd.execute_cmd('show port stats all') + self.verify(result1 != False, "VF0 failed to forward packets to VF1") + + print "\nsecondly, send packets to the new added MAC, expected result is RX packets=TX packets\n" + dst_mac = vf0_setmac + pkt_param=[("ether", {'dst': dst_mac, 'src': src_mac})] + result2 = self.tester.check_random_pkts(tgen_ports, pktnum=100, allow_miss=False, params=pkt_param) + print "\nshow port stats in testpmd for double check: \n", self.vm0_testpmd.execute_cmd('show port stats all') + self.verify(result2 != False, "VF0 failed to forward packets to VF1") + + print "\nThirdly, negative test, send packets to a wrong MAC, expected result is RX packets=0\n" + dst_mac = vf0_wrongmac + pkt_param=[("ether", {'dst': dst_mac, 'src': src_mac})] + result3 = self.tester.check_random_pkts(tgen_ports, pktnum=100, allow_miss=False, params=pkt_param) + print "\nshow port stats in testpmd for double check: \n", self.vm0_testpmd.execute_cmd('show port stats all') + self.verify(result3 != True, "VF0 failed to forward packets to VF1") + + + def tear_down(self): + + if self.setup_2pf_2vf_1vm_env_flag == 1: + self.destroy_2pf_2vf_1vm_env() + + def tear_down_all(self): + + if getattr(self, 'vm0', None): + self.vm0.stop() + + for port_id in self.dut_ports: + self.dut.destroy_sriov_vfs_by_port(port_id) + -- 2.1.0