From: yufengmx <yufengx.mo@intel.com>
To: dts@dpdk.org
Cc: yufengmx <yufengx.mo@intel.com>
Subject: [dts] [next][PATCH V1 3/14] framework/pktgen: packet generator init and trex port
Date: Sun, 28 Apr 2019 10:49:10 +0800 [thread overview]
Message-ID: <1556419751-41723-14-git-send-email-yufengx.mo@intel.com> (raw)
In-Reply-To: <1556419751-41723-1-git-send-email-yufengx.mo@intel.com>
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 <yufengx.mo@intel.com>
---
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
next prev parent reply other threads:[~2019-04-28 2:45 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-28 2:48 [dts] [next][PATCH V1 0/14] [dts/pktgen]: dts packet generator api yufengmx
2019-04-28 2:48 ` [dts] [next][PATCH V1 1/14] conf/pktgen: add pktgen key word in crbs.cfg yufengmx
2019-04-28 2:48 ` [dts] [next][PATCH V1 2/14] conf/pktgen: packet generator configure file definition yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 3/14] doc/pktgen: trex tool known issues yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 4/14] doc/pktgen: migrate from etgen api to pktgen api yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 5/14] doc/pktgen: pktgen api program guide document yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 6/14] framework/pktgen: packet generator configure file parse yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 7/14] framework/pktgen: initialize pktgen logger yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 8/14] framework/pktgen: packet generator base class yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 9/14] framework/pktgen: ixia packet generator relevant classes yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 0/14] framework/pktgen: trex " yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 1/14] framework/pktgen: pktgen instance creation and helper yufengmx
2019-04-28 2:49 ` [dts] [next][PATCH V1 2/14] framework/pktgen: packet generator types definition yufengmx
2019-04-28 2:49 ` yufengmx [this message]
2019-04-28 2:49 ` [dts] [next][PATCH V1 4/14] framework/pktgen: utils methods yufengmx
2019-05-29 2:45 ` [dts] [next][PATCH V1 0/14] [dts/pktgen]: dts packet generator api Tu, Lijuan
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=1556419751-41723-14-git-send-email-yufengx.mo@intel.com \
--to=yufengx.mo@intel.com \
--cc=dts@dpdk.org \
/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).