Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest: tcp: Make bind() selftest flexible.

Currently, bind_wildcard.c tests only (IPv4, IPv6) pairs, but we will
add more tests for the same protocol pairs.

This patch makes it possible by changing the address pointer to void.

No functional changes are intended.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://lore.kernel.org/r/20240326204251.51301-4-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Kuniyuki Iwashima and committed by
Jakub Kicinski
c48baf56 d91ef1e1

+58 -34
+58 -34
tools/testing/selftests/net/bind_wildcard.c
··· 6 6 7 7 #include "../kselftest_harness.h" 8 8 9 - struct in6_addr in6addr_v4mapped_any = { 9 + static const __u32 in4addr_any = INADDR_ANY; 10 + static const __u32 in4addr_loopback = INADDR_LOOPBACK; 11 + static const struct in6_addr in6addr_v4mapped_any = { 10 12 .s6_addr = { 11 13 0, 0, 0, 0, 12 14 0, 0, 0, 0, ··· 16 14 0, 0, 0, 0 17 15 } 18 16 }; 19 - 20 - struct in6_addr in6addr_v4mapped_loopback = { 17 + static const struct in6_addr in6addr_v4mapped_loopback = { 21 18 .s6_addr = { 22 19 0, 0, 0, 0, 23 20 0, 0, 0, 0, ··· 27 26 28 27 FIXTURE(bind_wildcard) 29 28 { 30 - struct sockaddr_in addr4; 31 - struct sockaddr_in6 addr6; 29 + socklen_t addrlen[2]; 30 + union { 31 + struct sockaddr addr; 32 + struct sockaddr_in addr4; 33 + struct sockaddr_in6 addr6; 34 + } addr[2]; 32 35 }; 33 36 34 37 FIXTURE_VARIANT(bind_wildcard) 35 38 { 36 - const __u32 addr4_const; 37 - const struct in6_addr *addr6_const; 39 + sa_family_t family[2]; 40 + const void *addr[2]; 38 41 int expected_errno; 39 42 }; 40 43 41 44 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any) 42 45 { 43 - .addr4_const = INADDR_ANY, 44 - .addr6_const = &in6addr_any, 46 + .family = {AF_INET, AF_INET6}, 47 + .addr = {&in4addr_any, &in6addr_any}, 45 48 .expected_errno = EADDRINUSE, 46 49 }; 47 50 48 51 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local) 49 52 { 50 - .addr4_const = INADDR_ANY, 51 - .addr6_const = &in6addr_loopback, 53 + .family = {AF_INET, AF_INET6}, 54 + .addr = {&in4addr_any, &in6addr_loopback}, 52 55 .expected_errno = 0, 53 56 }; 54 57 55 58 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_any) 56 59 { 57 - .addr4_const = INADDR_ANY, 58 - .addr6_const = &in6addr_v4mapped_any, 60 + .family = {AF_INET, AF_INET6}, 61 + .addr = {&in4addr_any, &in6addr_v4mapped_any}, 59 62 .expected_errno = EADDRINUSE, 60 63 }; 61 64 62 65 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_local) 63 66 { 64 - .addr4_const = INADDR_ANY, 65 - .addr6_const = &in6addr_v4mapped_loopback, 67 + .family = {AF_INET, AF_INET6}, 68 + .addr = {&in4addr_any, &in6addr_v4mapped_loopback}, 66 69 .expected_errno = EADDRINUSE, 67 70 }; 68 71 69 72 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any) 70 73 { 71 - .addr4_const = INADDR_LOOPBACK, 72 - .addr6_const = &in6addr_any, 74 + .family = {AF_INET, AF_INET6}, 75 + .addr = {&in4addr_loopback, &in6addr_any}, 73 76 .expected_errno = EADDRINUSE, 74 77 }; 75 78 76 79 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_local) 77 80 { 78 - .addr4_const = INADDR_LOOPBACK, 79 - .addr6_const = &in6addr_loopback, 81 + .family = {AF_INET, AF_INET6}, 82 + .addr = {&in4addr_loopback, &in6addr_loopback}, 80 83 .expected_errno = 0, 81 84 }; 82 85 83 86 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_any) 84 87 { 85 - .addr4_const = INADDR_LOOPBACK, 86 - .addr6_const = &in6addr_v4mapped_any, 88 + .family = {AF_INET, AF_INET6}, 89 + .addr = {&in4addr_loopback, &in6addr_v4mapped_any}, 87 90 .expected_errno = EADDRINUSE, 88 91 }; 89 92 90 93 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_local) 91 94 { 92 - .addr4_const = INADDR_LOOPBACK, 93 - .addr6_const = &in6addr_v4mapped_loopback, 95 + .family = {AF_INET, AF_INET6}, 96 + .addr = {&in4addr_loopback, &in6addr_v4mapped_loopback}, 94 97 .expected_errno = EADDRINUSE, 95 98 }; 96 99 100 + static void setup_addr(FIXTURE_DATA(bind_wildcard) *self, int i, 101 + int family, const void *addr_const) 102 + { 103 + if (family == AF_INET) { 104 + struct sockaddr_in *addr4 = &self->addr[i].addr4; 105 + const __u32 *addr4_const = addr_const; 106 + 107 + addr4->sin_family = AF_INET; 108 + addr4->sin_port = htons(0); 109 + addr4->sin_addr.s_addr = htonl(*addr4_const); 110 + 111 + self->addrlen[i] = sizeof(struct sockaddr_in); 112 + } else { 113 + struct sockaddr_in6 *addr6 = &self->addr[i].addr6; 114 + const struct in6_addr *addr6_const = addr_const; 115 + 116 + addr6->sin6_family = AF_INET6; 117 + addr6->sin6_port = htons(0); 118 + addr6->sin6_addr = *addr6_const; 119 + 120 + self->addrlen[i] = sizeof(struct sockaddr_in6); 121 + } 122 + } 123 + 97 124 FIXTURE_SETUP(bind_wildcard) 98 125 { 99 - self->addr4.sin_family = AF_INET; 100 - self->addr4.sin_port = htons(0); 101 - self->addr4.sin_addr.s_addr = htonl(variant->addr4_const); 102 - 103 - self->addr6.sin6_family = AF_INET6; 104 - self->addr6.sin6_port = htons(0); 105 - self->addr6.sin6_addr = *variant->addr6_const; 126 + setup_addr(self, 0, variant->family[0], variant->addr[0]); 127 + setup_addr(self, 1, variant->family[1], variant->addr[1]); 106 128 } 107 129 108 130 FIXTURE_TEARDOWN(bind_wildcard) ··· 170 146 TEST_F(bind_wildcard, v4_v6) 171 147 { 172 148 bind_sockets(_metadata, self, variant->expected_errno, 173 - (struct sockaddr *)&self->addr4, sizeof(self->addr4), 174 - (struct sockaddr *)&self->addr6, sizeof(self->addr6)); 149 + &self->addr[0].addr, self->addrlen[0], 150 + &self->addr[1].addr, self->addrlen[1]); 175 151 } 176 152 177 153 TEST_F(bind_wildcard, v6_v4) 178 154 { 179 155 bind_sockets(_metadata, self, variant->expected_errno, 180 - (struct sockaddr *)&self->addr6, sizeof(self->addr6), 181 - (struct sockaddr *)&self->addr4, sizeof(self->addr4)); 156 + &self->addr[1].addr, self->addrlen[1], 157 + &self->addr[0].addr, self->addrlen[0]); 182 158 } 183 159 184 160 TEST_HARNESS_MAIN