trex_multistream: Add multistream support to T-Rex 47/44247/9
authorChristian Trautman <ctrautma@redhat.com>
Wed, 4 Oct 2017 14:34:46 +0000 (10:34 -0400)
committerMartin Klozik <martinx.klozik@intel.com>
Fri, 20 Oct 2017 09:43:20 +0000 (09:43 +0000)
Adds incremental source multi-stream functionality to
T-Rex traffic generator code in VSPerf.

JIRA: VSPERF-532

Change-Id: Ib5ba326699d89350ac1715c9a4276e5fa46a133e
Signed-off-by: Christian Trautman <ctrautma@redhat.com>
conf/03_traffic.conf
conf/10_custom.conf
docs/testing/user/configguide/trafficgen.rst
tools/pkt_gen/trex/trex.py

index 419ca70..b553383 100644 (file)
@@ -441,7 +441,7 @@ TRAFFICGEN_TREX_LATENCY_PPS = 1000
 # Example 10 Gbps: TRAFFICGEN_TREXINE_SPEED_GBPS = '10'
 # Today only 10 Gbps is supported
 TRAFFICGEN_TREX_LINE_SPEED_GBPS = '10'
-# FOR SR-IOV tests to work with T-Rex enable Promiscuous mode
+# FOR SR-IOV or multistream layer 2 tests to work with T-Rex enable Promiscuous mode
 TRAFFICGEN_TREX_PROMISCUOUS=False
 PATHS['trafficgen'] = {
     'trex': {
index 9dc605e..8020bb9 100644 (file)
@@ -136,7 +136,7 @@ TRAFFICGEN_TREX_LATENCY_PPS = 1000
 # Example 10 Gbps: TRAFFICGEN_TREXINE_SPEED_GBPS = '10'
 # Today only 10 Gbps is supported
 TRAFFICGEN_TREX_LINE_SPEED_GBPS = '10'
-# FOR SR-IOV tests to work with T-Rex enable Promiscuous mode
+# FOR SR-IOV or multistream layer 2 tests to work with T-Rex enable Promiscuous mode
 TRAFFICGEN_TREX_PROMISCUOUS=False
 
 # TREX Configuration and Connection Info-- END
index 2d2b9a9..7caa501 100644 (file)
@@ -811,7 +811,7 @@ Example of this configuration is in conf/03_traffic.conf or conf/10_custom.conf.
 TRAFFICGEN_TREX_USER has to have sudo permission and passwordless access.
 TRAFFICGEN_TREX_BASE_DIR is the place, where is stored 't-rex-64' file.
 
-It is possible to specify the accurancy of RFC2544 Throughput measurement.
+It is possible to specify the accuracy of RFC2544 Throughput measurement.
 Threshold below defines maximal difference between frame rate of successful
 (i.e. defined frameloss was reached) and unsuccessful (i.e. frameloss was
 exceeded) iterations.
@@ -822,14 +822,17 @@ Default value of this parameter is defined in conf/03_traffic.conf as follows:
 
     TRAFFICGEN_TREX_RFC2544_TPUT_THRESHOLD = ''
 
-SR-IOV
-~~~~~~
+SR-IOV and Multistream layer 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 T-Rex by default only accepts packets on the receive side if the destination mac matches the
-MAC address specificed in the /etc/trex-cfg.yaml on the server side. For SR-IOV this creates
+MAC address specified in the /etc/trex-cfg.yaml on the server side. For SR-IOV this creates
 challenges with modifying the MAC address in the traffic profile to correctly flow packets
 through specified VFs. To remove this limitation enable promiscuous mode on T-Rex to allow
 all packets regardless of the destination mac to be accepted.
 
+This also creates problems when doing multistream at layer 2 since the source macs will be
+modified. Enable Promiscuous mode when doing multistream at layer 2 testing with T-Rex.
+
 .. code-block:: console
 
     TRAFFICGEN_TREX_PROMISCUOUS=True
index 7b554ec..abae35d 100644 (file)
@@ -21,6 +21,7 @@ import subprocess
 import sys
 from collections import OrderedDict
 # pylint: disable=unused-import
+import netaddr
 import zmq
 from conf import settings
 from conf import merge_spec
@@ -174,8 +175,46 @@ class Trex(ITrafficGenerator):
         fsize_no_fcs = frame_size - 4
         payload_a = max(0, fsize_no_fcs - len(base_pkt_a)) * 'x'
         payload_b = max(0, fsize_no_fcs - len(base_pkt_b)) * 'x'
-        pkt_a = STLPktBuilder(pkt=base_pkt_a/payload_a)
-        pkt_b = STLPktBuilder(pkt=base_pkt_b/payload_b)
+
+        # Multistream configuration, increments source values only
+        ms_mod = list() # mod list for incrementing values to be populated based on layer
+        if traffic['multistream'] > 1:
+            if traffic['stream_type'].upper() == 'L2':
+                for _ in [base_pkt_a, base_pkt_b]:
+                    ms_mod += [STLVmFlowVar(name="mac_start", min_value=0,
+                                            max_value=traffic['multistream'] - 1, size=4, op="inc"),
+                               STLVmWrFlowVar(fv_name="mac_start", pkt_offset=7)]
+            elif traffic['stream_type'].upper() == 'L3':
+                ip_src = {"start": int(netaddr.IPAddress(traffic['l3']['srcip'])),
+                          "end": int(netaddr.IPAddress(traffic['l3']['srcip'])) + traffic['multistream'] - 1}
+                ip_dst = {"start": int(netaddr.IPAddress(traffic['l3']['dstip'])),
+                          "end": int(netaddr.IPAddress(traffic['l3']['dstip'])) + traffic['multistream'] - 1}
+                for ip_address in [ip_src, ip_dst]:
+                    ms_mod += [STLVmFlowVar(name="ip_src", min_value=ip_address['start'],
+                                            max_value=ip_address['end'], size=4, op="inc"),
+                               STLVmWrFlowVar(fv_name="ip_src", pkt_offset="IP.src")]
+            elif traffic['stream_type'].upper() == 'L4':
+                for udpport in [traffic['l4']['srcport'], traffic['l4']['dstport']]:
+                    if udpport + (traffic['multistream'] - 1) > 65535:
+                        start_port = udpport
+                        # find the max/min port number based on the loop around of 65535 to 0 if needed
+                        minimum_value = 65535 - (traffic['multistream'] -1)
+                        maximum_value = 65535
+                    else:
+                        start_port, minimum_value = udpport, udpport
+                        maximum_value = start_port + (traffic['multistream'] - 1)
+                    ms_mod += [STLVmFlowVar(name="port_src", init_value=start_port,
+                                            min_value=minimum_value, max_value=maximum_value,
+                                            size=2, op="inc"),
+                               STLVmWrFlowVar(fv_name="port_src", pkt_offset="UDP.sport"),]
+
+        if ms_mod: # multistream detected
+            pkt_a = STLPktBuilder(pkt=base_pkt_a/payload_a, vm=[ms_mod[0], ms_mod[1]])
+            pkt_b = STLPktBuilder(pkt=base_pkt_b/payload_b, vm=[ms_mod[2], ms_mod[3]])
+        else:
+            pkt_a = STLPktBuilder(pkt=base_pkt_a / payload_a)
+            pkt_b = STLPktBuilder(pkt=base_pkt_b / payload_b)
+
         stream_1 = STLStream(packet=pkt_a,
                              name='stream_1',
                              mode=STLTXCont(percentage=traffic['frame_rate']))