Skip to content

Commit 45c4183

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
selftests: mptcp: sockopt: add SO_BINDTOIFINDEX test
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 <[email protected]>
1 parent a38423e commit 45c4183

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

tools/testing/selftests/net/mptcp/mptcp_sockopt.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <sys/socket.h>
2121
#include <sys/types.h>
2222
#include <sys/wait.h>
23+
#include <sys/ioctl.h>
2324

2425
#include <netdb.h>
2526
#include <netinet/in.h>
@@ -208,11 +209,36 @@ static void do_setsockopt_bindtodevice(int fd)
208209
perror("setsockopt(SO_BINDTODEVICE)");
209210
}
210211

212+
static int get_ifindex(int fd, const char *ifname)
213+
{
214+
struct ifreq ifr;
215+
216+
memset(&ifr, 0, sizeof(ifr));
217+
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
218+
219+
if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) {
220+
perror("ioctl");
221+
return -1;
222+
}
223+
224+
return ifr.ifr_ifindex;
225+
}
226+
227+
static void do_setsockopt_bindtoifindex(int fd)
228+
{
229+
int ifindex = get_ifindex(fd, "lo");
230+
231+
if (setsockopt(fd, SOL_SOCKET, SO_BINDTOIFINDEX,
232+
&ifindex, sizeof(ifindex)))
233+
perror("setsockopt(SO_BINDTOIFINDEX)");
234+
}
235+
211236
static void do_setsockopts(int fd)
212237
{
213238
do_setsockopt_reuseaddr(fd);
214239
do_setsockopt_reuseport(fd);
215240
do_setsockopt_bindtodevice(fd);
241+
do_setsockopt_bindtoifindex(fd);
216242
}
217243

218244
static int sock_listen_mptcp(const char * const listenaddr,
@@ -622,6 +648,19 @@ static void do_getsockopt_bindtodevice(int fd)
622648
assert(!memcmp(ifname, "lo", len));
623649
}
624650

651+
static void do_getsockopt_bindtoifindex(int fd)
652+
{
653+
socklen_t len;
654+
int ifindex;
655+
656+
len = sizeof(ifindex);
657+
if (getsockopt(fd, SOL_SOCKET, SO_BINDTOIFINDEX,
658+
&ifindex, &len))
659+
die_perror("getsockopt(SO_BINDTOIFINDEX)");
660+
661+
assert(ifindex == get_ifindex(fd, "lo"));
662+
}
663+
625664
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
626665
{
627666
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)
638677
do_getsockopt_reuseport(fd);
639678

640679
do_getsockopt_bindtodevice(fd);
680+
681+
do_getsockopt_bindtoifindex(fd);
641682
}
642683

643684
static void connect_one_server(int fd, int pipefd)

tools/testing/selftests/net/mptcp/mptcp_sockopt.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ do_mptcp_sockopt_tests()
271271

272272
for opt in "SOL_MPTCP" \
273273
"SO_REUSEADDR" "SO_REUSEPORT" \
274-
"SO_BINDTODEVICE"; do
274+
"SO_BINDTODEVICE" "SO_BINDTOIFINDEX"; do
275275
print_title "$opt sockopt v4"
276276
mptcp_lib_pr_ok
277277
mptcp_lib_result_pass "$opt sockopt v4"
@@ -290,7 +290,7 @@ do_mptcp_sockopt_tests()
290290

291291
for opt in "SOL_MPTCP" \
292292
"SO_REUSEADDR" "SO_REUSEPORT" \
293-
"SO_BINDTODEVICE"; do
293+
"SO_BINDTODEVICE" "SO_BINDTOIFINDEX"; do
294294
print_title "$opt sockopt v6"
295295
mptcp_lib_pr_ok
296296
mptcp_lib_result_pass "$opt sockopt v6"

0 commit comments

Comments
 (0)