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.
This commit is contained in:
Bruce A. Mah 2014-11-12 13:58:23 -08:00
parent d65986030a
commit 72ac83e7f2
3 changed files with 34 additions and 2 deletions

View File

@ -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)

View File

@ -132,7 +132,7 @@ const char usage_longstr[] = "Usage: iperf [-s|-c host] [options]\n"
" --cport <port> 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 <algo> set TCP congestion control algorithm (Linux and FreeBSD only)\n"
#endif /* HAVE_TCP_CONGESTION */

View File

@ -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.