From: Geliang Tang <tanggeliang@kylinos.cn>
Introduce helper functions to set and verify the SO_REUSEADDR socket
option. This includes:
- do_setsockopt_reuseaddr() to set the option
- do_getsockopt_reuseaddr() to validate the value
- Integration into IPv4/IPv6 test flows
- Explicit result reporting in the test script
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 34 ++++++++++++++++---
.../selftests/net/mptcp/mptcp_sockopt.sh | 7 ++--
2 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index e934dd26a59d..a91709aeca06 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -182,6 +182,19 @@ static void xgetaddrinfo(const char *node, const char *service,
}
}
+static void do_setsockopt_reuseaddr(int fd)
+{
+ int one = 1;
+
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
+ perror("setsockopt(SO_REUSEADDR)");
+}
+
+static void do_setsockopts(int fd)
+{
+ do_setsockopt_reuseaddr(fd);
+}
+
static int sock_listen_mptcp(const char * const listenaddr,
const char * const port)
{
@@ -195,7 +208,6 @@ static int sock_listen_mptcp(const char * const listenaddr,
hints.ai_family = pf;
struct addrinfo *a, *addr;
- int one = 1;
xgetaddrinfo(listenaddr, port, &hints, &addr);
hints.ai_family = pf;
@@ -205,9 +217,7 @@ static int sock_listen_mptcp(const char * const listenaddr,
if (sock < 0)
continue;
- if (-1 == setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one,
- sizeof(one)))
- perror("setsockopt");
+ do_setsockopts(sock);
if (bind(sock, a->ai_addr, a->ai_addrlen) == 0)
break; /* success */
@@ -246,6 +256,8 @@ static int sock_connect_mptcp(const char * const remoteaddr,
if (sock < 0)
continue;
+ do_setsockopts(sock);
+
if (connect(sock, a->ai_addr, a->ai_addrlen) == 0)
break; /* success */
@@ -554,6 +566,18 @@ static void do_getsockopt_mptcp_full_info(struct so_state *s, int fd)
assert(!memcmp(&sfinfo->addrs, &s->addrs, sizeof(struct mptcp_subflow_addrs)));
}
+static void do_getsockopt_reuseaddr(int fd)
+{
+ socklen_t len;
+ int reuse;
+
+ len = sizeof(reuse);
+ if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, &len))
+ perror("getsockopt(SO_REUSEADDR)");
+
+ assert(reuse == 1);
+}
+
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
{
do_getsockopt_mptcp_info(s, fd, w);
@@ -564,6 +588,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
if (r)
do_getsockopt_mptcp_full_info(s, fd);
+
+ do_getsockopt_reuseaddr(fd);
}
static void connect_one_server(int fd, int pipefd)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index 003d218defa8..da6c261275ec 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -269,7 +269,8 @@ do_mptcp_sockopt_tests()
return
fi
- for opt in "SOL_MPTCP"; do
+ for opt in "SOL_MPTCP" \
+ "SO_REUSEADDR"; do
print_title "$opt sockopt v4"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v4"
@@ -286,12 +287,12 @@ do_mptcp_sockopt_tests()
return
fi
- for opt in "SOL_MPTCP"; do
+ for opt in "SOL_MPTCP" \
+ "SO_REUSEADDR"; do
print_title "$opt sockopt v6"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v6"
done
-
}
run_tests()
--
2.48.1