Skip to content

Commit db354a1

Browse files
HoyeonRheeMartin KaFai Lau
authored andcommitted
selftests/bpf: Use sockaddr_storage instead of sa46 in select_reuseport test
The select_reuseport selftest uses a custom sa46 union to represent IPv4 and IPv6 addresses. This custom wrapper requires extra manual handling for address family and field extraction. Replace sa46 with sockaddr_storage and update the helper functions to operate on native socket structures. This simplifies the code and removes unnecessary custom address-handling logic. No functional changes intended. Reviewed-by: Amery Hung <[email protected]> Signed-off-by: Hoyeon Lee <[email protected]> Signed-off-by: Martin KaFai Lau <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent fd6ed07 commit db354a1

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

tools/testing/selftests/bpf/prog_tests/select_reuseport.c

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@ static struct bpf_object *obj;
4141
static __u32 index_zero;
4242
static int epfd;
4343

44-
static union sa46 {
45-
struct sockaddr_in6 v6;
46-
struct sockaddr_in v4;
47-
sa_family_t family;
48-
} srv_sa;
44+
static struct sockaddr_storage srv_sa;
4945

5046
#define RET_IF(condition, tag, format...) ({ \
5147
if (CHECK_FAIL(condition)) { \
@@ -135,24 +131,24 @@ static int prepare_bpf_obj(void)
135131
return 0;
136132
}
137133

138-
static void sa46_init_loopback(union sa46 *sa, sa_family_t family)
134+
static void ss_init_loopback(struct sockaddr_storage *sa, sa_family_t family)
139135
{
140136
memset(sa, 0, sizeof(*sa));
141-
sa->family = family;
142-
if (sa->family == AF_INET6)
143-
sa->v6.sin6_addr = in6addr_loopback;
137+
sa->ss_family = family;
138+
if (sa->ss_family == AF_INET6)
139+
((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_loopback;
144140
else
145-
sa->v4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
141+
((struct sockaddr_in *)sa)->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
146142
}
147143

148-
static void sa46_init_inany(union sa46 *sa, sa_family_t family)
144+
static void ss_init_inany(struct sockaddr_storage *sa, sa_family_t family)
149145
{
150146
memset(sa, 0, sizeof(*sa));
151-
sa->family = family;
152-
if (sa->family == AF_INET6)
153-
sa->v6.sin6_addr = in6addr_any;
147+
sa->ss_family = family;
148+
if (sa->ss_family == AF_INET6)
149+
((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_any;
154150
else
155-
sa->v4.sin_addr.s_addr = INADDR_ANY;
151+
((struct sockaddr_in *)sa)->sin_addr.s_addr = INADDR_ANY;
156152
}
157153

158154
static int read_int_sysctl(const char *sysctl)
@@ -228,7 +224,7 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
228224
int cli_fd)
229225
{
230226
struct data_check expected = {}, result;
231-
union sa46 cli_sa;
227+
struct sockaddr_storage cli_sa;
232228
socklen_t addrlen;
233229
int err;
234230

@@ -251,26 +247,32 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
251247
}
252248

253249
if (family == AF_INET6) {
250+
struct sockaddr_in6 *srv_v6 = (struct sockaddr_in6 *)&srv_sa;
251+
struct sockaddr_in6 *cli_v6 = (struct sockaddr_in6 *)&cli_sa;
252+
254253
expected.eth_protocol = htons(ETH_P_IPV6);
255-
expected.bind_inany = !srv_sa.v6.sin6_addr.s6_addr32[3] &&
256-
!srv_sa.v6.sin6_addr.s6_addr32[2] &&
257-
!srv_sa.v6.sin6_addr.s6_addr32[1] &&
258-
!srv_sa.v6.sin6_addr.s6_addr32[0];
254+
expected.bind_inany = !srv_v6->sin6_addr.s6_addr32[3] &&
255+
!srv_v6->sin6_addr.s6_addr32[2] &&
256+
!srv_v6->sin6_addr.s6_addr32[1] &&
257+
!srv_v6->sin6_addr.s6_addr32[0];
259258

260-
memcpy(&expected.skb_addrs[0], cli_sa.v6.sin6_addr.s6_addr32,
261-
sizeof(cli_sa.v6.sin6_addr));
259+
memcpy(&expected.skb_addrs[0], cli_v6->sin6_addr.s6_addr32,
260+
sizeof(cli_v6->sin6_addr));
262261
memcpy(&expected.skb_addrs[4], &in6addr_loopback,
263262
sizeof(in6addr_loopback));
264-
expected.skb_ports[0] = cli_sa.v6.sin6_port;
265-
expected.skb_ports[1] = srv_sa.v6.sin6_port;
263+
expected.skb_ports[0] = cli_v6->sin6_port;
264+
expected.skb_ports[1] = srv_v6->sin6_port;
266265
} else {
266+
struct sockaddr_in *srv_v4 = (struct sockaddr_in *)&srv_sa;
267+
struct sockaddr_in *cli_v4 = (struct sockaddr_in *)&cli_sa;
268+
267269
expected.eth_protocol = htons(ETH_P_IP);
268-
expected.bind_inany = !srv_sa.v4.sin_addr.s_addr;
270+
expected.bind_inany = !srv_v4->sin_addr.s_addr;
269271

270-
expected.skb_addrs[0] = cli_sa.v4.sin_addr.s_addr;
272+
expected.skb_addrs[0] = cli_v4->sin_addr.s_addr;
271273
expected.skb_addrs[1] = htonl(INADDR_LOOPBACK);
272-
expected.skb_ports[0] = cli_sa.v4.sin_port;
273-
expected.skb_ports[1] = srv_sa.v4.sin_port;
274+
expected.skb_ports[0] = cli_v4->sin_port;
275+
expected.skb_ports[1] = srv_v4->sin_port;
274276
}
275277

276278
if (memcmp(&result, &expected, offsetof(struct data_check,
@@ -364,16 +366,15 @@ static void check_results(void)
364366
static int send_data(int type, sa_family_t family, void *data, size_t len,
365367
enum result expected)
366368
{
367-
union sa46 cli_sa;
369+
struct sockaddr_storage cli_sa;
368370
int fd, err;
369371

370372
fd = socket(family, type, 0);
371373
RET_ERR(fd == -1, "socket()", "fd:%d errno:%d\n", fd, errno);
372374

373-
sa46_init_loopback(&cli_sa, family);
375+
ss_init_loopback(&cli_sa, family);
374376
err = bind(fd, (struct sockaddr *)&cli_sa, sizeof(cli_sa));
375377
RET_ERR(fd == -1, "bind(cli_sa)", "err:%d errno:%d\n", err, errno);
376-
377378
err = sendto(fd, data, len, MSG_FASTOPEN, (struct sockaddr *)&srv_sa,
378379
sizeof(srv_sa));
379380
RET_ERR(err != len && expected >= PASS,
@@ -589,9 +590,9 @@ static void prepare_sk_fds(int type, sa_family_t family, bool inany)
589590
socklen_t addrlen;
590591

591592
if (inany)
592-
sa46_init_inany(&srv_sa, family);
593+
ss_init_inany(&srv_sa, family);
593594
else
594-
sa46_init_loopback(&srv_sa, family);
595+
ss_init_loopback(&srv_sa, family);
595596
addrlen = sizeof(srv_sa);
596597

597598
/*

0 commit comments

Comments
 (0)