From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 7152FA05D3 for ; Wed, 22 May 2019 07:49:18 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 40BEB14EC; Wed, 22 May 2019 07:49:18 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id DDBFF9E4 for ; Wed, 22 May 2019 07:49:16 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 May 2019 22:49:15 -0700 X-ExtLoop1: 1 Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by FMSMGA003.fm.intel.com with ESMTP; 21 May 2019 22:49:15 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 21 May 2019 22:49:15 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.33]) with mapi id 14.03.0415.000; Wed, 22 May 2019 13:49:13 +0800 From: "Tu, Lijuan" To: "Peng, Yuan" , "dts@dpdk.org" CC: "Peng, Yuan" Thread-Topic: [dts] [PATCH v1] tests: add TestSuite_ixgbe_vf_get_extra_queue_information.py Thread-Index: AQHVBvI8T1v/KXZ+YUmIB5GE9fVy9qZ2tjtQ Date: Wed, 22 May 2019 05:49:12 +0000 Message-ID: <8CE3E05A3F976642AAB0F4675D0AD20E0BA83FFC@SHSMSX101.ccr.corp.intel.com> References: <1557466786-39205-1-git-send-email-yuan.peng@intel.com> In-Reply-To: <1557466786-39205-1-git-send-email-yuan.peng@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMTkyNjk1Y2UtNzNhYS00MTJjLWJmYjQtZGZhMWU5YTk0YWQyIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiWXptYXpydXNrWXpORUtaZjlVVkJoN25YMTNSc1VQbW5JSWIyNnduRnlWc3V6V3BkWXprTXJoMzFnT2NPdGtmVyJ9 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 v1] tests: add TestSuite_ixgbe_vf_get_extra_queue_information.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: , Errors-To: dts-bounces@dpdk.org Sender: "dts" Applied, thanks > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Peng Yuan > Sent: Friday, May 10, 2019 1:40 PM > To: dts@dpdk.org > Cc: Peng, Yuan > Subject: [dts] [PATCH v1] tests: add > TestSuite_ixgbe_vf_get_extra_queue_information.py >=20 > Add TestSuite_ixgbe_vf_get_extra_queue_information.py >=20 > Signed-off-by: Peng Yuan >=20 > diff --git a/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py > b/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py > new file mode 100644 > index 0000000..c712942 > --- /dev/null > +++ b/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py > @@ -0,0 +1,285 @@ > +# BSD LICENSE > +# > +# Copyright(c) 2010-2019 Intel Corporation. All rights reserved. > +# All rights reserved. > +# > +# Redistribution and use in source and binary forms, with or without # > +modification, are permitted provided that the following conditions # > +are met: > +# > +# * Redistributions of source code must retain the above copyright > +# notice, this list of conditions and the following disclaimer. > +# * Redistributions in binary form must reproduce the above copyright > +# notice, this list of conditions and the following disclaimer in > +# the documentation and/or other materials provided with the > +# distribution. > +# * Neither the name of Intel Corporation nor the names of its > +# contributors may be used to endorse or promote products derived > +# from this software without specific prior written permission. > +# > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND > CONTRIBUTORS # > +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # > +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > FOR # > +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > COPYRIGHT # > +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > INCIDENTAL, # > +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > # > +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > USE, # > +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND > ON ANY # > +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # > +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE > USE # > +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + > +""" > +DPDK Test suite. > +Test Niantic ixgbe_get_vf_queue Include Extra Information function. > +""" > +import time > +import random > +import re > +import utils > + > +# Use scapy to send packets with different source and dest ip. > +# and collect the hash result of five tuple and the queue id. > +from test_case import TestCase > +from pmd_output import PmdOutput > +from virt_common import VM > +from qemu_kvm import QEMUKvm > + > +class TestIxgbeVfGetExtraInfo(TestCase): > + > + > + def get_packet_bytes(self, queue): > + """ > + Get rx queue packets and bytes. > + """ > + out =3D self.vm0_dut.send_expect("ethtool -S %s" % self.vm0_intf= 0, "#") > + lines =3D out.split("\r\n") > + > + for line in lines: > + line =3D line.strip() > + if ("rx_queue_%s_packets" % queue) in line: > + rev_queue, rev_num =3D line.split(': ', 1) > + for line in lines: > + line =3D line.strip() > + if ("rx_queue_%s_bytes" % queue) in line: > + rev_queue, rev_byte =3D line.split(': ', 1) > + > + return rev_num, rev_byte > + > + def send_verify_up(self, prio=3D"", vlan=3D""): > + """ > + Send packets including user priority and verify the result. > + """ > + if prio=3D=3D"1" or prio=3D=3D"2" or prio=3D=3D"3": > + rev_num, rev_byte =3D self.get_packet_bytes(prio) > + else: > + rev_num, rev_byte =3D self.get_packet_bytes("0") > + > + self.tester.scapy_foreground() > + self.tester.scapy_append('sys.path.append("./")') > + self.vm0_vf0_mac =3D self.vm0_dut.get_mac_address(0) > + # send packet with different parameters > + packet =3D r'sendp([Ether(src=3D"%s",dst=3D"%s")/Dot1Q(prio=3D%s= , > vlan=3D%s)/IP()/Raw("x"*20)], iface=3D"%s")' % ( > + self.src_mac, self.vm0_vf0_mac, prio, vlan, self.tester_intf= ) > + self.tester.scapy_append(packet) > + self.tester.scapy_execute() > + time.sleep(.5) > + > + if prio=3D=3D"1" or prio=3D=3D"2" or prio=3D=3D"3": > + rev_num_after, rev_byte_after =3D self.get_packet_bytes(prio= ) > + else: > + rev_num_after, rev_byte_after =3D self.get_packet_bytes("0") > + > + rev_num_added =3D int(rev_num_after) - int(rev_num) > + rev_byte_added =3D int(rev_byte_after) - int(rev_byte) > + > + if vlan =3D=3D "0": > + self.verify((rev_num_added =3D=3D 1 and rev_byte_added =3D= =3D 60), "the > packet is not sent to the right queue.") > + else: > + self.verify((rev_num_added =3D=3D 0 and rev_byte_added =3D= =3D 0), > + "the packet is received.") > + > + def send_verify_queue(self, ptype=3D"ip"): > + """ > + Send different packets, return the received queue. > + """ > + rev_num0, rev_byte0 =3D self.get_packet_bytes("0") > + rev_num1, rev_byte1 =3D self.get_packet_bytes("1") > + self.tester.scapy_foreground() > + self.tester.scapy_append('sys.path.append("./")') > + self.vm0_vf0_mac =3D self.vm0_dut.get_mac_address(0) > + # send packet with different parameters > + if ptype =3D=3D "ip": > + packet =3D r'sendp([Ether(src=3D"%s",dst=3D"%s")/IP()/Raw("x= "*20)], > count=3D100, iface=3D"%s")' % ( > + self.src_mac, self.vm0_vf0_mac, self.tester_intf) > + elif ptype =3D=3D "udp": > + packet =3D r'sendp([Ether(src=3D"%s",dst=3D"%s")/IP(src=3D"1= 92.168.0.1", > dst=3D"192.168.0.3")/UDP(sport=3D23,dport=3D24)/Raw("x"*20)], count=3D100= , > iface=3D"%s")' % ( > + self.src_mac, self.vm0_vf0_mac, self.tester_intf) > + self.tester.scapy_append(packet) > + self.tester.scapy_execute() > + > + rev_num_after0, rev_byte_after0 =3D self.get_packet_bytes("0") > + rev_num_after1, rev_byte_after1 =3D self.get_packet_bytes("1") > + > + rev_num_added0 =3D int(rev_num_after0) - int(rev_num0) > + rev_byte_added0 =3D int(rev_byte_after0) - int(rev_byte0) > + rev_num_added1 =3D int(rev_num_after1) - int(rev_num1) > + rev_byte_added1 =3D int(rev_byte_after1) - int(rev_byte1) > + > + if rev_num_added0 =3D=3D 100 and rev_byte_added0 !=3D 0: > + queue =3D 0 > + elif rev_num_added1 =3D=3D 100 and rev_byte_added1 !=3D 0: > + queue =3D 1 > + else: > + print utils.RED("There is no packet received.") > + > + return queue > + > + def set_up_all(self): > + """ > + Run at the start of each test suite. > + """ > + self.verify(self.nic in ["niantic"], > + "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.cores =3D "1S/8C/1T" > + > + self.pf_mac =3D self.dut.get_mac_address(self.dut_ports[0]) > + txport =3D self.tester.get_local_port(self.dut_ports[0]) > + self.tester_intf =3D self.tester.get_interface(txport) > + self.tester_mac =3D self.tester.get_mac(txport) > + > + self.pf_intf =3D self.dut.ports_info[self.dut_ports[0]]['intf'] > + self.pf_pci =3D self.dut.ports_info[self.dut_ports[0]]['pci'] > + self.src_mac =3D '00:02:00:00:00:01' > + self.dut.send_expect('modprobe vfio-pci', '#') > + > + self.used_dut_port =3D self.dut_ports[0] > + 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'] > + for port in self.sriov_vfs_port: > + port.bind_driver('vfio-pci') > + time.sleep(1) > + > + def set_up(self): > + """ > + Run before each test case. > + """ > + pass > + > + def setup_vm_env(self): > + """ > + 1pf -> 1vf , vf->vm0 > + """ > + vf0_prop_1 =3D {'opt_host': self.sriov_vfs_port[0].pci} > + self.vm0 =3D QEMUKvm(self.dut, 'vm0', > 'ixgbe_vf_get_extra_queue_information') > + self.vm0.set_vm_device(driver=3D'vfio-pci', **vf0_prop_1) > + try: > + self.vm0_dut =3D self.vm0.start() > + if self.vm0_dut is None: > + raise Exception("Set up VM ENV failed") > + else: > + self.verify(self.vm0_dut.ports_info[0][ > + 'intf'] !=3D 'N/A', "Not interface") > + except Exception as e: > + self.destroy_vm_env() > + self.logger.error("Failure for %s" % str(e)) > + > + self.vm0_vf0_mac =3D self.vm0_dut.get_mac_address(0) > + self.vm0_intf0 =3D self.vm0_dut.ports_info[0]['intf'] > + > + self.vm0_dut.restore_interfaces_linux() > + > + def destroy_vm_env(self): > + """ > + destroy vm environment > + """ > + if getattr(self, 'vm0', None): > + self.vm0_dut.kill_all() > + self.vm0_dut_ports =3D None > + self.vm0.stop() > + self.vm0 =3D None > + > + self.dut.virt_exit() > + > + def destroy_vf_env(self): > + """ > + destroy vf > + """ > + if getattr(self, 'used_dut_port', None) !=3D None: > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port =3D self.dut.ports_info[self.used_dut_port]['port'] > + self.used_dut_port =3D None > + > + def verify_rx_queue(self, num): > + """ > + verify the rx queue number > + """ > + # pf up + vf up -> vf up > + self.vm0_dut.send_expect("ifconfig %s up" % self.vm0_intf0, "#") > + time.sleep(10) > + out =3D self.vm0_dut.send_expect("ethtool -S %s" % self.vm0_intf= 0, "#") > + self.verify(("rx_queue_%d" % (num-1)) in out, "Wrong rx queue > number") > + time.sleep(3) > + > + def test_enable_dcb(self): > + """ > + DPDK PF, kernel VF, enable DCB mode with TC=3D4 > + """ > + # start testpmd with PF on the host > + self.dut_testpmd =3D PmdOutput(self.dut) > + self.dut_testpmd.start_testpmd( > + "%s" % self.cores, "--rxq=3D4 --txq=3D4 --nb-cores=3D4", "-w= %s" % > self.pf_pci) > + self.dut_testpmd.execute_cmd("port stop 0") > + self.dut_testpmd.execute_cmd("port config 0 dcb vt on 4 pfc off"= ) > + self.dut_testpmd.execute_cmd("port start 0") > + time.sleep(5) > + self.setup_vm_env() > + # verify the vf get the extra info. > + self.verify_rx_queue(4) > + # verify the packet enter into the expected queue. > + self.send_verify_up(prio=3D"0",vlan=3D"0") > + self.send_verify_up(prio=3D"1",vlan=3D"0") > + self.send_verify_up(prio=3D"2",vlan=3D"0") > + self.send_verify_up(prio=3D"3",vlan=3D"0") > + self.send_verify_up(prio=3D"4",vlan=3D"0") > + self.send_verify_up(prio=3D"5",vlan=3D"0") > + self.send_verify_up(prio=3D"6",vlan=3D"0") > + self.send_verify_up(prio=3D"7",vlan=3D"0") > + self.send_verify_up(prio=3D"0",vlan=3D"1") > + > + def test_disable_dcb(self): > + """ > + DPDK PF, kernel VF, disable DCB mode > + """ > + # start testpmd with PF on the host > + self.dut_testpmd =3D PmdOutput(self.dut) > + self.dut_testpmd.start_testpmd( > + "%s" % self.cores, "--rxq=3D2 --txq=3D2 --nb-cores=3D2", "-w= %s" % > self.pf_pci) > + self.dut_testpmd.execute_cmd("start") > + time.sleep(5) > + self.setup_vm_env() > + # verify the vf get the extra info. > + self.verify_rx_queue(2) > + # verify the packet enter into the expected queue. > + rss_queue0 =3D self.send_verify_queue(ptype=3D"ip") > + rss_queue1 =3D self.send_verify_queue(ptype=3D"udp") > + self.verify(rss_queue0 !=3D rss_queue1, "Different packets not > + mapping to different queues.") > + > + def tear_down(self): > + """ > + Run after each test case. > + """ > + self.dut_testpmd.quit() > + self.destroy_vm_env() > + time.sleep(2) > + > + def tear_down_all(self): > + """ > + Run after each test suite. > + """ > + self.destroy_vf_env() > + self.dut.kill_all() > + time.sleep(2) > -- > 2.14.3