From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 8DC3A5934 for ; Fri, 14 Oct 2016 16:41:21 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga101.jf.intel.com with ESMTP; 14 Oct 2016 07:41:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,493,1473145200"; d="scan'208";a="1070434392" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga002.fm.intel.com with ESMTP; 14 Oct 2016 07:41:19 -0700 Received: from fmsmsx152.amr.corp.intel.com (10.18.125.5) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 14 Oct 2016 07:41:15 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by FMSMSX152.amr.corp.intel.com (10.18.125.5) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 14 Oct 2016 07:41:14 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.139]) by shsmsx102.ccr.corp.intel.com ([169.254.2.206]) with mapi id 14.03.0248.002; Fri, 14 Oct 2016 22:40:07 +0800 From: "Liu, Yong" To: "Peng, Yuan" , "dts@dpdk.org" CC: "Peng, Yuan" Thread-Topic: [dts] [PATCH 1/2] tests add TestSuite_VEB.py Thread-Index: AQHSJiIKHU5fPt2unk6RUJDWNizSzqCn+7WA Date: Fri, 14 Oct 2016 14:40:07 +0000 Message-ID: <86228AFD5BCD8E4EBFD2B90117B5E81E60300ABC@SHSMSX103.ccr.corp.intel.com> References: <1476453052-19505-1-git-send-email-yuan.peng@intel.com> In-Reply-To: <1476453052-19505-1-git-send-email-yuan.peng@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMWIyYTk5Y2QtNGMxMi00ZWJmLTgxMGEtODBhYzVhZWU0MWI2IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IjhCRUludU1rRnN0cm1rek9BMW91cmw2TlwvRlhWcnlaOWNjS1hIZnM4V1lZPSJ9 x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dts] [PATCH 1/2] tests add TestSuite_VEB.py 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: Fri, 14 Oct 2016 14:41:23 -0000 Yuan, some comments below. Please remember that your suite is not the only = one in our execution. You need keep the environment just the same as you use it. And please try to keep line in 79 characters. > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Yuan Peng > Sent: Friday, October 14, 2016 8:51 AM > To: dts@dpdk.org > Cc: Peng, Yuan > Subject: [dts] [PATCH 1/2] tests add TestSuite_VEB.py >=20 > From: pengyuan >=20 > Signed-off-by: pengyuan >=20 > diff --git a/tests/TestSuite_VEB.py b/tests/TestSuite_VEB.py > new file mode 100644 > index 0000000..6296ff1 > --- /dev/null > +++ b/tests/TestSuite_VEB.py > @@ -0,0 +1,934 @@ > +# BSD LICENSE > +# > +# Copyright(c) 2010-2014 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. > + > +Test VEB Switch and floating VEB Features by Poll Mode Drivers. > +""" > + > +import re > +import time > + > +import dts Please remove dts dependency in your suite. All suite should have no depend= ency on this module. > +from virt_dut import VirtDut > +from project_dpdk import DPDKdut > +from dut import Dut > +from net_device import GetNicObj > +from net_device import RemoveNicObj > +from test_case import TestCase > +from pmd_output import PmdOutput > +from settings import HEADER_SIZE > +from packet import Packet > +from utils import RED > + > + > +class TestVEBSwitching(TestCase): > + > + def VEB_get_stats(self, vf0_vf1, portid, rx_tx): > + """ > + Get packets number from port statistic > + """ > + if vf0_vf1 =3D=3D "vf0": > + stats =3D self.pmdout.get_pmd_stats(portid) > + elif vf0_vf1 =3D=3D "vf1": > + stats =3D self.pmdout_session_secondary.get_pmd_stats(portid= ) > + else: > + return None > + > + if rx_tx =3D=3D "rx": > + return [stats['RX-packets'], stats['RX-errors'], stats['RX- > bytes']] > + elif rx_tx =3D=3D "tx": > + return [stats['TX-packets'], stats['TX-errors'], stats['TX- > bytes']] > + else: > + return None > + > + def veb_get_pmd_stats(self, dev, portid, rx_tx): > + stats =3D {} > + rx_pkts_prefix =3D "RX-packets:" > + rx_bytes_prefix =3D "RX-bytes:" > + rx_error_prefix =3D "RX-errors:" > + tx_pkts_prefix =3D "TX-packets:" > + tx_error_prefix =3D "TX-errors:" > + tx_bytes_prefix =3D "TX-bytes:" > + > + if dev =3D=3D "first": > + out =3D self.dut.send_expect("show port stats %d" % portid, > "testpmd> ") > + elif dev =3D=3D "second": > + out =3D self.session_secondary.send_expect("show port > stats %d" % portid, "testpmd> ") > + elif dev =3D=3D "third": > + out =3D self.session_third.send_expect("show port stats %d" = % > portid, "testpmd> ") > + else: > + return None > + > + stats["RX-packets"] =3D self.veb_get_pmd_value(rx_pkts_prefix, o= ut) > + stats["RX-bytes"] =3D self.veb_get_pmd_value(rx_bytes_prefix, ou= t) > + stats["RX-errors"] =3D self.veb_get_pmd_value(rx_error_prefix, o= ut) > + stats["TX-packets"] =3D self.veb_get_pmd_value(tx_pkts_prefix, o= ut) > + stats["TX-errors"] =3D self.veb_get_pmd_value(tx_error_prefix, o= ut) > + stats["TX-bytes"] =3D self.veb_get_pmd_value(tx_bytes_prefix, ou= t) > + > + if rx_tx =3D=3D "rx": > + return [stats['RX-packets'], stats['RX-errors'], stats['RX- > bytes']] > + elif rx_tx =3D=3D "tx": > + return [stats['TX-packets'], stats['TX-errors'], stats['TX- > bytes']] > + else: > + return None > + > + > + def veb_get_pmd_value(self, prefix, out): > + pattern =3D re.compile(prefix + "(\s+)([0-9]+)") > + m =3D pattern.search(out) > + if m is None: > + return None > + else: > + return int(m.group(2)) > + > + def send_packet(self, vf_mac, itf, tran_type=3D""): > + """ > + Send 1 packet > + """ > + self.tester.scapy_foreground() > + self.tester.scapy_append('sys.path.append("./")') > + self.dut.send_expect("start", "testpmd>") > + mac =3D self.dut.get_mac_address(0) > + > + if tran_type =3D=3D "vlan": > + packet =3D r'sendp([Ether(dst=3D"%s", > src=3Dget_if_hwaddr("%s"))/Dot1Q(vlan=3D1)/IP(src=3D"192.168.0.1", > dst=3D"192.168.0.2")], iface=3D"%s")' % (vf_mac, itf, itf) > + self.tester.scapy_append(packet) > + self.tester.scapy_execute() > + time.sleep(.5) > + else: > + packet =3D r'sendp([Ether(dst=3D"%s", > src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.1", dst=3D"192.168.0.2")], > iface=3D"%s")' % (vf_mac, itf, itf) > + self.tester.scapy_append(packet) > + self.tester.scapy_execute() > + time.sleep(.5) > + > + # > + # Test cases. > + # > + > + def set_up_all(self): > + """ > + Prerequisite steps for each test suite. > + """ > + self.verify(self.nic in ["fortville_eagle", "fortville_spirit", > + "fortville_spirit_single"], > + "NIC Unsupported: " + str(self.nic)) > + self.dut_ports =3D self.dut.get_ports(self.nic) > + self.verify(len(self.dut_ports) >=3D 1, "Insufficient ports") > + # self.rx_port =3D self.dut_ports[0] > + # self.tx_port =3D self.dut_ports[0] > + > + # cores =3D self.dut.get_core_list("1S/2C/1T") > + # self.coremask =3D dts.create_mask(cores) > + > + # self.port_mask =3D dts.create_mask([self.rx_port, self.tx_port= ]) > + self.session_secondary =3D self.dut.new_session() > + self.session_third =3D self.dut.new_session() > + # self.pmdout =3D PmdOutput(self.dut) > + # self.pmdout_session_secondary =3D > PmdOutput(self.session_secondary) > + Please remove commented code. > + def set_up(self): > + """ > + This is to clear up environment before the case run. > + """ > + self.dut.kill_all() > + self.setup_1pf_kdriver_2vf_env_flag =3D 0 > + self.setup_1pf_ddriver_1vf_env_flag =3D 0 > + self.setup_1pf_ddriver_2vf_env_flag =3D 0 > + self.setup_1pf_ddriver_4vf_env_flag =3D 0 > + self.vf0_mac =3D "00:11:22:33:44:11" > + self.vf1_mac =3D "00:11:22:33:44:12" > + self.vf2_mac =3D "00:11:22:33:44:13" > + self.vf3_mac =3D "00:11:22:33:44:14" > + > + def setup_1pf_ddriver_4vf_env(self, driver=3D'default'): > + self.used_dut_port =3D self.dut_ports[0] > + localPort =3D self.tester.get_local_port(self.dut_ports[0]) > + self.tester_itf =3D self.tester.get_interface(localPort) > + self.pf_interface =3D > self.dut.ports_info[self.used_dut_port]['intf'] > + self.pf_mac_address =3D self.dut.get_mac_address(0) Several function required these information, you can strip these informatio= n only once in setup_all function. > + self.pf_pci =3D self.dut.ports_info[self.used_dut_port]['pci'] > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) This code is useless here, is it just for debug? > + self.dut.generate_sriov_vfs_by_port(self.used_dut_port, 4, > driver=3D'igb_uio') > + self.sriov_vfs_port =3D > self.dut.ports_info[self.used_dut_port]['vfs_port'] > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + try: > + > + for port in self.sriov_vfs_port: > + print port.pci Please remove debug code. > + self.dut.send_expect("./tools/dpdk-devbind.py -b > igb_uio %s" % (port.pci), "# ", 3) > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + time.sleep(1) > + vf0_prop =3D {'opt_host': self.sriov_vfs_port[0].pci} > + vf1_prop =3D {'opt_host': self.sriov_vfs_port[1].pci} > + vf2_prop =3D {'opt_host': self.sriov_vfs_port[2].pci} > + vf3_prop =3D {'opt_host': self.sriov_vfs_port[3].pci} > + for port_id in self.dut_ports: > + if port_id =3D=3D self.used_dut_port: > + continue > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() I'm not sure about this logic, you can just get port object by self.dut.por= ts_info[self.used_dut_port]. There's no need to browser through all dut ports. > + > + self.setup_1pf_ddriver_4vf_env_flag =3D 1 > + except Exception as e: > + self.destroy_1pf_ddriver_4vf_env() > + raise Exception(e) > + > + def destroy_1pf_ddriver_4vf_env(self): > + self.session_third.send_expect("quit", "# ") > + self.session_secondary.send_expect("quit", "# ") > + self.dut.send_expect("quit", "# ") When there met some issues which caused testpmd can't start up normally. "Q= uit" command here will cause the session unavailable any more. Use kill_all api to quit dpdk application is one more reliable way to do su= ch thing. > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port =3D self.dut.ports_info[self.used_dut_port]['port'] > + port.bind_driver() > + self.used_dut_port =3D None > + > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + Do not bind dut ports to default driver, this will cause that later suites = can't work anymore. There's one solution for this is that when test suite initializing, we bind= all dut ports to igb_uio.=20 But please do not bind to default driver by now. > + self.setup_1pf_ddriver_4vf_env_flag =3D 0 > + > + def setup_1pf_ddriver_2vf_env(self, driver=3D'default'): > + self.used_dut_port =3D self.dut_ports[0] > + localPort =3D self.tester.get_local_port(self.dut_ports[0]) > + self.tester_itf =3D self.tester.get_interface(localPort) > + self.pf_interface =3D > self.dut.ports_info[self.used_dut_port]['intf'] > + self.pf_mac_address =3D self.dut.get_mac_address(0) > + self.pf_pci =3D self.dut.ports_info[self.used_dut_port]['pci'] These codes can be done only once in setup_all function. > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + self.dut.generate_sriov_vfs_by_port(self.used_dut_port, 2, > driver=3D'igb_uio') > + self.sriov_vfs_port =3D > self.dut.ports_info[self.used_dut_port]['vfs_port'] > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + try: > + > + for port in self.sriov_vfs_port: > + print port.pci > + self.dut.send_expect("./tools/dpdk-devbind.py -b > igb_uio %s" % (port.pci), "# ", 3) > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + time.sleep(1) > + vf0_prop =3D {'opt_host': self.sriov_vfs_port[0].pci} > + vf1_prop =3D {'opt_host': self.sriov_vfs_port[1].pci} > + for port_id in self.dut_ports: > + if port_id =3D=3D self.used_dut_port: > + continue > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + self.setup_1pf_ddriver_2vf_env_flag =3D 1 > + except Exception as e: > + self.destroy_1pf_ddriver_2vf_env() > + raise Exception(e) > + > + def destroy_1pf_ddriver_2vf_env(self): > + self.session_third.send_expect("quit", "# ") > + self.session_secondary.send_expect("quit", "# ") > + self.dut.send_expect("quit", "# ") > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port =3D self.dut.ports_info[self.used_dut_port]['port'] > + port.bind_driver() > + self.used_dut_port =3D None > + > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + self.setup_1pf_ddriver_2vf_env_flag =3D 0 > + > + def setup_1pf_ddriver_1vf_env(self, driver=3D'default'): > + self.used_dut_port =3D self.dut_ports[0] > + localPort =3D self.tester.get_local_port(self.dut_ports[0]) > + self.tester_itf =3D self.tester.get_interface(localPort) > + self.pf_interface =3D > self.dut.ports_info[self.used_dut_port]['intf'] > + self.pf_mac_address =3D self.dut.get_mac_address(0) > + self.pf_pci =3D self.dut.ports_info[self.used_dut_port]['pci'] > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + # self.dut.send_expect("echo 1 > > /sys/bus/pci/devices/%s/max_vfs" % self.pf_pci, "# ", 3) > + self.dut.generate_sriov_vfs_by_port(self.used_dut_port, 1, > driver=3D'igb_uio') > + self.sriov_vfs_port =3D > self.dut.ports_info[self.used_dut_port]['vfs_port'] > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + > + try: > + > + for port in self.sriov_vfs_port: > + print port.pci > + self.dut.send_expect("./tools/dpdk-devbind.py -b > igb_uio %s" % (port.pci), "# ", 3) > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + time.sleep(1) > + vf0_prop =3D {'opt_host': self.sriov_vfs_port[0].pci} > + > + for port_id in self.dut_ports: > + if port_id =3D=3D self.used_dut_port: > + continue > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + self.setup_1pf_ddriver_1vf_env_flag =3D 1 > + except Exception as e: > + self.destroy_1pf_ddriver_1vf_env() > + raise Exception(e) > + > + def destroy_1pf_ddriver_1vf_env(self): > + > + self.session_secondary.send_expect("quit", "# ") > + self.dut.send_expect("quit", "# ") > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port =3D self.dut.ports_info[self.used_dut_port]['port'] > + port.bind_driver() > + self.used_dut_port =3D None > + > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + self.setup_1pf_ddriver_1vf_env_flag =3D 0 > + > + def setup_1pf_kdriver_2vf_env(self, driver=3D'default'): > + self.used_dut_port =3D self.dut_ports[0] > + localPort =3D self.tester.get_local_port(self.dut_ports[0]) > + self.tester_itf =3D self.tester.get_interface(localPort) > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + self.pf_interface =3D > self.dut.ports_info[self.used_dut_port]['intf'] > + self.dut.generate_sriov_vfs_by_port(self.used_dut_port, 2, > driver=3Ddriver) > + self.sriov_vfs_port =3D > self.dut.ports_info[self.used_dut_port]['vfs_port'] > + #self.vf0_mac =3D "00:11:22:33:44:11" > + #self.vf1_mac =3D "00:11:22:33:44:12" > + self.dut.send_expect("ip link set %s vf 0 mac %s" % > (self.pf_interface, self.vf0_mac), "# ", 3) > + self.dut.send_expect("ip link set %s vf 1 mac %s" % > (self.pf_interface, self.vf1_mac), "# ", 3) > + > + try: > + > + for port in self.sriov_vfs_port: > + print port.pci > + self.dut.send_expect("./tools/dpdk-devbind.py -b > igb_uio %s" % (port.pci), "# ", 3) > + self.dut.send_expect("./tools/dpdk-devbind.py -s", "# ", 3) > + time.sleep(1) > + vf0_prop =3D {'opt_host': self.sriov_vfs_port[0].pci} > + vf1_prop =3D {'opt_host': self.sriov_vfs_port[1].pci} > + > + # for port_id in self.dut_ports: > + # if port_id =3D=3D self.used_dut_port: > + # continue > + # port =3D self.dut.ports_info[port_id]['port'] > + # port.bind_driver() > + > + self.setup_1pf_kdriver_2vf_env_flag =3D 1 > + except Exception as e: > + self.destroy_1pf_kdriver_2vf_env() > + raise Exception(e) > + > + def destroy_1pf_kdriver_2vf_env(self): > + > + self.session_secondary.send_expect("quit", "# ") > + self.dut.send_expect("quit", "# ") > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port =3D self.dut.ports_info[self.used_dut_port]['port'] > + port.bind_driver() > + self.used_dut_port =3D None > + > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + self.setup_1pf_kdriver_2vf_env_flag =3D 0 > + > + def test_VEB_switching_inter_vfs_MAC_switch_rxtx(self): > + """ Please simplify the test case name, description below can explain the case= . > + Kernel PF, then create 2VFs. VFs running dpdk testpmd, send > traffic to VF1, and set the packet's DEST MAC to VF2, check if VF2 can > receive the packets. Check Inter VF-VF MAC switch. > + """ > + self.setup_1pf_kdriver_2vf_env(driver=3D'') > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i --crc- > strip --eth-peer=3D0,00:11:22:33:44:12" % self.sriov_vfs_port[0].pci, > "testpmd>", 120) Mac here should not hardcode, it has been defined in setup function. > + self.dut.send_expect("set fwd txonly", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % self.sriov_vfs_port[1].pci, "testpmd>= ", > 120) Target should not be hard coded for we will do the validation with differen= t targets. You can use start_testpmd in pmd_ouput module to simplify the step.=20 > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>", 5) > + self.dut.send_expect("start", "testpmd>", 5) > + time.sleep(2) > + > + self.dut.send_expect("stop", "testpmd>", 5) > + self.session_secondary.send_expect("stop", "testpmd>", 5) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + vf1_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(vf0_tx_stats[0] * 0.5 < vf1_rx_stats[0], "VF1 failed > to receive packets from VF0") > + > + def test_VEB_switching_inter_vfs_MAC_switch_fwd(self): > + """ > + Kernel PF, then create 2VFs. VFs running dpdk testpmd, send > traffic to VF1, and set the packet's DEST MAC to VF2, check if VF2 can > receive the packets. Check Inter VF-VF MAC switch. > + """ > + self.setup_1pf_kdriver_2vf_env(driver=3D'') > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i --crc- > strip --eth-peer=3D0,00:11:22:33:44:12" % self.sriov_vfs_port[0].pci, > "testpmd>", 120) > + self.dut.send_expect("set fwd mac", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % self.sriov_vfs_port[1].pci, "testpmd>= ", > 120) > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf0_mac, self.tester_itf) > + > + self.dut.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + vf1_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(vf0_tx_stats =3D=3D vf1_rx_stats, "VF1 failed to rec= eive > packets from VF0") > + > + def test_VEB_switching_inter_vfs_MAC_switch_vlan(self): > + """ > + Kernel PF, then create 2VFs, assign VF1 with VLAN=3D1 in, VF2 wi= th > VLAN=3D2. VFs are running dpdk testpmd, send traffic to VF1 with VLAN=3D1= , > then let it forwards to VF2, it should not work since they are not > in the same VLAN; set VF2 with VLAN=3D1, then send traffic to VF1 with > VLAN=3D1, and VF2 can receive the packets. Check inter VF MAC/VL= AN > switch. > + """ > + self.setup_1pf_kdriver_2vf_env(driver=3D'') > + # the two vfs belongs to different vlans > + self.dut.send_expect("ip link set %s vf 0 vlan 1" % > self.pf_interface, "# ", 1) > + self.dut.send_expect("ip link set %s vf 1 vlan 2" % > self.pf_interface, "# ", 1) > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i --crc- > strip --eth-peer=3D0,00:11:22:33:44:12" % self.sriov_vfs_port[0].pci, > "testpmd>", 120) > + self.dut.send_expect("set fwd mac", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % self.sriov_vfs_port[1].pci, "testpmd>= ", > 120) > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf0_mac, self.tester_itf, "vlan") > + > + self.dut.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + vf1_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify((vf0_tx_stats[0] =3D=3D 1) and (vf1_rx_stats[0] =3D= =3D 0), > "VF1 received packets from VF0, the vlan filter doen't work") > + self.dut.send_expect("quit", "# ") > + time.sleep(2) > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + > + # the two vfs belongs to the same vlan > + self.dut.send_expect("ip link set %s vf 1 vlan 1" % > self.pf_interface, "# ", 1) > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i --crc- > strip --eth-peer=3D0,00:11:22:33:44:12" % self.sriov_vfs_port[0].pci, > "testpmd>", 120) > + self.dut.send_expect("set fwd mac", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % self.sriov_vfs_port[1].pci, "testpmd>= ", > 120) > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf0_mac, self.tester_itf, "vlan") > + > + self.dut.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + vf1_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify((vf0_tx_stats[0] =3D=3D 1) and (vf1_rx_stats[0] =3D= =3D 1), > "VF1 didn't receive packets from VF0, the vlan filter doen't work") > + > + def test_VEB_switching_inter_pf_vf_MAC_switch(self): > + """ > + DPDK PF, then create 1VF, PF in the host running dpdk testpmd, > send traffic from PF to VF1, ensure PF->VF1(let VF1 in promisc mode); sen= d > traffic from VF1 to PF, ensure VF1->PF can work. > + """ > + # VF->PF > + self.setup_1pf_ddriver_1vf_env(driver=3D'') > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i" % > self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("set fwd rxonly", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[0].pci, self.pf_mac_address), "testpmd>", 120) > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + pf_rx_stats =3D self.veb_get_pmd_stats("first", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(pf_rx_stats[0] !=3D 0, "no packet was received by PF= ") > + self.verify(vf0_tx_stats[0]*0.5 < pf_rx_stats[0], "PF failed to > receive most packets from VF0") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.dut.send_expect("quit", "# ") > + time.sleep(2) > + > + #PF->VF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i --eth- > peer=3D0,%s" % (self.pf_pci, self.vf0_mac), "testpmd>", 120) > + self.dut.send_expect("set fwd txonly", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % (self.sriov_vfs_port[0].pci), "testpm= d>", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.dut.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + pf_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + self.verify(pf_tx_stats[0] !=3D 0, "no packet was sent by PF") > + self.verify(vf0_rx_stats[0] !=3D 0, "no packet was received by V= F0") > + self.verify(vf0_rx_stats[0] > pf_tx_stats[0]*0.5, "VF0 failed to > receive most packets from PF") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.dut.send_expect("quit", "# ") > + time.sleep(2) > + > + # tester->VF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s --file-prefix=3Dtest1 -- -i" % > self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("set fwd mac", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % (self.sriov_vfs_port[0].pci), "testpm= d>", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf0_mac, self.tester_itf) > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + pf_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + self.verify(pf_tx_stats[0] =3D=3D 0, "PF received unexpected pac= ket") > + self.verify(vf0_rx_stats[0] =3D=3D 1, "no packet was received by= VF0") > + > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.send_packet(self.pf_mac_address, self.tester_itf) > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + pf_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + pf_rx_stats =3D self.veb_get_pmd_stats("first", 0, "rx") > + self.verify(pf_tx_stats[0] =3D=3D 1, "no packet was sent by VF0"= ) > + self.verify(pf_rx_stats[0] =3D=3D 1, "no packet was received by = VF0") > + self.verify(vf0_rx_stats[0] =3D=3D 1, "no packet was received by= VF0") > + > + def test_floating_VEB_switching_inter_pf_vf_MAC_switch(self): > + """ > + DPDK PF, then create 1VF, PF in the host running dpdk testpmd, > send traffic from PF to VF0, VF0 can't receive any packets; send traffic > from VF0 to PF, PF can't rec eive any packets either. > + """ > + # VF->PF > + self.setup_1pf_ddriver_1vf_env(driver=3D'') > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s,enable_floating_veb=3D1 --file- > prefix=3Dtest1 -- -i" % self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("set fwd rxonly", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[0].pci, self.pf_mac_address), "testpmd>", 120) > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + pf_rx_stats =3D self.veb_get_pmd_stats("first", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(pf_rx_stats[0] =3D=3D 0, "PF can receive packet from= VF0, > the floating VEB doesn't work") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.dut.send_expect("quit", "# ") > + time.sleep(2) > + > + #PF->VF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s,enable_floating_veb=3D1 --file- > prefix=3Dtest1 -- -i --eth-peer=3D0,%s" % (self.pf_pci, self.vf0_mac), > "testpmd>", 120) > + self.dut.send_expect("set fwd txonly", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % (self.sriov_vfs_port[0].pci), "testpm= d>", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.dut.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + pf_tx_stats =3D self.veb_get_pmd_stats("first", 0, "tx") > + self.verify(pf_tx_stats[0] !=3D 0, "no packet was sent by PF") > + self.verify(vf0_rx_stats[0] =3D=3D 0, "VF0 can receive packet fr= om PF, > the floating VEB doesn't work") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.dut.send_expect("quit", "# ") > + time.sleep(2) > + > + #outside world ->VF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s,enable_floating_veb=3D1 --file- > prefix=3Dtest1 -- -i --eth-peer=3D0,%s" % (self.pf_pci, self.vf0_mac), > "testpmd>", 120) > + self.dut.send_expect("set fwd mac", "testpmd>") > + self.dut.send_expect("set promisc all on", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % (self.sriov_vfs_port[0].pci), "testpm= d>", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd mac", "testpmd>") > + self.session_secondary.send_expect("set promisc all on", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf0_mac, self.tester_itf) > + time.sleep(2) > + self.dut.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf0_rx_stats[0] =3D=3D 0, "VF0 can receive packet fr= om > outside world, the floating VEB doesn't work") > + > + def test_floating_VEB_switching_inter_vfs_MAC_switch(self): > + """ > + 1 DPDK PF, then create 2VF, PF in the host running dpdk testpmd, > and VF0 are running dpdk testpmd, VF0 send traffic, and set the packet's > DEST MAC to VF1, check if VF1 can receive the packets. Check Inter VF-VF > MAC switch when PF is link down as well as up. > + """ > + # PF link up, VF0->VF1 > + self.setup_1pf_ddriver_2vf_env(driver=3D'') > + # start PF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 -w %s,enable_floating_veb=3D1 --file- > prefix=3Dtest1 -- -i" % self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("port start all", "testpmd>") > + time.sleep(2) > + # start VF0 > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % self.sriov_vfs_port[0].pci, "testpmd>= ", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + # start VF1 > + self.session_third.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf00 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest3 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[1].pci, self.vf0_mac), "testpmd>", 120) > + self.session_third.send_expect("set fwd txonly", "testpmd>") > + self.session_third.send_expect("set promisc all off", "testpmd>"= ) > + self.session_third.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_third.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + vf1_tx_stats =3D self.veb_get_pmd_stats("third", 0, "tx") > + self.verify(vf1_tx_stats[0] !=3D 0, "no packet was sent by VF1") > + self.verify(vf0_rx_stats[0] !=3D 0, "no packet was received by V= F0") > + self.verify(vf1_tx_stats[0]*0.5 < vf0_rx_stats[0], "VF0 failed t= o > receive most packets from VF1") > + > + # PF link down, VF0 -> VF1 > + self.dut.send_expect("port stop all", "Port 0 Link Down", 20) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_third.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_third.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf1_tx_stats_pfstop =3D self.veb_get_pmd_stats("third", 0, "tx") > + vf0_rx_stats_pfstop =3D self.veb_get_pmd_stats("second", 0, "rx"= ) > + vf1_tx_stats_pfstop[0] =3D vf1_tx_stats_pfstop[0] - vf1_tx_stats= [0] > + vf0_rx_stats_pfstop[0] =3D vf0_rx_stats_pfstop[0] - vf0_rx_stats= [0] > + self.verify(vf1_tx_stats_pfstop[0] !=3D 0, "no packet was sent b= y > VF1") > + self.verify(vf0_rx_stats_pfstop[0] !=3D 0, "no packet was receiv= ed > by VF0") > + self.verify(vf1_tx_stats_pfstop[0]*0.5 < vf0_rx_stats_pfstop[0], > "VF0 failed to receive most packets from VF1") > + > + def test_floating_VEB_VF_cannot_communicate_with_legacy_VEB_VF(self)= : > + """ > + DPDK PF, then create 4VF, VF0,VF2,VF3 are floating VEB; VF1 is > lagecy VEB. Make PF link down(the cable can be pluged out), VFs are > running dpdk testpmd. > + 1. VF0 send traffic, and set the packet's DEST MAC to VF1, check > VF1 can not receive the packets. > + 2. VF1 send traffic, and set the packet's DEST MAC to VF0, check > VF0 can not receive the packets. > + 3. VF0 send traffic, and set the packet's DEST MAC to VF2, check > VF2 can receive the packets. > + 4. VF3 send traffic, and set the packet's DEST MAC to VF2, check > VF2 can receive the packets. > + """ > + self.setup_1pf_ddriver_4vf_env(driver=3D'') > + # start PF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 \"- > w %s,enable_floating_veb=3D1,floating_veb_list=3D0;2-3\" --file-prefix=3D= test1 - > - -i" % self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("port start all", "testpmd>") > + time.sleep(2) > + # VF1->VF0 > + # start VF0 > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[0].pci, self.vf1_mac), "testpmd>", 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd rxonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + # start VF1 > + self.session_third.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf00 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest3 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[1].pci, self.vf0_mac), "testpmd>", 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf1_mac, "testpmd>") > + self.session_third.send_expect("set fwd txonly", "testpmd>") > + self.session_third.send_expect("set promisc all off", "testpmd>"= ) > + > + # PF link down > + self.dut.send_expect("port stop all", "Port 0 Link Down", 40) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_third.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_third.send_expect("stop", "testpmd>", 2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + vf1_tx_stats =3D self.veb_get_pmd_stats("third", 0, "tx") > + self.verify(vf1_tx_stats[0] !=3D 0, "no packet was sent by VF1") > + self.verify(vf0_rx_stats[0] =3D=3D 0, "floating_VEB VF can > communicate with legacy_VEB VF") > + > + # VF0->VF1 > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_third.send_expect("set fwd rxonly", "testpmd>") > + self.session_third.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.session_third.send_expect("stop", "testpmd>", 2) > + vf1_rx_stats =3D self.veb_get_pmd_stats("third", 0, "rx") > + vf0_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(vf1_rx_stats[0] =3D=3D 0, "floating_VEB VF can > communicate with legacy_VEB VF") > + > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.session_third.send_expect("quit", "# ") > + time.sleep(2) > + > + # VF0->VF2 > + # start VF0 > + self.dut.send_expect("port start all", "testpmd>") > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[0].pci, self.vf2_mac), "testpmd>", 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + # start VF2 > + self.session_third.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf00 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest3 -- -i --crc-strip" % self.sriov_vfs_port[2].pci, "testpmd>= ", > 120) > + self.session_third.send_expect("mac_addr add 0 %s" % self.vf2_ma= c, > "testpmd>") > + self.session_third.send_expect("set fwd rxonly", "testpmd>") > + self.session_third.send_expect("set promisc all off", "testpmd>"= ) > + > + # PF link down > + self.dut.send_expect("port stop all", "Port 0 Link Down", 40) > + self.session_third.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.session_third.send_expect("stop", "testpmd>", 2) > + > + vf2_rx_stats =3D self.veb_get_pmd_stats("third", 0, "rx") > + vf0_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(vf2_rx_stats[0] !=3D 0, "floating_VEB VFs cannot > communicate with each other") > + self.verify(vf0_tx_stats[0] * 0.5 < vf2_rx_stats[0], "VF2 failed > to receive packets from VF0") > + > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.session_third.send_expect("quit", "# ") > + time.sleep(2) > + > + # VF3->VF2 > + # start VF3 > + self.dut.send_expect("port start all", "testpmd>") > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[3].pci, self.vf2_mac), "testpmd>", 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + # start VF2 > + self.session_third.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf00 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest3 -- -i --crc-strip" % self.sriov_vfs_port[2].pci, "testpmd>= ", > 120) > + self.session_third.send_expect("mac_addr add 0 %s" % self.vf2_ma= c, > "testpmd>") > + self.session_third.send_expect("set fwd rxonly", "testpmd>") > + self.session_third.send_expect("set promisc all off", "testpmd>"= ) > + > + # PF link down > + self.dut.send_expect("port stop all", "Port 0 Link Down", 40) > + self.session_third.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.session_third.send_expect("stop", "testpmd>", 2) > + > + vf2_rx_stats =3D self.veb_get_pmd_stats("third", 0, "rx") > + vf3_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + self.verify(vf3_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(vf2_rx_stats[0] !=3D 0, "floating_VEB VFs cannot > communicate with each other") > + self.verify(vf3_tx_stats[0] * 0.5 < vf2_rx_stats[0], "VF2 failed > to receive packets from VF3") > + > + def > test_floating_VEB_and_legacy_VEB_switching_inter_pf_vf_MAC_switch(self): > + """ > + DPDK PF, then create 2VFs, VF0 is in floating VEB, VF1 is in > legacy VEB. > + 1. Send traffic from VF0 to PF, then check PF will not see any > traffic; > + 2. Send traffic from VF1 to PF, then check PF will receive all > the packets. > + 3. send traffic from tester to VF0, check VF0 can't receive > traffic from tester. > + 4. send traffic from tester to VF1, check VF1 can receive all th= e > traffic from tester. > + """ > + self.setup_1pf_ddriver_2vf_env(driver=3D'') > + # VF0->PF > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 \"- > w %s,enable_floating_veb=3D1,floating_veb_list=3D0\" --file-prefix=3Dtest= 1 -- - > i" % self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("set fwd rxonly", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[0].pci, self.pf_mac_address), "testpmd>", 120) > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf0_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + pf_rx_stats =3D self.veb_get_pmd_stats("first", 0, "rx") > + self.verify(vf0_tx_stats[0] !=3D 0, "no packet was sent by VF0") > + self.verify(pf_rx_stats[0] =3D=3D 0, "PF can receive packet from= VF0, > the floating VEB doesn't work") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + > + # VF1->PF > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip --eth-peer=3D0,%s" % > (self.sriov_vfs_port[1].pci, self.pf_mac_address), "testpmd>", 120) > + self.session_secondary.send_expect("set fwd txonly", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf1_tx_stats =3D self.veb_get_pmd_stats("second", 0, "tx") > + pf_rx_stats =3D self.veb_get_pmd_stats("first", 0, "rx") > + self.verify(vf1_tx_stats[0] !=3D 0, "no packet was sent by VF1") > + self.verify(pf_rx_stats[0] !=3D 0, "PF can't receive packet from > VF1, the VEB doesn't work") > + self.verify(vf1_tx_stats[0] * 0.5 < pf_rx_stats[0], "PF failed t= o > receive packets from VF1") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + self.dut.send_expect("quit", "# ") > + time.sleep(2) > + > + # tester->VF0 > + self.dut.send_expect("./x86_64-native-linuxapp-gcc/app/testpmd -= c > 0xf -n 4 --socket-mem 1024,1024 \"- > w %s,enable_floating_veb=3D1,floating_veb_list=3D0\" --file-prefix=3Dtest= 1 -- - > i" % self.pf_pci, "testpmd>", 120) > + self.dut.send_expect("set fwd mac", "testpmd>") > + self.dut.send_expect("set promisc all off", "testpmd>") > + self.dut.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % (self.sriov_vfs_port[0].pci), "testpm= d>", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf0_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd mac", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf0_mac, self.tester_itf) > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf0_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf0_rx_stats[0] =3D=3D 0, "VF0 can receive packet fr= om > outside world, the floating VEB doesn't work") > + self.session_secondary.send_expect("quit", "# ") > + time.sleep(2) > + > + # tester->VF1 > + self.session_secondary.send_expect("./x86_64-native-linuxapp- > gcc/app/testpmd -c 0xf0 -n 4 --socket-mem 1024,1024 -w %s --file- > prefix=3Dtest2 -- -i --crc-strip" % (self.sriov_vfs_port[1].pci), "testpm= d>", > 120) > + self.session_secondary.send_expect("mac_addr add 0 %s" % > self.vf1_mac, "testpmd>") > + self.session_secondary.send_expect("set fwd mac", "testpmd>") > + self.session_secondary.send_expect("set promisc all off", > "testpmd>") > + self.session_secondary.send_expect("start", "testpmd>") > + time.sleep(2) > + > + self.send_packet(self.vf1_mac, self.tester_itf) > + time.sleep(2) > + self.session_secondary.send_expect("stop", "testpmd>", 2) > + self.dut.send_expect("stop", "testpmd>", 2) > + > + vf1_rx_stats =3D self.veb_get_pmd_stats("second", 0, "rx") > + self.verify(vf1_rx_stats[0] =3D=3D 1, "VF1 can't receive packet = from > outside world, the VEB doesn't work") > + > + def tear_down(self): > + """ > + Run after each test case. > + """ > + if self.setup_1pf_kdriver_2vf_env_flag =3D=3D 1: > + self.destroy_1pf_kdriver_2vf_env() > + if self.setup_1pf_ddriver_1vf_env_flag =3D=3D 1: > + self.destroy_1pf_ddriver_1vf_env() > + if self.setup_1pf_ddriver_2vf_env_flag =3D=3D 1: > + self.destroy_1pf_ddriver_2vf_env() > + if self.setup_1pf_ddriver_4vf_env_flag =3D=3D 1: > + self.destroy_1pf_ddriver_4vf_env() > + > + self.dut.kill_all() > + > + pass > + > + def tear_down_all(self): > + """ > + Run after each test suite. > + """ > + self.dut.kill_all() > + self.dut.close_session(self.session_secondary) > + self.dut.close_session(self.session_third) Need restore dut ports bound to igb_uio driver. > + > + pass > -- > 2.5.0