Merge "trex: Add support for burst traffic type"
[vswitchperf.git] / docs / testing / user / configguide / trafficgen.rst
index 535f799..f9e2db1 100644 (file)
@@ -39,12 +39,14 @@ and is configured as follows:
     TRAFFIC = {
         'traffic_type' : 'rfc2544_throughput',
         'frame_rate' : 100,
+        'burst_size' : 100,
         'bidir' : 'True',  # will be passed as string in title format to tgen
         'multistream' : 0,
         'stream_type' : 'L4',
         'pre_installed_flows' : 'No',           # used by vswitch implementation
         'flow_type' : 'port',                   # used by vswitch implementation
-
+        'flow_control' : False,                 # supported only by IxNet
+        'learning_frames' : True,               # supported only by IxNet
         'l2': {
             'framesize': 64,
             'srcmac': '00:00:00:00:00:00',
@@ -67,8 +69,29 @@ and is configured as follows:
             'priority': 0,
             'cfi': 0,
         },
+        'capture': {
+            'enabled': False,
+            'tx_ports' : [0],
+            'rx_ports' : [1],
+            'count': 1,
+            'filter': '',
+        },
+        'scapy': {
+            'enabled': False,
+            '0' : 'Ether(src={Ether_src}, dst={Ether_dst})/'
+                  'Dot1Q(prio={Dot1Q_prio}, id={Dot1Q_id}, vlan={Dot1Q_vlan})/'
+                  'IP(proto={IP_proto}, src={IP_src}, dst={IP_dst})/'
+                  '{IP_PROTO}(sport={IP_PROTO_sport}, dport={IP_PROTO_dport})',
+            '1' : 'Ether(src={Ether_dst}, dst={Ether_src})/'
+                  'Dot1Q(prio={Dot1Q_prio}, id={Dot1Q_id}, vlan={Dot1Q_vlan})/'
+                  'IP(proto={IP_proto}, src={IP_dst}, dst={IP_src})/'
+                  '{IP_PROTO}(sport={IP_PROTO_dport}, dport={IP_PROTO_sport})',
+        }
     }
 
+A detailed description of the ``TRAFFIC`` dictionary can be found at
+:ref:`configuration-of-traffic-dictionary`.
+
 The framesize parameter can be overridden from the configuration
 files by adding the following to your custom configuration file
 ``10_custom.conf``:
@@ -569,7 +592,7 @@ http://www.mono-project.com/docs/getting-started/install/linux/
 
     rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
     yum-config-manager --add-repo http://download.mono-project.com/repo/centos/
-    yum -y install mono-complete
+    yum -y install mono-complete-5.8.0.127-0.xamarin.3.epel7.x86_64
 
 To prevent gpg errors on future yum installation of packages the mono-project
 repo should be disabled once installed.
@@ -737,11 +760,14 @@ You can directly download from GitHub:
 
     git clone https://github.com/cisco-system-traffic-generator/trex-core
 
-and use the master branch:
+and use the same Trex version for both server and client API.
+
+**NOTE:** The Trex API version used by VSPERF is defined by variable ``TREX_TAG``
+in file ``src/package-list.mk``.
 
 .. code-block:: console
 
-    git checkout master
+    git checkout v2.38
 
 or Trex latest release you can download from here:
 
@@ -783,6 +809,17 @@ It is neccesary for proper connection between Trex server and VSPERF.
    cd trex-core/scripts/
    ./t-rex-64 -i
 
+**NOTE:** Please check your firewall settings at both DUT and T-Rex server.
+Firewall must allow a connection from DUT (VSPERF) to the T-Rex server running
+at TCP port 4501.
+
+**NOTE:** For high speed cards it may be advantageous to start T-Rex with more transmit queues/cores.
+
+.. code-block:: console
+
+   cd trex-cores/scripts/
+   ./t-rex-64 -i -c 10
+
 For additional information about Trex stateless mode see Trex stateless documentation:
 
 https://trex-tgn.cisco.com/trex/doc/trex_stateless.html
@@ -835,6 +872,21 @@ place. This can be adjusted with the following configurations:
     TRAFFICGEN_TREX_LEARNING_MODE=True
     TRAFFICGEN_TREX_LEARNING_DURATION=5
 
+Latency measurements have impact on T-Rex performance. Thus vswitchperf uses a separate
+latency stream for each direction with limited speed. This workaround is used for RFC2544
+**Throughput** and **Continuous** traffic types. In case of **Burst** traffic type,
+the latency statistics are measured for all frames in the burst. Collection of latency
+statistics is driven by configuration option ``TRAFFICGEN_TREX_LATENCY_PPS`` as follows:
+
+    * value ``0`` - disables latency measurements
+    * non zero integer value - enables latency measurements; In case of Throughput
+        and Continuous traffic types, it specifies a speed of latency specific stream
+        in PPS. In case of burst traffic type, it enables latency measurements for all frames.
+
+.. code-block:: console
+
+    TRAFFICGEN_TREX_LATENCY_PPS = 1000
+
 SR-IOV and Multistream layer 2
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 T-Rex by default only accepts packets on the receive side if the destination mac matches the
@@ -849,3 +901,108 @@ modified. Enable Promiscuous mode when doing multistream at layer 2 testing with
 .. code-block:: console
 
     TRAFFICGEN_TREX_PROMISCUOUS=True
+
+Card Bandwidth Options
+~~~~~~~~~~~~~~~~~~~~~~
+
+T-Rex API will attempt to retrieve the highest possible speed from the card using internal
+calls to port information. If you are using two separate cards then it will take the lowest
+of the two cards as the max speed. If necessary you can try to force the API to use a
+specific maximum speed per port. The below configurations can be adjusted to enable this.
+
+.. code-block:: console
+
+    TRAFFICGEN_TREX_FORCE_PORT_SPEED = True
+    TRAFFICGEN_TREX_PORT_SPEED = 40000 # 40 gig
+
+**Note::** Setting higher than possible speeds will result in unpredictable behavior when running
+tests such as duration inaccuracy and/or complete test failure.
+
+RFC2544 Validation
+~~~~~~~~~~~~~~~~~~
+
+T-Rex can perform a verification run for a longer duration once the binary search of the
+RFC2544 trials have completed. This duration should be at least 60 seconds. This is similar
+to other traffic generator functionality where a more sustained time can be attempted to
+verify longer runs from the result of the search. This can be configured with the following
+params
+
+.. code-block:: console
+
+    TRAFFICGEN_TREX_VERIFICATION_MODE = False
+    TRAFFICGEN_TREX_VERIFICATION_DURATION = 60
+    TRAFFICGEN_TREX_MAXIMUM_VERIFICATION_TRIALS = 10
+
+The duration and maximum number of attempted verification trials can be set to change the
+behavior of this step. If the verification step fails, it will resume the binary search
+with new values where the maximum output will be the last attempted frame rate minus the
+current set thresh hold.
+
+Scapy frame definition
+~~~~~~~~~~~~~~~~~~~~~~
+
+It is possible to use a SCAPY frame definition to generate various network protocols
+by the **T-Rex** traffic generator. In case that particular network protocol layer
+is disabled by the TRAFFIC dictionary (e.g. TRAFFIC['vlan']['enabled'] = False),
+then disabled layer will be removed from the scapy format definition by VSPERF.
+
+The scapy frame definition can refer to values defined by the TRAFFIC dictionary
+by following keywords. These keywords are used in next examples.
+
+* ``Ether_src`` - refers to ``TRAFFIC['l2']['srcmac']``
+* ``Ether_dst`` - refers to ``TRAFFIC['l2']['dstmac']``
+* ``IP_proto`` - refers to ``TRAFFIC['l3']['proto']``
+* ``IP_PROTO`` - refers to upper case version of ``TRAFFIC['l3']['proto']``
+* ``IP_src`` - refers to ``TRAFFIC['l3']['srcip']``
+* ``IP_dst`` - refers to ``TRAFFIC['l3']['dstip']``
+* ``IP_PROTO_sport`` - refers to ``TRAFFIC['l4']['srcport']``
+* ``IP_PROTO_dport`` - refers to ``TRAFFIC['l4']['dstport']``
+* ``Dot1Q_prio`` - refers to ``TRAFFIC['vlan']['priority']``
+* ``Dot1Q_id`` - refers to ``TRAFFIC['vlan']['cfi']``
+* ``Dot1Q_vlan`` - refers to ``TRAFFIC['vlan']['id']``
+
+In following examples of SCAPY frame definition only relevant parts of TRAFFIC
+dictionary are shown. The rest of the TRAFFIC dictionary is set to default values
+as they are defined in ``conf/03_traffic.conf``.
+
+Please check official documentation of SCAPY project for details about SCAPY frame
+definition and supported network layers at: http://www.secdev.org/projects/scapy
+
+#. Generate ICMP frames:
+
+   .. code-block:: console
+
+        'scapy': {
+            'enabled': True,
+            '0' : 'Ether(src={Ether_src}, dst={Ether_dst})/IP(proto={IP_proto}, src={IP_src}, dst={IP_dst})/ICMP()',
+            '1' : 'Ether(src={Ether_dst}, dst={Ether_src})/IP(proto={IP_proto}, src={IP_dst}, dst={IP_src})/ICMP()',
+        }
+
+#. Generate IPv6 ICMP Echo Request
+
+   .. code-block:: console
+
+        'l3' : {
+            'srcip': 'feed::01',
+            'dstip': 'feed::02',
+        },
+        'scapy': {
+            'enabled': True,
+            '0' : 'Ether(src={Ether_src}, dst={Ether_dst})/IPv6(src={IP_src}, dst={IP_dst})/ICMPv6EchoRequest()',
+            '1' : 'Ether(src={Ether_dst}, dst={Ether_src})/IPv6(src={IP_dst}, dst={IP_src})/ICMPv6EchoRequest()',
+        }
+
+#. Generate SCTP frames:
+
+   Example uses default SCAPY frame definition, which can reflect ``TRAFFIC['l3']['proto']`` settings. The same
+   approach can be used to generate other protocols, e.g. TCP.
+
+   .. code-block:: console
+
+        'l3' : {
+            'proto' : 'sctp',
+        },
+        'scapy': {
+            'enabled': True,
+        }
+