From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id AF72E37B8 for ; Wed, 19 Oct 2016 05:23:41 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP; 18 Oct 2016 20:23:40 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,364,1473145200"; d="scan'208";a="1055885677" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga001.fm.intel.com with ESMTP; 18 Oct 2016 20:23:40 -0700 Received: from fmsmsx102.amr.corp.intel.com (10.18.124.200) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 18 Oct 2016 20:23:40 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by FMSMSX102.amr.corp.intel.com (10.18.124.200) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 18 Oct 2016 20:23:39 -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:23:35 +0800 From: "Liu, Yong" To: "Peng, Yuan" , "dts@dpdk.org" Thread-Topic: [dts] [PATCH 1/2] tests add TestSuite_VEB.py Thread-Index: AQHSJiIKHU5fPt2unk6RUJDWNizSzqCn+7WAgAafGACAAIZJcP//e8eAgACGlUA= Date: Wed, 19 Oct 2016 03:23:35 +0000 Message-ID: <86228AFD5BCD8E4EBFD2B90117B5E81E60305171@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> <86228AFD5BCD8E4EBFD2B90117B5E81E6030512D@SHSMSX103.ccr.corp.intel.com> <67D543A150B29E4CAAE53918F64EDAEA36960554@shsmsx102.ccr.corp.intel.com> In-Reply-To: <67D543A150B29E4CAAE53918F64EDAEA36960554@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:23:43 -0000 Yes, as I has mentioned that we can add bind action in suite instantiation.= Otherwise we need make sure one suite not affect others. > -----Original Message----- > From: Peng, Yuan > Sent: Tuesday, October 18, 2016 8:20 PM > To: Liu, Yong; dts@dpdk.org > Subject: RE: [dts] [PATCH 1/2] tests add TestSuite_VEB.py >=20 > At the initiation of each suite, there are not steps to bind the dut port= s > to igb_uio? >=20 > -----Original Message----- > From: Liu, Yong > Sent: Wednesday, October 19, 2016 11:17 AM > To: Peng, Yuan ; dts@dpdk.org > Subject: RE: [dts] [PATCH 1/2] tests add TestSuite_VEB.py >=20 > 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 > should guarantee that all ports still bind to igb_uio after each case > finished. >=20 > > -----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 > > > > Hi Marvin, > > > > I don't know why I can't bind the dut ports to default driver when the > > testsuite finished? > > > > Thank you. > > Yuan. > > > > -----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 > > > > 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 > > > > > > 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 > copyright > > > +# notice, this list of conditions and the following disclaimer i= n > > > +# 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 derive= d > > > +# from this software without specific prior written permission. > > > +# > > > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTOR= S > > > +# "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 TOR= T > > > +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE > USE > > > +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAG= E. > > > + > > > +""" > > > +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. > > > > > +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" % port= id, > > > "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_prefi= x, > > 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_prefi= x, > > out) > > > + stats["TX-packets"] =3D self.veb_get_pmd_value(tx_pkts_prefi= x, > > out) > > > + stats["TX-errors"] =3D self.veb_get_pmd_value(tx_error_prefi= x, > > 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_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 > > information 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.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 d= o > > such 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. > > 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 ca= n > > > 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 --c= rc- > > > 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 > > different targets. > > You can use start_testpmd in pmd_ouput module to simplify the step. > > > > > + 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 V= F0") > > > + 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 ca= n > > > 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 --c= rc- > > > 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 V= F0") > > > + 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, VF= 2 > > 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 wit= h > > > 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 --c= rc- > > > 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 V= F0") > > > + 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 --c= rc- > > > 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 V= F0") > > > + 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 testpm= d, > > > 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 V= F0") > > > + self.verify(pf_rx_stats[0] !=3D 0, "no packet was received b= y > 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 --e= th- > > > 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 faile= d > > 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 receive= d 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 receive= d by > > VF0") > > > + > > > + def test_floating_VEB_switching_inter_pf_vf_MAC_switch(self): > > > + """ > > > + DPDK PF, then create 1VF, PF in the host running dpdk testpm= d, > > > 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 V= F0") > > > + 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), > > "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 packe= t > 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 packe= t > 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 > 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 V= F1") > > > + 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, > "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 se= nt > 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 V= F1") > > > + 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 V= F0") > > > + 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_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 V= F0") > > > + 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_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 V= F0") > > > + 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 al= l > > 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=3D= test1 - > - > > - > > > 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 V= F0") > > > + 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 V= F1") > > > + 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 > > 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=3D= test1 - > - > > - > > > 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 packe= t > 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 pac= ket > > 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