[PATCH mptcp-next 07/11] selftests: mptcp: sockopt: add IP_FREEBIND tests

Geliang Tang posted 11 patches 4 weeks, 1 day ago
There is a newer version of this series
[PATCH mptcp-next 07/11] selftests: mptcp: sockopt: add IP_FREEBIND tests
Posted by Geliang Tang 4 weeks, 1 day ago
From: Geliang Tang <tanggeliang@kylinos.cn>

Add tests for IP_FREEBIND (IPv4) and IPV6_FREEBIND (IPv6):
- Setsockopt helpers to enable FREEBIND
- Getsockopt validation of the enabled state
- Test integration for both address families
- Script result reporting

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 3bef535ce981..1e7cacdebc72 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -241,6 +241,21 @@ static void do_setsockopt_tos(int fd)
 		die_perror("setsockopt(IP_TOS)");
 }
 
+static void do_setsockopt_freebind(int fd)
+{
+	int optname = IP_FREEBIND;
+	int level = SOL_IP;
+	int enable = 1;
+
+	if (pf == AF_INET6) {
+		level = SOL_IPV6;
+		optname = IPV6_FREEBIND;
+	}
+
+	if (setsockopt(fd, level, optname, &enable, sizeof(enable)))
+		perror("setsockopt(IP_FREEBIND)");
+}
+
 static void do_setsockopts(int fd)
 {
 	do_setsockopt_reuseaddr(fd);
@@ -248,6 +263,7 @@ static void do_setsockopts(int fd)
 	do_setsockopt_bindtodevice(fd);
 	do_setsockopt_bindtoifindex(fd);
 	do_setsockopt_tos(fd);
+	do_setsockopt_freebind(fd);
 }
 
 static int sock_listen_mptcp(const char * const listenaddr,
@@ -704,6 +720,25 @@ static void do_getsockopt_tos(int fd)
 		xerror("expect socklen_t == -1");
 }
 
+static void do_getsockopt_freebind(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_FREEBIND)");
+
+	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);
@@ -724,6 +759,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
 	do_getsockopt_bindtoifindex(fd);
 
 	do_getsockopt_tos(fd);
+
+	do_getsockopt_freebind(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 9972012d08f6..b5054533872b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -293,6 +293,10 @@ do_mptcp_sockopt_tests()
 	mptcp_lib_pr_ok
 	mptcp_lib_result_pass "IP_TOS sockopt v4"
 
+	print_title "IP_FREEBIND sockopt v4"
+	mptcp_lib_pr_ok
+	mptcp_lib_result_pass "IP_FREEBIND sockopt v4"
+
 	ip netns exec "$ns_sbox" ./mptcp_sockopt -6
 	lret=$?
 
@@ -327,6 +331,10 @@ do_mptcp_sockopt_tests()
 	print_title "IP_TOS sockopt v6"
 	mptcp_lib_pr_ok
 	mptcp_lib_result_pass "IP_TOS sockopt v6"
+
+	print_title "IPV6_FREEBIND sockopt v6"
+	mptcp_lib_pr_ok
+	mptcp_lib_result_pass "IPV6_FREEBIND sockopt v6"
 }
 
 run_tests()
-- 
2.48.1