mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 08:33:17 +02:00
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 <ameryhung@gmail.com> Signed-off-by: Hoyeon Lee <hoyeon.lee@suse.com> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Link: https://patch.msgid.link/20251121081332.2309838-3-hoyeon.lee@suse.com
This commit is contained in:
parent
fd6ed07a05
commit
db354a1577
|
|
@ -41,11 +41,7 @@ static struct bpf_object *obj;
|
|||
static __u32 index_zero;
|
||||
static int epfd;
|
||||
|
||||
static union sa46 {
|
||||
struct sockaddr_in6 v6;
|
||||
struct sockaddr_in v4;
|
||||
sa_family_t family;
|
||||
} srv_sa;
|
||||
static struct sockaddr_storage srv_sa;
|
||||
|
||||
#define RET_IF(condition, tag, format...) ({ \
|
||||
if (CHECK_FAIL(condition)) { \
|
||||
|
|
@ -135,24 +131,24 @@ static int prepare_bpf_obj(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void sa46_init_loopback(union sa46 *sa, sa_family_t family)
|
||||
static void ss_init_loopback(struct sockaddr_storage *sa, sa_family_t family)
|
||||
{
|
||||
memset(sa, 0, sizeof(*sa));
|
||||
sa->family = family;
|
||||
if (sa->family == AF_INET6)
|
||||
sa->v6.sin6_addr = in6addr_loopback;
|
||||
sa->ss_family = family;
|
||||
if (sa->ss_family == AF_INET6)
|
||||
((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_loopback;
|
||||
else
|
||||
sa->v4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
((struct sockaddr_in *)sa)->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
}
|
||||
|
||||
static void sa46_init_inany(union sa46 *sa, sa_family_t family)
|
||||
static void ss_init_inany(struct sockaddr_storage *sa, sa_family_t family)
|
||||
{
|
||||
memset(sa, 0, sizeof(*sa));
|
||||
sa->family = family;
|
||||
if (sa->family == AF_INET6)
|
||||
sa->v6.sin6_addr = in6addr_any;
|
||||
sa->ss_family = family;
|
||||
if (sa->ss_family == AF_INET6)
|
||||
((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_any;
|
||||
else
|
||||
sa->v4.sin_addr.s_addr = INADDR_ANY;
|
||||
((struct sockaddr_in *)sa)->sin_addr.s_addr = INADDR_ANY;
|
||||
}
|
||||
|
||||
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,
|
|||
int cli_fd)
|
||||
{
|
||||
struct data_check expected = {}, result;
|
||||
union sa46 cli_sa;
|
||||
struct sockaddr_storage cli_sa;
|
||||
socklen_t addrlen;
|
||||
int err;
|
||||
|
||||
|
|
@ -251,26 +247,32 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
|
|||
}
|
||||
|
||||
if (family == AF_INET6) {
|
||||
expected.eth_protocol = htons(ETH_P_IPV6);
|
||||
expected.bind_inany = !srv_sa.v6.sin6_addr.s6_addr32[3] &&
|
||||
!srv_sa.v6.sin6_addr.s6_addr32[2] &&
|
||||
!srv_sa.v6.sin6_addr.s6_addr32[1] &&
|
||||
!srv_sa.v6.sin6_addr.s6_addr32[0];
|
||||
struct sockaddr_in6 *srv_v6 = (struct sockaddr_in6 *)&srv_sa;
|
||||
struct sockaddr_in6 *cli_v6 = (struct sockaddr_in6 *)&cli_sa;
|
||||
|
||||
memcpy(&expected.skb_addrs[0], cli_sa.v6.sin6_addr.s6_addr32,
|
||||
sizeof(cli_sa.v6.sin6_addr));
|
||||
expected.eth_protocol = htons(ETH_P_IPV6);
|
||||
expected.bind_inany = !srv_v6->sin6_addr.s6_addr32[3] &&
|
||||
!srv_v6->sin6_addr.s6_addr32[2] &&
|
||||
!srv_v6->sin6_addr.s6_addr32[1] &&
|
||||
!srv_v6->sin6_addr.s6_addr32[0];
|
||||
|
||||
memcpy(&expected.skb_addrs[0], cli_v6->sin6_addr.s6_addr32,
|
||||
sizeof(cli_v6->sin6_addr));
|
||||
memcpy(&expected.skb_addrs[4], &in6addr_loopback,
|
||||
sizeof(in6addr_loopback));
|
||||
expected.skb_ports[0] = cli_sa.v6.sin6_port;
|
||||
expected.skb_ports[1] = srv_sa.v6.sin6_port;
|
||||
expected.skb_ports[0] = cli_v6->sin6_port;
|
||||
expected.skb_ports[1] = srv_v6->sin6_port;
|
||||
} else {
|
||||
expected.eth_protocol = htons(ETH_P_IP);
|
||||
expected.bind_inany = !srv_sa.v4.sin_addr.s_addr;
|
||||
struct sockaddr_in *srv_v4 = (struct sockaddr_in *)&srv_sa;
|
||||
struct sockaddr_in *cli_v4 = (struct sockaddr_in *)&cli_sa;
|
||||
|
||||
expected.skb_addrs[0] = cli_sa.v4.sin_addr.s_addr;
|
||||
expected.eth_protocol = htons(ETH_P_IP);
|
||||
expected.bind_inany = !srv_v4->sin_addr.s_addr;
|
||||
|
||||
expected.skb_addrs[0] = cli_v4->sin_addr.s_addr;
|
||||
expected.skb_addrs[1] = htonl(INADDR_LOOPBACK);
|
||||
expected.skb_ports[0] = cli_sa.v4.sin_port;
|
||||
expected.skb_ports[1] = srv_sa.v4.sin_port;
|
||||
expected.skb_ports[0] = cli_v4->sin_port;
|
||||
expected.skb_ports[1] = srv_v4->sin_port;
|
||||
}
|
||||
|
||||
if (memcmp(&result, &expected, offsetof(struct data_check,
|
||||
|
|
@ -364,16 +366,15 @@ static void check_results(void)
|
|||
static int send_data(int type, sa_family_t family, void *data, size_t len,
|
||||
enum result expected)
|
||||
{
|
||||
union sa46 cli_sa;
|
||||
struct sockaddr_storage cli_sa;
|
||||
int fd, err;
|
||||
|
||||
fd = socket(family, type, 0);
|
||||
RET_ERR(fd == -1, "socket()", "fd:%d errno:%d\n", fd, errno);
|
||||
|
||||
sa46_init_loopback(&cli_sa, family);
|
||||
ss_init_loopback(&cli_sa, family);
|
||||
err = bind(fd, (struct sockaddr *)&cli_sa, sizeof(cli_sa));
|
||||
RET_ERR(fd == -1, "bind(cli_sa)", "err:%d errno:%d\n", err, errno);
|
||||
|
||||
err = sendto(fd, data, len, MSG_FASTOPEN, (struct sockaddr *)&srv_sa,
|
||||
sizeof(srv_sa));
|
||||
RET_ERR(err != len && expected >= PASS,
|
||||
|
|
@ -589,9 +590,9 @@ static void prepare_sk_fds(int type, sa_family_t family, bool inany)
|
|||
socklen_t addrlen;
|
||||
|
||||
if (inany)
|
||||
sa46_init_inany(&srv_sa, family);
|
||||
ss_init_inany(&srv_sa, family);
|
||||
else
|
||||
sa46_init_loopback(&srv_sa, family);
|
||||
ss_init_loopback(&srv_sa, family);
|
||||
addrlen = sizeof(srv_sa);
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user