From: Geliang Tang <tanggeliang@kylinos.cn>
Add tests for the SO_BINDTODEVICE socket option:
- Binds sockets to the loopback device ("lo")
- Verifies the binding via getsockopt
- Includes IPv4 and IPv6 test cases
- Reports results explicitly in the test script
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 25 +++++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 8 ++++++
2 files changed, 33 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 816d71706f7d..df4f85f129f7 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -23,6 +23,7 @@
#include <netdb.h>
#include <netinet/in.h>
+#include <net/if.h>
#include <linux/tcp.h>
@@ -198,10 +199,20 @@ static void do_setsockopt_reuseport(int fd)
perror("setsockopt(SO_REUSEPORT)");
}
+static void do_setsockopt_bindtodevice(int fd)
+{
+ const char *interface = "lo";
+
+ if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,
+ interface, strlen(interface)))
+ perror("setsockopt(SO_BINDTODEVICE)");
+}
+
static void do_setsockopts(int fd)
{
do_setsockopt_reuseaddr(fd);
do_setsockopt_reuseport(fd);
+ do_setsockopt_bindtodevice(fd);
}
static int sock_listen_mptcp(const char * const listenaddr,
@@ -599,6 +610,18 @@ static void do_getsockopt_reuseport(int fd)
assert(reuse == 1);
}
+static void do_getsockopt_bindtodevice(int fd)
+{
+ char ifname[IFNAMSIZ] = { 0 };
+ socklen_t len;
+
+ len = sizeof(ifname);
+ if (getsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifname, &len))
+ die_perror("getsockopt(SO_BINDTODEVICE)");
+
+ assert(!memcmp(ifname, "lo", len));
+}
+
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
{
do_getsockopt_mptcp_info(s, fd, w);
@@ -613,6 +636,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
do_getsockopt_reuseaddr(fd);
do_getsockopt_reuseport(fd);
+
+ do_getsockopt_bindtodevice(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 271d9777da54..948e54b50c43 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -281,6 +281,10 @@ do_mptcp_sockopt_tests()
mptcp_lib_pr_ok
mptcp_lib_result_pass "SO_REUSEPORT sockopt v4"
+ print_title "SO_BINDTODEVICE sockopt v4"
+ mptcp_lib_pr_ok
+ mptcp_lib_result_pass "SO_BINDTODEVICE sockopt v4"
+
ip netns exec "$ns_sbox" ./mptcp_sockopt -6
lret=$?
@@ -303,6 +307,10 @@ do_mptcp_sockopt_tests()
print_title "SO_REUSEPORT sockopt v6"
mptcp_lib_pr_ok
mptcp_lib_result_pass "SO_REUSEPORT sockopt v6"
+
+ print_title "SO_BINDTODEVICE sockopt v6"
+ mptcp_lib_pr_ok
+ mptcp_lib_result_pass "SO_BINDTODEVICE sockopt v6"
}
run_tests()
--
2.48.1