13 years agoSupport for UDP-Lite in iperf master
Gerrit Renker [Tue, 24 Feb 2009 19:52:37 +0000 (20:52 +0100)]
Support for UDP-Lite in iperf

Applies on top of the DCCP patch and requires host support for UDP-Lite, which
means two minor changes to header include files.

See Documentation/networking/udplite.txt in the kernel sources (2.6.20 or higher)
on how to set this up.

13 years agoBring DiffServ codepoint support up-to-date
Gerrit Renker [Tue, 24 Feb 2009 19:50:23 +0000 (20:50 +0100)]
Bring DiffServ codepoint support up-to-date

The -S/--tos argument currently only supports IPv4 TOS, for IPv6 a different
socket option is used. Both uses are unified through the definition of the
DiffServ codepoint in RFC 2474 (the two unused bits are used for ECN marking
and can not normally be influenced via socket options).

This patch
 * adds (conditional) support for IPv4/v6 socket options to set the DSCP;
 * adds an extra type argument mSockAF to remember the address family
   of mSock (to allow address-family-dependent TOS);
 * fixes a ToDo to support base-2 numbers for the DSCP string;
 * validates the numeric argument;
 * replaces the older IPv4-based `--tos' option with `--dscp'
   and the environment variable `IPERF_TOS' with `IPERF_DSCP'.

The argument types that are now supported are
 # iperf -c server -S 0x1f # hex string
 # iperf -c server -S 017 # octal string (=0xf)
 # iperf -c server -S 42 # decimal string
 # iperf -c server -S 011011 # binary string (must be 6 digits)

13 years agoSupport for continuous runs
Ian McDonald [Tue, 24 Feb 2009 19:43:12 +0000 (20:43 +0100)]
Support for continuous runs

This patch makes iperf run continuously if -t 0 is used as a parameter.

(Well it makes it run for 7 years which is long enough for my needs)

13 years agoTCP Congestion Control Module via options
Ian McDonald [Tue, 24 Feb 2009 19:42:45 +0000 (20:42 +0100)]
TCP Congestion Control Module via options

This adds plug-able TCP congestion control support to iperf.

13 years agoNative IPv6 support for iperf
Gerrit Renker [Tue, 24 Feb 2009 19:31:40 +0000 (20:31 +0100)]
Native IPv6 support for iperf

This simplifies the internal IPv6 concepts so that IPv4/IPv6 and IPv4/IPv6
hostnames can be used interchangeably, without having to use the -V flag.

That is, the type of the address (v4/v6) is automatically detected from the
input hostname given, as one would expect.

Most of the code is now Linux-specific, which is why #ifdefs have been removed.

Note on multicast-join operation for v4/v6:
The multicast-join code has been extended to allow specifying the multicast
interface. This is clear when a host has only one interface: but on which
interface to join if the host has more than one interface?
This is now done via the
-J <interface-name>  or
-j <interface-name> flags.

Note on bidirectional/tradeoff tests (options -2 / -r):
The connecting client does not longer validate the peer address when switching
from a connecting client to a listening server for the reverse connection. The
reason is that previously mSettings->peer was looked up and then tested against
the server->peer address. When using both v4/v6 addresses, this is no longer
trivial (v4/v6, v4/v4, v6/v4, v6/v6), hence I have disabled it.

13 years agoDCCP support for iperf
Gerrit Renker [Tue, 24 Feb 2009 19:31:15 +0000 (20:31 +0100)]
DCCP support for iperf

This adds DCCP support for iperf, based on a patch developed by Ian and
later much modified and extended by myself.
When applied, DCCP can be used as transport protocol via the `-d' option.

It knows two modes:

 (1) Bytestream Mode
     This is the default and works as in TCP. The application tries to
     stuff as many bytes into the socket as possible. This is good for
     performance tests with DCCP CCID2, but detrimental in combination
     with DCCP CCID3, since it invariably pushes the sending rate beyond
     controllable limits.

 (2) Packet-oriented mode
     This is enabled by setting the `-b' option in addition to `-d' and
     sets up, as before, a constant bitrate datagram stream. This option
     (also as before) understands the format specifiers `k' for kilobits/sec
     and `m' for megabits/sec. If the optional argument to `-b' is omitted,
     then a default of 1 megabit/sec is used.
     Note that when using this mode, it needs to be enabled both on the
     sender and the receiver.

The changes I added were:
 * made counting of packets work consistently across UDP and DCCP;
 * enabled UDP-like reporting of statistics also for DCCP;
 * rewrote the algorithm to compute the inter-packet-gap in CBR mode:
   - in DCCP it tried to stuff the pipe without accounting for the time
     it spent, thus producing more packets than specifie
   - in tests this was observed to cause overflow
   - the algorithm now measures the actual inter-packet gap of each packet
     and compares it to the target; adjusting for each send time
   - it is more accurate than the previous implementation, in particular
     so for DCCP
 * fixed a bug which resulted in disabling IPv6 (the order of statements
   in Client::Connect() is important; the local socket must be initialised
   first for IPv6 to work).

13 years agoTimer Utilities
Gerrit Renker [Tue, 24 Feb 2009 19:30:50 +0000 (20:30 +0100)]
Timer Utilities

Apart from extending the Timestamp class (support for measuring elapsed
time and an `after' test), the main point of this patch is to update
the delay_loop() function.

The present implementation used a tight loop of continually calling
gettimeofday(2) until the specified amount of time has passed. This
is resource-intensive. In addition, while the loop worked reasonably
in many cases, it sometimes caused unwanted delays of 50 milliseconds
or more (process preempted?).

This has been replaced with nanosleep(2) as default now. The advantage
of nanosleep over the old solution is that signals are blocked and it
seems a much more robust solution.

Also, nanosleep uses the hrtimers interface internally

For people who would like to keep the old behaviour, #ifdefs with
alternatives have been added.

13 years agoRemove Win32 Support
Gerrit Renker [Tue, 24 Feb 2009 19:30:18 +0000 (20:30 +0100)]
Remove Win32 Support

This removes support for Win32 since all subsequent patches introduce
functionality specific to Linux:

 * use of nanosleep (POSIX, using hrtimers),
 * UDP-Lite support (RFC 3828),
 * DCCP support (RFC 4340-2).

Don't know whether this was a good idea, but it helped to make the code more readable.

13 years agoFix CPU Usage Bug
Gerrit Renker [Tue, 24 Feb 2009 19:29:49 +0000 (20:29 +0100)]
Fix CPU Usage Bug

Bug fix by Ingo Molnar, taken from


This reduces CPU usage a lot - confirmed in individual tests.

13 years agoOriginal 2.0.2 iperf sources
Gerrit Renker [Tue, 24 Feb 2009 19:26:34 +0000 (20:26 +0100)]
Original 2.0.2 iperf sources