test suite reviews and discussions
 help / color / mirror / Atom feed
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


  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).