From: Geliang Tang <tanggeliang@kylinos.cn>
Add IPv6-specific testing for IPV6_V6ONLY:
- Enables the option and verifies its state
- Restricted to IPv6 sockets
- Reports results in the test script
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 30 +++++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 3 +-
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 25074e5b4eaa..9bbe2e56351f 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -271,6 +271,18 @@ static void do_setsockopt_local_port_range(int fd)
perror("setsockopt(IP_LOCAL_PORT_RANGE)");
}
+static void do_setsockopt_v6only(int fd)
+{
+ int v6only = 1;
+
+ if (pf != AF_INET6)
+ return;
+
+ if (setsockopt(fd, SOL_IPV6, IPV6_V6ONLY, &v6only,
+ sizeof(v6only)))
+ perror("setsockopt(IPV6_V6ONLY)");
+}
+
static void do_setsockopts(int fd)
{
do_setsockopt_reuseaddr(fd);
@@ -281,6 +293,7 @@ static void do_setsockopts(int fd)
do_setsockopt_transparent(fd);
do_setsockopt_bind_address_no_port(fd);
do_setsockopt_local_port_range(fd);
+ do_setsockopt_v6only(fd);
}
static int sock_listen_mptcp(const char * const listenaddr,
@@ -757,6 +770,21 @@ static void do_getsockopt_local_port_range(int fd)
assert(port_range == (31000 << 16 | 30000));
}
+static void do_getsockopt_v6only(int fd)
+{
+ socklen_t len;
+ int v6only;
+
+ if (pf != AF_INET6)
+ return;
+
+ len = sizeof(v6only);
+ if (getsockopt(fd, SOL_IPV6, IPV6_V6ONLY, &v6only, &len))
+ die_perror("getsockopt(IPV6_V6ONLY)");
+
+ assert(v6only == 1);
+}
+
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
{
do_getsockopt_mptcp_info(s, fd, w);
@@ -783,6 +811,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
do_getsockopt_bind_address_no_port(fd);
do_getsockopt_local_port_range(fd);
+
+ do_getsockopt_v6only(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 2016adde1553..356911077451 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -296,7 +296,8 @@ do_mptcp_sockopt_tests()
"SO_BINDTODEVICE" "SO_BINDTOIFINDEX" \
"IPV6_FREEBIND" "IPV6_TRANSPARENT" \
"IP_BIND_ADDRESS_NO_PORT" \
- "IP_LOCAL_PORT_RANGE"; do
+ "IP_LOCAL_PORT_RANGE" \
+ "IPV6_V6ONLY"; do
print_title "$opt sockopt v6"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v6"
--
2.48.1