From 72ac83e7f27f5956f1822382a299c0e75a65c9aa Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 12 Nov 2014 13:58:23 -0800 Subject: [PATCH] Make UDP tests honor the -w option for setting the socket buffer size. This appears to be necessary on some long, high-bandwidth paths to get sane results, either by reducing packet loss or by somehow allowing the sending host of a test to go faster. Fixes #219. --- src/iperf3.1 | 2 +- src/iperf_locale.c | 2 +- src/iperf_udp.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/iperf3.1 b/src/iperf3.1 index a9fe8e9..a7e67e6 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -124,7 +124,7 @@ number of parallel client streams to run run in reverse mode (server sends, client receives) .TP .BR -w ", " --window " \fIn\fR[KM]" -TCP window size / socket buffer size (this gets sent to the server and used on that side too) +window size / socket buffer size (this gets sent to the server and used on that side too) .TP .BR -M ", " --set-mss " \fIn\fR" set TCP maximum segment size (MTU - 40 bytes) diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 91bacc4..354906f 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -132,7 +132,7 @@ const char usage_longstr[] = "Usage: iperf [-s|-c host] [options]\n" " --cport bind to a specific client port (TCP and UDP, default: ephemeral port)\n" " -P, --parallel # number of parallel client streams to run\n" " -R, --reverse run in reverse mode (server sends, client receives)\n" - " -w, --window #[KMG] TCP window size (socket buffer size)\n" + " -w, --window #[KMG] set window size / socket buffer size\n" #if defined(HAVE_TCP_CONGESTION) " -C, --congestion set TCP congestion control algorithm (Linux and FreeBSD only)\n" #endif /* HAVE_TCP_CONGESTION */ diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 0f55226..8d32dbe 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -228,6 +228,22 @@ iperf_udp_accept(struct iperf_test *test) return -1; } + /* + * Set socket buffer size if requested. Do this for both sending and + * receiving so that we can cover both normal and --reverse operation. + */ + int opt; + if ((opt = test->settings->socket_bufsize)) { + if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) { + i_errno = IESETBUF; + return -1; + } + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)) < 0) { + i_errno = IESETBUF; + return -1; + } + } + /* * Create a new "listening" socket to replace the one we were using before. */ @@ -291,6 +307,22 @@ iperf_udp_connect(struct iperf_test *test) return -1; } + /* + * Set socket buffer size if requested. Do this for both sending and + * receiving so that we can cover both normal and --reverse operation. + */ + int opt; + if ((opt = test->settings->socket_bufsize)) { + if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) { + i_errno = IESETBUF; + return -1; + } + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)) < 0) { + i_errno = IESETBUF; + return -1; + } + } + /* * Write a datagram to the UDP stream to let the server know we're here. * The server learns our address by obtaining its peer's address.