From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 6B540F6A8 for ; Thu, 9 Feb 2017 11:07:26 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga105.jf.intel.com with ESMTP; 09 Feb 2017 02:07:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,349,1484035200"; d="scan'208";a="1124174567" Received: from unknown (HELO dpdk-fedora20.icx.intel.com) ([10.240.176.135]) by fmsmga002.fm.intel.com with ESMTP; 09 Feb 2017 02:07:21 -0800 From: "xu,gang" To: dts@dpdk.org Cc: "xu,gang" Date: Thu, 9 Feb 2017 18:08:28 +0800 Message-Id: <1486634908-21999-1-git-send-email-gangx.xu@intel.com> X-Mailer: git-send-email 1.9.3 Subject: [dts] [PATCH V1] add test suite interrupt pmd 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: Thu, 09 Feb 2017 10:07:27 -0000 Signed-off-by: xu,gang --- tests/TestSuite_interrupt_pmd.py | 156 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 tests/TestSuite_interrupt_pmd.py diff --git a/tests/TestSuite_interrupt_pmd.py b/tests/TestSuite_interrupt_pmd.py new file mode 100644 index 0000000..6acb99d --- /dev/null +++ b/tests/TestSuite_interrupt_pmd.py @@ -0,0 +1,156 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2017 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 interrupt pmd. +""" + +import string +import re +import time +import utils +from test_case import TestCase +from utils import create_mask +from packet import Packet, sniff_packets, load_sniff_packets + + +class TestIntrPmd(TestCase): + + def set_up_all(self): + """ + Run before each test suite. + """ + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) >= 2, "Insufficient ports") + self.portmask = utils.create_mask(self.dut_ports) + + self.path = "./examples/l3fwd-power/build/l3fwd-power" + # build sample app + out = self.dut.send_expect("make -C examples/l3fwd-power", "# ") + self.verify("Error" not in out, "compilation error 1") + self.verify("No such file" not in out, "compilation error 2") + + def set_up(self): + """ + Run before each test case. + """ + pass + + def scapy_send_packet(self,num = 1): + """ + Send a packet to port + """ + self.dmac = self.dut.get_mac_address(self.dut_ports[0]) + txport = self.tester.get_local_port(self.dut_ports[0]) + self.txItf = self.tester.get_interface(txport) + pkt = Packet(pkt_type='UDP') + pkt.config_layer('ether', {'dst': self.dmac,}) + pkt.send_pkt(tx_port=self.txItf,count=num) + + def test_basal(self): + """ + Verify interrupt pmd work fine when nic bound to vfio + """ + cores = self.dut.get_core_list("1S/2C/1T") + coremask = create_mask(cores) + cmd = self.path + " -c %s -n %d -- -p %s -P " \ + "--config=\"(0,0,%s),(1,0,%s)\" " \ + % (coremask, self.dut.get_memory_channels(), + self.portmask, cores[0], cores[1]) + out1=self.dut.send_expect(cmd, "sleeps until interrupt triggers", 60) + self.scapy_send_packet() + out = self.dut.get_session_output(timeout=5) + self.dut.send_expect("^C", "# ") + self.verify_status(out) + + def test_pf_multiqueue(self): + """ + Verify interrupt pmd work fine with multi queues + """ + cores = self.dut.get_core_list("1S/4C/1T") + coremask = create_mask(cores) + cmd = self.path + " -c %s -n %d -- -p %s -P " \ + "--config=\"(0,0,%s),(0,1,%s),(1,0,%s),(1,1,%s)\"" \ + % (coremask, self.dut.get_memory_channels(), + self.portmask, cores[0], cores[1], cores[2], cores[3]) + self.dut.send_expect(cmd, "sleeps until interrupt triggers", 60) + self.scapy_send_packet() + out = self.dut.get_session_output(timeout=5) + self.dut.send_expect("^C", "# ") + self.verify_status(out) + + def test_pf_maxqueue(self): + """ + Verify interrupt pmd work fine with maximum queues + """ + cores = self.dut.get_core_list("2S/16C/2T") + coremask = create_mask(cores) + config_cmd = "--config=\"" + #At most 15 intr queues supported + max_queue = 15 + for idx in range(max_queue): + config_cmd += "(0,%d,%s)," % (idx, cores[idx]) + for idx in range(max_queue): + config_cmd += "(1,%d,%s)," % (idx, cores[idx + max_queue]) + config_cmd += "\"" + cmd = self.path + " -c %s -n %d -- -p %s -P " % (coremask, self.dut.get_memory_channels(),self.portmask) + cmd += config_cmd + put=self.dut.send_expect(cmd, "sleeps until interrupt triggers", 60) + self.scapy_send_packet() + out = self.dut.get_session_output(timeout=5) + self.dut.send_expect("^C", "# ") + self.verify_status(out) + + def verify_status(self,out): + """ + Verify core status change + """ + # make sure core normally waked up + wakeup_msg = "waked up from rx interrupt" + self.verify(wakeup_msg in out, "Expected core not waked up") + # make sure core normally sleep + sleep_msg = "sleeps until interrupt triggers" + self.verify(sleep_msg in out, "Expected core not sleep") + + def tear_down(self): + """ + Run after each test suite. + """ + self.dut.kill_all() + time.sleep(2) + pass + + def tear_down_all(self): + """ + Run after each test suite. + """ + pass -- 1.9.3