diff options
author | Bruce A. Mah <bmah@es.net> | 2016-05-26 09:47:48 -0700 |
---|---|---|
committer | Bruce A. Mah <bmah@es.net> | 2016-05-26 09:47:48 -0700 |
commit | 9915746a8bf88050cd4cfee4295d063c1154e9a0 (patch) | |
tree | 74aad1026c7018e03634754becdb16b19bb54ef1 /src/iperf_tcp.c | |
parent | 0da552c390c8332a53b5a39cdfbe6ffccd749189 (diff) | |
download | iperf3-9915746a8bf88050cd4cfee4295d063c1154e9a0.tar.gz |
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.
Diffstat (limited to 'src/iperf_tcp.c')
-rw-r--r-- | src/iperf_tcp.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index 78501fe..ac3b392 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014, The Regents of the University of + * iperf, Copyright (c) 2014, 2016, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -245,6 +245,22 @@ iperf_tcp_listen(struct iperf_test *test) } } #endif /* HAVE_TCP_CONGESTION */ +#if defined(HAVE_SO_MAX_PACING_RATE) + /* If socket pacing is available and not disabled, try it. */ + if (! test->no_fq_socket_pacing) { + /* Convert bits per second to bytes per second */ + unsigned int rate = test->settings->rate / 8; + if (rate > 0) { + if (test->debug) { + printf("Setting fair-queue socket pacing to %u\n", rate); + } + if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &rate, sizeof(rate)) < 0) { + warning("Unable to set socket pacing, using application pacing instead"); + test->no_fq_socket_pacing = 1; + } + } + } +#endif /* HAVE_SO_MAX_PACING_RATE */ opt = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { saved_errno = errno; @@ -468,6 +484,23 @@ iperf_tcp_connect(struct iperf_test *test) } #endif /* HAVE_TCP_CONGESTION */ +#if defined(HAVE_SO_MAX_PACING_RATE) + /* If socket pacing is available and not disabled, try it. */ + if (! test->no_fq_socket_pacing) { + /* Convert bits per second to bytes per second */ + unsigned int rate = test->settings->rate / 8; + if (rate > 0) { + if (test->debug) { + printf("Socket pacing set to %u\n", rate); + } + if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &rate, sizeof(rate)) < 0) { + warning("Unable to set socket pacing, using application pacing instead"); + test->no_fq_socket_pacing = 1; + } + } + } +#endif /* HAVE_SO_MAX_PACING_RATE */ + if (connect(s, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen) < 0 && errno != EINPROGRESS) { saved_errno = errno; close(s); |