diff options
Diffstat (limited to 'src/iperf_sctp.c')
-rw-r--r-- | src/iperf_sctp.c | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/src/iperf_sctp.c b/src/iperf_sctp.c index 06e1e23..0bc98ba 100644 --- a/src/iperf_sctp.c +++ b/src/iperf_sctp.c @@ -131,12 +131,14 @@ iperf_sctp_accept(struct iperf_test * test) if (Nread(s, cookie, COOKIE_SIZE, Psctp) < 0) { i_errno = IERECVCOOKIE; + close(s); return -1; } - if (strcmp(test->cookie, cookie) != 0) { + if (strncmp(test->cookie, cookie, COOKIE_SIZE) != 0) { if (Nwrite(s, (char*) &rbuf, sizeof(rbuf), Psctp) < 0) { i_errno = IESENDMESSAGE; + close(s); return -1; } close(s); @@ -189,6 +191,26 @@ iperf_sctp_listen(struct iperf_test *test) return -1; } + if ((opt = test->settings->socket_bufsize)) { + int saved_errno; + if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) { + saved_errno = errno; + close(s); + freeaddrinfo(res); + errno = saved_errno; + i_errno = IESETBUF; + return -1; + } + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)) < 0) { + saved_errno = errno; + close(s); + freeaddrinfo(res); + errno = saved_errno; + i_errno = IESETBUF; + return -1; + } + } + #if defined(IPV6_V6ONLY) && !defined(__OpenBSD__) if (res->ai_family == AF_INET6 && (test->settings->domain == AF_UNSPEC || test->settings->domain == AF_INET6)) { @@ -220,9 +242,11 @@ iperf_sctp_listen(struct iperf_test *test) /* servers must call sctp_bindx() _instead_ of bind() */ if (!TAILQ_EMPTY(&test->xbind_addrs)) { - freeaddrinfo(res); - if (iperf_sctp_bindx(test, s, IPERF_SCTP_SERVER)) + if (iperf_sctp_bindx(test, s, IPERF_SCTP_SERVER)) { + close(s); + freeaddrinfo(res); return -1; + } } else if (bind(s, (struct sockaddr *) res->ai_addr, res->ai_addrlen) < 0) { saved_errno = errno; @@ -292,6 +316,26 @@ iperf_sctp_connect(struct iperf_test *test) return -1; } + if ((opt = test->settings->socket_bufsize)) { + int saved_errno; + if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) { + saved_errno = errno; + close(s); + freeaddrinfo(server_res); + errno = saved_errno; + i_errno = IESETBUF; + return -1; + } + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)) < 0) { + saved_errno = errno; + close(s); + freeaddrinfo(server_res); + errno = saved_errno; + i_errno = IESETBUF; + return -1; + } + } + /* * Various ways to bind the local end of the connection. * 1. --bind (with or without --cport). @@ -433,8 +477,11 @@ iperf_sctp_connect(struct iperf_test *test) /* clients must call bind() followed by sctp_bindx() before connect() */ if (!TAILQ_EMPTY(&test->xbind_addrs)) { - if (iperf_sctp_bindx(test, s, IPERF_SCTP_CLIENT)) + if (iperf_sctp_bindx(test, s, IPERF_SCTP_CLIENT)) { + freeaddrinfo(server_res); + close(s); return -1; + } } /* TODO support sctp_connectx() to avoid heartbeating. */ @@ -446,12 +493,12 @@ iperf_sctp_connect(struct iperf_test *test) i_errno = IESTREAMCONNECT; return -1; } - freeaddrinfo(server_res); /* Send cookie for verification */ if (Nwrite(s, test->cookie, COOKIE_SIZE, Psctp) < 0) { saved_errno = errno; close(s); + freeaddrinfo(server_res); errno = saved_errno; i_errno = IESENDCOOKIE; return -1; @@ -475,6 +522,7 @@ iperf_sctp_connect(struct iperf_test *test) return -1; } + freeaddrinfo(server_res); return s; #else i_errno = IENOSCTP; |