--- embedaddon/iperf/src/iperf_sctp.c 2021/03/17 00:36:46 1.1.1.2 +++ embedaddon/iperf/src/iperf_sctp.c 2023/09/27 11:14:54 1.1.1.3 @@ -82,7 +82,7 @@ iperf_sctp_recv(struct iperf_stream *sp) } -/* iperf_sctp_send +/* iperf_sctp_send * * sends the data for SCTP */ @@ -94,7 +94,7 @@ iperf_sctp_send(struct iperf_stream *sp) r = Nwrite(sp->socket, sp->buffer, sp->settings->blksize, Psctp); if (r < 0) - return r; + return r; sp->result->bytes_sent += r; sp->result->bytes_sent_this_interval += r; @@ -165,7 +165,8 @@ iperf_sctp_listen(struct iperf_test *test) int s, opt, saved_errno; close(test->listener); - + test->listener = -1; + snprintf(portstr, 6, "%d", test->server_port); memset(&hints, 0, sizeof(hints)); /* @@ -211,14 +212,29 @@ iperf_sctp_listen(struct iperf_test *test) } } + if (test->bind_dev) { +#if defined(SO_BINDTODEVICE) + if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, + test->bind_dev, IFNAMSIZ) < 0) +#endif // SO_BINDTODEVICE + { + saved_errno = errno; + close(s); + freeaddrinfo(res); + i_errno = IEBINDDEV; + errno = saved_errno; + return -1; + } + } + #if defined(IPV6_V6ONLY) && !defined(__OpenBSD__) - if (res->ai_family == AF_INET6 && (test->settings->domain == AF_UNSPEC || + if (res->ai_family == AF_INET6 && (test->settings->domain == AF_UNSPEC || test->settings->domain == AF_INET6)) { if (test->settings->domain == AF_UNSPEC) opt = 0; else opt = 1; - if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, + if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &opt, sizeof(opt)) < 0) { saved_errno = errno; close(s); @@ -265,7 +281,7 @@ iperf_sctp_listen(struct iperf_test *test) } test->listener = s; - + return s; #else i_errno = IENOSCTP; @@ -284,7 +300,7 @@ iperf_sctp_connect(struct iperf_test *test) #if defined(HAVE_SCTP_H) int s, opt, saved_errno; char portstr[6]; - struct addrinfo hints, *local_res, *server_res; + struct addrinfo hints, *local_res = NULL, *server_res = NULL; if (test->bind_address) { memset(&hints, 0, sizeof(hints)); @@ -309,8 +325,7 @@ iperf_sctp_connect(struct iperf_test *test) s = socket(server_res->ai_family, SOCK_STREAM, IPPROTO_SCTP); if (s < 0) { - if (test->bind_address) - freeaddrinfo(local_res); + freeaddrinfo(local_res); freeaddrinfo(server_res); i_errno = IESTREAMCONNECT; return -1; @@ -332,6 +347,22 @@ iperf_sctp_connect(struct iperf_test *test) freeaddrinfo(server_res); errno = saved_errno; i_errno = IESETBUF; + return -1; + } + } + + if (test->bind_dev) { +#if defined(SO_BINDTODEVICE) + if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, + test->bind_dev, IFNAMSIZ) < 0) +#endif // SO_BINDTODEVICE + { + saved_errno = errno; + close(s); + freeaddrinfo(local_res); + freeaddrinfo(server_res); + i_errno = IEBINDDEV; + errno = saved_errno; return -1; } }