2636626a7923a883082224b79606ae6f4c8cc7f4
[vswitchperf.git] / docs / testing / user / configguide / trafficgen.rst
1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. http://creativecommons.org/licenses/by/4.0
3 .. (c) OPNFV, Intel Corporation, AT&T and others.
4
5 .. _trafficgen-installation:
6
7 ===========================
8 'vsperf' Traffic Gen Guide
9 ===========================
10
11 Overview
12 --------
13
14 VSPERF supports the following traffic generators:
15
16   * Dummy_ (DEFAULT)
17   * Ixia_
18   * `Spirent TestCenter`_
19   * `Xena Networks`_
20   * MoonGen_
21   * Trex_
22
23 To see the list of traffic gens from the cli:
24
25 .. code-block:: console
26
27     $ ./vsperf --list-trafficgens
28
29 This guide provides the details of how to install
30 and configure the various traffic generators.
31
32 Background Information
33 ----------------------
34 The traffic default configuration can be found in **conf/03_traffic.conf**,
35 and is configured as follows:
36
37 .. code-block:: console
38
39     TRAFFIC = {
40         'traffic_type' : 'rfc2544_throughput',
41         'frame_rate' : 100,
42         'burst_size' : 100,
43         'bidir' : 'True',  # will be passed as string in title format to tgen
44         'multistream' : 0,
45         'stream_type' : 'L4',
46         'pre_installed_flows' : 'No',           # used by vswitch implementation
47         'flow_type' : 'port',                   # used by vswitch implementation
48         'flow_control' : False,                 # supported only by IxNet
49         'learning_frames' : True,               # supported only by IxNet
50         'l2': {
51             'framesize': 64,
52             'srcmac': '00:00:00:00:00:00',
53             'dstmac': '00:00:00:00:00:00',
54         },
55         'l3': {
56             'enabled': True,
57             'proto': 'udp',
58             'srcip': '1.1.1.1',
59             'dstip': '90.90.90.90',
60         },
61         'l4': {
62             'enabled': True,
63             'srcport': 3000,
64             'dstport': 3001,
65         },
66         'vlan': {
67             'enabled': False,
68             'id': 0,
69             'priority': 0,
70             'cfi': 0,
71         },
72         'capture': {
73             'enabled': False,
74             'tx_ports' : [0],
75             'rx_ports' : [1],
76             'count': 1,
77             'filter': '',
78         },
79         'scapy': {
80             'enabled': False,
81             '0' : 'Ether(src={Ether_src}, dst={Ether_dst})/'
82                   'Dot1Q(prio={Dot1Q_prio}, id={Dot1Q_id}, vlan={Dot1Q_vlan})/'
83                   'IP(proto={IP_proto}, src={IP_src}, dst={IP_dst})/'
84                   '{IP_PROTO}(sport={IP_PROTO_sport}, dport={IP_PROTO_dport})',
85             '1' : 'Ether(src={Ether_dst}, dst={Ether_src})/'
86                   'Dot1Q(prio={Dot1Q_prio}, id={Dot1Q_id}, vlan={Dot1Q_vlan})/'
87                   'IP(proto={IP_proto}, src={IP_dst}, dst={IP_src})/'
88                   '{IP_PROTO}(sport={IP_PROTO_dport}, dport={IP_PROTO_sport})',
89         }
90     }
91
92 A detailed description of the ``TRAFFIC`` dictionary can be found at
93 :ref:`configuration-of-traffic-dictionary`.
94
95 The framesize parameter can be overridden from the configuration
96 files by adding the following to your custom configuration file
97 ``10_custom.conf``:
98
99 .. code-block:: console
100
101     TRAFFICGEN_PKT_SIZES = (64, 128,)
102
103 OR from the commandline:
104
105 .. code-block:: console
106
107     $ ./vsperf --test-params "TRAFFICGEN_PKT_SIZES=(x,y)" $TESTNAME
108
109 You can also modify the traffic transmission duration and the number
110 of tests run by the traffic generator by extending the example
111 commandline above to:
112
113 .. code-block:: console
114
115     $ ./vsperf --test-params "TRAFFICGEN_PKT_SIZES=(x,y);TRAFFICGEN_DURATION=10;" \
116                              "TRAFFICGEN_RFC2544_TESTS=1" $TESTNAME
117
118 .. _trafficgen-dummy:
119
120 Dummy
121 -----
122
123 The Dummy traffic generator can be used to test VSPERF installation or
124 to demonstrate VSPERF functionality at DUT without connection
125 to a real traffic generator.
126
127 You could also use the Dummy generator in case, that your external
128 traffic generator is not supported by VSPERF. In such case you could
129 use VSPERF to setup your test scenario and then transmit the traffic.
130 After the transmission is completed you could specify values for all
131 collected metrics and VSPERF will use them to generate final reports.
132
133 Setup
134 ~~~~~
135
136 To select the Dummy generator please add the following to your
137 custom configuration file ``10_custom.conf``.
138
139 .. code-block:: console
140
141      TRAFFICGEN = 'Dummy'
142
143 OR run ``vsperf`` with the ``--trafficgen`` argument
144
145 .. code-block:: console
146
147     $ ./vsperf --trafficgen Dummy $TESTNAME
148
149 Where $TESTNAME is the name of the vsperf test you would like to run.
150 This will setup the vSwitch and the VNF (if one is part of your test)
151 print the traffic configuration and prompt you to transmit traffic
152 when the setup is complete.
153
154 .. code-block:: console
155
156     Please send 'continuous' traffic with the following stream config:
157     30mS, 90mpps, multistream False
158     and the following flow config:
159     {
160         "flow_type": "port",
161         "l3": {
162             "enabled": True,
163             "srcip": "1.1.1.1",
164             "proto": "udp",
165             "dstip": "90.90.90.90"
166         },
167         "traffic_type": "rfc2544_continuous",
168         "multistream": 0,
169         "bidir": "True",
170         "vlan": {
171             "cfi": 0,
172             "priority": 0,
173             "id": 0,
174             "enabled": False
175         },
176         "l4": {
177             "enabled": True,
178             "srcport": 3000,
179             "dstport": 3001,
180         },
181         "frame_rate": 90,
182         "l2": {
183             "dstmac": "00:00:00:00:00:00",
184             "srcmac": "00:00:00:00:00:00",
185             "framesize": 64
186         }
187     }
188     What was the result for 'frames tx'?
189
190 When your traffic generator has completed traffic transmission and provided
191 the results please input these at the VSPERF prompt. VSPERF will try
192 to verify the input:
193
194 .. code-block:: console
195
196     Is '$input_value' correct?
197
198 Please answer with y OR n.
199
200 VSPERF will ask you to provide a value for every of collected metrics. The list
201 of metrics can be found at traffic-type-metrics_.
202 Finally vsperf will print out the results for your test and generate the
203 appropriate logs and report files.
204
205 .. _traffic-type-metrics:
206
207 Metrics collected for supported traffic types
208 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
209
210 Below you could find a list of metrics collected by VSPERF for each of supported
211 traffic types.
212
213 RFC2544 Throughput and Continuous:
214
215   * frames tx
216   * frames rx
217   * min latency
218   * max latency
219   * avg latency
220   * frameloss
221
222 RFC2544 Back2back:
223
224   * b2b frames
225   * b2b frame loss %
226
227 Dummy result pre-configuration
228 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
229
230 In case of a Dummy traffic generator it is possible to pre-configure the test
231 results. This is useful for creation of demo testcases, which do not require
232 a real traffic generator. Such testcase can be run by any user and it will still
233 generate all reports and result files.
234
235 Result values can be specified within ``TRAFFICGEN_DUMMY_RESULTS`` dictionary,
236 where every of collected metrics must be properly defined. Please check the list
237 of traffic-type-metrics_.
238
239 Dictionary with dummy results can be passed by CLI argument ``--test-params``
240 or specified in ``Parameters`` section of testcase definition.
241
242 Example of testcase execution with dummy results defined by CLI argument:
243
244 .. code-block:: console
245
246     $ ./vsperf back2back --trafficgen Dummy --test-params \
247       "TRAFFICGEN_DUMMY_RESULTS={'b2b frames':'3000','b2b frame loss %':'0.0'}"
248
249 Example of testcase definition with pre-configured dummy results:
250
251 .. code-block:: python
252
253     {
254         "Name": "back2back",
255         "Traffic Type": "rfc2544_back2back",
256         "Deployment": "p2p",
257         "biDirectional": "True",
258         "Description": "LTD.Throughput.RFC2544.BackToBackFrames",
259         "Parameters" : {
260             'TRAFFICGEN_DUMMY_RESULTS' : {'b2b frames':'3000','b2b frame loss %':'0.0'}
261         },
262     },
263
264 **NOTE:** Pre-configured results for the Dummy traffic generator will be used only
265 in case, that the Dummy traffic generator is used. Otherwise the option
266 ``TRAFFICGEN_DUMMY_RESULTS`` will be ignored.
267
268 .. _Ixia:
269
270 Ixia
271 ----
272
273 VSPERF can use both IxNetwork and IxExplorer TCL servers to control Ixia chassis.
274 However, usage of IxNetwork TCL server is a preferred option. The following sections
275 will describe installation and configuration of IxNetwork components used by VSPERF.
276
277 Installation
278 ~~~~~~~~~~~~
279
280 On the system under the test you need to install IxNetworkTclClient$(VER\_NUM)Linux.bin.tgz.
281
282 On the IXIA client software system you need to install IxNetwork TCL server. After its
283 installation you should configure it as follows:
284
285     1. Find the IxNetwork TCL server app (start -> All Programs -> IXIA ->
286        IxNetwork -> IxNetwork\_$(VER\_NUM) -> IxNetwork TCL Server)
287     2. Right click on IxNetwork TCL Server, select properties - Under shortcut tab in
288        the Target dialogue box make sure there is the argument "-tclport xxxx"
289        where xxxx is your port number (take note of this port number as you will
290        need it for the 10\_custom.conf file).
291
292        .. image:: TCLServerProperties.png
293
294     3. Hit Ok and start the TCL server application
295
296 VSPERF configuration
297 ~~~~~~~~~~~~~~~~~~~~
298
299 There are several configuration options specific to the IxNetwork traffic generator
300 from IXIA. It is essential to set them correctly, before the VSPERF is executed
301 for the first time.
302
303 Detailed description of options follows:
304
305  * ``TRAFFICGEN_IXNET_MACHINE`` - IP address of server, where IxNetwork TCL Server is running
306  * ``TRAFFICGEN_IXNET_PORT`` - PORT, where IxNetwork TCL Server is accepting connections from
307    TCL clients
308  * ``TRAFFICGEN_IXNET_USER`` - username, which will be used during communication with IxNetwork
309    TCL Server and IXIA chassis
310  * ``TRAFFICGEN_IXIA_HOST`` - IP address of IXIA traffic generator chassis
311  * ``TRAFFICGEN_IXIA_CARD`` - identification of card with dedicated ports at IXIA chassis
312  * ``TRAFFICGEN_IXIA_PORT1`` - identification of the first dedicated port at ``TRAFFICGEN_IXIA_CARD``
313    at IXIA chassis; VSPERF uses two separated ports for traffic generation. In case of
314    unidirectional traffic, it is essential to correctly connect 1st IXIA port to the 1st NIC
315    at DUT, i.e. to the first PCI handle from ``WHITELIST_NICS`` list. Otherwise traffic may not
316    be able to pass through the vSwitch.
317    **NOTE**: In case that ``TRAFFICGEN_IXIA_PORT1`` and ``TRAFFICGEN_IXIA_PORT2`` are set to the
318    same value, then VSPERF will assume, that there is only one port connection between IXIA
319    and DUT. In this case it must be ensured, that chosen IXIA port is physically connected to the
320    first NIC from ``WHITELIST_NICS`` list.
321  * ``TRAFFICGEN_IXIA_PORT2`` - identification of the second dedicated port at ``TRAFFICGEN_IXIA_CARD``
322    at IXIA chassis; VSPERF uses two separated ports for traffic generation. In case of
323    unidirectional traffic, it is essential to correctly connect 2nd IXIA port to the 2nd NIC
324    at DUT, i.e. to the second PCI handle from ``WHITELIST_NICS`` list. Otherwise traffic may not
325    be able to pass through the vSwitch.
326    **NOTE**: In case that ``TRAFFICGEN_IXIA_PORT1`` and ``TRAFFICGEN_IXIA_PORT2`` are set to the
327    same value, then VSPERF will assume, that there is only one port connection between IXIA
328    and DUT. In this case it must be ensured, that chosen IXIA port is physically connected to the
329    first NIC from ``WHITELIST_NICS`` list.
330  * ``TRAFFICGEN_IXNET_LIB_PATH`` - path to the DUT specific installation of IxNetwork TCL API
331  * ``TRAFFICGEN_IXNET_TCL_SCRIPT`` - name of the TCL script, which VSPERF will use for
332    communication with IXIA TCL server
333  * ``TRAFFICGEN_IXNET_TESTER_RESULT_DIR`` - folder accessible from IxNetwork TCL server,
334    where test results are stored, e.g. ``c:/ixia_results``; see test-results-share_
335  * ``TRAFFICGEN_IXNET_DUT_RESULT_DIR`` - directory accessible from the DUT, where test
336    results from IxNetwork TCL server are stored, e.g. ``/mnt/ixia_results``; see
337    test-results-share_
338
339 .. _test-results-share:
340
341 Test results share
342 ~~~~~~~~~~~~~~~~~~
343
344 VSPERF is not able to retrieve test results via TCL API directly. Instead, all test
345 results are stored at IxNetwork TCL server. Results are stored at folder defined by
346 ``TRAFFICGEN_IXNET_TESTER_RESULT_DIR`` configuration parameter. Content of this
347 folder must be shared (e.g. via samba protocol) between TCL Server and DUT, where
348 VSPERF is executed. VSPERF expects, that test results will be available at directory
349 configured by ``TRAFFICGEN_IXNET_DUT_RESULT_DIR`` configuration parameter.
350
351 Example of sharing configuration:
352
353  * Create a new folder at IxNetwork TCL server machine, e.g. ``c:\ixia_results``
354  * Modify sharing options of ``ixia_results`` folder to share it with everybody
355  * Create a new directory at DUT, where shared directory with results
356    will be mounted, e.g. ``/mnt/ixia_results``
357  * Update your custom VSPERF configuration file as follows:
358
359    .. code-block:: python
360
361        TRAFFICGEN_IXNET_TESTER_RESULT_DIR = 'c:/ixia_results'
362        TRAFFICGEN_IXNET_DUT_RESULT_DIR = '/mnt/ixia_results'
363
364    **NOTE:** It is essential to use slashes '/' also in path
365    configured by ``TRAFFICGEN_IXNET_TESTER_RESULT_DIR`` parameter.
366  * Install cifs-utils package.
367
368    e.g. at rpm based Linux distribution:
369
370    .. code-block:: console
371
372        yum install cifs-utils
373
374  * Mount shared directory, so VSPERF can access test results.
375
376    e.g. by adding new record into ``/etc/fstab``
377
378    .. code-block:: console
379
380        mount -t cifs //_TCL_SERVER_IP_OR_FQDN_/ixia_results /mnt/ixia_results
381              -o file_mode=0777,dir_mode=0777,nounix
382
383 It is recommended to verify, that any new file inserted into ``c:/ixia_results`` folder
384 is visible at DUT inside ``/mnt/ixia_results`` directory.
385
386 .. _`Spirent TestCenter`:
387
388 Spirent Setup
389 -------------
390
391 Spirent installation files and instructions are available on the
392 Spirent support website at:
393
394 http://support.spirent.com
395
396 Select a version of Spirent TestCenter software to utilize. This example
397 will use Spirent TestCenter v4.57 as an example. Substitute the appropriate
398 version in place of 'v4.57' in the examples, below.
399
400 On the CentOS 7 System
401 ~~~~~~~~~~~~~~~~~~~~~~
402
403 Download and install the following:
404
405 Spirent TestCenter Application, v4.57 for 64-bit Linux Client
406
407 Spirent Virtual Deployment Service (VDS)
408 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
409
410 Spirent VDS is required for both TestCenter hardware and virtual
411 chassis in the vsperf environment. For installation, select the version
412 that matches the Spirent TestCenter Application version. For v4.57,
413 the matching VDS version is 1.0.55. Download either the ova (VMware)
414 or qcow2 (QEMU) image and create a VM with it. Initialize the VM
415 according to Spirent installation instructions.
416
417 Using Spirent TestCenter Virtual (STCv)
418 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
419
420 STCv is available in both ova (VMware) and qcow2 (QEMU) formats. For
421 VMware, download:
422
423 Spirent TestCenter Virtual Machine for VMware, v4.57 for Hypervisor - VMware ESX.ESXi
424
425 Virtual test port performance is affected by the hypervisor configuration. For
426 best practice results in deploying STCv, the following is suggested:
427
428 - Create a single VM with two test ports rather than two VMs with one port each
429 - Set STCv in DPDK mode
430 - Give STCv 2*n + 1 cores, where n = the number of ports. For vsperf, cores = 5.
431 - Turning off hyperthreading and pinning these cores will improve performance
432 - Give STCv 2 GB of RAM
433
434 To get the highest performance and accuracy, Spirent TestCenter hardware is
435 recommended. vsperf can run with either stype test ports.
436
437 Using STC REST Client
438 ~~~~~~~~~~~~~~~~~~~~~
439 The stcrestclient package provides the stchttp.py ReST API wrapper module.
440 This allows simple function calls, nearly identical to those provided by
441 StcPython.py, to be used to access TestCenter server sessions via the
442 STC ReST API. Basic ReST functionality is provided by the resthttp module,
443 and may be used for writing ReST clients independent of STC.
444
445 - Project page: <https://github.com/Spirent/py-stcrestclient>
446 - Package download: <http://pypi.python.org/pypi/stcrestclient>
447
448 To use REST interface, follow the instructions in the Project page to
449 install the package. Once installed, the scripts named with 'rest' keyword
450 can be used. For example: testcenter-rfc2544-rest.py can be used to run
451 RFC 2544 tests using the REST interface.
452
453 Configuration:
454 ~~~~~~~~~~~~~~
455
456 1. The Labserver and license server addresses. These parameters applies to
457    all the tests, and are mandatory for all tests.
458
459 .. code-block:: console
460
461     TRAFFICGEN_STC_LAB_SERVER_ADDR = " "
462     TRAFFICGEN_STC_LICENSE_SERVER_ADDR = " "
463     TRAFFICGEN_STC_PYTHON2_PATH = " "
464     TRAFFICGEN_STC_TESTCENTER_PATH = " "
465     TRAFFICGEN_STC_TEST_SESSION_NAME = " "
466     TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX = " "
467
468 2. For RFC2544 tests, the following parameters are mandatory
469
470 .. code-block:: console
471
472     TRAFFICGEN_STC_EAST_CHASSIS_ADDR = " "
473     TRAFFICGEN_STC_EAST_SLOT_NUM = " "
474     TRAFFICGEN_STC_EAST_PORT_NUM = " "
475     TRAFFICGEN_STC_EAST_INTF_ADDR = " "
476     TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR = " "
477     TRAFFICGEN_STC_WEST_CHASSIS_ADDR = ""
478     TRAFFICGEN_STC_WEST_SLOT_NUM = " "
479     TRAFFICGEN_STC_WEST_PORT_NUM = " "
480     TRAFFICGEN_STC_WEST_INTF_ADDR = " "
481     TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR = " "
482     TRAFFICGEN_STC_RFC2544_TPUT_TEST_FILE_NAME
483
484 3. RFC2889 tests: Currently, the forwarding, address-caching, and
485    address-learning-rate tests of RFC2889 are supported.
486    The testcenter-rfc2889-rest.py script implements the rfc2889 tests.
487    The configuration for RFC2889 involves test-case definition, and parameter
488    definition, as described below. New results-constants, as shown below, are
489    added to support these tests.
490
491 Example of testcase definition for RFC2889 tests:
492
493 .. code-block:: python
494
495     {
496         "Name": "phy2phy_forwarding",
497         "Deployment": "p2p",
498         "Description": "LTD.Forwarding.RFC2889.MaxForwardingRate",
499         "Parameters" : {
500             "TRAFFIC" : {
501                 "traffic_type" : "rfc2889_forwarding",
502             },
503         },
504     }
505
506 For RFC2889 tests, specifying the locations for the monitoring ports is mandatory.
507 Necessary parameters are:
508
509 .. code-block:: console
510
511     TRAFFICGEN_STC_RFC2889_TEST_FILE_NAME
512     TRAFFICGEN_STC_EAST_CHASSIS_ADDR = " "
513     TRAFFICGEN_STC_EAST_SLOT_NUM = " "
514     TRAFFICGEN_STC_EAST_PORT_NUM = " "
515     TRAFFICGEN_STC_EAST_INTF_ADDR = " "
516     TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR = " "
517     TRAFFICGEN_STC_WEST_CHASSIS_ADDR = ""
518     TRAFFICGEN_STC_WEST_SLOT_NUM = " "
519     TRAFFICGEN_STC_WEST_PORT_NUM = " "
520     TRAFFICGEN_STC_WEST_INTF_ADDR = " "
521     TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR = " "
522     TRAFFICGEN_STC_VERBOSE = "True"
523     TRAFFICGEN_STC_RFC2889_LOCATIONS="//10.1.1.1/1/1,//10.1.1.1/2/2"
524
525 Other Configurations are :
526
527 .. code-block:: console
528
529     TRAFFICGEN_STC_RFC2889_MIN_LR = 1488
530     TRAFFICGEN_STC_RFC2889_MAX_LR = 14880
531     TRAFFICGEN_STC_RFC2889_MIN_ADDRS = 1000
532     TRAFFICGEN_STC_RFC2889_MAX_ADDRS = 65536
533     TRAFFICGEN_STC_RFC2889_AC_LR = 1000
534
535 The first 2 values are for address-learning test where as other 3 values are
536 for the Address caching capacity test. LR: Learning Rate. AC: Address Caching.
537 Maximum value for address is 16777216. Whereas, maximum for LR is 4294967295.
538
539 Results for RFC2889 Tests: Forwarding tests outputs following values:
540
541 .. code-block:: console
542
543     TX_RATE_FPS : "Transmission Rate in Frames/sec"
544     THROUGHPUT_RX_FPS: "Received Throughput Frames/sec"
545     TX_RATE_MBPS : " Transmission rate in MBPS"
546     THROUGHPUT_RX_MBPS: "Received Throughput in MBPS"
547     TX_RATE_PERCENT: "Transmission Rate in Percentage"
548     FRAME_LOSS_PERCENT: "Frame loss in Percentage"
549     FORWARDING_RATE_FPS: " Maximum Forwarding Rate in FPS"
550
551
552 Whereas, the address caching test outputs following values,
553
554 .. code-block:: console
555
556     CACHING_CAPACITY_ADDRS = 'Number of address it can cache'
557     ADDR_LEARNED_PERCENT = 'Percentage of address successfully learned'
558
559 and address learning test outputs just a single value:
560
561 .. code-block:: console
562
563     OPTIMAL_LEARNING_RATE_FPS = 'Optimal learning rate in fps'
564
565 Note that 'FORWARDING_RATE_FPS', 'CACHING_CAPACITY_ADDRS',
566 'ADDR_LEARNED_PERCENT' and 'OPTIMAL_LEARNING_RATE_FPS' are the new
567 result-constants added to support RFC2889 tests.
568
569 .. _`Xena Networks`:
570
571 Xena Networks
572 -------------
573
574 Installation
575 ~~~~~~~~~~~~
576
577 Xena Networks traffic generator requires specific files and packages to be
578 installed. It is assumed the user has access to the Xena2544.exe file which
579 must be placed in VSPerf installation location under the tools/pkt_gen/xena
580 folder. Contact Xena Networks for the latest version of this file. The user
581 can also visit www.xenanetworks/downloads to obtain the file with a valid
582 support contract.
583
584 **Note** VSPerf has been fully tested with version v2.43 of Xena2544.exe
585
586 To execute the Xena2544.exe file under Linux distributions the mono-complete
587 package must be installed. To install this package follow the instructions
588 below. Further information can be obtained from
589 http://www.mono-project.com/docs/getting-started/install/linux/
590
591 .. code-block:: console
592
593     rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
594     yum-config-manager --add-repo http://download.mono-project.com/repo/centos/
595     yum -y install mono-complete-5.8.0.127-0.xamarin.3.epel7.x86_64
596
597 To prevent gpg errors on future yum installation of packages the mono-project
598 repo should be disabled once installed.
599
600 .. code-block:: console
601
602     yum-config-manager --disable download.mono-project.com_repo_centos_
603
604 Configuration
605 ~~~~~~~~~~~~~
606
607 Connection information for your Xena Chassis must be supplied inside the
608 ``10_custom.conf`` or ``03_custom.conf`` file. The following parameters must be
609 set to allow for proper connections to the chassis.
610
611 .. code-block:: console
612
613     TRAFFICGEN_XENA_IP = ''
614     TRAFFICGEN_XENA_PORT1 = ''
615     TRAFFICGEN_XENA_PORT2 = ''
616     TRAFFICGEN_XENA_USER = ''
617     TRAFFICGEN_XENA_PASSWORD = ''
618     TRAFFICGEN_XENA_MODULE1 = ''
619     TRAFFICGEN_XENA_MODULE2 = ''
620
621 RFC2544 Throughput Testing
622 ~~~~~~~~~~~~~~~~~~~~~~~~~~
623
624 Xena traffic generator testing for rfc2544 throughput can be modified for
625 different behaviors if needed. The default options for the following are
626 optimized for best results.
627
628 .. code-block:: console
629
630     TRAFFICGEN_XENA_2544_TPUT_INIT_VALUE = '10.0'
631     TRAFFICGEN_XENA_2544_TPUT_MIN_VALUE = '0.1'
632     TRAFFICGEN_XENA_2544_TPUT_MAX_VALUE = '100.0'
633     TRAFFICGEN_XENA_2544_TPUT_VALUE_RESOLUTION = '0.5'
634     TRAFFICGEN_XENA_2544_TPUT_USEPASS_THRESHHOLD = 'false'
635     TRAFFICGEN_XENA_2544_TPUT_PASS_THRESHHOLD = '0.0'
636
637 Each value modifies the behavior of rfc 2544 throughput testing. Refer to your
638 Xena documentation to understand the behavior changes in modifying these
639 values.
640
641 Xena RFC2544 testing inside VSPerf also includes a final verification option.
642 This option allows for a faster binary search with a longer final verification
643 of the binary search result. This feature can be enabled in the configuration
644 files as well as the length of the final verification in seconds.
645
646 ..code-block:: python
647
648     TRAFFICGEN_XENA_RFC2544_VERIFY = False
649     TRAFFICGEN_XENA_RFC2544_VERIFY_DURATION = 120
650
651 If the final verification does not pass the test with the lossrate specified
652 it will continue the binary search from its previous point. If the smart search
653 option is enabled the search will continue by taking the current pass rate minus
654 the minimum and divided by 2. The maximum is set to the last pass rate minus the
655 threshold value set.
656
657 For example if the settings are as follows
658
659 ..code-block:: python
660
661     TRAFFICGEN_XENA_RFC2544_BINARY_RESTART_SMART_SEARCH = True
662     TRAFFICGEN_XENA_2544_TPUT_MIN_VALUE = '0.5'
663     TRAFFICGEN_XENA_2544_TPUT_VALUE_RESOLUTION = '0.5'
664
665 and the verification attempt was 64.5, smart search would take 64.5 - 0.5 / 2.
666 This would continue the search at 32 but still have a maximum possible value of
667 64.
668
669 If smart is not enabled it will just resume at the last pass rate minus the
670 threshold value.
671
672 Continuous Traffic Testing
673 ~~~~~~~~~~~~~~~~~~~~~~~~~~
674
675 Xena continuous traffic by default does a 3 second learning preemption to allow
676 the DUT to receive learning packets before a continuous test is performed. If
677 a custom test case requires this learning be disabled, you can disable the option
678 or modify the length of the learning by modifying the following settings.
679
680 .. code-block:: console
681
682     TRAFFICGEN_XENA_CONT_PORT_LEARNING_ENABLED = False
683     TRAFFICGEN_XENA_CONT_PORT_LEARNING_DURATION = 3
684
685 Multistream Modifier
686 ~~~~~~~~~~~~~~~~~~~~
687
688 Xena has a modifier maximum value or 64k in size. For this reason when specifying
689 Multistream values of greater than 64k for Layer 2 or Layer 3 it will use two
690 modifiers that may be modified to a value that can be square rooted to create the
691 two modifiers. You will see a log notification for the new value that was calculated.
692
693 MoonGen
694 -------
695
696 Installation
697 ~~~~~~~~~~~~
698
699 MoonGen architecture overview and general installation instructions
700 can be found here:
701
702 https://github.com/emmericp/MoonGen
703
704 * Note:  Today, MoonGen with VSPERF only supports 10Gbps line speeds.
705
706 For VSPERF use, MoonGen should be cloned from here (as opposed to the
707 previously mentioned GitHub):
708
709 .. code-block:: console
710
711     git clone https://github.com/atheurer/lua-trafficgen
712
713 and use the master branch:
714
715 .. code-block:: console
716
717     git checkout master
718
719 VSPERF uses a particular Lua script with the MoonGen project:
720
721 trafficgen.lua
722
723 Follow MoonGen set up and execution instructions here:
724
725 https://github.com/atheurer/lua-trafficgen/blob/master/README.md
726
727 Note one will need to set up ssh login to not use passwords between the server
728 running MoonGen and the device under test (running the VSPERF test
729 infrastructure).  This is because VSPERF on one server uses 'ssh' to
730 configure and run MoonGen upon the other server.
731
732 One can set up this ssh access by doing the following on both servers:
733
734 .. code-block:: console
735
736     ssh-keygen -b 2048 -t rsa
737     ssh-copy-id <other server>
738
739 Configuration
740 ~~~~~~~~~~~~~
741
742 Connection information for MoonGen must be supplied inside the
743 ``10_custom.conf`` or ``03_custom.conf`` file. The following parameters must be
744 set to allow for proper connections to the host with MoonGen.
745
746 .. code-block:: console
747
748     TRAFFICGEN_MOONGEN_HOST_IP_ADDR = ""
749     TRAFFICGEN_MOONGEN_USER = ""
750     TRAFFICGEN_MOONGEN_BASE_DIR = ""
751     TRAFFICGEN_MOONGEN_PORTS = ""
752     TRAFFICGEN_MOONGEN_LINE_SPEED_GBPS = ""
753
754 Trex
755 ----
756
757 Installation
758 ~~~~~~~~~~~~
759
760 Trex architecture overview and general installation instructions
761 can be found here:
762
763 https://trex-tgn.cisco.com/trex/doc/trex_stateless.html
764
765 You can directly download from GitHub:
766
767 .. code-block:: console
768
769     git clone https://github.com/cisco-system-traffic-generator/trex-core
770
771 and use the same Trex version for both server and client API.
772
773 **NOTE:** The Trex API version used by VSPERF is defined by variable ``TREX_TAG``
774 in file ``src/package-list.mk``.
775
776 .. code-block:: console
777
778     git checkout v2.38
779
780 or Trex latest release you can download from here:
781
782 .. code-block:: console
783
784     wget --no-cache http://trex-tgn.cisco.com/trex/release/latest
785
786 After download, Trex repo has to be built:
787
788 .. code-block:: console
789
790    cd trex-core/linux_dpdk
791    ./b configure   (run only once)
792    ./b build
793
794 Next step is to create a minimum configuration file. It can be created by script ``dpdk_setup_ports.py``.
795 The script with parameter ``-i`` will run in interactive mode and it will create file ``/etc/trex_cfg.yaml``.
796
797 .. code-block:: console
798
799    cd trex-core/scripts
800    sudo ./dpdk_setup_ports.py -i
801
802 Or example of configuration file can be found at location below, but it must be updated manually:
803
804 .. code-block:: console
805
806    cp trex-core/scripts/cfg/simple_cfg /etc/trex_cfg.yaml
807
808 For additional information about configuration file see official documentation (chapter 3.1.2):
809
810 https://trex-tgn.cisco.com/trex/doc/trex_manual.html#_creating_minimum_configuration_file
811
812 After compilation and configuration it is possible to run trex server in stateless mode.
813 It is neccesary for proper connection between Trex server and VSPERF.
814
815 .. code-block:: console
816
817    cd trex-core/scripts/
818    ./t-rex-64 -i
819
820 **NOTE:** Please check your firewall settings at both DUT and T-Rex server.
821 Firewall must allow a connection from DUT (VSPERF) to the T-Rex server running
822 at TCP port 4501.
823
824 **NOTE:** For high speed cards it may be advantageous to start T-Rex with more transmit queues/cores.
825
826 .. code-block:: console
827
828    cd trex-cores/scripts/
829    ./t-rex-64 -i -c 10
830
831 For additional information about Trex stateless mode see Trex stateless documentation:
832
833 https://trex-tgn.cisco.com/trex/doc/trex_stateless.html
834
835 **NOTE:** One will need to set up ssh login to not use passwords between the server
836 running Trex and the device under test (running the VSPERF test
837 infrastructure). This is because VSPERF on one server uses 'ssh' to
838 configure and run Trex upon the other server.
839
840 One can set up this ssh access by doing the following on both servers:
841
842 .. code-block:: console
843
844     ssh-keygen -b 2048 -t rsa
845     ssh-copy-id <other server>
846
847 Configuration
848 ~~~~~~~~~~~~~
849
850 Connection information for Trex must be supplied inside the custom configuration
851 file. The following parameters must be set to allow for proper connections to the host with Trex.
852 Example of this configuration is in conf/03_traffic.conf or conf/10_custom.conf.
853
854 .. code-block:: console
855
856     TRAFFICGEN_TREX_HOST_IP_ADDR = ''
857     TRAFFICGEN_TREX_USER = ''
858     TRAFFICGEN_TREX_BASE_DIR = ''
859
860 TRAFFICGEN_TREX_USER has to have sudo permission and password-less access.
861 TRAFFICGEN_TREX_BASE_DIR is the place, where is stored 't-rex-64' file.
862
863 It is possible to specify the accuracy of RFC2544 Throughput measurement.
864 Threshold below defines maximal difference between frame rate of successful
865 (i.e. defined frameloss was reached) and unsuccessful (i.e. frameloss was
866 exceeded) iterations.
867
868 Default value of this parameter is defined in conf/03_traffic.conf as follows:
869
870 .. code-block:: console
871
872     TRAFFICGEN_TREX_RFC2544_TPUT_THRESHOLD = ''
873
874 T-Rex can have learning packets enabled. For certain tests it may be beneficial
875 to send some packets before starting test traffic to allow switch learning to take
876 place. This can be adjusted with the following configurations:
877
878 .. code-block:: console
879
880     TRAFFICGEN_TREX_LEARNING_MODE=True
881     TRAFFICGEN_TREX_LEARNING_DURATION=5
882
883 Latency measurements have impact on T-Rex performance. Thus vswitchperf uses a separate
884 latency stream for each direction with limited speed. This workaround is used for RFC2544
885 **Throughput** and **Continuous** traffic types. In case of **Burst** traffic type,
886 the latency statistics are measured for all frames in the burst. Collection of latency
887 statistics is driven by configuration option ``TRAFFICGEN_TREX_LATENCY_PPS`` as follows:
888
889     * value ``0`` - disables latency measurements
890     * non zero integer value - enables latency measurements; In case of Throughput
891         and Continuous traffic types, it specifies a speed of latency specific stream
892         in PPS. In case of burst traffic type, it enables latency measurements for all frames.
893
894 .. code-block:: console
895
896     TRAFFICGEN_TREX_LATENCY_PPS = 1000
897
898 SR-IOV and Multistream layer 2
899 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
900 T-Rex by default only accepts packets on the receive side if the destination mac matches the
901 MAC address specified in the /etc/trex-cfg.yaml on the server side. For SR-IOV this creates
902 challenges with modifying the MAC address in the traffic profile to correctly flow packets
903 through specified VFs. To remove this limitation enable promiscuous mode on T-Rex to allow
904 all packets regardless of the destination mac to be accepted.
905
906 This also creates problems when doing multistream at layer 2 since the source macs will be
907 modified. Enable Promiscuous mode when doing multistream at layer 2 testing with T-Rex.
908
909 .. code-block:: console
910
911     TRAFFICGEN_TREX_PROMISCUOUS=True
912
913 Card Bandwidth Options
914 ~~~~~~~~~~~~~~~~~~~~~~
915
916 T-Rex API will attempt to retrieve the highest possible speed from the card using internal
917 calls to port information. If you are using two separate cards then it will take the lowest
918 of the two cards as the max speed. If necessary you can try to force the API to use a
919 specific maximum speed per port. The below configurations can be adjusted to enable this.
920
921 .. code-block:: console
922
923     TRAFFICGEN_TREX_FORCE_PORT_SPEED = True
924     TRAFFICGEN_TREX_PORT_SPEED = 40000 # 40 gig
925
926 **Note::** Setting higher than possible speeds will result in unpredictable behavior when running
927 tests such as duration inaccuracy and/or complete test failure.
928
929 RFC2544 Validation
930 ~~~~~~~~~~~~~~~~~~
931
932 T-Rex can perform a verification run for a longer duration once the binary search of the
933 RFC2544 trials have completed. This duration should be at least 60 seconds. This is similar
934 to other traffic generator functionality where a more sustained time can be attempted to
935 verify longer runs from the result of the search. This can be configured with the following
936 params
937
938 .. code-block:: console
939
940     TRAFFICGEN_TREX_VERIFICATION_MODE = False
941     TRAFFICGEN_TREX_VERIFICATION_DURATION = 60
942     TRAFFICGEN_TREX_MAXIMUM_VERIFICATION_TRIALS = 10
943
944 The duration and maximum number of attempted verification trials can be set to change the
945 behavior of this step. If the verification step fails, it will resume the binary search
946 with new values where the maximum output will be the last attempted frame rate minus the
947 current set thresh hold.
948
949 Scapy frame definition
950 ~~~~~~~~~~~~~~~~~~~~~~
951
952 It is possible to use a SCAPY frame definition to generate various network protocols
953 by the **T-Rex** traffic generator. In case that particular network protocol layer
954 is disabled by the TRAFFIC dictionary (e.g. TRAFFIC['vlan']['enabled'] = False),
955 then disabled layer will be removed from the scapy format definition by VSPERF.
956
957 The scapy frame definition can refer to values defined by the TRAFFIC dictionary
958 by following keywords. These keywords are used in next examples.
959
960 * ``Ether_src`` - refers to ``TRAFFIC['l2']['srcmac']``
961 * ``Ether_dst`` - refers to ``TRAFFIC['l2']['dstmac']``
962 * ``IP_proto`` - refers to ``TRAFFIC['l3']['proto']``
963 * ``IP_PROTO`` - refers to upper case version of ``TRAFFIC['l3']['proto']``
964 * ``IP_src`` - refers to ``TRAFFIC['l3']['srcip']``
965 * ``IP_dst`` - refers to ``TRAFFIC['l3']['dstip']``
966 * ``IP_PROTO_sport`` - refers to ``TRAFFIC['l4']['srcport']``
967 * ``IP_PROTO_dport`` - refers to ``TRAFFIC['l4']['dstport']``
968 * ``Dot1Q_prio`` - refers to ``TRAFFIC['vlan']['priority']``
969 * ``Dot1Q_id`` - refers to ``TRAFFIC['vlan']['cfi']``
970 * ``Dot1Q_vlan`` - refers to ``TRAFFIC['vlan']['id']``
971
972 In following examples of SCAPY frame definition only relevant parts of TRAFFIC
973 dictionary are shown. The rest of the TRAFFIC dictionary is set to default values
974 as they are defined in ``conf/03_traffic.conf``.
975
976 Please check official documentation of SCAPY project for details about SCAPY frame
977 definition and supported network layers at: http://www.secdev.org/projects/scapy
978
979 #. Generate ICMP frames:
980
981    .. code-block:: console
982
983         'scapy': {
984             'enabled': True,
985             '0' : 'Ether(src={Ether_src}, dst={Ether_dst})/IP(proto="icmp", src={IP_src}, dst={IP_dst})/ICMP()',
986             '1' : 'Ether(src={Ether_dst}, dst={Ether_src})/IP(proto="icmp", src={IP_dst}, dst={IP_src})/ICMP()',
987         }
988
989 #. Generate IPv6 ICMP Echo Request
990
991    .. code-block:: console
992
993         'l3' : {
994             'srcip': 'feed::01',
995             'dstip': 'feed::02',
996         },
997         'scapy': {
998             'enabled': True,
999             '0' : 'Ether(src={Ether_src}, dst={Ether_dst})/IPv6(src={IP_src}, dst={IP_dst})/ICMPv6EchoRequest()',
1000             '1' : 'Ether(src={Ether_dst}, dst={Ether_src})/IPv6(src={IP_dst}, dst={IP_src})/ICMPv6EchoRequest()',
1001         }
1002
1003 #. Generate TCP frames:
1004
1005    Example uses default SCAPY frame definition, which can reflect ``TRAFFIC['l3']['proto']`` settings.
1006
1007    .. code-block:: console
1008
1009         'l3' : {
1010             'proto' : 'tcp',
1011         },
1012