From: Geliang Tang <tanggeliang@kylinos.cn>
Implement tests for transparent socket options:
- IP_TRANSPARENT (IPv4) and IPV6_TRANSPARENT (IPv6)
- Setsockopt and getsockopt helpers
- State verification after setting
- IPv4/IPv6 coverage in test script
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 37 +++++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 8 ++++
2 files changed, 45 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 1e7cacdebc72..fe54c333e455 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -256,6 +256,21 @@ static void do_setsockopt_freebind(int fd)
perror("setsockopt(IP_FREEBIND)");
}
+static void do_setsockopt_transparent(int fd)
+{
+ int optname = IP_TRANSPARENT;
+ int level = SOL_IP;
+ int enable = 1;
+
+ if (pf == AF_INET6) {
+ level = SOL_IPV6;
+ optname = IPV6_TRANSPARENT;
+ }
+
+ if (setsockopt(fd, level, optname, &enable, sizeof(enable)))
+ perror("setsockopt(IP_TRANSPARENT)");
+}
+
static void do_setsockopts(int fd)
{
do_setsockopt_reuseaddr(fd);
@@ -264,6 +279,7 @@ static void do_setsockopts(int fd)
do_setsockopt_bindtoifindex(fd);
do_setsockopt_tos(fd);
do_setsockopt_freebind(fd);
+ do_setsockopt_transparent(fd);
}
static int sock_listen_mptcp(const char * const listenaddr,
@@ -739,6 +755,25 @@ static void do_getsockopt_freebind(int fd)
assert(enable == 1);
}
+static void do_getsockopt_transparent(int fd)
+{
+ int optname = IP_FREEBIND;
+ int level = SOL_IP;
+ socklen_t len;
+ int enable;
+
+ if (pf == AF_INET6) {
+ level = SOL_IPV6;
+ optname = IPV6_FREEBIND;
+ }
+
+ len = sizeof(enable);
+ if (getsockopt(fd, level, optname, &enable, &len))
+ die_perror("getsockopt(IP_TRANSPARENT)");
+
+ assert(enable == 1);
+}
+
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
{
do_getsockopt_mptcp_info(s, fd, w);
@@ -761,6 +796,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
do_getsockopt_tos(fd);
do_getsockopt_freebind(fd);
+
+ do_getsockopt_transparent(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 b5054533872b..ed73ad7bba66 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -297,6 +297,10 @@ do_mptcp_sockopt_tests()
mptcp_lib_pr_ok
mptcp_lib_result_pass "IP_FREEBIND sockopt v4"
+ print_title "IP_TRANSPARENT sockopt v4"
+ mptcp_lib_pr_ok
+ mptcp_lib_result_pass "IP_TRANSPARENT sockopt v4"
+
ip netns exec "$ns_sbox" ./mptcp_sockopt -6
lret=$?
@@ -335,6 +339,10 @@ do_mptcp_sockopt_tests()
print_title "IPV6_FREEBIND sockopt v6"
mptcp_lib_pr_ok
mptcp_lib_result_pass "IPV6_FREEBIND sockopt v6"
+
+ print_title "IPV6_TRANSPARENT sockopt v6"
+ mptcp_lib_pr_ok
+ mptcp_lib_result_pass "IPV6_TRANSPARENT sockopt v6"
}
run_tests()
--
2.48.1