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 | 27 +++++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 6 +++--
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 25456e540cad..e9ef908dc270 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -233,12 +233,23 @@ static void do_setsockopt_bindtoifindex(int fd)
perror("setsockopt(SO_BINDTOIFINDEX)");
}
+static void do_setsockopt_freebind(int fd)
+{
+ int optname = (pf == AF_INET ? IP_FREEBIND : IPV6_FREEBIND);
+ int level = (pf == AF_INET ? SOL_IP : SOL_IPV6);
+ int enable = 1;
+
+ if (setsockopt(fd, level, optname, &enable, sizeof(enable)))
+ perror("setsockopt(IP(V6)_FREEBIND)");
+}
+
static void do_setsockopts(int fd)
{
do_setsockopt_reuseaddr(fd);
do_setsockopt_reuseport(fd);
do_setsockopt_bindtodevice(fd);
do_setsockopt_bindtoifindex(fd);
+ do_setsockopt_freebind(fd);
}
static int sock_listen_mptcp(const char * const listenaddr,
@@ -661,6 +672,20 @@ static void do_getsockopt_bindtoifindex(int fd)
assert(ifindex == get_ifindex(fd, "lo"));
}
+static void do_getsockopt_freebind(int fd)
+{
+ int optname = (pf == AF_INET ? IP_FREEBIND : IPV6_FREEBIND);
+ int level = (pf == AF_INET ? SOL_IP : SOL_IPV6);
+ socklen_t len;
+ int enable;
+
+ len = sizeof(enable);
+ if (getsockopt(fd, level, optname, &enable, &len))
+ die_perror("getsockopt(IP(V6)_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);
@@ -679,6 +704,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
do_getsockopt_bindtodevice(fd);
do_getsockopt_bindtoifindex(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 7f2effd82af8..193f4d4dc41a 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -271,7 +271,8 @@ do_mptcp_sockopt_tests()
for opt in "SOL_MPTCP" \
"SO_REUSEADDR" "SO_REUSEPORT" \
- "SO_BINDTODEVICE" "SO_BINDTOIFINDEX"; do
+ "SO_BINDTODEVICE" "SO_BINDTOIFINDEX" \
+ "IP_FREEBIND"; do
print_title "$opt sockopt v4"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v4"
@@ -290,7 +291,8 @@ do_mptcp_sockopt_tests()
for opt in "SOL_MPTCP" \
"SO_REUSEADDR" "SO_REUSEPORT" \
- "SO_BINDTODEVICE" "SO_BINDTOIFINDEX"; do
+ "SO_BINDTODEVICE" "SO_BINDTOIFINDEX" \
+ "IPV6_FREEBIND"; do
print_title "$opt sockopt v6"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v6"
--
2.48.1