test suite reviews and discussions
 help / color / mirror / Atom feed
From: "Fu, JingguoX" <jingguox.fu@intel.com>
To: "Liu, Yong" <yong.liu@intel.com>, "dts@dpdk.org" <dts@dpdk.org>
Subject: Re: [dts] [DTS][PATCH V3 3/3] virt: vf to vf nic bridge test suite
Date: Tue, 2 Feb 2016 06:13:24 +0000	[thread overview]
Message-ID: <6BD6202160B55B409D423293115822622BA9CFF6@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <56AF1BE5.6030104@intel.com>

Update in v4

Thanks
Jingguo Fu

-----Original Message-----
From: Liu, Yong 
Sent: Monday, February 01, 2016 4:49 PM
To: Fu, JingguoX; dts@dpdk.org
Cc: Xu, Qian Q; Pei, Yulong
Subject: Re: [DTS][PATCH V3 3/3] virt: vf to vf nic bridge test suite

Jingguo,
Please change preparing environment code in set_up function, this will help us to skip preparing virtual environment when debugging test case.
There has been one sample in Testsuite_vxlan_sample. Pre-case setup function will setup case specified environment.

On 01/26/2016 06:12 PM, Jingguo Fu wrote:
> Abstract:
>      This suite adds three cases totally for vf to vf bridge test 
> suite, the test scenario details see the test plan , which named 
> "0002-virt-vf-to-vf-nic-bridge-test-plan.patch".
>
>      Test Case1: test_2vf_d2d_pktgen_stream
>          use pktgen-dpdk as packet generator in first vm, and use pmd 
> driver on another vm
>
>      Test Case2: test_2vf_d2k_pktgen_stream
>          use pktgen-dpdk as packet generator in first vm, and use 
> kernel driver on another vm
>
>      Test Case3: test_2vf_k2d_scapy_stream
>          use scapy as packet generator in first vm, and use pmd driver 
> on another vm
>
>      v3: using default pktgen as packet generator
>
> Signed-off-by: Jingguo Fu <jingguox.fu@intel.com>
> ---
>   tests/TestSuite_vf_to_vf_nic_bridge.py | 247 +++++++++++++++++++++++++++++++++
>   1 file changed, 247 insertions(+)
>   create mode 100644 tests/TestSuite_vf_to_vf_nic_bridge.py
>
> diff --git a/tests/TestSuite_vf_to_vf_nic_bridge.py 
> b/tests/TestSuite_vf_to_vf_nic_bridge.py
> new file mode 100644
> index 0000000..45f3039
> --- /dev/null
> +++ b/tests/TestSuite_vf_to_vf_nic_bridge.py
> @@ -0,0 +1,247 @@
> +# BSD LICENSE
> +#
> +# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
> +# All rights reserved.
> +#
> +# Redistribution and use in source and binary forms, with or without 
> +# modification, are permitted provided that the following conditions 
> +# are met:
> +#
> +#   * Redistributions of source code must retain the above copyright
> +#     notice, this list of conditions and the following disclaimer.
> +#   * Redistributions in binary form must reproduce the above copyright
> +#     notice, this list of conditions and the following disclaimer in
> +#     the documentation and/or other materials provided with the
> +#     distribution.
> +#   * Neither the name of Intel Corporation nor the names of its
> +#     contributors may be used to endorse or promote products derived
> +#     from this software without specific prior written permission.
> +#
> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
> +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # 
> +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
> +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
> +COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
> +INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
> +(INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
> +SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
> +HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, 
> +STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) 
> +ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +"""
> +DPDK Test suite
> +Test vf to vf nic bridge
> +"""
> +
> +import re
> +import dts
> +import time
> +import pdb
> +
> +from test_case import TestCase
> +from qemu_kvm import QEMUKvm
> +from pmd_output import PmdOutput
> +
> +VF_NUMS_ON_ONE_PF = 2
> +VF_TEMP_MAC = "52:54:12:45:67:1%d"
> +SEND_PACKET = 100
> +
> +class TestVF2VFBridge(TestCase):
> +    def set_up_all(self):
> +        self.dut_ports = self.dut.get_ports(self.nic)
> +        self.verify(len(self.dut_ports) >= 1, "Insufficient ports")
> +        self.vm0 = None
> +        self.vm1 = None
> +
> +    def set_up(self):
> +        pass
> +
> +    def set_up_vf_to_vf_env(self, driver='default'):

Suggest call this function in set_up and distinguish by test case name.  
You can reference to set_up function vxlan_sample suite.
> +        self.pf_port_for_vfs = self.dut_ports[0]
> +        self.dut.restore_interfaces()
> +        self.dut.generate_sriov_vfs_by_port(self.pf_port_for_vfs, VF_NUMS_ON_ONE_PF, driver=driver)
> +        self.sriov_vfs_ports = self.dut.ports_info[self.pf_port_for_vfs]['vfs_port']
> +        self.host_port_intf = self.dut.ports_info[self.pf_port_for_vfs]['intf']
> +        for i in range(VF_NUMS_ON_ONE_PF):
> +            self.dut.send_expect('ip link set dev %s vf %d mac %s' % \
> +                                (self.host_port_intf, i, VF_TEMP_MAC % i), '#', 10)
> +        try:
> +            for port in self.sriov_vfs_ports:
> +                port.bind_driver('pci-stub')
> +            time.sleep(1)
> +        except Exception as e:
> +            raise Exception(e)
> +
> +        vf0_prop = {'opt_host' : self.sriov_vfs_ports[0].pci}
> +        vf1_prop = {'opt_host' : self.sriov_vfs_ports[1].pci}
> +        time.sleep(1)
> +        self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_to_vf_bridge')
> +        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop)
> +        try:
> +            self.vm0_dut = self.vm0.start()
> +            if self.vm0_dut is None:
> +                raise Exception('Set up VM0 failed')
> +        except Exception as e:
> +            print dts.RED(str(e))
> +
> +        self.vm1 = QEMUKvm(self.dut, 'vm1', 'vf_to_vf_bridge')
> +        self.vm1.set_vm_device(driver='pci-assign', **vf1_prop)
> +        try:
> +            self.vm1_dut = self.vm1.start()
> +            if self.vm1_dut is None:
> +                raise Exception('Set up VM1 failed')
> +        except Exception as e:
> +            print dts.RED(str(e))
> +
> +    def clear_vf_to_vf_env(self):
> +        if self.vm0 is not None:
> +            self.vm0.stop()
> +            self.vm0 = None
> +        if self.vm1 is not None:
> +            self.vm1.stop()
> +            self.vm1 = None
> +        if self.pf_port_for_vfs is not None:
> +            self.dut.destroy_sriov_vfs_by_port(self.pf_port_for_vfs)
> +            port = self.dut.ports_info[self.pf_port_for_vfs]['port']
> +            port.bind_driver()
> +            self.pf_port_for_vfs = 0
> +
> +    def generate_pcap_pkt(self, dst, src, load, pktname='flow.pcap'):
> +        """
> +        dst:
> +            server: dst server object
> +             ether: dst mac
> +                ip: dst ip
> +               udp: dst udp protocol
> +               tcp: dst tcp protocal
> +        src:
> +            server: src server object
> +             ether: src mac
> +                ip: src ip
> +               udp: src udp protocol
> +               tcp: src tcp protocal
> +        load:
> +           content: pay load
> +            length: content length
> +        """
> +        context = '[Ether(dst="%s", src="%s")/IP()/Raw(load=%s)]' % \
> +                   (str(dst['ether']), str(src['ether']),load['content'])
> +        src['server'].send_expect('scapy', '>>> ', 10)
> +        src['server'].send_expect('wrpcap("%s", %s)'% (pktname, context), '>>> ', 10)
> +        src['server'].send_expect('quit()', '#', 10)
> +
> +    def prepare_pktgen(self, vm):
> +        vm.session.copy_file_to('./dep/tgen.tgz')
> +        vm.send_expect("cd /root", "#", 10)
> +        vm.send_expect("tar xvf tgen.tgz", '#', 20)
> +
> +    def send_stream_pktgen(self, vm, pktname='flow.pcap'):
> +        vm.send_expect("echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages", "#", 10)
> +        vm.send_expect(" mount -t hugetlbfs nodedev /mnt/huge/", "#", 10)
> +        vm.send_expect("./pktgen -c 0xf -n 2 --proc-type auto -- -P -T -m '1.0' -s 0:%s" % pktname, "", 100)
> +        time.sleep(60)
> +        vm.send_expect("set 0 rate 50", "", 20)
> +        time.sleep(5)
> +        vm.send_expect("set 0 count %d" % SEND_PACKET, "", 20)
> +        time.sleep(5)
> +        vm.send_expect("start all", "", 20)
> +        time.sleep(20)
> +
> +    def stop_stream_pktgen(self, vm):
> +        vm.send_expect("stop all", "", 20)
> +        time.sleep(5)
> +        vm.send_expect("quit", "#", 20)
> +
> +    def test_2vf_d2d_pktgen_stream(self):
> +        self.set_up_vf_to_vf_env()
> +        self.vm0_ports = self.vm0_dut.get_ports('any')
> +        self.vm0_pmd = PmdOutput(self.vm0_dut)
> +        self.vm0_pmd.start_testpmd('all')
> +        self.vm0_pmd.execute_cmd('set fwd rxonly')
> +        self.vm0_pmd.execute_cmd('start')
> +
> +        self.vm1_ports = self.vm1_dut.get_ports('any')
> +        self.prepare_pktgen(self.vm1_dut)
> +
> +        dst = {}
> +        dst['server'] = self.vm0_dut
> +        dst['ether'] = self.vm0_dut.ports_info[self.vm0_ports[0]]['mac']
> +        src = {}
> +        src['server'] = self.vm1_dut
> +        src['ether'] = self.vm1_dut.ports_info[self.vm1_ports[0]]['mac']
> +        load = {}
> +        load['content'] = "'X'*46"
> +        self.generate_pcap_pkt(dst, src, load)
> +        self.send_stream_pktgen(self.vm1_dut)
> +        recv_num = self.vm0_pmd.get_pmd_stats(0)['RX-packets']
> +        time.sleep(1)
> +        self.stop_stream_pktgen(self.vm1_dut)
> +        self.vm0_pmd.execute_cmd('stop')
> +        self.vm0_pmd.execute_cmd('quit', '# ')
> +
> +        self.verify(recv_num is SEND_PACKET,'Rx port recv error: %d' 
> + % recv_num)
> +
> +    def test_2vf_d2k_pktgen_stream(self):
> +        self.set_up_vf_to_vf_env()
> +        self.vm0_dut.restore_interfaces()
> +        self.vm0_ports = self.vm0_dut.get_ports('any')
> +        vf0_intf = self.vm0_dut.ports_info[self.vm0_ports[0]]['intf']
> +        self.vm0_dut.send_expect('tcpdump -i %s -s 1000 > /dev/null 
> + &' % vf0_intf, '#', 30)
> +
> +        self.vm1_ports = self.vm1_dut.get_ports('any')
> +        self.prepare_pktgen(self.vm1_dut)
> +
> +        dst = {}
> +        dst['server'] = self.vm0_dut
> +        dst['ether'] = self.vm0_dut.ports_info[self.vm0_ports[0]]['mac']
> +        src = {}
> +        src['server'] = self.vm1_dut
> +        src['ether'] = self.vm1_dut.ports_info[self.vm1_ports[0]]['mac']
> +        load = {}
> +        load['content'] = "'X'*46"
> +        self.generate_pcap_pkt(dst, src, load)
> +        self.send_stream_pktgen(self.vm1_dut)
> +        self.stop_stream_pktgen(self.vm1_dut)
> +
> +        recv_tcpdump = self.vm0_dut.send_expect('killall tcpdump', '#', 30)
> +        time.sleep(5)
> +        recv_pattern = re.compile("(\d+) packets captured")
> +        recv_info = recv_pattern.search(recv_tcpdump)
> +        recv_str = recv_info.group(0).split(' ')[0]
> +        recv_number = int(recv_str, 10)
> +        self.vm0_dut.bind_interfaces_linux(dts.drivername)
> +
> +        self.verify(recv_number is SEND_PACKET, 'Rx port recv error: 
> + %d' % recv_number)
> +
> +    def test_2vf_k2d_scapy_stream(self):
> +        self.set_up_vf_to_vf_env()
> +        self.vm0_ports = self.vm0_dut.get_ports('any')
> +        self.vm0_pmd = PmdOutput(self.vm0_dut)
> +        self.vm0_pmd.start_testpmd('all')
> +        self.vm0_pmd.execute_cmd('set fwd rxonly')
> +        self.vm0_pmd.execute_cmd('start')
> +        self.vm0_pmd.execute_cmd('clear port stats all')
> +
> +        self.vm1_ports = self.vm1_dut.get_ports('any')
> +        self.vm1_dut.restore_interfaces()
> +        vf1_intf = self.vm1_dut.ports_info[self.vm1_ports[0]]['intf']
> +
> +        dst_mac = self.vm0_dut.ports_info[self.vm0_ports[0]]['mac']
> +        src_mac = self.vm1_dut.ports_info[self.vm1_ports[0]]['mac']
> +        pkt_content = 'Ether(dst="%s", src="%s")/IP()/Raw(load="X"*46)' % \
> +                      (dst_mac, src_mac)
> +        self.vm1_dut.send_expect('scapy', '>>> ', 10)
> +        self.vm1_dut.send_expect('sendp([%s], iface="%s", count=%d)' % (pkt_content, vf1_intf, SEND_PACKET), '>>> ', 30)
> +        self.vm1_dut.send_expect('quit()', '# ', 10)
> +        self.vm1_dut.bind_interfaces_linux(dts.drivername)
> +        recv_num = self.vm0_pmd.get_pmd_stats(0)['RX-packets']
> +        self.vm0_pmd.execute_cmd('stop')
> +        self.vm0_pmd.execute_cmd('quit', '# ')
> +
> +        self.verify(recv_num is SEND_PACKET, 'Rx port recv error: %d' 
> + % recv_num)
> +
> +    def tear_down(self):
> +        self.clear_vf_to_vf_env()
> +
> +    def tear_down_all(self):
> +        pass

      reply	other threads:[~2016-02-02  6:13 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-26 10:12 [dts] [DTS][PATCH V3 1/3] virt: vf to vf bridge config file Abstract: add config for vf to vf " Jingguo Fu
2016-01-26 10:12 ` [dts] [DTS][PATCH V3 2/3] virt: vf to vf nic bridge test plan Jingguo Fu
2016-02-01  8:38   ` Liu, Yong
2016-02-02  6:13     ` Fu, JingguoX
2016-01-26 10:12 ` [dts] [DTS][PATCH V3 3/3] virt: vf to vf nic bridge test suite Jingguo Fu
2016-02-01  8:48   ` Liu, Yong
2016-02-02  6:13     ` Fu, JingguoX [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6BD6202160B55B409D423293115822622BA9CFF6@shsmsx102.ccr.corp.intel.com \
    --to=jingguox.fu@intel.com \
    --cc=dts@dpdk.org \
    --cc=yong.liu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).