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 DD864A0679 for ; Sun, 28 Apr 2019 04:45:43 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 011841B564; Sun, 28 Apr 2019 04:45:43 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 8046F4C93 for ; Sun, 28 Apr 2019 04:45:41 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2019 19:45:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,403,1549958400"; d="scan'208";a="146438617" Received: from itecstvdts01.sh.intel.com ([10.67.111.114]) by fmsmga007.fm.intel.com with ESMTP; 27 Apr 2019 19:45:40 -0700 From: yufengmx To: dts@dpdk.org Cc: yufengmx Date: Sun, 28 Apr 2019 10:49:10 +0800 Message-Id: <1556419751-41723-14-git-send-email-yufengx.mo@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1556419751-41723-1-git-send-email-yufengx.mo@intel.com> References: <1556419751-41723-1-git-send-email-yufengx.mo@intel.com> Subject: [dts] [next][PATCH V1 3/14] framework/pktgen: packet generator init and trex port 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" mapping packet generator init and trex port mapping Move pktgen init process in init_ext_gen method(). Add is_pktgen() to check if pktgen module configuration is set by user. Add restore_trex_interfaces() to restore ports used by trex tool after trex tool quit. Use crbs.cfg setting to avoid duplicate parsing pktgen.cfg content. Set pktgen quit process before dts default sessions close. Signed-off-by: yufengmx --- framework/tester.py | 136 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 113 insertions(+), 23 deletions(-) mode change 100755 => 100644 framework/tester.py diff --git a/framework/tester.py b/framework/tester.py old mode 100755 new mode 100644 index ce02b7f..9a6f6aa --- a/framework/tester.py +++ b/framework/tester.py @@ -1,6 +1,6 @@ # BSD LICENSE # -# Copyright(c) 2010-2014 Intel Corporation. All rights reserved. +# Copyright(c) 2010-2019 Intel Corporation. All rights reserved. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -38,16 +38,18 @@ import subprocess import os from time import sleep from settings import NICS, load_global_setting, PERF_SETTING +from settings import IXIA, USERNAME, PKTGEN, PKTGEN_GRP from crb import Crb from net_device import GetNicObj from etgen import IxiaPacketGenerator, SoftwarePacketGenerator -from settings import IXIA, USERNAME import random from utils import GREEN, convert_int2ip, convert_ip2int from exception import ParameterInvalidException from multiprocessing import Process -from pktgen import getPacketGenerator, PktgenConf +from pktgen import getPacketGenerator +from config import PktgenConf + class Tester(Crb): """ @@ -71,13 +73,19 @@ class Tester(Crb): self.bgCmds = [] self.bgItf = '' self.re_run_time = 0 + self.pktgen = None + self.ixia_packet_gen = None def init_ext_gen(self): """ Initialize tester packet generator object. """ if self.it_uses_external_generator(): - self.ixia_packet_gen = IxiaPacketGenerator(self) + if self.is_pktgen: + self.pktgen_init() + else: + self.ixia_packet_gen = IxiaPacketGenerator(self) + return self.packet_gen = SoftwarePacketGenerator(self) def set_re_run(self, re_run_time): @@ -91,7 +99,7 @@ class Tester(Crb): Get ip address of tester CRB. """ return self.crb['tester IP'] - + def get_username(self): """ Get login username of tester CRB. @@ -104,12 +112,32 @@ class Tester(Crb): """ return self.crb['tester pass'] + @property + def is_pktgen(self): + """ + Check whether packet generator is configured. + """ + if PKTGEN not in self.crb or not self.crb[PKTGEN]: + return False + + if self.crb[PKTGEN].lower() in PKTGEN_GRP: + return True + else: + msg = os.linesep.join([ + "Packet generator <{0}> is not supported".format(self.crb[PKTGEN]), + "Current supports: {0}".format(' | '.join(PKTGEN_GRP))]) + self.logger.info(msg) + return False + def has_external_traffic_generator(self): """ Check whether performance test will base on IXIA equipment. """ try: - if self.crb[IXIA] is not None: + # if pktgen_group is set, take pktgen config file as first selection + if self.is_pktgen: + return True + elif self.crb[IXIA] is not None: return True except Exception as e: return False @@ -140,7 +168,6 @@ class Tester(Crb): self.pci_devices_information() self.restore_interfaces() self.scan_ports() - self.pktgen_init() def get_local_port(self, remotePort): """ @@ -251,6 +278,30 @@ class Tester(Crb): sleep(2) + def restore_trex_interfaces(self): + """ + Restore Linux interfaces used by trex + """ + try: + for port_info in self.ports_info: + nic_type = port_info.get('type') + if nic_type is not 'trex': + continue + pci_bus = port_info.get('pci') + port_inst = port_info.get('port') + port_inst.bind_driver() + itf = port_inst.get_interface_name() + self.enable_ipv6(itf) + self.send_expect("ifconfig %s up" % itf, "# ") + if port_inst.get_interface2_name(): + itf = port_inst.get_interface2_name() + self.enable_ipv6(itf) + self.send_expect("ifconfig %s up" % itf, "# ") + except Exception as e: + self.logger.error(" !!! Restore ITF: " + e.message) + + sleep(2) + def set_promisc(self): try: for (pci_bus, pci_id) in self.pci_devices_info: @@ -284,6 +335,28 @@ class Tester(Crb): cached_ports_info.append(port_info) self.serializer.save(self.PORT_INFO_CACHE_KEY, cached_ports_info) + def _scan_pktgen_ports(self): + ''' packet generator port setting + Currently, trex run on tester node + ''' + pktgen_ports_info = self.pktgen.get_ports() + for pktgen_port_info in pktgen_ports_info: + pktgen_port_type = pktgen_port_info['type'] + if pktgen_port_type.lower() == 'ixia': + self.ports_info.extend(pktgen_ports_info) + break + pktgen_port_name = pktgen_port_info['intf'] + pktgen_pci = pktgen_port_info['pci'] + pktgen_mac = pktgen_port_info['mac'] + for port_info in self.ports_info: + dts_pci = port_info['pci'] + if dts_pci != pktgen_pci: + continue + port_info['intf'] = pktgen_port_name + port_info['type'] = pktgen_port_type + port_info['mac'] = pktgen_mac + break + def scan_ports(self): """ Scan all ports on tester and save port's pci/mac/interface. @@ -295,7 +368,10 @@ class Tester(Crb): if not self.read_cache or self.ports_info is None: self.scan_ports_uncached() if self.it_uses_external_generator(): - self.ports_info.extend(self.ixia_packet_gen.get_ports()) + if self.is_pktgen: + self._scan_pktgen_ports() + else: + self.ports_info.extend(self.ixia_packet_gen.get_ports()) self.save_serializer_ports() for port_info in self.ports_info: @@ -359,7 +435,7 @@ class Tester(Crb): 'type': pci_id, 'intf': intf, 'mac': macaddr, - 'ipv4': ipv4, + 'ipv4': ipv4, 'ipv6': ipv6}) # return if port is not connect x3 @@ -382,14 +458,14 @@ class Tester(Crb): 'ipv6': ipv6}) def pktgen_init(self): - pktgen = PktgenConf() - pktgen_inst_type = pktgen.pktgen_conf.get_sections() - if len(pktgen_inst_type) == 1 and pktgen_inst_type[0] == "TREX": - pktgen_type = "TREX" - # init packet generator instance - self.pktgen = getPacketGenerator(self, pktgen_type) - # prepare running environment - self.pktgen.prepare_generator() + ''' + initialize packet generator instance + ''' + pktgen_type = self.crb[PKTGEN] + # init packet generator instance + self.pktgen = getPacketGenerator(self, pktgen_type) + # prepare running environment + self.pktgen.prepare_generator() def send_ping(self, localPort, ipv4, mac): """ @@ -404,10 +480,14 @@ class Tester(Crb): """ Send ping6 packet from local port with destination ipv6 address. """ - if self.ports_info[localPort]['type'].lower() == 'ixia': + if self.is_pktgen: + if self.ports_info[localPort]['type'].lower() in 'ixia': + return self.packet_gen.send_ping6( + self.ports_info[localPort]['pci'], mac, ipv6) + elif self.ports_info[localPort]['type'].lower() == 'trex': + return "Not implemented yet" + elif self.ports_info[localPort]['type'].lower() in 'ixia': return self.ixia_packet_gen.send_ping6(self.ports_info[localPort]['pci'], mac, ipv6) - elif self.ports_info[localPort]['type'].lower() == 'trex': - return "Not implemented yet" else: return self.send_expect("ping6 -w 5 -c 5 -A %s%%%s" % (ipv6, self.ports_info[localPort]['intf']), "# ", 10) @@ -686,6 +766,10 @@ class Tester(Crb): """ Update packet generator function, will implement later. """ + # packet generator has forbidden suite class to override parent class methods + if self.is_pktgen: + return + # discard this in future if self.it_uses_external_generator(): self.ixia_packet_gen.__class__ = clazz current_attrs = instance.__dict__ @@ -770,19 +854,25 @@ class Tester(Crb): """ Close ssh session and IXIA tcl session. """ + if self.it_uses_external_generator(): + if self.is_pktgen and self.pktgen: + self.pktgen.quit_generator() + self.restore_trex_interfaces() + self.pktgen = None + elif self.ixia_packet_gen: + self.ixia_packet_gen.close() + self.ixia_packet_gen = None + if self.session: self.session.close() self.session = None if self.alt_session: self.alt_session.close() self.alt_session = None - if self.it_uses_external_generator(): - self.ixia_packet_gen.close() def crb_exit(self): """ Close all resource before crb exit """ - self.pktgen.quit_generator() self.logger.logger_exit() self.close() -- 1.9.3