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 8CFDECE7 for ; Tue, 2 Feb 2016 07:11:47 +0100 (CET) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP; 01 Feb 2016 22:11:46 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,383,1449561600"; d="scan'208";a="40728883" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga004.fm.intel.com with ESMTP; 01 Feb 2016 22:11:45 -0800 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id u126Bgcp028303; Tue, 2 Feb 2016 14:11:42 +0800 Received: from shecgisg003.sh.intel.com (localhost [127.0.0.1]) by shecgisg003.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id u126Be5j010847; Tue, 2 Feb 2016 14:11:42 +0800 Received: (from jingguox@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id u126BeMQ010843; Tue, 2 Feb 2016 14:11:40 +0800 From: Jingguo Fu To: dts@dpdk.org Date: Tue, 2 Feb 2016 14:11:25 +0800 Message-Id: <1454393485-10799-3-git-send-email-jingguox.fu@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1454393485-10799-1-git-send-email-jingguox.fu@intel.com> References: <1454393485-10799-1-git-send-email-jingguox.fu@intel.com> Cc: Jingguo Fu Subject: [dts] [DTS][PATCH V4 3/3] virt: vf to vf nic bridge test suite 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: Tue, 02 Feb 2016 06:11:48 -0000 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 update: settle env prepare to set_up for debug require Signed-off-by: Jingguo Fu --- tests/TestSuite_vf_to_vf_nic_bridge.py | 244 +++++++++++++++++++++++++++++++++ 1 file changed, 244 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..2da9645 --- /dev/null +++ b/tests/TestSuite_vf_to_vf_nic_bridge.py @@ -0,0 +1,244 @@ +# 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): + self.set_up_vf_to_vf_env() + + def set_up_vf_to_vf_env(self, driver='default'): + 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.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.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.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 -- 2.1.0