summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-ximages/128_nodrop.pngbin0 -> 40822 bytes
-rwxr-xr-ximages/128_util.pngbin0 -> 40877 bytes
-rwxr-xr-ximages/1514_nodrop.pngbin0 -> 44913 bytes
-rwxr-xr-ximages/1514_util.pngbin0 -> 40567 bytes
-rwxr-xr-ximages/590_nodrop.pngbin0 -> 41542 bytes
-rwxr-xr-ximages/590_util.pngbin0 -> 40506 bytes
-rwxr-xr-ximages/64_nodrop.pngbin0 -> 40877 bytes
-rwxr-xr-ximages/64_util.pngbin0 -> 41139 bytes
-rwxr-xr-ximages/icons/callouts/1.pngbin329 -> 183 bytes
-rwxr-xr-ximages/icons/callouts/10.pngbin361 -> 229 bytes
-rwxr-xr-ximages/icons/callouts/11.pngbin565 -> 223 bytes
-rwxr-xr-ximages/icons/callouts/12.pngbin617 -> 237 bytes
-rwxr-xr-ximages/icons/callouts/13.pngbin623 -> 238 bytes
-rwxr-xr-ximages/icons/callouts/14.pngbin411 -> 245 bytes
-rwxr-xr-ximages/icons/callouts/15.pngbin640 -> 251 bytes
-rwxr-xr-ximages/icons/callouts/2.pngbin353 -> 209 bytes
-rwxr-xr-ximages/icons/callouts/3.pngbin350 -> 211 bytes
-rwxr-xr-ximages/icons/callouts/4.pngbin345 -> 204 bytes
-rwxr-xr-ximages/icons/callouts/5.pngbin348 -> 206 bytes
-rwxr-xr-ximages/icons/callouts/6.pngbin355 -> 219 bytes
-rwxr-xr-ximages/icons/callouts/7.pngbin344 -> 199 bytes
-rwxr-xr-ximages/icons/callouts/8.pngbin357 -> 219 bytes
-rwxr-xr-ximages/icons/callouts/9.pngbin357 -> 228 bytes
-rwxr-xr-xrelease_notes.asciidoc5
-rw-r--r--trex_faq.asciidoc89
-rw-r--r--trex_index.asciidoc2
-rwxr-xr-xtrex_stateless.asciidoc6
-rwxr-xr-xtrex_stateless_bench.asciidoc242
-rwxr-xr-xvisio_drawings/illustrations_stateless.vsdbin5082624 -> 5346816 bytes
-rwxr-xr-xws_main.py3
30 files changed, 286 insertions, 61 deletions
diff --git a/images/128_nodrop.png b/images/128_nodrop.png
new file mode 100755
index 00000000..e2a4c59a
--- /dev/null
+++ b/images/128_nodrop.png
Binary files differ
diff --git a/images/128_util.png b/images/128_util.png
new file mode 100755
index 00000000..7dd7627e
--- /dev/null
+++ b/images/128_util.png
Binary files differ
diff --git a/images/1514_nodrop.png b/images/1514_nodrop.png
new file mode 100755
index 00000000..34902725
--- /dev/null
+++ b/images/1514_nodrop.png
Binary files differ
diff --git a/images/1514_util.png b/images/1514_util.png
new file mode 100755
index 00000000..7ad7d4da
--- /dev/null
+++ b/images/1514_util.png
Binary files differ
diff --git a/images/590_nodrop.png b/images/590_nodrop.png
new file mode 100755
index 00000000..569bb9e7
--- /dev/null
+++ b/images/590_nodrop.png
Binary files differ
diff --git a/images/590_util.png b/images/590_util.png
new file mode 100755
index 00000000..892caf0b
--- /dev/null
+++ b/images/590_util.png
Binary files differ
diff --git a/images/64_nodrop.png b/images/64_nodrop.png
new file mode 100755
index 00000000..7dd7627e
--- /dev/null
+++ b/images/64_nodrop.png
Binary files differ
diff --git a/images/64_util.png b/images/64_util.png
new file mode 100755
index 00000000..d3b6807e
--- /dev/null
+++ b/images/64_util.png
Binary files differ
diff --git a/images/icons/callouts/1.png b/images/icons/callouts/1.png
index 7d473430..054ea07a 100755
--- a/images/icons/callouts/1.png
+++ b/images/icons/callouts/1.png
Binary files differ
diff --git a/images/icons/callouts/10.png b/images/icons/callouts/10.png
index 997bbc82..8833bd59 100755
--- a/images/icons/callouts/10.png
+++ b/images/icons/callouts/10.png
Binary files differ
diff --git a/images/icons/callouts/11.png b/images/icons/callouts/11.png
index ce47dac3..d77914d8 100755
--- a/images/icons/callouts/11.png
+++ b/images/icons/callouts/11.png
Binary files differ
diff --git a/images/icons/callouts/12.png b/images/icons/callouts/12.png
index 31daf4e2..ac9f8af7 100755
--- a/images/icons/callouts/12.png
+++ b/images/icons/callouts/12.png
Binary files differ
diff --git a/images/icons/callouts/13.png b/images/icons/callouts/13.png
index 14021a89..e5e62a1f 100755
--- a/images/icons/callouts/13.png
+++ b/images/icons/callouts/13.png
Binary files differ
diff --git a/images/icons/callouts/14.png b/images/icons/callouts/14.png
index 64014b75..f55ef966 100755
--- a/images/icons/callouts/14.png
+++ b/images/icons/callouts/14.png
Binary files differ
diff --git a/images/icons/callouts/15.png b/images/icons/callouts/15.png
index 0d65765f..fee9beda 100755
--- a/images/icons/callouts/15.png
+++ b/images/icons/callouts/15.png
Binary files differ
diff --git a/images/icons/callouts/2.png b/images/icons/callouts/2.png
index 5d09341b..b05ad9c7 100755
--- a/images/icons/callouts/2.png
+++ b/images/icons/callouts/2.png
Binary files differ
diff --git a/images/icons/callouts/3.png b/images/icons/callouts/3.png
index ef7b7004..9ce22b7d 100755
--- a/images/icons/callouts/3.png
+++ b/images/icons/callouts/3.png
Binary files differ
diff --git a/images/icons/callouts/4.png b/images/icons/callouts/4.png
index adb8364e..03d55928 100755
--- a/images/icons/callouts/4.png
+++ b/images/icons/callouts/4.png
Binary files differ
diff --git a/images/icons/callouts/5.png b/images/icons/callouts/5.png
index 4d7eb460..710b57cc 100755
--- a/images/icons/callouts/5.png
+++ b/images/icons/callouts/5.png
Binary files differ
diff --git a/images/icons/callouts/6.png b/images/icons/callouts/6.png
index 0ba694af..65ce9b91 100755
--- a/images/icons/callouts/6.png
+++ b/images/icons/callouts/6.png
Binary files differ
diff --git a/images/icons/callouts/7.png b/images/icons/callouts/7.png
index 472e96f8..07bc7f1c 100755
--- a/images/icons/callouts/7.png
+++ b/images/icons/callouts/7.png
Binary files differ
diff --git a/images/icons/callouts/8.png b/images/icons/callouts/8.png
index 5e60973c..fc640cab 100755
--- a/images/icons/callouts/8.png
+++ b/images/icons/callouts/8.png
Binary files differ
diff --git a/images/icons/callouts/9.png b/images/icons/callouts/9.png
index a0676d26..5bbc0ad9 100755
--- a/images/icons/callouts/9.png
+++ b/images/icons/callouts/9.png
Binary files differ
diff --git a/release_notes.asciidoc b/release_notes.asciidoc
index 1eebfe23..23c8002a 100755
--- a/release_notes.asciidoc
+++ b/release_notes.asciidoc
@@ -25,9 +25,10 @@ endif::backend-docbook[]
== Release 2.09 ==
+
* Statless, split to core algorithm is more accurate and simple see link:trex_stateless.html#_tutorial_field_engine_split_to_core[split_to_core]
-* Add repeatable random instruction see an example link:https://github.com/cisco-system-traffic-generator/trex-core/tree/master/scripts/api/stl/udp_1pkt_repeat_random.py[stl/udp_1pkt_repeat_random.py] link:cp_stl_docs/api/field_engine.html#stlvmflowvarrepetablerandom[repetable_random] and link:trex_rpc_server_spec.html#_repetable_random[repetable_random_spec]
-* Add TCP/UDP checksum fix instruction see an example link:https://github.com/cisco-system-traffic-generator/trex-core/tree/master/scripts/api/stl/syn_attack_fix_cs_hw.py[stl/syn_attack_fix_cs_hw.py] link:cp_stl_docs/api/field_engine.html#stlvmfixchecksumhw[fix checksum] and link:trex_rpc_server_spec.html#_fix_checksum_hw[fix_checksum_hw_spec]
+* Add repeatable random instruction see an example link:https://github.com/cisco-system-traffic-generator/trex-core/tree/master/scripts/stl/udp_1pkt_repeat_random.py[stl/udp_1pkt_repeat_random.py] link:cp_stl_docs/api/field_engine.html#stlvmflowvarrepetablerandom[repetable_random] and link:trex_rpc_server_spec.html#_repetable_random[repetable_random_spec]
+* Add TCP/UDP checksum fix instruction see an example link:https://github.com/cisco-system-traffic-generator/trex-core/tree/master/scripts/stl/syn_attack_fix_cs_hw.py[stl/syn_attack_fix_cs_hw.py] link:cp_stl_docs/api/field_engine.html#stlvmfixchecksumhw[fix checksum] and link:trex_rpc_server_spec.html#_fix_checksum_hw[fix_checksum_hw_spec]
* Improve Stateless Field Engine (FE) performance
* Support dual mode for push pcap/remote Python API. see here link:cp_stl_docs/api/client_code.html#trex_stl_lib.trex_stl_client.STLClient.push_remote[push_remote] and link:cp_stl_docs/api/client_code.html#trex_stl_lib.trex_stl_client.STLClient.push_pcap[push_pcap] Using this feature pcap can be splited to client/server ports
* Add infra for L2 emulation support
diff --git a/trex_faq.asciidoc b/trex_faq.asciidoc
index 15a9560f..169b04be 100644
--- a/trex_faq.asciidoc
+++ b/trex_faq.asciidoc
@@ -118,6 +118,7 @@ This is still better than the Intel x520 (82559 based) which can reach ~30MPPS f
==== I have XL710 NIC with 2x40Gb/sec ports and I can not get line rate
XL710-da2 with 2 40G ports can reach maximum of 40MPPS/50Gb (total for all ports) and not 60MPPS with small packets (64B)
Intel had in mind redundancy use case when they produced a two port NIC. Card was not intended to reach 80G line rate.
+see link:trex_stateless_bench.html[xl710_benchmark.html] for more info
==== I want to contribute to the project
You have several ways you can help: +
@@ -140,32 +141,34 @@ You have several options. +
2. To run the real product, check link:trex_manual.html#_download_and_installation[here] for hardware recommendation and
installation instructions.
-==== During OS installation, screen is skewed / error "out of range" / resolution not supported etc
+==== During OS installation, screen is skewed / error "out of range" / resolution not supported etc.
- * Fedora - during installation, choose "Troubleshooting" -> Install in basic graphic mode
- * Ubuntu - try Ubuntu server, which has textual installation
+ * Fedora - during installation, choose "Troubleshooting" -> Install in basic graphic mode.
+ * Ubuntu - try Ubuntu server, which has textual installation.
-==== How to determine relation between TRex ports and device under test ports
+==== How to determine relation between TRex ports and device under test ports?
-Run the TRex with following command and check incoming packet on router interfaces:
+Run TRex with the below command and check incoming packet count on DUT interfaces.
[source,bash]
----
sudo ./t-rex-64 -f cap2/dns.yaml --lm 1 --lo -l 1000 -d 100
----
-==== How to determine relation between Virtual OS ports and Hypervisor ports
+Alternatively, you can run TRex in stateless mode, send traffic from each port, and look at the counters on the DUT interfaces.
+
+==== How to determine relation between Virtual OS ports and Hypervisor ports?
Compare the MACs address + name of interface, for example:
[source,bash]
----
-* > ifconfig +
-*eth0* Link encap:Ethernet *HWaddr 00:0c:29:2a:99:b2* +
+> ifconfig
+eth0 Link encap:Ethernet HWaddr 00:0c:29:2a:99:b2
...
-* > sudo ./dpdk_setup_ports.py -s +
-*03:00.0* 'VMXNET3 Ethernet Controller' *if=eth0* drv=vmxnet3 unused=igb_uio
+> sudo ./dpdk_setup_ports.py -s
+03:00.0 'VMXNET3 Ethernet Controller' if=eth0 drv=vmxnet3 unused=igb_uio
----
[NOTE]
@@ -184,20 +187,19 @@ We are planning to add MACs to `./dpdk_setup_ports.py -s`
==== TRex traffic does not show up on Wireshark, so I can not capture the traffic from the TRex port
TRex uses DPDK which takes ownership of the ports, so using Wireshark is not possible. You can use switch with port mirroring to capture the traffic.
-==== How can I map betwean TRex port-id (e.g. port 0) and physical router interface?
-Load TRex in stateless mode, run traffic from each port, and look at the counters on the router interfaces.
-
-
=== Stateful
==== How do I start using the stateful mode?
You should first have a YAML configuration file. See link:trex_manual.html#_traffic_yaml_parameter_of_f_option[here].
Then, you can find some basic examples link:trex_manual.html#_trex_command_line[here].
-==== TRex is connected to a switch and we observe many dropped packets at TRex startup.
-A switch might be configured with spanning tree enabled. TRex initializes the port at startup, making the spanning tree drop the packets.
+==== TRex is connected to a switch and I observe many dropped packets at TRex startup.
+A switch might be configured with spanning tree enabled. TRex reset the port at startup, making the switch reset it side as well,
+and spanning tree can drop the packets until it stabilizes.
Disabling spanning tree can help. On Cisco nexus, you can do that using `spanning-tree port type edge`
-This issue would be fixed when we consolidate ``Stateful'' and ``Stateless'' RPC.
+You can also start Cisco with -k <num> flag. This will send packets for k seconds before starting the actual test, letting the spanning
+tree time to stabilize.
+This issue will be fixed when we consolidate ``Stateful'' and ``Stateless'' RPC.
==== I can not see RX packets
TRex does not support ARP yet, you should configure the DUT to send the packets to the TRex port MAC address. From Stateless mode, you can change the port mode to promiscuous. +
@@ -218,52 +220,23 @@ Yes. We know this is something many people would like, and are working on this.
You can use the simulator. see link:trex_manual.html#_simulator[simulator]
The output of the simulator can be loaded to Excel. The CPS can be tuned.
-==== I want to have more active flows on the DUT, how can I do it?
-After stretching TRex to its maximum CPS capacity, consider the following: DUT will have much more active flows in case of a UDP flow due to the nature of aging (DUT does not know when the flow ends while TRex knows).
-In order to artificialy increse the length of the active flows in TRex, you can config larger IPG in the YAML file. This will cause each flow to last longer. Alternatively, you can increase IPG in your PCAP file as well.
-
-
-==== How do I support more active flows?
-The default maximum supported flows are 1M total (TRex prospective). DUT could have much more due to aging. When active flows are more than 1M flows there is message that there is no enough memory.
+==== I want to have more acrive flows in TRex, how can I do this?
+Default maximum supported flows is 1M (From TRex prespective. DUT might have much more due to slower aging). When active flows reach higher number, you will get ``out of memory'' error message
-[source,Python]
---------
-Active-flows : 1045562 Clients : 80120 Socket-util : 0.0207 %
---------
-
-Look link:trex_manual.html#_memory_section_configuration[here]
-
-This example support 10M flows
-
-[source,Python]
---------
-- port_limit : 2
- version : 2
- interfaces : ['04:00.0', '0c:00.0'] # list of the interfaces to bind run ./dpdk_nic_bind.py --status
- port_info : # set eh mac addr
-
- - dest_mac : [0x18, 0x8b, 0x9d, 0xa3, 0xae, 0x84]
- src_mac : [0x18, 0x8b, 0x9d, 0xa3, 0xae, 0x83]
-
- - dest_mac : [0x18, 0x8b, 0x9d, 0xa3, 0xae, 0x83]
- src_mac : [0x18, 0x8b, 0x9d, 0xa3, 0xae, 0x84]
-
- memory :
- dp_flows : 10048576 <1>
---------
-<1> 10M flows
+To increase the number of supported active flows, you should add ``dp_flows'' arg in config file ``memory'' section.
+Look link:trex_manual.html#_memory_section_configuration[here] for more info.
+==== I want to have more active flows on the DUT, how can I do this?
+After stretching TRex to its maximum CPS capacity, consider the following: DUT will have much more active flows in case of a UDP flow due to the nature of aging (DUT does not know when the flow ends while TRex knows).
+In order to artificialy increse the length of the active flows in TRex, you can config larger IPG in the YAML file. This will cause each flow to last longer. Alternatively, you can increase IPG in your PCAP file as well.
-==== I am getting and error: The number of ips should be at least number of threads
+==== I am getting an error: The number of ips should be at least number of threads.
The range of clients and servers should be at least the number of threads.
The number of threads is equal to (number of port pairs) * (-c value)
-==== Incoming frames are of type SCTP. Why?
-Default latency packets are SCTP, you can remove `-l 1000` or change it to ICMP see manual for more info.
+==== Some of the incoming frames are of type SCTP. Why?
+Default latency packets are SCTP, you can omit the `-l <num>` from command line, or change it to ICMP. See the manual for more info.
-==== Is there a configuration guide to Linux as a router (static ARP)?
-have a look link:https://groups.google.com/forum/#!topic/trex-tgn/YQcQtA8A8hA[linux as a router]
-
=== Stateless
==== How do I get started with stateless mode?
@@ -305,7 +278,7 @@ Yes. You can build any packet you like using Scapy.
However, there is no way to create corrupted L1 fields (Like Ethernet FCS), since these are usually handled by the NIC hardware.
==== Why the performance is low?
-What would reduce the performance:
+Major things that can reduce the performance are:
1. Many concurent streams.
2. Complex field engine program.
@@ -418,7 +391,7 @@ To workaround this you could create one stream in lower speed for latency (e.g.
flow_stats = STLFlowLatencyStats(pg_id = 12+port_id))
--------
<1> non latency stream will be amplified
-<2> latency stream, the speed would be constant 1KPPS
+<2> latency stream, the speed will be constant 1KPPS
===== Latency stream has constant rate of 1PPS, and is not getting amplified by multiplier. Why?
diff --git a/trex_index.asciidoc b/trex_index.asciidoc
index b2f3b1fd..454e21ec 100644
--- a/trex_index.asciidoc
+++ b/trex_index.asciidoc
@@ -72,6 +72,8 @@ link:http://trex-tgn.cisco.com/youtrack/dashboard[youtrack]
link:../release/[pkgs]
| Windows Stateful GUI |
link:../client_gui/[stateful GUI]
+| XL710 Statless performance |
+link:trex_stateless_bench.html[xl710_benchmark.html]
|=================
== For Developers
diff --git a/trex_stateless.asciidoc b/trex_stateless.asciidoc
index 0b6ad8f7..f3ae85b3 100755
--- a/trex_stateless.asciidoc
+++ b/trex_stateless.asciidoc
@@ -5,7 +5,7 @@ TRex Stateless support
:revnumber: 2.01
:quotes.++:
:numbered:
-:web_server_url: http://trex-tgn.cisco.com/trex
+:web_server_url: https://trex-tgn.cisco.com/trex
:local_web_server_url: csi-wiki-01:8181/trex
:github_stl_path: https://github.com/cisco-system-traffic-generator/trex-core/tree/master/scripts/stl
:github_stl_examples_path: https://github.com/cisco-system-traffic-generator/trex-core/tree/master/scripts/automation/trex_control_plane/stl/examples
@@ -4054,6 +4054,10 @@ The followig keyboard commands operate in the TUI window: +
c - Clear all counters +
d, s, l - change display between dashboard (d), streams (s) and l (latency) info. +
+=== Benchmarks of 40G NICs
+
+link:trex_stateless_bench.html[TRex stateless benchmarks]
+
=== Appendix
==== Scapy packet examples
diff --git a/trex_stateless_bench.asciidoc b/trex_stateless_bench.asciidoc
new file mode 100755
index 00000000..2e0cbf3a
--- /dev/null
+++ b/trex_stateless_bench.asciidoc
@@ -0,0 +1,242 @@
+TRex Stateless support
+======================
+:email: trex.tgen@gmail.com
+:quotes.++:
+:numbered:
+:web_server_url: https://trex-tgn.cisco.com/trex
+:local_web_server_url: csi-wiki-01:8181/trex
+:toclevels: 6
+:tabledef-default.subs: normal,callouts
+
+include::trex_ga.asciidoc[]
+
+// PDF version - image width variable
+ifdef::backend-docbook[]
+:p_width: 450
+endif::backend-docbook[]
+
+// HTML version - image width variable
+ifdef::backend-xhtml11[]
+:p_width: 800
+endif::backend-xhtml11[]
+
+
+== TRex stateless L2 benchmarks using XL710 40G NICs
+
+=== Setup details
+
+[cols="1,5"]
+|=================
+| Server: | UCSC-C240-M4SX
+| CPU: | 2 x Intel(R) Xeon(R) CPU E5-2667 v3 @ 3.20GHz
+| RAM: | 65536 @ 2133 MHz
+| NICs: | 2 x Intel Corporation Ethernet Controller XL710 for 40GbE QSFP+ (rev 01)
+| QSFP: | Cisco QSFP-H40G-AOC1M
+| OS: | Fedora 18
+| Switch: | Cisco Nexus 3172 Chassis, System version: 6.0(2)U5(2).
+| TRex: | v2.09 using 7 cores per dual interface.
+|=================
+
+=== Topology
+
+TRex port 1 &#8596; Switch port Eth1/50 (vlan 1005) &#8596; Switch port Eth1/52 (vlan 1005) &#8596; TRex port 2
+
+=== Results
+
+.Cached VM
+[cols="2,2^,2^,2^,2^,2^,2^,2^,3", options="header"]
+|=================
+| Packet size | Line Utilization (%) | Total L1 (Gb/s) | Total L2 (Gb/s) | CPU Util (%) | Total MPPS | BW per core (Gb/s) <1> | MPPS per core <2> | Multiplier
+| Imix | 100.04 | 80.03 | 76.03 | 2.7 | 25.03 | 89.74 | 28.07 | 100%
+| 1514 | 100.12 | 80.1 | 79.05 | 1.33 | 6.53 | 430.18 | 35.07 | 100%
+| 590 | 99.36 | 79.49 | 76.89 | 3.2 | 16.29 | 177.43 | 36.36 | 99.5%
+| 128 | 99.56 | 79.65 | 68.89 | 15.4 | 67.27 | 36.94 | 31.2 | 99.5%
+| 64 | 52.8 | 42.3 | 32.23 | 14.1 | 62.95 | 21.43 | 31.89 | 31.5mpps
+|=================
+
+.VM with 1 variable
+[cols="2,2^,2^,2^,2^,2^,2^,2^,3", options="header"]
+|=================
+| Packet size | Line Utilization (%) | Total L1 (Gb/s) | Total L2 (Gb/s) | CPU Util (%) | Total MPPS | BW per core (Gb/s) <1> | MPPS per core <2> | Multiplier
+| Imix | 100.04 | 80.03 | 76.03 | 12.6 | 25.03 | 45.37 | 14.19 | 100%
+| 1514 | 100.12 | 80.1 | 79.05 | 2.6 | 6.53 | 220.05 | 17.94 | 100%
+| 590 | 99.36 | 79.49 | 76.89 | 5.6 | 16.29 | 101.39 | 20.78 | 99.5%
+| 128 | 99.56 | 79.65 | 68.89 | 33.1 | 67.27 | 17.19 | 14.52 | 99.5%
+| 64 | 52.8 | 42.3 | 32.23 | 31.3 | 63.06 | 9.65 | 14.37 | 31.5mpps
+|=================
+
+<1> Extrapolated L1 bandwidth per 1 core @ 100% CPU utilization.
+<2> Extrapolated amount of MPPS per 1 core @ 100% CPU utilization.
+
+== Appendix
+
+=== Preparing setup and running the tests.
+
+==== Hardware preparations
+
+Order the UCS with HW described above.
+
+* There are several NICs with this chipset. +
+Bare Intel NICs don't work with Cisco QSFP+ optics, for such case you will need Silicom NICs.
+* Use NICs with 2x40G ports in each.
+* Put the NICs at different NUMAs (first on the left side, second on the right side).
+
+==== Software preparations
+
+* Install the OS (Bare metal Linux, *not* VM!)
+* Obtain the latest TRex package: wget https://trex-tgn.cisco.com/trex/release/latest
+* Untar the package: tar -xzf latest
+* Change dir to unzipped TRex
+* Create config file using command: sudo python dpdk_setup_ports.py -i
+** In case of Ubuntu 16 need python3
+** See paragraph link:trex_stateless_bench.html#_config_creation[config creation] for detailed step-by-step
+
+==== The tests
+
+* Run the TRex server: sudo ./t-rex-64 -i -c 7
+* In another shell run TRex console: trex-console
+** The console can be run from another computer with -s argument, --help for more info.
+** Other options for TRex client are automation or GUI
+* In the console, run "tui" command, and then send the traffic with commands like:
+** start -f stl/bench.py -m 50% --port 0 3 -t size=590,vm=var1
+** stop
+** clear
+** start -f stl/bench.py -m 30mpps --port 0 -t size=64,vm=cached
+** start -f stl/bench.py -m 100% -t size=1514,vm=random --force
+
+==== Config creation
+
+In our setup we will not use hyper-threading. +
+We will start with command: +
+sudo ./dpdk_setup_ports.py -i --no-ht +
+ +
+Printed table with interfaces info:
+
+[cols="4,6,9,19,33,9,10,10", options="header"]
+|=================
+^| ID ^| NUMA ^| PCI ^| MAC ^| Name ^| Driver ^| Linux IF ^| Active
+| 0 | 0 | 02:00.0 | 68:05:ca:32:15:b0 | Device 1583 | i40e | p1p1 |
+| 1 | 0 | 02:00.1 | 68:05:ca:32:15:b1 | Device 1583 | i40e | p1p2 |
+| 2 | 0 | 05:00.0 | 00:E0:ED:5D:82:D1 | Device 1583 | igb_uio | |
+| 3 | 0 | 05:00.1 | 00:E0:ED:5D:82:D2 | Device 1583 | igb_uio | |
+| 4 | 0 | 0a:00.0 | 04:62:73:5f:e8:a8 | I350 Gigabit Network Connection | igb | p4p1 | \*Active*
+| 5 | 0 | 0a:00.1 | 04:62:73:5f:e8:a9 | I350 Gigabit Network Connection | igb | p4p2 |
+| 6 | 1 | 84:00.0 | 68:05:CA:32:0C:38 | Device 1583 | igb_uio | |
+| 7 | 1 | 84:00.1 | 68:05:CA:32:0C:39 | Device 1583 | igb_uio | |
+|=================
+
+We will be asked to specify interfaces for TRex usage:
+
+==========================
+Please choose even number of interfaces either by ID or PCI or Linux IF (look at columns above). +
+Stateful will use order of interfaces: Client1 Server1 Client2 Server2 etc. for flows. +
+Stateless can be in any order. +
+Try to choose each pair of interfaces to be on same NUMA within the pair for performance. +
+Enter list of interfaces in line (for example: 1 3) : *2 3 6 7*
+==========================
+
+In our setup we have used 2, 3, 6, 7. +
+Next, we need to specify destination MAC addresses for given interfaces. +
+By default assumed loopback or L2 Switch with ports connection: 1^st^ port&#8596;2^nd^ port, 3^rd^ port&#8596;4^th^ port etc. +
+If you have router or L3 switch or some different connection, change the destination MACs accordingly. +
+In our case, ports are connected 2&#8596;7, 3&#8596;6. +
+We will give proper MACs as destination by clicking "y" and copy-paste MAC:
+
+==========================
+For interface 2, assuming loopback to it's dual interface 3. +
+Destination MAC is 00:E0:ED:5D:82:D2. Change it to MAC of DUT? (y/N).*y* +
+Please enter new destination MAC of interface 2: *68:05:CA:32:0C:39* +
+For interface 3, assuming loopback to it's dual interface 2. +
+Destination MAC is 00:E0:ED:5D:82:D1. Change it to MAC of DUT? (y/N).*y* +
+Please enter new destination MAC of interface 3: *68:05:CA:32:0C:38* +
+For interface 6, assuming loopback to it's dual interface 7. +
+Destination MAC is 68:05:CA:32:0C:39. Change it to MAC of DUT? (y/N).*y* +
+Please enter new destination MAC of interface 6: *00:E0:ED:5D:82:D2* +
+For interface 7, assuming loopback to it's dual interface 6. +
+Destination MAC is 68:05:CA:32:0C:38. Change it to MAC of DUT? (y/N).*y* +
+Please enter new destination MAC of interface 7: *00:E0:ED:5D:82:D1*
+==========================
+
+Finally, you can print generated config and save it to file:
+
+==========================
+Print preview of generated config? (Y/n) +
+++++
+<pre>### Config file generated by dpdk_setup_ports.py ###
+
+- port_limit: 4
+ version: 2
+ interfaces: ['05:00.0', '05:00.1', '84:00.0', '84:00.1']
+ port_info:
+ - dest_mac: [0x68, 0x05, 0xca, 0x32, 0x0c, 0x39]
+ src_mac: [0x00, 0xe0, 0xed, 0x5d, 0x82, 0xd1]
+ - dest_mac: [0x68, 0x05, 0xca, 0x32, 0x0c, 0x38]
+ src_mac: [0x00, 0xe0, 0xed, 0x5d, 0x82, 0xd2]
+
+ - dest_mac: [0x00, 0xe0, 0xed, 0x5d, 0x82, 0xd2]
+ src_mac: [0x68, 0x05, 0xca, 0x32, 0x0c, 0x38]
+ - dest_mac: [0x00, 0xe0, 0xed, 0x5d, 0x82, 0xd1]
+ src_mac: [0x68, 0x05, 0xca, 0x32, 0x0c, 0x39]
+
+ platform:
+ master_thread_id: 0
+ latency_thread_id: 15
+ dual_if:
+ - socket: 0
+ threads: [1,2,3,4,5,6,7] +
+
+ - socket: 1
+ threads: [8,9,10,11,12,13,14]
+
+</pre>
+++++
+Save the config to file? (Y/n) +
+Default filename is /etc/trex_cfg.yaml +
+Press ENTER to confirm or enter new file: +
+File /etc/trex_cfg.yaml already exist, overwrite? (y/N)*y* +
+Saved.
+==========================
+
+
+=== Some of screenshots of console with commands
+
+==== 64 bytes
+
+Utilization:
+
+image:images/64_util.png[title="64 bytes util",align="left",width={p_width}, link="images/64_util.png"]
+
+No drops:
+
+image:images/64_nodrop.png[title="64 bytes no drops",align="left",width={p_width}, link="images/64_nodrop.png"]
+
+==== 128 bytes
+
+Utilization:
+
+image:images/128_util.png[title="128 bytes util",align="left",width={p_width}, link="images/128_util.png"]
+
+No drops:
+
+image:images/128_nodrop.png[title="128 bytes no drops",align="left",width={p_width}, link="images/128_nodrop.png"]
+
+==== 590 bytes
+
+Utilization:
+
+image:images/590_util.png[title="128 bytes util",align="left",width={p_width}, link="images/590_util.png"]
+
+No drops:
+
+image:images/590_nodrop.png[title="590 bytes no drops",align="left",width={p_width}, link="images/590_nodrop.png"]
+
+==== 1514 bytes
+
+Utilization:
+
+image:images/1514_util.png[title="128 bytes util",align="left",width={p_width}, link="images/1514_util.png"]
+
+No drops:
+
+image:images/1514_nodrop.png[title="1514 bytes no drops",align="left",width={p_width}, link="images/1514_nodrop.png"]
+
diff --git a/visio_drawings/illustrations_stateless.vsd b/visio_drawings/illustrations_stateless.vsd
index aa827a21..9a979a7f 100755
--- a/visio_drawings/illustrations_stateless.vsd
+++ b/visio_drawings/illustrations_stateless.vsd
Binary files differ
diff --git a/ws_main.py b/ws_main.py
index 8b2f99b6..762bb7b2 100755
--- a/ws_main.py
+++ b/ws_main.py
@@ -909,6 +909,9 @@ def build(bld):
source='trex_stateless.asciidoc waf.css', target='trex_stateless.html',scan=ascii_doc_scan);
bld(rule=convert_to_html_toc_book,
+ source='trex_stateless_bench.asciidoc waf.css', target='trex_stateless_bench.html',scan=ascii_doc_scan);
+
+ bld(rule=convert_to_html_toc_book,
source='trex_book.asciidoc waf.css', target='trex_manual.html',scan=ascii_doc_scan);
bld(rule=convert_to_html_toc_book,