Some tests have to stop/start a server multiple time with the same
listening address. Doing so without SO_REUSADDR leads to failures due to
the socket still being in TIME_WAIT right after the first instance
stop/before the second instance start. Instead of letting each test
manually set SO_REUSEADDR on their servers, it can be done automatically
by start_server_addr for all tests (and without any major downside).

Enforce SO_REUSEADDR in start_server_addr for all tests.

Signed-off-by: Alexis LothorĂ© (eBPF Foundation) <[email protected]>
---
 tools/testing/selftests/bpf/network_helpers.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/network_helpers.c 
b/tools/testing/selftests/bpf/network_helpers.c
index 8bb09167399a..e99b9c5e66a3 100644
--- a/tools/testing/selftests/bpf/network_helpers.c
+++ b/tools/testing/selftests/bpf/network_helpers.c
@@ -97,7 +97,8 @@ int settimeo(int fd, int timeout_ms)
 int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t 
addrlen,
                      const struct network_helper_opts *opts)
 {
-       int fd;
+
+       int on = 1, fd;
 
        if (!opts)
                opts = &default_opts;
@@ -111,6 +112,12 @@ int start_server_addr(int type, const struct 
sockaddr_storage *addr, socklen_t a
        if (settimeo(fd, opts->timeout_ms))
                goto error_close;
 
+       if (type == SOCK_STREAM &&
+           setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) {
+               log_err("Failed to enable SO_REUSEADDR");
+               goto error_close;
+       }
+
        if (opts->post_socket_cb &&
            opts->post_socket_cb(fd, opts->cb_opts)) {
                log_err("Failed to call post_socket_cb");

-- 
2.51.2


Reply via email to