From: Geliang Tang <tanggeliang@kylinos.cn>
Implement tests for the SO_BINDTOIFINDEX socket option:
- Uses ioctl to get the loopback interface index
- Sets the option to bind to "lo"
- Validates the bound index via getsockopt
- Supports both IPv4 and IPv6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 41 +++++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 4 +-
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index df4f85f129f7..25456e540cad 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -20,6 +20,7 @@
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/ioctl.h>
#include <netdb.h>
#include <netinet/in.h>
@@ -208,11 +209,36 @@ static void do_setsockopt_bindtodevice(int fd)
perror("setsockopt(SO_BINDTODEVICE)");
}
+static int get_ifindex(int fd, const char *ifname)
+{
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) {
+ perror("ioctl");
+ return -1;
+ }
+
+ return ifr.ifr_ifindex;
+}
+
+static void do_setsockopt_bindtoifindex(int fd)
+{
+ int ifindex = get_ifindex(fd, "lo");
+
+ if (setsockopt(fd, SOL_SOCKET, SO_BINDTOIFINDEX,
+ &ifindex, sizeof(ifindex)))
+ perror("setsockopt(SO_BINDTOIFINDEX)");
+}
+
static void do_setsockopts(int fd)
{
do_setsockopt_reuseaddr(fd);
do_setsockopt_reuseport(fd);
do_setsockopt_bindtodevice(fd);
+ do_setsockopt_bindtoifindex(fd);
}
static int sock_listen_mptcp(const char * const listenaddr,
@@ -622,6 +648,19 @@ static void do_getsockopt_bindtodevice(int fd)
assert(!memcmp(ifname, "lo", len));
}
+static void do_getsockopt_bindtoifindex(int fd)
+{
+ socklen_t len;
+ int ifindex;
+
+ len = sizeof(ifindex);
+ if (getsockopt(fd, SOL_SOCKET, SO_BINDTOIFINDEX,
+ &ifindex, &len))
+ die_perror("getsockopt(SO_BINDTOIFINDEX)");
+
+ assert(ifindex == get_ifindex(fd, "lo"));
+}
+
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
{
do_getsockopt_mptcp_info(s, fd, w);
@@ -638,6 +677,8 @@ static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
do_getsockopt_reuseport(fd);
do_getsockopt_bindtodevice(fd);
+
+ do_getsockopt_bindtoifindex(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 44342ce6fd16..7f2effd82af8 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -271,7 +271,7 @@ do_mptcp_sockopt_tests()
for opt in "SOL_MPTCP" \
"SO_REUSEADDR" "SO_REUSEPORT" \
- "SO_BINDTODEVICE"; do
+ "SO_BINDTODEVICE" "SO_BINDTOIFINDEX"; do
print_title "$opt sockopt v4"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v4"
@@ -290,7 +290,7 @@ do_mptcp_sockopt_tests()
for opt in "SOL_MPTCP" \
"SO_REUSEADDR" "SO_REUSEPORT" \
- "SO_BINDTODEVICE"; do
+ "SO_BINDTODEVICE" "SO_BINDTOIFINDEX"; do
print_title "$opt sockopt v6"
mptcp_lib_pr_ok
mptcp_lib_result_pass "$opt sockopt v6"
--
2.48.1