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

selftest: tcp: Add more bind() calls.

In addtition to the two addresses defined in the fixtures, this patch
add 6 more bind calls():

* 0.0.0.0
* 127.0.0.1
* ::
* ::1
* ::ffff:0.0.0.0
* ::ffff:127.0.0.1

The first two per-fixture bind() calls control how inet_bind2_bucket
is created, and the rest 6 bind() calls cover as many conflicting
patterns as possible.

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

authored by

Kuniyuki Iwashima and committed by
Jakub Kicinski
f40742c2 5e9e9afd

+166 -59
+166 -59
tools/testing/selftests/net/bind_wildcard.c
··· 25 25 } 26 26 }; 27 27 28 + #define NR_SOCKETS 8 29 + 28 30 FIXTURE(bind_wildcard) 29 31 { 30 - socklen_t addrlen[2]; 32 + int fd[NR_SOCKETS]; 33 + socklen_t addrlen[NR_SOCKETS]; 31 34 union { 32 35 struct sockaddr addr; 33 36 struct sockaddr_in addr4; 34 37 struct sockaddr_in6 addr6; 35 - } addr[2]; 38 + } addr[NR_SOCKETS]; 36 39 }; 37 40 38 41 FIXTURE_VARIANT(bind_wildcard) 39 42 { 40 43 sa_family_t family[2]; 41 44 const void *addr[2]; 42 - int expected_errno; 45 + 46 + /* 6 bind() calls below follow two bind() for the defined 2 addresses: 47 + * 48 + * 0.0.0.0 49 + * 127.0.0.1 50 + * :: 51 + * ::1 52 + * ::ffff:0.0.0.0 53 + * ::ffff:127.0.0.1 54 + */ 55 + int expected_errno[NR_SOCKETS]; 43 56 }; 44 57 45 58 /* (IPv4, IPv4) */ ··· 60 47 { 61 48 .family = {AF_INET, AF_INET}, 62 49 .addr = {&in4addr_any, &in4addr_loopback}, 63 - .expected_errno = EADDRINUSE, 50 + .expected_errno = {0, EADDRINUSE, 51 + EADDRINUSE, EADDRINUSE, 52 + EADDRINUSE, 0, 53 + EADDRINUSE, EADDRINUSE}, 64 54 }; 65 55 66 56 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v4_any) 67 57 { 68 58 .family = {AF_INET, AF_INET}, 69 59 .addr = {&in4addr_loopback, &in4addr_any}, 70 - .expected_errno = EADDRINUSE, 60 + .expected_errno = {0, EADDRINUSE, 61 + EADDRINUSE, EADDRINUSE, 62 + EADDRINUSE, 0, 63 + EADDRINUSE, EADDRINUSE}, 71 64 }; 72 65 73 66 /* (IPv4, IPv6) */ ··· 81 62 { 82 63 .family = {AF_INET, AF_INET6}, 83 64 .addr = {&in4addr_any, &in6addr_any}, 84 - .expected_errno = EADDRINUSE, 65 + .expected_errno = {0, EADDRINUSE, 66 + EADDRINUSE, EADDRINUSE, 67 + EADDRINUSE, 0, 68 + EADDRINUSE, EADDRINUSE}, 85 69 }; 86 70 87 71 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local) 88 72 { 89 73 .family = {AF_INET, AF_INET6}, 90 74 .addr = {&in4addr_any, &in6addr_loopback}, 91 - .expected_errno = 0, 75 + .expected_errno = {0, 0, 76 + EADDRINUSE, EADDRINUSE, 77 + EADDRINUSE, EADDRINUSE, 78 + EADDRINUSE, EADDRINUSE}, 92 79 }; 93 80 94 81 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_any) 95 82 { 96 83 .family = {AF_INET, AF_INET6}, 97 84 .addr = {&in4addr_any, &in6addr_v4mapped_any}, 98 - .expected_errno = EADDRINUSE, 85 + .expected_errno = {0, EADDRINUSE, 86 + EADDRINUSE, EADDRINUSE, 87 + EADDRINUSE, 0, 88 + EADDRINUSE, EADDRINUSE}, 99 89 }; 100 90 101 91 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_local) 102 92 { 103 93 .family = {AF_INET, AF_INET6}, 104 94 .addr = {&in4addr_any, &in6addr_v4mapped_loopback}, 105 - .expected_errno = EADDRINUSE, 95 + .expected_errno = {0, EADDRINUSE, 96 + EADDRINUSE, EADDRINUSE, 97 + EADDRINUSE, 0, 98 + EADDRINUSE, EADDRINUSE}, 106 99 }; 107 100 108 101 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any) 109 102 { 110 103 .family = {AF_INET, AF_INET6}, 111 104 .addr = {&in4addr_loopback, &in6addr_any}, 112 - .expected_errno = EADDRINUSE, 105 + .expected_errno = {0, EADDRINUSE, 106 + EADDRINUSE, EADDRINUSE, 107 + EADDRINUSE, 0, 108 + EADDRINUSE, EADDRINUSE}, 113 109 }; 114 110 115 111 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_local) 116 112 { 117 113 .family = {AF_INET, AF_INET6}, 118 114 .addr = {&in4addr_loopback, &in6addr_loopback}, 119 - .expected_errno = 0, 115 + .expected_errno = {0, 0, 116 + EADDRINUSE, EADDRINUSE, 117 + EADDRINUSE, EADDRINUSE, 118 + EADDRINUSE, EADDRINUSE}, 120 119 }; 121 120 122 121 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_any) 123 122 { 124 123 .family = {AF_INET, AF_INET6}, 125 124 .addr = {&in4addr_loopback, &in6addr_v4mapped_any}, 126 - .expected_errno = EADDRINUSE, 125 + .expected_errno = {0, EADDRINUSE, 126 + EADDRINUSE, EADDRINUSE, 127 + EADDRINUSE, 0, 128 + EADDRINUSE, EADDRINUSE}, 127 129 }; 128 130 129 131 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_local) 130 132 { 131 133 .family = {AF_INET, AF_INET6}, 132 134 .addr = {&in4addr_loopback, &in6addr_v4mapped_loopback}, 133 - .expected_errno = EADDRINUSE, 135 + .expected_errno = {0, EADDRINUSE, 136 + EADDRINUSE, EADDRINUSE, 137 + EADDRINUSE, 0, 138 + EADDRINUSE, EADDRINUSE}, 134 139 }; 135 140 136 141 /* (IPv6, IPv4) */ ··· 162 119 { 163 120 .family = {AF_INET6, AF_INET}, 164 121 .addr = {&in6addr_any, &in4addr_any}, 165 - .expected_errno = EADDRINUSE, 122 + .expected_errno = {0, EADDRINUSE, 123 + EADDRINUSE, EADDRINUSE, 124 + EADDRINUSE, EADDRINUSE, 125 + EADDRINUSE, EADDRINUSE}, 166 126 }; 167 127 168 128 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_local) 169 129 { 170 130 .family = {AF_INET6, AF_INET}, 171 131 .addr = {&in6addr_any, &in4addr_loopback}, 172 - .expected_errno = EADDRINUSE, 132 + .expected_errno = {0, EADDRINUSE, 133 + EADDRINUSE, EADDRINUSE, 134 + EADDRINUSE, EADDRINUSE, 135 + EADDRINUSE, EADDRINUSE}, 173 136 }; 174 137 175 138 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_any) 176 139 { 177 140 .family = {AF_INET6, AF_INET}, 178 141 .addr = {&in6addr_loopback, &in4addr_any}, 179 - .expected_errno = 0, 142 + .expected_errno = {0, 0, 143 + EADDRINUSE, EADDRINUSE, 144 + EADDRINUSE, EADDRINUSE, 145 + EADDRINUSE, EADDRINUSE}, 180 146 }; 181 147 182 148 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_local) 183 149 { 184 150 .family = {AF_INET6, AF_INET}, 185 151 .addr = {&in6addr_loopback, &in4addr_loopback}, 186 - .expected_errno = 0, 152 + .expected_errno = {0, 0, 153 + EADDRINUSE, EADDRINUSE, 154 + EADDRINUSE, EADDRINUSE, 155 + EADDRINUSE, EADDRINUSE}, 187 156 }; 188 157 189 158 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_any) 190 159 { 191 160 .family = {AF_INET6, AF_INET}, 192 161 .addr = {&in6addr_v4mapped_any, &in4addr_any}, 193 - .expected_errno = EADDRINUSE, 162 + .expected_errno = {0, EADDRINUSE, 163 + EADDRINUSE, EADDRINUSE, 164 + EADDRINUSE, 0, 165 + EADDRINUSE, EADDRINUSE}, 194 166 }; 195 167 196 168 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_local) 197 169 { 198 170 .family = {AF_INET6, AF_INET}, 199 171 .addr = {&in6addr_v4mapped_any, &in4addr_loopback}, 200 - .expected_errno = EADDRINUSE, 172 + .expected_errno = {0, EADDRINUSE, 173 + EADDRINUSE, EADDRINUSE, 174 + EADDRINUSE, 0, 175 + EADDRINUSE, EADDRINUSE}, 201 176 }; 202 177 203 178 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_any) 204 179 { 205 180 .family = {AF_INET6, AF_INET}, 206 181 .addr = {&in6addr_v4mapped_loopback, &in4addr_any}, 207 - .expected_errno = EADDRINUSE, 182 + .expected_errno = {0, EADDRINUSE, 183 + EADDRINUSE, EADDRINUSE, 184 + EADDRINUSE, 0, 185 + EADDRINUSE, EADDRINUSE}, 208 186 }; 209 187 210 188 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_local) 211 189 { 212 190 .family = {AF_INET6, AF_INET}, 213 191 .addr = {&in6addr_v4mapped_loopback, &in4addr_loopback}, 214 - .expected_errno = EADDRINUSE, 192 + .expected_errno = {0, EADDRINUSE, 193 + EADDRINUSE, EADDRINUSE, 194 + EADDRINUSE, 0, 195 + EADDRINUSE, EADDRINUSE}, 215 196 }; 216 197 217 198 /* (IPv6, IPv6) */ ··· 243 176 { 244 177 .family = {AF_INET6, AF_INET6}, 245 178 .addr = {&in6addr_any, &in6addr_loopback}, 246 - .expected_errno = EADDRINUSE, 179 + .expected_errno = {0, EADDRINUSE, 180 + EADDRINUSE, EADDRINUSE, 181 + EADDRINUSE, EADDRINUSE, 182 + EADDRINUSE, EADDRINUSE}, 247 183 }; 248 184 249 185 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_any) 250 186 { 251 187 .family = {AF_INET6, AF_INET6}, 252 188 .addr = {&in6addr_any, &in6addr_v4mapped_any}, 253 - .expected_errno = EADDRINUSE, 189 + .expected_errno = {0, EADDRINUSE, 190 + EADDRINUSE, EADDRINUSE, 191 + EADDRINUSE, EADDRINUSE, 192 + EADDRINUSE, EADDRINUSE}, 254 193 }; 255 194 256 195 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_local) 257 196 { 258 197 .family = {AF_INET6, AF_INET6}, 259 198 .addr = {&in6addr_any, &in6addr_v4mapped_loopback}, 260 - .expected_errno = EADDRINUSE, 199 + .expected_errno = {0, EADDRINUSE, 200 + EADDRINUSE, EADDRINUSE, 201 + EADDRINUSE, EADDRINUSE, 202 + EADDRINUSE, EADDRINUSE}, 261 203 }; 262 204 263 205 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any) 264 206 { 265 207 .family = {AF_INET6, AF_INET6}, 266 208 .addr = {&in6addr_loopback, &in6addr_any}, 267 - .expected_errno = EADDRINUSE, 209 + .expected_errno = {0, EADDRINUSE, 210 + 0, EADDRINUSE, 211 + EADDRINUSE, EADDRINUSE, 212 + EADDRINUSE, EADDRINUSE}, 268 213 }; 269 214 270 215 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_any) 271 216 { 272 217 .family = {AF_INET6, AF_INET6}, 273 218 .addr = {&in6addr_loopback, &in6addr_v4mapped_any}, 274 - .expected_errno = 0, 219 + .expected_errno = {0, 0, 220 + EADDRINUSE, EADDRINUSE, 221 + EADDRINUSE, EADDRINUSE, 222 + EADDRINUSE, EADDRINUSE}, 275 223 }; 276 224 277 225 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_local) 278 226 { 279 227 .family = {AF_INET6, AF_INET6}, 280 228 .addr = {&in6addr_loopback, &in6addr_v4mapped_loopback}, 281 - .expected_errno = 0, 229 + .expected_errno = {0, 0, 230 + EADDRINUSE, EADDRINUSE, 231 + EADDRINUSE, EADDRINUSE, 232 + EADDRINUSE, EADDRINUSE}, 282 233 }; 283 234 284 235 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any) 285 236 { 286 237 .family = {AF_INET6, AF_INET6}, 287 238 .addr = {&in6addr_v4mapped_any, &in6addr_any}, 288 - .expected_errno = EADDRINUSE, 239 + .expected_errno = {0, EADDRINUSE, 240 + EADDRINUSE, EADDRINUSE, 241 + EADDRINUSE, 0, 242 + EADDRINUSE, EADDRINUSE}, 289 243 }; 290 244 291 245 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_local) 292 246 { 293 247 .family = {AF_INET6, AF_INET6}, 294 248 .addr = {&in6addr_v4mapped_any, &in6addr_loopback}, 295 - .expected_errno = 0, 249 + .expected_errno = {0, 0, 250 + EADDRINUSE, EADDRINUSE, 251 + EADDRINUSE, EADDRINUSE, 252 + EADDRINUSE, EADDRINUSE}, 296 253 }; 297 254 298 255 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_v4mapped_local) 299 256 { 300 257 .family = {AF_INET6, AF_INET6}, 301 258 .addr = {&in6addr_v4mapped_any, &in6addr_v4mapped_loopback}, 302 - .expected_errno = EADDRINUSE, 259 + .expected_errno = {0, EADDRINUSE, 260 + EADDRINUSE, EADDRINUSE, 261 + EADDRINUSE, 0, 262 + EADDRINUSE, EADDRINUSE}, 303 263 }; 304 264 305 265 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any) 306 266 { 307 267 .family = {AF_INET6, AF_INET6}, 308 268 .addr = {&in6addr_v4mapped_loopback, &in6addr_any}, 309 - .expected_errno = EADDRINUSE, 269 + .expected_errno = {0, EADDRINUSE, 270 + EADDRINUSE, EADDRINUSE, 271 + EADDRINUSE, 0, 272 + EADDRINUSE, EADDRINUSE}, 310 273 }; 311 274 312 275 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_local) 313 276 { 314 277 .family = {AF_INET6, AF_INET6}, 315 278 .addr = {&in6addr_v4mapped_loopback, &in6addr_loopback}, 316 - .expected_errno = 0, 279 + .expected_errno = {0, 0, 280 + EADDRINUSE, EADDRINUSE, 281 + EADDRINUSE, EADDRINUSE, 282 + EADDRINUSE, EADDRINUSE}, 317 283 }; 318 284 319 285 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_v4mapped_any) 320 286 { 321 287 .family = {AF_INET6, AF_INET6}, 322 288 .addr = {&in6addr_v4mapped_loopback, &in6addr_v4mapped_any}, 323 - .expected_errno = EADDRINUSE, 289 + .expected_errno = {0, EADDRINUSE, 290 + EADDRINUSE, EADDRINUSE, 291 + EADDRINUSE, 0, 292 + EADDRINUSE, EADDRINUSE}, 324 293 }; 325 294 326 295 static void setup_addr(FIXTURE_DATA(bind_wildcard) *self, int i, ··· 387 284 { 388 285 setup_addr(self, 0, variant->family[0], variant->addr[0]); 389 286 setup_addr(self, 1, variant->family[1], variant->addr[1]); 287 + 288 + setup_addr(self, 2, AF_INET, &in4addr_any); 289 + setup_addr(self, 3, AF_INET, &in4addr_loopback); 290 + 291 + setup_addr(self, 4, AF_INET6, &in6addr_any); 292 + setup_addr(self, 5, AF_INET6, &in6addr_loopback); 293 + setup_addr(self, 6, AF_INET6, &in6addr_v4mapped_any); 294 + setup_addr(self, 7, AF_INET6, &in6addr_v4mapped_loopback); 390 295 } 391 296 392 297 FIXTURE_TEARDOWN(bind_wildcard) 393 298 { 299 + int i; 300 + 301 + for (i = 0; i < NR_SOCKETS; i++) 302 + close(self->fd[i]); 394 303 } 395 304 396 - void bind_sockets(struct __test_metadata *_metadata, 397 - FIXTURE_DATA(bind_wildcard) *self, 398 - int expected_errno, 399 - struct sockaddr *addr1, socklen_t addrlen1, 400 - struct sockaddr *addr2, socklen_t addrlen2) 305 + void bind_socket(struct __test_metadata *_metadata, 306 + FIXTURE_DATA(bind_wildcard) *self, 307 + const FIXTURE_VARIANT(bind_wildcard) *variant, 308 + int i) 401 309 { 402 - int fd[2]; 403 310 int ret; 404 311 405 - fd[0] = socket(addr1->sa_family, SOCK_STREAM, 0); 406 - ASSERT_GT(fd[0], 0); 312 + self->fd[i] = socket(self->addr[i].addr.sa_family, SOCK_STREAM, 0); 313 + ASSERT_GT(self->fd[i], 0); 407 314 408 - ret = bind(fd[0], addr1, addrlen1); 409 - ASSERT_EQ(ret, 0); 315 + self->addr[i].addr4.sin_port = self->addr[0].addr4.sin_port; 410 316 411 - ret = getsockname(fd[0], addr1, &addrlen1); 412 - ASSERT_EQ(ret, 0); 413 - 414 - ((struct sockaddr_in *)addr2)->sin_port = ((struct sockaddr_in *)addr1)->sin_port; 415 - 416 - fd[1] = socket(addr2->sa_family, SOCK_STREAM, 0); 417 - ASSERT_GT(fd[1], 0); 418 - 419 - ret = bind(fd[1], addr2, addrlen2); 420 - if (expected_errno) { 317 + ret = bind(self->fd[i], &self->addr[i].addr, self->addrlen[i]); 318 + if (variant->expected_errno[i]) { 421 319 ASSERT_EQ(ret, -1); 422 - ASSERT_EQ(errno, expected_errno); 320 + ASSERT_EQ(errno, variant->expected_errno[i]); 423 321 } else { 424 322 ASSERT_EQ(ret, 0); 425 323 } 426 324 427 - close(fd[1]); 428 - close(fd[0]); 325 + if (i == 0) { 326 + ret = getsockname(self->fd[0], &self->addr[0].addr, &self->addrlen[0]); 327 + ASSERT_EQ(ret, 0); 328 + } 429 329 } 430 330 431 331 TEST_F(bind_wildcard, plain) 432 332 { 433 - bind_sockets(_metadata, self, variant->expected_errno, 434 - &self->addr[0].addr, self->addrlen[0], 435 - &self->addr[1].addr, self->addrlen[1]); 333 + int i; 334 + 335 + for (i = 0; i < NR_SOCKETS; i++) 336 + bind_socket(_metadata, self, variant, i); 436 337 } 437 338 438 339 TEST_HARNESS_MAIN