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)
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.
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).
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
(/usr/src/davem-2.6/Documentation/hrtimers/hrtimers.txt).
For people who would like to keep the old behaviour, #ifdefs with
alternatives have been added.