trex_multistream: Add multistream support to T-Rex 29/46029/1 stable/euphrates opnfv-5.0.0 opnfv-5.0.RC1 opnfv-5.1.0
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 10:27:31 +0000 (10:27 +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>
(cherry picked from commit d4054052bdc6d9417e27f81f2434bcf1f2149972)

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 597f566..4b9eec6 100644 (file)
@@ -826,14 +826,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 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']))