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 64D512BEA for ; Wed, 19 Oct 2016 05:17:36 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP; 18 Oct 2016 20:17:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,364,1473145200"; d="scan'208";a="774366145" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by FMSMGA003.fm.intel.com with ESMTP; 18 Oct 2016 20:17:30 -0700 Received: from FMSMSX109.amr.corp.intel.com (10.18.116.9) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 18 Oct 2016 20:17:19 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by fmsmsx109.amr.corp.intel.com (10.18.116.9) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 18 Oct 2016 20:17:19 -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; Wed, 19 Oct 2016 11:16:47 +0800 From: "Liu, Yong" To: "Peng, Yuan" , "dts@dpdk.org" Thread-Topic: [dts] [PATCH 1/2] tests add TestSuite_VEB.py Thread-Index: AQHSJiIKHU5fPt2unk6RUJDWNizSzqCn+7WAgAafGACAAIZJcA== Date: Wed, 19 Oct 2016 03:16:47 +0000 Message-ID: <86228AFD5BCD8E4EBFD2B90117B5E81E6030512D@SHSMSX103.ccr.corp.intel.com> References: <1476453052-19505-1-git-send-email-yuan.peng@intel.com> <86228AFD5BCD8E4EBFD2B90117B5E81E60300ABC@SHSMSX103.ccr.corp.intel.com> <67D543A150B29E4CAAE53918F64EDAEA36960534@shsmsx102.ccr.corp.intel.com> In-Reply-To: <67D543A150B29E4CAAE53918F64EDAEA36960534@shsmsx102.ccr.corp.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: Wed, 19 Oct 2016 03:17:38 -0000 Use Fortville as example, its default driver is i40e. After bind to default= driver, dpdk won't able to use it. When dts run suites, all ports have been bound to igb_uio. Each suite shoul= d guarantee that all ports still bind to igb_uio after each case finished. > -----Original Message----- > From: Peng, Yuan > Sent: Tuesday, October 18, 2016 8:12 PM > To: Liu, Yong; dts@dpdk.org > Subject: RE: [dts] [PATCH 1/2] tests add TestSuite_VEB.py >=20 > Hi Marvin, >=20 > I don't know why I can't bind the dut ports to default driver when the > testsuite finished? >=20 > Thank you. > Yuan. >=20 > -----Original Message----- > From: Liu, Yong > Sent: Friday, October 14, 2016 10:40 PM > To: Peng, Yuan ; dts@dpdk.org > Cc: Peng, Yuan > Subject: RE: [dts] [PATCH 1/2] tests add TestSuite_VEB.py >=20 > Yuan, some comments below. Please remember that your suite is not the onl= y > 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. >=20 > > -----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 > > > > From: pengyuan > > > > Signed-off-by: pengyuan > > > > 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 copyrigh= t > > +# 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 FO= R > > +# 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 AN= Y > > +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > > +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE US= E > > +# 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 > dependency on this module. >=20 > > +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(port= id) > > + 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, > out) > > + stats["RX-bytes"] =3D self.veb_get_pmd_value(rx_bytes_prefix, = out) > > + stats["RX-errors"] =3D self.veb_get_pmd_value(rx_error_prefix, > out) > > + stats["TX-packets"] =3D self.veb_get_pmd_value(tx_pkts_prefix, > out) > > + stats["TX-errors"] =3D self.veb_get_pmd_value(tx_error_prefix, > out) > > + stats["TX-bytes"] =3D self.veb_get_pmd_value(tx_bytes_prefix, = out) > > + > > + 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_po= rt]) > > + 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. >=20 > > + 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) >=20 > Several function required these information, you can strip these > information only once in setup_all function. >=20 > > + 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? >=20 > > + 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.ports_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. > "Quit" command here will cause the session unavailable any more. > Use kill_all api to quit dpdk application is one more reliable way to do > such thing. >=20 > > + 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 suite= s > can't work anymore. > There's one solution for this is that when test suite initializing, we > bind all dut ports to igb_uio. > But please do not bind to default driver by now. >=20 > > + 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. >=20 > > + 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): > > + """ >=20 > Please simplify the test case name, description below can explain the > case. >=20 > > + 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. >=20 > > + 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, "testpm= d>", > > 120) >=20 > Target should not be hard coded for we will do the validation with > different 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, "testpm= d>", > > 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 > receive > > 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 > with > > 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/VLAN > > 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, "testpm= d>", > > 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, "testpm= d>", > > 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); > send > > 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 t= o > > 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), > "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) > > + 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 > VF0") > > + 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), > "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) > > + > > + 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 > packet") > > + 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 VF= 0") > > + self.verify(pf_rx_stats[0] =3D=3D 1, "no packet was received b= y > 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 traffi= c > > 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 fr= om > 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), > "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) > > + 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 = from > 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), > "testpmd>", > > 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 = from > > 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 testpm= d, > > 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-V= F > > 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, "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) > > + # 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 > VF0") > > + self.verify(vf1_tx_stats[0]*0.5 < vf0_rx_stats[0], "VF0 failed > to > > 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, "r= x") > > + 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= by > > VF1") > > + self.verify(vf0_rx_stats_pfstop[0] !=3D 0, "no packet was > received > > 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= =3Dtest1 > - > > - -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, "testpm= d>", > > 120) > > + self.session_third.send_expect("mac_addr add 0 %s" % > self.vf2_mac, > > "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, "testpm= d>", > > 120) > > + self.session_third.send_expect("mac_addr add 0 %s" % > self.vf2_mac, > > "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 > the > > 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=3Dte= st1 -- > - > > 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 fr= om > 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 fr= om > > VF1, the VEB doesn't work") > > + self.verify(vf1_tx_stats[0] * 0.5 < pf_rx_stats[0], "PF failed > to > > 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=3Dte= st1 -- > - > > 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), > "testpmd>", > > 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 = from > > 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), > "testpmd>", > > 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 packe= t > 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