[dts] [PATCH V1] framework/pktgen.py for next branch: remove hard code and enhance TREX function by adding DUT and TREX port mapping
wang fei
feix.y.wang at intel.com
Wed Dec 20 12:08:09 CET 2017
Signed-off-by: wang fei <feix.y.wang at intel.com>
---
framework/pktgen.py | 135 +++++++++++++++++++++++++++++++++++++---------------
1 file changed, 96 insertions(+), 39 deletions(-)
diff --git a/framework/pktgen.py b/framework/pktgen.py
index 03550bd..505f49d 100644
--- a/framework/pktgen.py
+++ b/framework/pktgen.py
@@ -49,7 +49,6 @@ from exception import VerifyFailure
from utils import create_mask
from uuid import uuid4
from pickletools import optimize
-from tester import Tester
#from serializer import Serializer
FORMAT = '%(message)s'
@@ -62,14 +61,10 @@ sys.path.append(cwd + '/nics')
sys.path.append(cwd + '/framework')
sys.path.append(cwd + '/tests')
sys.path.append(cwd + '/dep')
-#sys.path.append("/opt/trex-core-2.26/scripts/automation/trex_control_plane/stl/trex_stl_lib")
-sys.path.insert(0, "/opt/trex-core-2.26/scripts/automation/"+\
- "trex_control_plane/stl")
-#from api import STLClient, STLStream, STLPktBuilder, Ether, IP, STLTXCont
-from trex_stl_lib.api import *
+
from crb import Crb
-from config import PktgenConf, CrbsConf
-#from net_device import GetNicObj
+from config import PktgenConf, CrbsConf, PortConf
+
class PacketGenerator(object):
#class PacketGenerator(Crb):
@@ -79,15 +74,45 @@ class PacketGenerator(object):
"""
def __init__(self, tester):
self.__streams = []
+ self._ports_map = []
self.tester = tester
@abstractmethod
def _check_options(self, opts={}):
pass
- @abstractmethod
def prepare_generator(self):
- pass
+ self._prepare_generator()
+
+ # extened tester port map and self port map
+ ports = self._get_ports()
+ print ports
+ tester_portnum = len(self.tester.ports_info)
+ for port_idx in range(len(ports)):
+ port_info = {'type': '%s' % self.pktgen_type, 'pci': '%s' % ports[port_idx]}
+ self._ports_map.append(tester_portnum + port_idx)
+ self.tester.ports_info.append(port_info)
+ print self._ports_map
+ # update dut port map
+ portconf = PortConf()
+ for dut in self.tester.duts:
+ dut.map_available_ports()
+
+ def _convert_pktgen_port(self, port_id):
+ try:
+ port = self._ports_map[port_id]
+ except:
+ port = -1
+
+ return port
+
+ def _convert_tester_port(self, port_id):
+ try:
+ port = self._ports_map.index(port_id)
+ except:
+ port = -1
+
+ return port
@abstractmethod
def _prepare_transmission(self, stream_ids=[]):
@@ -108,9 +133,12 @@ class PacketGenerator(object):
def add_stream(self, tx_port, rx_port, pcap_file):
stream_id = None
+ pktgen_tx_port = self._convert_tester_port(tx_port)
+ pktgen_rx_port = self._convert_tester_port(rx_port)
+
stream_id = len(self.__streams)
- stream = {'tx_port': tx_port,
- 'rx_port': rx_port,
+ stream = {'tx_port': pktgen_tx_port,
+ 'rx_port': pktgen_rx_port,
'pcap_file': pcap_file}
self.__streams.append(stream)
@@ -148,8 +176,6 @@ class PacketGenerator(object):
return bps_rx_total, pps_rx_total
-
-
def _summary_statistic(self, array=[]):
"""
Summary all values in statistic array
@@ -158,14 +184,13 @@ class PacketGenerator(object):
for value in array:
summary += value
-
return summary
def _get_stream(self, stream_id):
return self.__streams[stream_id]
- def _get_generator_conf_instance(self, pktgen_type):
- conf_inst = PktgenConf(pktgen_type=pktgen_type)
+ def _get_generator_conf_instance(self):
+ conf_inst = PktgenConf(self.pktgen_type)
return conf_inst
@abstractmethod
@@ -178,13 +203,14 @@ class TrexPacketGenerator(PacketGenerator):
https://trex-tgn.cisco.com/trex/doc/trex_manual.html
"""
def __init__(self, tester):
+ self.pktgen_type = "trex"
self._conn = None
self._ports = []
self._traffic_ports = []
self._transmit_streams = {}
self.trex_app = "scripts/t-rex-64"
- self.conf_inst = self._get_generator_conf_instance("trex")
+ self.conf_inst = self._get_generator_conf_instance()
self.conf = self.conf_inst.load_pktgen_config()
self.options_keys = [ 'rate', 'ip', 'vlan']
self.ip_keys = ['start', 'end','action', 'mask', 'step']
@@ -200,6 +226,15 @@ class TrexPacketGenerator(PacketGenerator):
logger.debug(self._ports)
+ def _get_ports(self):
+ """
+ Return self ports information
+ """
+ ports = []
+ for idx in range(len(self._ports)):
+ ports.append('TREX:%d' % idx)
+ return ports
+
def disconnect(self):
self._conn.disconnect()
@@ -252,7 +287,7 @@ class TrexPacketGenerator(PacketGenerator):
return vm
- def prepare_generator(self):
+ def _prepare_generator(self):
app_param_temp = "-i"
for key in self.conf:
@@ -262,18 +297,30 @@ class TrexPacketGenerator(PacketGenerator):
elif key == 'core_num':
app_param_temp = app_param_temp + " -c " + self.conf[key]
- app = self.conf['trex_root_path'] + os.sep + self.trex_app
- cmd = app + " " + app_param_temp
-
- self.tester.send_expect("cd /opt/trex-core-2.26/scripts", "#", 70)
- self.tester.send_expect(cmd, "", 40)
+ # Insert Trex api library
+ sys.path.insert(0, "{0}/scripts/automation/trex_control_plane/stl".format(self.conf['trex_root_path']))
+ #from trex_stl_lib.api import *
+ global STLClient
+ global STLVmFlowVar
+ global STLVmWrFlowVar
+ global STLVmFixIpv4
+ global STLStream
+ global STLPktBuilder
+ global STLTXCont
+ from trex_stl_lib.api import STLClient, STLStream, STLPktBuilder, Ether, IP, STLTXCont, STLVmFlowVar, STLVmWrFlowVar,\
+ STLVmFixIpv4
+
+ # Launch Trex Server
+ #app = self.conf['trex_root_path'] + os.sep + self.trex_app
+ #cmd = app + " " + app_param_temp
+ #self.control_session.send_expect("cd {0}/scripts".format(self.conf['trex_root_path']), "#", 70)
+ #self.control_session.send_expect(cmd, "", 40)
time.sleep(15)
self.connect()
-
- self.tester.send_expect("cd " + cwd, "#", 70)
+ #self.control_session.send_expect("cd " + cwd, "", 70)
def _prepare_transmission(self, stream_ids=[]):
# Create base packet and pad it to size
@@ -290,9 +337,14 @@ class TrexPacketGenerator(PacketGenerator):
rx_port = stream['rx_port']
rx_port_name = "port%d" % rx_port
option = stream['options']
-
+ pcap_file = stream["pcap_file"]
#set rate
rate = option['rate']
+ if "ip" not in option:
+ stl_stream = STLStream(packet = STLPktBuilder(pkt = pcap_file), mode = STLTXCont(percentage=100))
+ self._transmit_streams[stream_id] = stl_stream
+ continue
+
ip = option['ip']
mask = ip['mask']
step_temp = ip['step'].split('.')
@@ -312,11 +364,11 @@ class TrexPacketGenerator(PacketGenerator):
ip_dst_range['start'] = ip_dst_range_temp[0]
ip_dst_range['end'] = ip_dst_range_temp[1]
- pcap_file = stream['pcap_file']
+ # pcap_file = stream['pcap_file']
vm = self.create_vm(ip_src_range, ip_dst_range, action=ip['action'], step=step_temp[3])
- stl_stream = STLStream(packet = STLPktBuilder(pkt = pcap_file, vm=vm), mode = STLTXCont(percentage=100))
+ stl_stream = STLStream(packet = STLPktBuilder(pkt = pcap_file, vm = vm), mode = STLTXCont(percentage=100))
self._transmit_streams[stream_id] = stl_stream
@@ -327,17 +379,20 @@ class TrexPacketGenerator(PacketGenerator):
duration_int = int(self.conf["duration"])
rate = "100%"
warmup = 15
-
+
if self.conf.has_key("warmup"):
warmup = int(self.conf["warmup"])
- for p in self._ports:
- for stream_id in stream_ids:
- stream = self._get_stream(stream_id)
- if stream["tx_port"] == p:
- self._conn.add_streams(self._transmit_streams[stream_id], ports=[p])
- rate = stream["options"]["rate"]
- self._traffic_ports.append(p)
+ for stream_id in stream_ids:
+ stream = self._get_stream(stream_id)
+ # tester port to Trex port
+ tx_port = stream["tx_port"]
+ p = self._ports[tx_port]
+ self._conn.add_streams(self._transmit_streams[stream_id], ports=[p])
+ rate = stream["options"]["rate"]
+ self._traffic_ports.append(p)
+
+ print self._traffic_ports
if self.conf.has_key("core_mask"):
self._conn.start(ports=self._traffic_ports, mult=rate, duration=warmup, core_mask=self.conf["core_mask"])
@@ -345,7 +400,7 @@ class TrexPacketGenerator(PacketGenerator):
else:
self._conn.start(ports=self._traffic_ports, mult=rate, duration=warmup)
self._conn.wait_on_traffic(ports=self._traffic_ports, timeout=warmup+30)
-
+
self._conn.clear_stats()
if self.conf.has_key("core_mask"):
@@ -378,6 +433,7 @@ def getPacketGenerator(tester, pktgen_type="trex"):
"""
Get packet generator object
"""
+ pktgen_type = pktgen_type.lower()
if pktgen_type == "dpdk":
return DpdkPacketGenerator(tester)
@@ -389,6 +445,8 @@ def getPacketGenerator(tester, pktgen_type="trex"):
if __name__ == "__main__":
# init pktgen stream options
+
+ from tester import Tester
options = {
'rate' : '100%',
'ip': {'action': 'inc', 'mask' : '255.255.255.0', 'step':'0.0.0.1'}
@@ -399,7 +457,6 @@ if __name__ == "__main__":
# framework initial
trex = getPacketGenerator(tester, pktgen_type="trex")
- conf_inst = trex._get_generator_conf_instance("trex")
conf = conf_inst.load_pktgen_config()
# prepare running environment
trex.prepare_generator()
--
2.7.4
More information about the dts
mailing list