From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 03F85A09EF; Wed, 16 Dec 2020 03:02:56 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C286B2B83; Wed, 16 Dec 2020 03:02:55 +0100 (CET) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 852551E34 for ; Wed, 16 Dec 2020 03:02:54 +0100 (CET) IronPort-SDR: NsOVvmLBVBbi2Nq+/UQ4sci4DEg6fOuczUWaG4sx0mb4Kv1py3Z6REIVWSHBzPjTiZ4uecTjMM 3QUxXrAw+/uw== X-IronPort-AV: E=McAfee;i="6000,8403,9836"; a="174215058" X-IronPort-AV: E=Sophos;i="5.78,423,1599548400"; d="scan'208";a="174215058" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Dec 2020 18:02:52 -0800 IronPort-SDR: bidgRGfAPJV+elJk6gI9P5UKRDOV4OGUXekdRqQjCFDLxjYTIdZyChwM2mqHR5swfKVAlL8/vk IrPumrmbK91w== X-IronPort-AV: E=Sophos;i="5.78,423,1599548400"; d="scan'208";a="451527200" Received: from unknown (HELO localhost.localdomain) ([10.240.183.80]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Dec 2020 18:02:50 -0800 From: Zhou Jun To: dts@dpdk.org Cc: Zhou Jun Date: Wed, 16 Dec 2020 10:05:28 +0800 Message-Id: <20201216020528.13114-1-junx.w.zhou@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [dts] [PATCH V1] tests/TestSuite_stats_checks: add new case xstats check for PF and VF 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" add new case xstats_check_PF and xstats_check_VF Signed-off-by: Zhou Jun --- tests/TestSuite_stats_checks.py | 102 +++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git a/tests/TestSuite_stats_checks.py b/tests/TestSuite_stats_checks.py index 4fdc0869..74de4eee 100644 --- a/tests/TestSuite_stats_checks.py +++ b/tests/TestSuite_stats_checks.py @@ -36,16 +36,21 @@ Stats Checks example. """ from time import sleep from typing import List, Iterator, Tuple - +import random +import struct +import socket +import re import utils from pmd_output import PmdOutput - +import packet from test_case import TestCase ETHER_HEADER_LEN = 18 IP_HEADER_LEN = 20 ETHER_STANDARD_MTU = 1518 +RANDOM_IP_POOL = ['192.168.10.222/0'] +prefix_list = ['rx_good_packets', 'tx_good_packets', 'rx_good_bytes', 'tx_good_bytes'] class TestStatsChecks(TestCase): @@ -90,6 +95,18 @@ class TestStatsChecks(TestCase): self.tester.scapy_append(f'sendp({packet}, iface="{itf}")') return self.tester.scapy_execute() + def get_random_ip(self): + str_ip = RANDOM_IP_POOL[random.randint(0, len(RANDOM_IP_POOL) - 1)] + str_ip_addr = str_ip.split('/')[0] + str_ip_mask = str_ip.split('/')[1] + ip_addr = struct.unpack('>I', socket.inet_aton(str_ip_addr))[0] + mask = 0x0 + for i in range(31, 31 - int(str_ip_mask), -1): + mask = mask | (1 << i) + ip_addr_min = ip_addr & (mask & 0xffffffff) + ip_addr_max = ip_addr | (~mask & 0xffffffff) + return socket.inet_ntoa(struct.pack('>I', random.randint(ip_addr_min, ip_addr_max))) + def send_packet_of_size_to_port(self, port_id: int, pktsize: int): # The packet total size include ethernet header, ip header, and payload. @@ -100,6 +117,22 @@ class TestStatsChecks(TestCase): f'Ether(dst=dutmac, src="52:00:00:00:00:00")/IP()/Raw(load="\x50"*{padding})') return out + def send_pkt_with_random_ip(self, port, count, if_vf=False): + """ + send pkt with random ip + port: send pkt port + count: pkt count + """ + pkt = packet.Packet() + pkt.assign_layers(['ether', 'ipv4']) + mac = self.pmdout.get_port_mac(port) if if_vf else self.dut.get_mac_address(port) + for i in range(count): + src_ip = self.get_random_ip() + pkt.config_layers([('ether', {'dst': mac}), + ('ipv4', {'src': src_ip})]) + pkt.send_pkt(crb=self.tester, tx_port=self.tester.get_interface(self.tester.get_local_port(self.dut_ports[0]))) + + def send_packet_of_size_to_tx_port(self, pktsize, received=True): """ Send 1 packet to portid @@ -141,6 +174,59 @@ class TestStatsChecks(TestCase): stats = self.pmdout.get_pmd_stats(portid) return stats['TX-packets'], stats['TX-errors'], stats['TX-bytes'] + def get_xstats(self, port_id_list): + xstats_data = dict() + for port_id in port_id_list: + out = self.exec('show port xstats %s' % port_id) + tmp_data = dict() + for prefix in prefix_list: + pattern = re.compile('%s:(\s+)([0-9]+)' % prefix) + m = pattern.search(out) + if not m: + tmp_data.setdefault(prefix, 0) + else: + tmp_data.setdefault(prefix, int(m.group(2))) + xstats_data[port_id] = tmp_data + return xstats_data + + def verify_results(self, xstats_data, rx_port, tx_port, stats_data={}, if_zero=False): + if if_zero: + for port in xstats_data.keys(): + self.verify(not any(xstats_data[port].values()), 'xstats Initial value error! port {} xstats ' + 'data is {}'.format(port, xstats_data[port])) + else: + self.verify(xstats_data[rx_port]['rx_good_packets'] == stats_data[rx_port]['RX-packets'] + == xstats_data[tx_port]['tx_good_packets'] == stats_data[tx_port]['TX-packets'] + == 100, "pkt recieve or transport count error!") + self.verify(xstats_data[rx_port]['rx_good_bytes'] == stats_data[rx_port]['RX-bytes'] == + xstats_data[tx_port]['tx_good_bytes'] == stats_data[tx_port]['TX-bytes'], + 'pkt recieve or transport bytes error!') + + def xstats_check(self, rx_port, tx_port, if_vf=False): + self.exec ("port config all rss all") + self.exec ("set fwd mac") + org_xstats = self.get_xstats([rx_port, tx_port]) + self.verify_results(org_xstats, rx_port, tx_port, if_zero=True) + self.exec ("start") + + self.send_pkt_with_random_ip(tx_port, count=100, if_vf=if_vf) + + self.exec ("stop") + if rx_port == tx_port: + final_xstats = self.get_xstats([rx_port]) + stats_data = {rx_port: self.pmdout.get_pmd_stats(rx_port)} + else: + rx_stats_info = self.pmdout.get_pmd_stats(rx_port) + tx_stats_info = self.pmdout.get_pmd_stats(tx_port) + final_xstats = self.get_xstats([rx_port, tx_port]) + stats_data = {rx_port: rx_stats_info, + tx_port: tx_stats_info + } + self.verify_results(final_xstats, rx_port, tx_port, stats_data=stats_data) + + self.pmdout.quit() + + def set_up_all(self): """ Prerequisite steps for each test suit. @@ -192,3 +278,15 @@ class TestStatsChecks(TestCase): self.exec("stop") self.pmdout.quit() + + def test_xstats_check_pf(self): + self.pmdout.start_testpmd('default', '--rxq=4 --txq=4') + self.xstats_check(self.rx_port, self.tx_port) + + def test_xstats_check_vf(self): + self.dut.generate_sriov_vfs_by_port(self.dut_ports[0], 1, self.kdriver) + self.vf_port = self.dut.ports_info[self.dut_ports[0]]["vfs_port"][0] + self.vf_port.bind_driver(driver="vfio-pci") + self.vf_port_pci = self.dut.ports_info[self.dut_ports[0]]['sriov_vfs_pci'][0] + self.pmdout.start_testpmd('default', '--rxq=4 --txq=4', eal_param='-w %s' % self.vf_port_pci) + self.xstats_check(0, 0, if_vf=True) -- 2.17.1