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.

Signed-off-by: Hoyeon Lee <[email protected]>
---
 .../bpf/prog_tests/select_reuseport.c         | 67 ++++++++++---------
 1 file changed, 34 insertions(+), 33 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/select_reuseport.c 
b/tools/testing/selftests/bpf/prog_tests/select_reuseport.c
index 036d4760d2c1..3dbcc091f16c 100644
--- a/tools/testing/selftests/bpf/prog_tests/select_reuseport.c
+++ b/tools/testing/selftests/bpf/prog_tests/select_reuseport.c
@@ -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) {
+               struct sockaddr_in6 *srv_v6 = (struct sockaddr_in6 *)&srv_sa;
+               struct sockaddr_in6 *cli_v6 = (struct sockaddr_in6 *)&cli_sa;
+
                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];
+               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_sa.v6.sin6_addr.s6_addr32,
-                      sizeof(cli_sa.v6.sin6_addr));
+               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 {
+               struct sockaddr_in *srv_v4 = (struct sockaddr_in *)&srv_sa;
+               struct sockaddr_in *cli_v4 = (struct sockaddr_in *)&cli_sa;
+
                expected.eth_protocol = htons(ETH_P_IP);
-               expected.bind_inany = !srv_sa.v4.sin_addr.s_addr;
+               expected.bind_inany = !srv_v4->sin_addr.s_addr;
 
-               expected.skb_addrs[0] = cli_sa.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);
 
        /*
-- 
2.51.1


Reply via email to