zperf: Network Traffic Generator

Overview

zperf is a shell utility which allows to generate network traffic in Zephyr. The tool may be used to evaluate network bandwidth.

zperf is compatible with iPerf 2.0.10 and newer. For compatability with older versions, enable CONFIG_NET_ZPERF_LEGACY_HEADER_COMPAT.

zperf can be enabled in any application, a dedicated sample is also present in Zephyr. See zperf sample application for details.

Sample Usage

If Zephyr acts as a client, iPerf must be executed in server mode. For example, the following command line must be used for UDP testing:

$ iperf -s -l 1K -u -V -B 2001:db8::2

For TCP testing, the command line would look like this:

$ iperf -s -l 1K -V -B 2001:db8::2

In the Zephyr console, zperf can be executed as follows:

zperf udp upload 2001:db8::2 5001 10 1K 1M

For TCP the zperf command would look like this:

zperf tcp upload 2001:db8::2 5001 10 1K 1M

If the IP addresses of Zephyr and the host machine are specified in the config file, zperf can be started as follows:

zperf udp upload2 v6 10 1K 1M

or like this if you want to test TCP:

zperf tcp upload2 v6 10 1K 1M

If Zephyr is acting as a server, set the download mode as follows for UDP:

zperf udp download 5001

or like this for TCP:

zperf tcp download 5001

and in the host side, iPerf must be executed with the following command line if you are testing UDP:

$ iperf -l 1K -u -V -c 2001:db8::1 -p 5001

and this if you are testing TCP:

$ iperf -l 1K -V -c 2001:db8::1 -p 5001

iPerf output can be limited by using the -b option if Zephyr is not able to receive all the packets in orderly manner.

Session Management

If CONFIG_ZPERF_SESSION_PER_THREAD option is set, then multiple upload sessions can be done at the same time if user supplies -a option when starting the upload. Each session will have their own work queue to run the test. The session test results can be viewed also after the tests have finished. The sessions can be started with -w option which then lets the worker threads to wait a start signal so that all the threads can be started at the same time. This will prevent the case where the zperf shell cannot run because it is running in lower priority than the already started session thread. If you have only one upload session, then the -w is not really needed.

Following zperf shell commands are available for session management:

zperf shell command

Description

jobs

Show currently active or finished sessions

jobs all

Show statistics of finished sessions

jobs clear

Clear finished session statistics

jobs start

Start all the waiting sessions

Example:

uart:~$ zperf udp upload -a -t 5 192.0.2.2 5001 10 1K 1M
Remote port is 5001
Connecting to 192.0.2.2
Duration:       10.00 s
Packet size:    1000 bytes
Rate:           1000 kbps
Starting...
Rate:           1.00 Mbps
Packet duration 7 ms

uart:~$ zperf jobs all
No sessions sessions found
uart:~$ zperf jobs
           Thread    Remaining
Id  Proto  Priority  time (sec)
[1] UDP    5            4

Active sessions have not yet finished
-
Upload completed!
Statistics:             server  (client)
Duration:               30.01 s (30.01 s)
Num packets:            3799    (3799)
Num packets out order:  0
Num packets lost:       0
Jitter:                 63 us
Rate:                   1.01 Mbps       (1.01 Mbps)
Thread priority:        5
Protocol:               UDP
Session id:             1

uart:~$ zperf jobs all
-
Upload completed!
Statistics:             server  (client)
Duration:               30.01 s (30.01 s)
Num packets:            3799    (3799)
Num packets out order:  0
Num packets lost:       0
Jitter:                 63 us
Rate:                   1.01 Mbps       (1.01 Mbps)
Thread priority:        5
Protocol:               UDP
Session id:             1
Total 1 sessions done

uart:~$ zperf jobs clear
Cleared data from 1 sessions

uart:~$ zperf jobs
No active upload sessions
No finished sessions found

The -w option can be used like this to delay the startup of the jobs.

uart:~$ zperf tcp upload -a -t 6 -w 192.0.2.2 5001 10 1K
Remote port is 5001
Connecting to 192.0.2.2
Duration:       10.00 s
Packet size:    1000 bytes
Rate:           10 kbps
Waiting "zperf jobs start" command.
[01:06:51.392,288] <inf> net_zperf: [0] TCP waiting for start

uart:~$ zperf udp upload -a -t 6 -w 192.0.2.2 5001 10 1K 10M
Remote port is 5001
Connecting to 192.0.2.2
Duration:       10.00 s
Packet size:    1000 bytes
Rate:           10000 kbps
Waiting "zperf jobs start" command.
Rate:           10.00 Mbps
Packet duration 781 us
[01:06:58.064,552] <inf> net_zperf: [0] UDP waiting for start

uart:~$ zperf jobs start
-
Upload completed!
-
Upload completed!

# Note that the output may be garbled as two threads printed
# output at the same time. Just print out the fresh listing
# like this.

uart:~$ zperf jobs all
-
Upload completed!
Statistics:             server  (client)
Duration:               9.99 s  (10.00 s)
Num packets:            11429   (11429)
Num packets out order:  0
Num packets lost:       0
Jitter:                 164 us
Rate:                   9.14 Mbps       (9.14 Mbps)
Thread priority:        6
Protocol:               UDP
Session id:             0
-
Upload completed!
Duration:               10.00 s
Num packets:            15487
Num errors:             0 (retry or fail)
Rate:                   12.38 Mbps
Thread priority:        6
Protocol:               TCP
Session id:             0
Total 2 sessions done

Custom Data Upload

zperf supports more advanced data upload profiling by setting a custom data source through zperf_upload_params.data_loader. This enables the generation of custom packet contents instead of sending a constant packet consisting solely of the z character. An example use case would be determining the maximum throughput of uploading data from an external flash memory chip.