1
1

After setting socket buffer sizes, verify they were set correctly.

Do this for both TCP and UDP, but not SCTP (which strangely doesn't
support --window, that's probably a bug).  Fixes #356.
Этот коммит содержится в:
Bruce A. Mah 2016-11-23 11:05:47 -08:00
родитель c4a56a3c49
Коммит d2202ee3be
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4984910A8CAAEE8A
4 изменённых файлов: 99 добавлений и 9 удалений

Просмотреть файл

@ -334,6 +334,7 @@ enum {
IESETSCTPNSTREAM= 138, // Unable to set SCTP number of streams (check perror)
IESETSCTPBINDX= 139, // Unable to process sctp_bindx() parameters
IESETPACING= 140, // Unable to set socket pacing rate
IESETBUF2= 141, // Socket buffer size incorrect (written value != read value)
/* Stream errors */
IECREATESTREAM = 200, // Unable to create a new stream (check herror/perror)
IEINITSTREAM = 201, // Unable to initialize stream (check herror/perror)

Просмотреть файл

@ -359,6 +359,10 @@ iperf_strerror(int i_errno)
snprintf(errstr, len, "unable to set socket pacing");
perr = 1;
break;
case IESETBUF2:
snprintf(errstr, len, "socket buffer size not set correctly");
break;
}
if (herr || perr)

Просмотреть файл

@ -317,6 +317,7 @@ iperf_tcp_connect(struct iperf_test *test)
struct addrinfo hints, *local_res, *server_res;
char portstr[6];
int s, opt;
socklen_t optlen;
int saved_errno;
if (test->bind_address) {
@ -406,18 +407,43 @@ iperf_tcp_connect(struct iperf_test *test)
return -1;
}
}
/* Read back and verify the sender socket buffer size */
optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, &optlen) < 0) {
saved_errno = errno;
close(s);
freeaddrinfo(server_res);
errno = saved_errno;
i_errno = IESETBUF;
return -1;
}
if (test->settings->socket_bufsize && test->settings->socket_bufsize != opt) {
i_errno = IESETBUF2;
return -1;
}
if (test->debug) {
socklen_t optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, &optlen) < 0) {
saved_errno = errno;
close(s);
freeaddrinfo(server_res);
errno = saved_errno;
i_errno = IESETBUF;
return -1;
}
printf("SO_SNDBUF is %u\n", opt);
}
/* Read back and verify the receiver socket buffer size */
optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, &optlen) < 0) {
saved_errno = errno;
close(s);
freeaddrinfo(server_res);
errno = saved_errno;
i_errno = IESETBUF;
return -1;
}
if (test->settings->socket_bufsize && test->settings->socket_bufsize != opt) {
i_errno = IESETBUF2;
return -1;
}
if (test->debug) {
printf("SO_RCVBUF is %u\n", opt);
}
#if defined(HAVE_FLOWLABEL)
if (test->settings->flowlabel) {
if (server_res->ai_addr->sa_family != AF_INET6) {

Просмотреть файл

@ -233,6 +233,8 @@ iperf_udp_accept(struct iperf_test *test)
* receiving so that we can cover both normal and --reverse operation.
*/
int opt;
socklen_t optlen;
if ((opt = test->settings->socket_bufsize)) {
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) {
i_errno = IESETBUF;
@ -244,6 +246,34 @@ iperf_udp_accept(struct iperf_test *test)
}
}
/* Read back and verify the sender socket buffer size */
optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, &optlen) < 0) {
i_errno = IESETBUF;
return -1;
}
if (test->settings->socket_bufsize && test->settings->socket_bufsize != opt) {
i_errno = IESETBUF2;
return -1;
}
if (test->debug) {
printf("SO_SNDBUF is %u\n", opt);
}
/* Read back and verify the receiver socket buffer size */
optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, &optlen) < 0) {
i_errno = IESETBUF;
return -1;
}
if (test->settings->socket_bufsize && test->settings->socket_bufsize != opt) {
i_errno = IESETBUF2;
return -1;
}
if (test->debug) {
printf("SO_RCVBUF is %u\n", opt);
}
#if defined(HAVE_SO_MAX_PACING_RATE)
/* If socket pacing is available and not disabled, try it. */
if (! test->no_fq_socket_pacing) {
@ -332,6 +362,8 @@ iperf_udp_connect(struct iperf_test *test)
* receiving so that we can cover both normal and --reverse operation.
*/
int opt;
socklen_t optlen;
if ((opt = test->settings->socket_bufsize)) {
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) {
i_errno = IESETBUF;
@ -342,6 +374,33 @@ iperf_udp_connect(struct iperf_test *test)
return -1;
}
}
/* Read back and verify the sender socket buffer size */
optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, &optlen) < 0) {
i_errno = IESETBUF;
return -1;
}
if (test->settings->socket_bufsize && test->settings->socket_bufsize != opt) {
i_errno = IESETBUF2;
return -1;
}
if (test->debug) {
printf("SO_SNDBUF is %u\n", opt);
}
/* Read back and verify the receiver socket buffer size */
optlen = sizeof(opt);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, &optlen) < 0) {
i_errno = IESETBUF;
return -1;
}
if (test->settings->socket_bufsize && test->settings->socket_bufsize != opt) {
i_errno = IESETBUF2;
return -1;
}
if (test->debug) {
printf("SO_RCVBUF is %u\n", opt);
}
#if defined(HAVE_SO_MAX_PACING_RATE)
/* If socket pacing is available and not disabled, try it. */