1
1

340 Коммитов

Автор SHA1 Сообщение Дата
woody77
14caac895c Properly setting the no_fq_socket_pacing option when support for it is not compiled in. (#459) 2016-09-21 10:21:59 -07:00
Bruce A. Mah
4dcb275b5b
Make error handling on the control channel more robust. 2016-06-03 09:25:14 -07:00
Bruce A. Mah
ed94082be2
Fix a buffer overflow / heap corruption issue that could occur if a
malformed JSON string was passed on the control channel.  This issue,
present in the cJSON library, was already fixed upstream, so was
addressed here in iperf3 by importing a newer version of cJSON (plus
local ESnet modifications).

Discovered and reported by Dave McDaniel, Cisco Talos.

Based on a patch by @dopheide-esnet, with input from @DaveGamble.

Cross-references:  TALOS-CAN-0164, ESNET-SECADV-2016-0001,
CVE-2016-4303
2016-06-03 09:23:59 -07:00
Bruce A. Mah
9915746a8b
Squashed commit of the following:
commit 2dc03630a736be2ae9f64823aabb5776e7074c2a
Merge: 61e325c 0da552c
Author: Bruce A. Mah <bmah@es.net>
Date:   Thu May 26 09:40:58 2016 -0700

    Merge branch 'master' into issue-325

commit 61e325c5d0a4e7a9823221ce507db0f478fc98b5
Merge: 227992f ccbcee6
Author: Bruce A. Mah <bmah@es.net>
Date:   Thu May 26 11:09:54 2016 -0400

    Merge branch 'issue-325' of github.com:esnet/iperf into issue-325

    Conflicts:
    	src/iperf3.1

commit 227992f366e7f4895b6762011576ba22a42a752e
Author: Bruce A. Mah <bmah@es.net>
Date:   Thu May 26 11:07:01 2016 -0400

    Don't set SO_MAX_PACING_RATE if the rate is 0.  Also tweak some help text.

    Towards #325, in response to feedback from @bltierney.

commit ccbcee6366d50ec632fc00eb11fde8a886f8febe
Author: Bruce A. Mah <bmah@es.net>
Date:   Tue May 24 09:19:41 2016 -0700

    Fix manpage formatting for consistency.

commit 90ac5a9ce09bd746ca5f943a8226ab864da3ebf8
Author: Bruce A. Mah <bmah@es.net>
Date:   Tue May 24 12:14:16 2016 -0400

    Add some documentation for fair-queueing per-socket pacing.

    For #325.

commit 5571059870f7aefefb574816de70b6406848888f
Author: Bruce A. Mah <bmah@es.net>
Date:   Tue May 24 11:55:44 2016 -0400

    Change the fair-queueing socket pacing logic in response to feedback.

    By default, on platforms where per-socket pacing is available, it
    will be used.  If not available, iperf3 will fall back to application-
    level pacing.

    The --no-fq-socket-pacing option can be used to forcibly disable
    fair-queueing per-socket pacing.  (The earlier --socket-pacing option
    has been removed.)

    Tested on CentOS 7, more testing on other platforms is required to
    be sure it didn't break the old application-level pacing behavior.

    For #325.

commit 3e3f506fe9f375a5771c9e3ddfe8677c1a7146e7
Merge: 50a379e 3b23112
Author: Bruce A. Mah <bmah@es.net>
Date:   Tue May 24 09:54:39 2016 -0400

    Merge branch 'master' into issue-325

commit 50a379eddfa89d1313d2aeeb62a6fbc82f00ea17
Author: Bruce A. Mah <bmah@es.net>
Date:   Sat Apr 16 02:55:42 2016 -0400

    Regen.

commit 200d3fe3917b3d298bdf52a0bde32c47cf2727b0
Author: Bruce A. Mah <bmah@es.net>
Date:   Sat Apr 16 02:41:32 2016 -0400

    Checkpoint for initial work on #325 to add socket pacing.

    This works only on Linux and depends on the availability of
    the SO_MAX_PACING_RATE socket option and the fq queue discipline.
    Use --socket-pacing to use SO_MAX_PACING_RATE instead of the
    default iperf3 user-level rate limiting; in either case, the
    --bandwidth parameter controls the desired rate.

    Lightly tested with both --tcp and --udp, normal and --reverse.
    Real testing requires analysis of packet timestamps between
    multiple hosts.
2016-05-26 09:47:48 -07:00
Joe McEachern
3b2311263a Add fix for #412 (#414)
* Add fix for #412
This prevents negative loss counters with UDP when omit is used

* Track the original start time and bytes omitted. This allows the
throttle function to work after the omit timer fires. This is
a fix for issue #419.

* Remove changes to switch the bandwidth to received instead of sent bandwidth

* Roll back bandwidth sent vs received changes
2016-05-20 11:40:18 -07:00
Bruce A. Mah
f88486443c
Fix build on FreeBSD 11-CURRENT, as described in issue #413.
This caused by a combination of the iperf3 build somehow using
the system queue.h on FreeBSD 11 (possibly only on this platform)
and TAILQ_END not being defined in the system queue.h.

Expanding the TAILQ_END macro to NULL seems to solve the problem.

Submitted by:	@rbgarga
2016-05-20 10:05:24 -07:00
QuaSoft
08a2de459b Add command line option --forceflush to allow user to request flushing of output at the end of each interval.
Fixes #299
2016-03-06 16:47:02 +02:00
Bruce A. Mah
670c18584b
Get rid of nan values when there were no packets in a UDP interval.
This was causing some headaches for code trying to parse JSON.
Also revise a prior partial fix that hard-coded 100% loss for the
case of zero packets.

Partially fixes #278.

Merge candidate for 3.0 and 3.1 bugfix branches.
2016-01-28 16:04:33 -08:00
Bruce A. Mah
224ae8c764
Fix a bug where we printed the incorrect value for out-of-order UDP packets.
Fixes #329, submitted by @bhegardt.

While here, add this value to the JSON output.
2015-11-20 08:31:09 -08:00
Bruce A. Mah
956d115851 Improve command error handling.
Exit with non-zero exit code if server mode has too many errors.

Properly detect complain about non-numeric arguments to -A, -L, and -S.

Implement range checks for argument to -S.

Fixes #316.
2015-11-18 09:40:24 -08:00
Bruce A. Mah
44485b5b88
Fix a bug where the -T title option was not being output correctly
in JSON output.

Fixes #292.

Patch from:	@SLX-WI
2015-11-17 10:47:47 -08:00
Bruce A. Mah
7b2abbc59a
Rename the recently-added template member in the iperf_test structure
to improve C++ compatibility.

Fixes #323.
2015-11-16 11:22:15 -08:00
Tobias Nießen
20585b9896 Fix bug in iperf_new_stream leading to EINVAL
Fix invocation of snprintf in iperf_new_stream to prevent mkstemp from producing EINVAL.
2015-10-11 15:58:52 +02:00
R0CKSTAR
9a3775091b Change tmp_path to template and use snprintf instead of strcpy 2015-09-21 11:07:41 +08:00
R0CKSTAR
01b82c9e3c Add tmp_path in order to make the template path workable on iOS. 2015-08-03 00:01:02 +08:00
Eduardo Abinader
1c89715936 iflush for interval results
In order to keep the same behavior of stdout, iflush the results
to files as they are printed.
2015-06-06 10:44:32 -04:00
Bruce A. Mah
5824381111
Make --get-server-output properly include all of the server side output.
Fixes #251, with a bug fix based on diagnosis and analysis from @nomel.
2015-05-11 10:44:06 -07:00
Bruce A. Mah
e142062572
Add -X to restrict SCTP binding to a subset of interfaces.
Contains an alternate implementation of previously-submitted patches
to set the maximum segment size and no-delay options.

As a result of this change, SCTP functionality on Linux will generally
require the libsctp library (on CentOS and similar distributions this
is provided by the lksctp-tools RPM).

Part of #131.

Submitted by:	Bruce Simpson <bs48@st-andrews.ac.uk>
2015-01-05 15:19:57 -08:00
Brian Candler
a80368bb7f Drop out of multisend loop if none of the streams are accepting data 2014-12-23 09:38:50 +00:00
Bruce A. Mah
dba611dbe4 Add one-off mode, where the server serves exactly one request.
Primarily useful for bwctl integration, this is enabled with the -1
and/or --one-off flags.

Fixes #230, based on a patch by @i2aaron.

Signed-off-by: Bruce A. Mah <bmah@es.net>
2014-12-22 14:45:40 -08:00
Brian Candler
8961016f90 Ignore set_test_zerocopy if host does not support it 2014-12-22 18:04:56 +00:00
Bruce A. Mah
29dbc41c1d Also maintain the min and mean of the RTT.
For issue #215.
2014-10-23 13:39:58 -07:00
Bruce A. Mah
c7b0726a38 Merge branch 'master' of github.com:esnet/iperf 2014-10-23 11:11:08 -07:00
Bruce A. Mah
432ef7ebb3 Retrieve RTT information on platforms supporting it.
This value is available on the sender side, expressed in
microseconds.  It's available in the JSON output.

In the JSON output we also output the maximum observed RTT
per-stream.  Note that since the observation interval is many times
the RTT, it's not clear how good this value would be at capturing the
largest computed RTT value over the lifetime of each stream.

While here, also determine the maximum observed snd_cwnd value over
the lifetime of each stream.

This all works pretty well on Linux, but on FreeBSD (which should
theoretically be supported) we don't do a good job of supporting the
tcp_info structure.  We need to make this code a lot more portable,
rather than just assuming the world of platforms is "Linux"
vs. "everything else".  Fixing this requires some rearchitecting of
the way that we retrieve, compute, and print statistics.

Part of a fix for #215.
2014-10-23 11:10:39 -07:00
Bruce A. Mah
96d0c77ca2 The maximum send length for UDP is the maximum size of a UDP datagram.
For UDP over IPv4, this is the maximum IPv4 packet size (65535) minus
the size of the IPv4 and UDP headers, arriving at 65507.

In theory for a system implementing IPv6 jumbogram support, there is
no maximum packet size for UDP.  In practice we've observed with
CentOS 5 a limitation of 65535 - 8, which is dictated by the size
field in the UDP header (it has a maximum value of 65535, but needs
to count both payload and header bytes, thus subtracting off the 8
bytes for the UDP header).

We take the most conservative approach and use the 65507 value
for UDP / IPv4.

This is (I believe) the last part of issue #212.
2014-10-13 08:55:41 -07:00
Bruce A. Mah
78033c4359 Fix a crash when we try to print ending stats but no tests were run.
This can happen if the server gets into a weird state (see the test
cases for reproducing issue #212).  We need to do a couple of checks
to make sure we're not dereferencing NULL pointers (yay C).

While here, also fix up a couple of related output glitches, where
in this case we can emit some invalid JSON (NaN values, such as what
you get if there's a division by zero, are not valid JSON).

Part of a fix in progress for #212.
2014-10-13 01:50:04 -07:00
Bruce A. Mah
da9f046f19
Update license and copyright text to conform to LBNL standards.
Note that the license remains a 3-clause BSD license; the only
license changes were to add the name of the program and to add
some punctuation.
2014-09-29 14:00:46 -07:00
Bruce A. Mah
785c8a42c9 Merge branch 'master' of github.com:kevinconstantine/iperf into kevinconstantine-master 2014-09-15 12:58:01 -07:00
Kevin Constantine
499b122230 specify client-side port: Only support --cport
Remove support for short-option -e

Signed-off-by: Kevin Constantine <kevin.constantine@gmail.com>
2014-09-15 10:55:09 -07:00
Bruce A. Mah
a1861d5f87
Rename locale.{c,h} to iperf_locale.{c,h} to avoid filename collision
with system header <locale.h>.

This apparently fixes problems on an ARM build, but this was generally
broken anyway.  It's slightly amazing this didn't cause problems before;
perhaps we never used <locale.h> before?

Addresses #203.
2014-09-15 10:42:36 -07:00
Kevin Constantine
b7b1b32afe Add support for specifying client-side epemeral port
-e/--cport now allows a user to specify the client-side port
used for data transfer.

Signed-off-by: Kevin Constantine <kevin.constantine@gmail.com>
2014-09-09 16:31:57 -07:00
Bruce A. Mah
329523a557
Add a --udp-counters-64bit feature to support very long UDP tests.
UDP tests store a packet sequence number in the packets to detect loss
and ordering issues.  This sequence number is a 32-bit signed integer,
which can wrap during very long-running UDP tests.  This change adds
an option (defaulting to off) which uses a 64-bit unsigned integer to
store this quantity in the packet.  The option is specified on the
client side; the server must support this feature for proper
functioning (older servers will interoperate with newer clients, as
long as --udp-counters-64-bit is not used).

The default might be changed in a future version of iperf3.

As a part of this change, the client sends its version string to the
server in the parameter block.

Uses a public-domain compatibility shim for 64-bit byte order
conversions.  There are probably some additional platforms that need
to be supported, in particular Solaris.  We might add some
configure-time checks to only enable this feature on platforms where
we can support the byte-order conversions.

This change is not well-tested.

Towards issue #191.
2014-08-28 08:59:32 -07:00
Bruce A. Mah
f50627706f
When parsing the -b (bandwidth) argument, use 10-based suffices.
We support using k, m, and g as suffices on input values.  In most
cases these are 2-based suffixes (i.e. K == 1024) because they are
sizes of objects.  In the case of rates, we need to use 10-based
suffices (i.e. K == 1000).

We do this by implementing (using copy-and-paste) a unit_atof_rate()
subroutine that parses strings similarly to unit_atof but using
10-based suffices instead.

Fixes #173.
2014-08-25 16:43:46 -07:00
Bruce A. Mah
e0d039ea3c Add API methods to allow setting the bind_address test parameter.
This is the same functionality as the -B iperf3 command-line option.

Fixes #197.
2014-07-24 09:30:45 -07:00
Bruce A. Mah
5b760eef47
Fix two related bugs with -B and IPv4 addresses.
If specifying -B with an IPv4 literal address or with an FQDN that
resolved to an IPv4 address, but we had not explicitly specified an
address family with -4, we failed to set up the socket correctly
because we assumed binding to an IPv6 address, and instead (after some
error spewage) wound up binding to wildcard address.

The fix in this commit has multiple parts:  First, if the address
family hasn't been explictly specified, don't force AF_INET6 in the
hints to getaddrinfo(3).  AF_UNSPEC should generate the correct
(according to RFC 6724) behavior.

Second, iperf_reset_test() should not discard members that were passed
from command-line parameters, because that alters the behavior of the
iperf3 when it tries to recreate the listening socket.  In the failure
situation described in this issue (and possibly other as well), the
value of -B gets discarded, so on subsequent attempts to set up the
listening socket it just binds to the wildcard address.

While here, fix on-line help related to the -B option to match
reality.

Note that we're not completely in compliance with RFC 6724, which
states that we should actually try all of the addresses in returned by
getaddrinfo(3), rather than just the first one.

Fixes Issue #193.
2014-07-17 14:30:39 -07:00
Bruce A. Mah
a134ba0a02
Fix a bug in the structure of the --json output.
The various "connected" structures were just dumped into the "start"
structure.  This caused problems if there were multiple connections
(i.e. multiple parallel streams), because the "connected" structures
would overwrite themselves.  Instead, make these structures members
of a "connected" array.

This is technically an incompatible API change, but the prior behavior
was unusable.

Discovered and fix suggested by:	@i2aaron
2014-06-12 11:38:43 -07:00
Bruce A. Mah
265c54a01f
Fix programming misteak.
Part of issue #160, pointed out by @i2aaron.
2014-06-11 09:55:31 -07:00
Bruce A. Mah
c5e1205e49
Fix build on Fedora 21.
An open(2) call had two arguments instead of the required three.
While here, replace a hard-coded mode in a different open(2) call
with symbolic constants for readability.

Fixes #183.

Submitted by @ssahani.
2014-06-09 13:41:30 -07:00
Bruce A. Mah
ba8d6e6246
Implement a --get-server-output flag that allows the client to
retrieve (most of) the output emitted by the server.

If the server was invoked with the --json flag, the output will be in
JSON, otherwise it will be in the human-readable format.

If the client was invoked with the --json flag, the output will be
contained within the JSON output structure, otherwise it will be
appended (in whatever format) to the bottom of the human-readable
output.

Because of the sequencing of the output generation and display, the
server-side output includes only the starting output, interval
statistics and summaries, but not the overall summaries.  (The overall
summaries were already displayed in the client's output.)

Towards issue #160.
2014-06-05 09:48:55 -07:00
Bruce A. Mah
426221a327
Check HAVE_STDINT_H before trying to include <stdint.h>.
Partial fix for compilation on some Solaris versions.  Fixes #175.

Submitted by:	@marksolaris
2014-05-19 10:15:36 -07:00
Bruce A. Mah
ef3eae69bf
Add reverse member to start.test_start JSON, which is 1 in --reverse mode.
This lets us tell easily from the JSON output whether a test was run in
--reverse mode or not.  Resolves #167 (one comment made in that issue
anyway).
2014-05-12 14:27:01 -07:00
Bruce A. Mah
81dbb9e2e1 More consistent documentation for the statistics gathering and
printing functions.
2014-05-02 12:41:07 -07:00
Bruce A. Mah
f8401dfb3a Take out some debugging goop. 2014-04-25 13:11:15 -07:00
Bruce A. Mah
721ffc1bc5 Fix rookie C mistake committed in revision d076653b as part of
Issue #99.

This caused random output to be displayed on the client's stdout in
--json mode.

Pointed out by:	@bltierney
Pointy hat to:	@bmah888
2014-04-22 10:09:00 -07:00
Bruce A. Mah
081ba8e4e9
Commit a version of the patch for #125 for testing.
Originally submitted by:	@i2aaron
2014-04-16 16:23:13 -07:00
Bruce A. Mah
3e9b0eb334
Recent feature detection changes have gotten the -C (TCP congestion
algorithm selection) option to work on FreeBSD for free, starting with
FreeBSD 9.  Update various documentation places to note this.  One
specifies the congestion algorithm in the same was on Linux, although
the names of the algorithms are (at least in the general case) different.
"sysctl net.inet.tcp.cc" on FreeBSD provides a list of available
algorithms, which are implemented as loadable kernel modules.

Rename the --linux-congestion long option to --congestion (retaining
the old option as a deprecated synonym).
2014-04-14 13:43:02 -07:00
Bruce A. Mah
40050b7bee
Fix breakage due to iperf.h depending on the autoconf config.h file but
not including it.

To fix this required us to change config.h to iperf_config.h (to
avoid potential filename collisions with this generic name).  Then
iperf.h could include this.

Adjust the existing header file inclusions to track this, and also
canonicalize their inclusion to be at the top of *.c files.
2014-04-14 13:33:33 -07:00
Bruce A. Mah
40a1faf332 Improve detection of CPU affinity support (for FreeBSD and Linux).
As with several other recent commits, don't check explicitly for an
OS platform, but rather detect the various API bits that are used
to implement CPU affinity setting.
2014-04-14 10:45:46 -07:00
Bruce A. Mah
4155c45471 Improve detection of IPv6 flowlabel support (Linux only).
We check at configure-time to see if IPV6_FLOWLABEL_MGR is defined
in <linux/in.6>, if it is we set a HAVE_FLOWLABEL CPP symbol to
turn on conditional compilation of the support for this feature.
2014-04-10 11:20:36 -07:00
Bruce A. Mah
c550ef4605 Non-platform-specific detection of TCP_CONGESTION socket option.
Rather than checking for anything Linux-specific at configure-time,
see if TCP_CONGESTION is defined in <netinet/tcp.h> and if so define
a CPP variable HAVE_TCP_CONGESTION, which we then use to enable
conditional compilation of the code for this feature.
2014-04-10 10:53:18 -07:00