NFVBENCH-152 Add service_mode method for debugging purpose 40/68640/4
authorLouin Pierrick <pierrick.louin@orange.com>
Tue, 15 Oct 2019 13:42:14 +0000 (15:42 +0200)
committerfmenguy <francoisregis.menguy@orange.com>
Wed, 23 Oct 2019 15:46:46 +0000 (17:46 +0200)
Change-Id: I17b70a26ea0df1b5b616db6039813c83a1efe799
Signed-off-by: fmenguy <francoisregis.menguy@orange.com>
docs/testing/user/userguide/advanced.rst
nfvbench/cfg.default.yaml
nfvbench/nfvbench.py
nfvbench/traffic_client.py
nfvbench/traffic_gen/dummy.py
nfvbench/traffic_gen/trex_gen.py
test/test_nfvbench.py

index e49cfab..b36f01e 100644 (file)
@@ -350,3 +350,79 @@ Example of run:
     #
 
 The --force-cleanup option will do the same but without prompting for confirmation.
+
+Service mode for TRex
+---------------------
+
+The ``--service-mode`` option allows you to capture traffic on a TRex window during the NFVBench test. Thus, you will be
+able to capture packets generated by TRex to observe many information on it.
+
+Example of use :
+
+.. code-block:: bash
+
+    nfvbench ``--service-mode``
+
+.. note:: It is preferable to define the minimum rate (2002 pps) to have a better capture
+
+In another bash window, you should connect to the TRex console doing :
+
+.. code-block:: bash
+
+    cd /opt/trex/vX.XX/ #use completion here to find your corresponding TRex version
+    ./trex-console -r
+    capture start monitor --rx [port number] -v
+
+Start this capture once you have started the NFVBench test, and you will observe packets on the TRex console :
+
+.. code-block:: bash
+
+    #26342 Port: 0 ◀── RX
+
+    trex(read-only)>
+
+        Type: UDP, Size: 66 B, TS: 26.30 [sec]
+
+    trex(read-only)>
+        ###[ Ethernet ]###
+            dst       = a0:36:9f:7a:58:8e
+            src       = fa:16:3e:57:8f:df
+            type      = 0x8100
+        ###[ 802.1Q ]###
+            prio      = 0
+            id        = 0
+            vlan      = 1093
+            type      = 0x800
+        ###[ IP ]###
+            version   = 4
+            ihl       = 5
+            tos       = 0x1
+            len       = 46
+            id        = 65535
+            flags     =
+            frag      = 0
+            ttl       = 63
+            proto     = udp
+            chksum    = 0x8425
+            src       = 120.0.0.0
+            dst       = 110.0.17.153
+            \options   \
+        ###[ UDP ]###
+            sport     = 53
+            dport     = 53
+            len       = 26
+            chksum    = 0xfd83
+        ###[ Raw ]###
+            load      = "xx\xab'\x01\x00?s\x00\x00\xbci\xf0_{U~\x00"
+        ###[ Padding ]###
+            load      = '6\x85'
+
+Check on the NFVBench window that the following log appears just before the testing phase :
+
+.. code-block:: bash
+
+    2019-10-21 09:38:51,532 INFO Starting to generate traffic...
+    2019-10-21 09:38:51,532 INFO Running traffic generator
+    2019-10-21 09:38:51,541 INFO ``Service mode is enabled``
+    2019-10-21 09:38:52,552 INFO TX: 2004; RX: 2003; Est. Dropped: 1; Est. Drop rate: 0.0499%
+    2019-10-21 09:38:53,559 INFO TX: 4013; RX: 4011; Est. Dropped: 2; Est. Drop rate: 0.0498%
\ No newline at end of file
index 8e94eac..9a4a815 100755 (executable)
@@ -687,3 +687,9 @@ user_label:
 # Can be overriden by --no-vswitch-access
 # Should be left to the default value (false)
 no_vswitch_access: false
+
+
+# Enable service mode for trafic capture from TRex console (for debugging purpose)
+# Can be overriden by --service-mode
+# Should be left to the default value (false)
+service_mode: false
index 050017e..80b9a93 100644 (file)
@@ -439,6 +439,11 @@ def _parse_opts_from_cli():
                         default='0',
                         help='Specify the FE cache size (default: 0, flow-count if < 0)')
 
+    parser.add_argument('--service-mode', dest='service_mode',
+                        action='store_true',
+                        default=False,
+                        help='Enable T-Rex service mode for debugging only')
+
     opts, unknown_opts = parser.parse_known_args()
     return opts, unknown_opts
 
index 8992d51..7591062 100755 (executable)
@@ -46,12 +46,13 @@ class TrafficClientException(Exception):
 class TrafficRunner(object):
     """Serialize various steps required to run traffic."""
 
-    def __init__(self, client, duration_sec, interval_sec=0):
+    def __init__(self, client, duration_sec, interval_sec=0, service_mode=False):
         """Create a traffic runner."""
         self.client = client
         self.start_time = None
         self.duration_sec = duration_sec
         self.interval_sec = interval_sec
+        self.service_mode = service_mode
 
     def run(self):
         """Clear stats and instruct the traffic generator to start generating traffic."""
@@ -59,6 +60,10 @@ class TrafficRunner(object):
             return None
         LOG.info('Running traffic generator')
         self.client.gen.clear_stats()
+        # Debug use only : new '--service-mode' option available for the NFVBench command line.
+        # A read-only mode TRex console would be able to capture the generated traffic.
+        self.client.gen.set_service_mode(enabled=self.service_mode)
+        LOG.info('Service mode is %sabled', 'en' if self.service_mode else 'dis')
         self.client.gen.start_traffic()
         self.start_time = time.time()
         return self.poll_stats()
@@ -486,7 +491,8 @@ class TrafficClient(object):
         self.notifier = notifier
         self.interval_collector = None
         self.iteration_collector = None
-        self.runner = TrafficRunner(self, self.config.duration_sec, self.config.interval_sec)
+        self.runner = TrafficRunner(self, self.config.duration_sec, self.config.interval_sec,
+                                    self.config.service_mode)
         self.config.frame_sizes = self._get_frame_sizes()
         self.run_config = {
             'l2frame_size': None,
index 120a99b..ef7f272 100644 (file)
@@ -201,6 +201,9 @@ class DummyTG(AbstractTrafficGenerator):
     def set_mode(self):
         pass
 
+    def set_service_mode(self, enabled=True):
+        pass
+
     def resolve_arp(self):
         """Resolve ARP sucessfully."""
         def get_macs(port, scc):
index 0f51188..b8e32e3 100644 (file)
@@ -693,7 +693,10 @@ class TRex(AbstractTrafficGenerator):
                           chain_count)
                 break
 
-        self.client.set_service_mode(ports=self.port_handle, enabled=False)
+        # if the capture from the TRex console was started before the arp request step,
+        # it keeps 'service_mode' enabled, otherwise, it disables the 'service_mode'
+        if not self.config.service_mode:
+            self.client.set_service_mode(ports=self.port_handle, enabled=False)
         if len(arp_dest_macs) == len(self.port_handle):
             return arp_dest_macs
         return None
@@ -835,7 +838,10 @@ class TRex(AbstractTrafficGenerator):
         if self.capture_id:
             self.client.stop_capture(capture_id=self.capture_id['id'])
             self.capture_id = None
-            self.client.set_service_mode(ports=self.port_handle, enabled=False)
+            # if the capture from TRex console was started before the connectivity step,
+            # it keeps 'service_mode' enabled, otherwise, it disables the 'service_mode'
+            if not self.config.service_mode:
+                self.client.set_service_mode(ports=self.port_handle, enabled=False)
 
     def cleanup(self):
         """Cleanup Trex driver."""
@@ -846,3 +852,7 @@ class TRex(AbstractTrafficGenerator):
             except STLError:
                 # TRex does not like a reset while in disconnected state
                 pass
+
+    def set_service_mode(self, enabled=True):
+        """Enable/disable the 'service_mode'."""
+        self.client.set_service_mode(ports=self.port_handle, enabled=enabled)
index e41ab33..04e3191 100644 (file)
@@ -331,7 +331,8 @@ def _get_dummy_tg_config(chain_type, rate, scc=1, fc=10, step_ip='0.0.0.1',
         'cores': None,
         'mbuf_factor': None,
         'disable_hdrh': None,
-        'mbuf_64': None
+        'mbuf_64': None,
+        'service_mode': False
 
     })