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

selftest: tcp: Add bind() tests for SO_REUSEADDR/SO_REUSEPORT.

This patch adds two tests using SO_REUSEADDR and SO_REUSEPORT and
defines errno for each test case.

SO_REUSEADDR/SO_REUSEPORT is set for the per-fixture two bind()
calls.

The notable pattern is the pair of v6only [::] and plain [::].
The two sockets are put into the same tb2, where per-bucket v6only
flag would be useless to detect bind() conflict.

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

authored by

Kuniyuki Iwashima and committed by
Jakub Kicinski
7679f096 d37f2f72

+257 -6
+257 -6
tools/testing/selftests/net/bind_wildcard.c
··· 54 54 * ::ffff:127.0.0.1 55 55 */ 56 56 int expected_errno[NR_SOCKETS]; 57 + int expected_reuse_errno[NR_SOCKETS]; 57 58 }; 58 59 59 60 /* (IPv4, IPv4) */ ··· 66 65 EADDRINUSE, EADDRINUSE, 67 66 EADDRINUSE, 0, 68 67 EADDRINUSE, EADDRINUSE}, 68 + .expected_reuse_errno = {0, 0, 69 + EADDRINUSE, EADDRINUSE, 70 + EADDRINUSE, 0, 71 + EADDRINUSE, EADDRINUSE}, 69 72 }; 70 73 71 74 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v4_any) ··· 80 75 EADDRINUSE, EADDRINUSE, 81 76 EADDRINUSE, 0, 82 77 EADDRINUSE, EADDRINUSE}, 78 + .expected_reuse_errno = {0, 0, 79 + EADDRINUSE, EADDRINUSE, 80 + EADDRINUSE, 0, 81 + EADDRINUSE, EADDRINUSE}, 83 82 }; 84 83 85 84 /* (IPv4, IPv6) */ ··· 95 86 EADDRINUSE, EADDRINUSE, 96 87 EADDRINUSE, 0, 97 88 EADDRINUSE, EADDRINUSE}, 89 + .expected_reuse_errno = {0, 0, 90 + EADDRINUSE, EADDRINUSE, 91 + EADDRINUSE, EADDRINUSE, 92 + EADDRINUSE, EADDRINUSE}, 98 93 }; 99 94 100 95 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any_only) ··· 110 97 EADDRINUSE, EADDRINUSE, 111 98 EADDRINUSE, EADDRINUSE, 112 99 EADDRINUSE, EADDRINUSE}, 100 + .expected_reuse_errno = {0, 0, 101 + EADDRINUSE, EADDRINUSE, 102 + EADDRINUSE, EADDRINUSE, 103 + EADDRINUSE, EADDRINUSE}, 113 104 }; 114 105 115 106 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local) ··· 124 107 EADDRINUSE, EADDRINUSE, 125 108 EADDRINUSE, EADDRINUSE, 126 109 EADDRINUSE, EADDRINUSE}, 110 + .expected_reuse_errno = {0, 0, 111 + EADDRINUSE, EADDRINUSE, 112 + EADDRINUSE, EADDRINUSE, 113 + EADDRINUSE, EADDRINUSE}, 127 114 }; 128 115 129 116 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_any) ··· 138 117 EADDRINUSE, EADDRINUSE, 139 118 EADDRINUSE, 0, 140 119 EADDRINUSE, EADDRINUSE}, 120 + .expected_reuse_errno = {0, 0, 121 + EADDRINUSE, EADDRINUSE, 122 + EADDRINUSE, 0, 123 + EADDRINUSE, EADDRINUSE}, 141 124 }; 142 125 143 126 FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_local) ··· 152 127 EADDRINUSE, EADDRINUSE, 153 128 EADDRINUSE, 0, 154 129 EADDRINUSE, EADDRINUSE}, 130 + .expected_reuse_errno = {0, 0, 131 + EADDRINUSE, EADDRINUSE, 132 + EADDRINUSE, 0, 133 + EADDRINUSE, EADDRINUSE}, 155 134 }; 156 135 157 136 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any) ··· 166 137 EADDRINUSE, EADDRINUSE, 167 138 EADDRINUSE, 0, 168 139 EADDRINUSE, EADDRINUSE}, 140 + .expected_reuse_errno = {0, 0, 141 + EADDRINUSE, EADDRINUSE, 142 + EADDRINUSE, EADDRINUSE, 143 + EADDRINUSE, EADDRINUSE}, 169 144 }; 170 145 171 146 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any_only) ··· 181 148 EADDRINUSE, EADDRINUSE, 182 149 EADDRINUSE, EADDRINUSE, 183 150 EADDRINUSE, EADDRINUSE}, 151 + .expected_reuse_errno = {0, 0, 152 + EADDRINUSE, EADDRINUSE, 153 + EADDRINUSE, EADDRINUSE, 154 + EADDRINUSE, EADDRINUSE}, 184 155 }; 185 156 186 157 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_local) ··· 195 158 EADDRINUSE, EADDRINUSE, 196 159 EADDRINUSE, EADDRINUSE, 197 160 EADDRINUSE, EADDRINUSE}, 161 + .expected_reuse_errno = {0, 0, 162 + EADDRINUSE, EADDRINUSE, 163 + EADDRINUSE, EADDRINUSE, 164 + EADDRINUSE, EADDRINUSE}, 198 165 }; 199 166 200 167 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_any) ··· 209 168 EADDRINUSE, EADDRINUSE, 210 169 EADDRINUSE, 0, 211 170 EADDRINUSE, EADDRINUSE}, 171 + .expected_reuse_errno = {0, 0, 172 + EADDRINUSE, EADDRINUSE, 173 + EADDRINUSE, 0, 174 + EADDRINUSE, EADDRINUSE}, 212 175 }; 213 176 214 177 FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_local) ··· 223 178 EADDRINUSE, EADDRINUSE, 224 179 EADDRINUSE, 0, 225 180 EADDRINUSE, EADDRINUSE}, 181 + .expected_reuse_errno = {0, 0, 182 + EADDRINUSE, EADDRINUSE, 183 + EADDRINUSE, 0, 184 + EADDRINUSE, EADDRINUSE}, 226 185 }; 227 186 228 187 /* (IPv6, IPv4) */ ··· 238 189 EADDRINUSE, EADDRINUSE, 239 190 EADDRINUSE, EADDRINUSE, 240 191 EADDRINUSE, EADDRINUSE}, 192 + .expected_reuse_errno = {0, 0, 193 + EADDRINUSE, EADDRINUSE, 194 + EADDRINUSE, EADDRINUSE, 195 + EADDRINUSE, EADDRINUSE}, 241 196 }; 242 197 243 198 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_any) ··· 253 200 EADDRINUSE, EADDRINUSE, 254 201 EADDRINUSE, EADDRINUSE, 255 202 EADDRINUSE, EADDRINUSE}, 203 + .expected_reuse_errno = {0, 0, 204 + EADDRINUSE, EADDRINUSE, 205 + EADDRINUSE, EADDRINUSE, 206 + EADDRINUSE, EADDRINUSE}, 256 207 }; 257 208 258 209 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_local) ··· 267 210 EADDRINUSE, EADDRINUSE, 268 211 EADDRINUSE, EADDRINUSE, 269 212 EADDRINUSE, EADDRINUSE}, 213 + .expected_reuse_errno = {0, 0, 214 + EADDRINUSE, EADDRINUSE, 215 + EADDRINUSE, EADDRINUSE, 216 + EADDRINUSE, EADDRINUSE}, 270 217 }; 271 218 272 219 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_local) ··· 282 221 EADDRINUSE, EADDRINUSE, 283 222 EADDRINUSE, EADDRINUSE, 284 223 EADDRINUSE, EADDRINUSE}, 224 + .expected_reuse_errno = {0, 0, 225 + EADDRINUSE, EADDRINUSE, 226 + EADDRINUSE, EADDRINUSE, 227 + EADDRINUSE, EADDRINUSE}, 285 228 }; 286 229 287 230 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_any) ··· 296 231 EADDRINUSE, EADDRINUSE, 297 232 EADDRINUSE, EADDRINUSE, 298 233 EADDRINUSE, EADDRINUSE}, 234 + .expected_reuse_errno = {0, 0, 235 + EADDRINUSE, EADDRINUSE, 236 + EADDRINUSE, EADDRINUSE, 237 + EADDRINUSE, EADDRINUSE}, 299 238 }; 300 239 301 240 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_local) ··· 310 241 EADDRINUSE, EADDRINUSE, 311 242 EADDRINUSE, EADDRINUSE, 312 243 EADDRINUSE, EADDRINUSE}, 244 + .expected_reuse_errno = {0, 0, 245 + EADDRINUSE, EADDRINUSE, 246 + EADDRINUSE, EADDRINUSE, 247 + EADDRINUSE, EADDRINUSE}, 313 248 }; 314 249 315 250 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_any) ··· 324 251 EADDRINUSE, EADDRINUSE, 325 252 EADDRINUSE, 0, 326 253 EADDRINUSE, EADDRINUSE}, 254 + .expected_reuse_errno = {0, 0, 255 + EADDRINUSE, EADDRINUSE, 256 + EADDRINUSE, 0, 257 + EADDRINUSE, EADDRINUSE}, 327 258 }; 328 259 329 260 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_local) ··· 338 261 EADDRINUSE, EADDRINUSE, 339 262 EADDRINUSE, 0, 340 263 EADDRINUSE, EADDRINUSE}, 264 + .expected_reuse_errno = {0, 0, 265 + EADDRINUSE, EADDRINUSE, 266 + EADDRINUSE, 0, 267 + EADDRINUSE, EADDRINUSE}, 341 268 }; 342 269 343 270 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_any) ··· 352 271 EADDRINUSE, EADDRINUSE, 353 272 EADDRINUSE, 0, 354 273 EADDRINUSE, EADDRINUSE}, 274 + .expected_reuse_errno = {0, 0, 275 + EADDRINUSE, EADDRINUSE, 276 + EADDRINUSE, 0, 277 + EADDRINUSE, EADDRINUSE}, 355 278 }; 356 279 357 280 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_local) ··· 366 281 EADDRINUSE, EADDRINUSE, 367 282 EADDRINUSE, 0, 368 283 EADDRINUSE, EADDRINUSE}, 284 + .expected_reuse_errno = {0, 0, 285 + EADDRINUSE, EADDRINUSE, 286 + EADDRINUSE, 0, 287 + EADDRINUSE, EADDRINUSE}, 369 288 }; 370 289 371 290 /* (IPv6, IPv6) */ 291 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_any) 292 + { 293 + .family = {AF_INET6, AF_INET6}, 294 + .addr = {&in6addr_any, &in6addr_any}, 295 + .expected_errno = {0, EADDRINUSE, 296 + EADDRINUSE, EADDRINUSE, 297 + EADDRINUSE, EADDRINUSE, 298 + EADDRINUSE, EADDRINUSE}, 299 + .expected_reuse_errno = {0, 0, 300 + EADDRINUSE, EADDRINUSE, 301 + EADDRINUSE, EADDRINUSE, 302 + EADDRINUSE, EADDRINUSE}, 303 + }; 304 + 305 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_any) 306 + { 307 + .family = {AF_INET6, AF_INET6}, 308 + .addr = {&in6addr_any, &in6addr_any}, 309 + .ipv6_only = {true, false}, 310 + .expected_errno = {0, EADDRINUSE, 311 + 0, EADDRINUSE, 312 + EADDRINUSE, EADDRINUSE, 313 + EADDRINUSE, EADDRINUSE}, 314 + .expected_reuse_errno = {0, 0, 315 + EADDRINUSE, EADDRINUSE, 316 + EADDRINUSE, EADDRINUSE, 317 + EADDRINUSE, EADDRINUSE}, 318 + }; 319 + 320 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_any_only) 321 + { 322 + .family = {AF_INET6, AF_INET6}, 323 + .addr = {&in6addr_any, &in6addr_any}, 324 + .ipv6_only = {false, true}, 325 + .expected_errno = {0, EADDRINUSE, 326 + EADDRINUSE, EADDRINUSE, 327 + EADDRINUSE, EADDRINUSE, 328 + EADDRINUSE, EADDRINUSE}, 329 + .expected_reuse_errno = {0, 0, 330 + EADDRINUSE, EADDRINUSE, 331 + EADDRINUSE, EADDRINUSE, 332 + EADDRINUSE, EADDRINUSE}, 333 + }; 334 + 335 + FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_any_only) 336 + { 337 + .family = {AF_INET6, AF_INET6}, 338 + .addr = {&in6addr_any, &in6addr_any}, 339 + .ipv6_only = {true, true}, 340 + .expected_errno = {0, EADDRINUSE, 341 + 0, EADDRINUSE, 342 + EADDRINUSE, EADDRINUSE, 343 + EADDRINUSE, EADDRINUSE}, 344 + .expected_reuse_errno = {0, 0, 345 + 0, EADDRINUSE, 346 + EADDRINUSE, EADDRINUSE, 347 + EADDRINUSE, EADDRINUSE}, 348 + }; 349 + 372 350 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_local) 373 351 { 374 352 .family = {AF_INET6, AF_INET6}, ··· 440 292 EADDRINUSE, EADDRINUSE, 441 293 EADDRINUSE, EADDRINUSE, 442 294 EADDRINUSE, EADDRINUSE}, 295 + .expected_reuse_errno = {0, 0, 296 + EADDRINUSE, EADDRINUSE, 297 + EADDRINUSE, EADDRINUSE, 298 + EADDRINUSE, EADDRINUSE}, 443 299 }; 444 300 445 301 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_local) ··· 455 303 0, EADDRINUSE, 456 304 EADDRINUSE, EADDRINUSE, 457 305 EADDRINUSE, EADDRINUSE}, 306 + .expected_reuse_errno = {0, 0, 307 + 0, EADDRINUSE, 308 + EADDRINUSE, EADDRINUSE, 309 + EADDRINUSE, EADDRINUSE}, 458 310 }; 459 311 460 312 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_any) ··· 469 313 EADDRINUSE, EADDRINUSE, 470 314 EADDRINUSE, EADDRINUSE, 471 315 EADDRINUSE, EADDRINUSE}, 316 + .expected_reuse_errno = {0, 0, 317 + EADDRINUSE, EADDRINUSE, 318 + EADDRINUSE, EADDRINUSE, 319 + EADDRINUSE, EADDRINUSE}, 472 320 }; 473 321 474 322 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_any) ··· 484 324 EADDRINUSE, EADDRINUSE, 485 325 EADDRINUSE, EADDRINUSE, 486 326 EADDRINUSE, EADDRINUSE}, 327 + .expected_reuse_errno = {0, 0, 328 + EADDRINUSE, EADDRINUSE, 329 + EADDRINUSE, EADDRINUSE, 330 + EADDRINUSE, EADDRINUSE}, 487 331 }; 488 332 489 333 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_local) ··· 498 334 EADDRINUSE, EADDRINUSE, 499 335 EADDRINUSE, EADDRINUSE, 500 336 EADDRINUSE, EADDRINUSE}, 337 + .expected_reuse_errno = {0, 0, 338 + EADDRINUSE, EADDRINUSE, 339 + EADDRINUSE, EADDRINUSE, 340 + EADDRINUSE, EADDRINUSE}, 501 341 }; 502 342 503 343 FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_local) ··· 513 345 EADDRINUSE, EADDRINUSE, 514 346 EADDRINUSE, EADDRINUSE, 515 347 EADDRINUSE, EADDRINUSE}, 348 + .expected_reuse_errno = {0, 0, 349 + EADDRINUSE, EADDRINUSE, 350 + EADDRINUSE, EADDRINUSE, 351 + EADDRINUSE, EADDRINUSE}, 516 352 }; 517 353 518 354 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any) ··· 527 355 0, EADDRINUSE, 528 356 EADDRINUSE, EADDRINUSE, 529 357 EADDRINUSE, EADDRINUSE}, 358 + .expected_reuse_errno = {0, 0, 359 + EADDRINUSE, EADDRINUSE, 360 + EADDRINUSE, EADDRINUSE, 361 + EADDRINUSE, EADDRINUSE}, 530 362 }; 531 363 532 364 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any_only) ··· 542 366 0, EADDRINUSE, 543 367 EADDRINUSE, EADDRINUSE, 544 368 EADDRINUSE, EADDRINUSE}, 369 + .expected_reuse_errno = {0, 0, 370 + 0, EADDRINUSE, 371 + EADDRINUSE, EADDRINUSE, 372 + EADDRINUSE, EADDRINUSE}, 545 373 }; 546 374 547 375 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_any) ··· 556 376 EADDRINUSE, EADDRINUSE, 557 377 EADDRINUSE, EADDRINUSE, 558 378 EADDRINUSE, EADDRINUSE}, 379 + .expected_reuse_errno = {0, 0, 380 + EADDRINUSE, EADDRINUSE, 381 + EADDRINUSE, EADDRINUSE, 382 + EADDRINUSE, EADDRINUSE}, 559 383 }; 560 384 561 385 FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_local) ··· 570 386 EADDRINUSE, EADDRINUSE, 571 387 EADDRINUSE, EADDRINUSE, 572 388 EADDRINUSE, EADDRINUSE}, 389 + .expected_reuse_errno = {0, 0, 390 + EADDRINUSE, EADDRINUSE, 391 + EADDRINUSE, EADDRINUSE, 392 + EADDRINUSE, EADDRINUSE}, 573 393 }; 574 394 575 395 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any) ··· 584 396 EADDRINUSE, EADDRINUSE, 585 397 EADDRINUSE, 0, 586 398 EADDRINUSE, EADDRINUSE}, 399 + .expected_reuse_errno = {0, 0, 400 + EADDRINUSE, EADDRINUSE, 401 + EADDRINUSE, EADDRINUSE, 402 + EADDRINUSE, EADDRINUSE}, 587 403 }; 588 404 589 405 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any_only) ··· 599 407 EADDRINUSE, EADDRINUSE, 600 408 EADDRINUSE, EADDRINUSE, 601 409 EADDRINUSE, EADDRINUSE}, 410 + .expected_reuse_errno = {0, 0, 411 + EADDRINUSE, EADDRINUSE, 412 + EADDRINUSE, EADDRINUSE, 413 + EADDRINUSE, EADDRINUSE}, 602 414 }; 603 415 604 416 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_local) ··· 613 417 EADDRINUSE, EADDRINUSE, 614 418 EADDRINUSE, EADDRINUSE, 615 419 EADDRINUSE, EADDRINUSE}, 420 + .expected_reuse_errno = {0, 0, 421 + EADDRINUSE, EADDRINUSE, 422 + EADDRINUSE, EADDRINUSE, 423 + EADDRINUSE, EADDRINUSE}, 616 424 }; 617 425 618 426 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_v4mapped_local) ··· 627 427 EADDRINUSE, EADDRINUSE, 628 428 EADDRINUSE, 0, 629 429 EADDRINUSE, EADDRINUSE}, 430 + .expected_reuse_errno = {0, 0, 431 + EADDRINUSE, EADDRINUSE, 432 + EADDRINUSE, 0, 433 + EADDRINUSE, EADDRINUSE}, 630 434 }; 631 435 632 436 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any) ··· 641 437 EADDRINUSE, EADDRINUSE, 642 438 EADDRINUSE, 0, 643 439 EADDRINUSE, EADDRINUSE}, 440 + .expected_reuse_errno = {0, 0, 441 + EADDRINUSE, EADDRINUSE, 442 + EADDRINUSE, EADDRINUSE, 443 + EADDRINUSE, EADDRINUSE}, 644 444 }; 645 445 646 446 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any_only) ··· 656 448 EADDRINUSE, EADDRINUSE, 657 449 EADDRINUSE, EADDRINUSE, 658 450 EADDRINUSE, EADDRINUSE}, 451 + .expected_reuse_errno = {0, 0, 452 + EADDRINUSE, EADDRINUSE, 453 + EADDRINUSE, EADDRINUSE, 454 + EADDRINUSE, EADDRINUSE}, 659 455 }; 660 456 661 457 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_local) ··· 670 458 EADDRINUSE, EADDRINUSE, 671 459 EADDRINUSE, EADDRINUSE, 672 460 EADDRINUSE, EADDRINUSE}, 461 + .expected_reuse_errno = {0, 0, 462 + EADDRINUSE, EADDRINUSE, 463 + EADDRINUSE, EADDRINUSE, 464 + EADDRINUSE, EADDRINUSE}, 673 465 }; 674 466 675 467 FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_v4mapped_any) ··· 684 468 EADDRINUSE, EADDRINUSE, 685 469 EADDRINUSE, 0, 686 470 EADDRINUSE, EADDRINUSE}, 471 + .expected_reuse_errno = {0, 0, 472 + EADDRINUSE, EADDRINUSE, 473 + EADDRINUSE, 0, 474 + EADDRINUSE, EADDRINUSE}, 687 475 }; 688 476 689 477 static void setup_addr(FIXTURE_DATA(bind_wildcard) *self, int i, ··· 739 519 void bind_socket(struct __test_metadata *_metadata, 740 520 FIXTURE_DATA(bind_wildcard) *self, 741 521 const FIXTURE_VARIANT(bind_wildcard) *variant, 742 - int i) 522 + int i, int reuse) 743 523 { 744 524 int ret; 745 525 ··· 751 531 ASSERT_EQ(ret, 0); 752 532 } 753 533 534 + if (i < 2 && reuse) { 535 + ret = setsockopt(self->fd[i], SOL_SOCKET, reuse, &(int){1}, sizeof(int)); 536 + ASSERT_EQ(ret, 0); 537 + } 538 + 754 539 self->addr[i].addr4.sin_port = self->addr[0].addr4.sin_port; 755 540 756 541 ret = bind(self->fd[i], &self->addr[i].addr, self->addrlen[i]); 757 - if (variant->expected_errno[i]) { 758 - ASSERT_EQ(ret, -1); 759 - ASSERT_EQ(errno, variant->expected_errno[i]); 542 + 543 + if (reuse) { 544 + if (variant->expected_reuse_errno[i]) { 545 + ASSERT_EQ(ret, -1); 546 + ASSERT_EQ(errno, variant->expected_reuse_errno[i]); 547 + } else { 548 + ASSERT_EQ(ret, 0); 549 + } 760 550 } else { 761 - ASSERT_EQ(ret, 0); 551 + if (variant->expected_errno[i]) { 552 + ASSERT_EQ(ret, -1); 553 + ASSERT_EQ(errno, variant->expected_errno[i]); 554 + } else { 555 + ASSERT_EQ(ret, 0); 556 + } 762 557 } 763 558 764 559 if (i == 0) { ··· 787 552 int i; 788 553 789 554 for (i = 0; i < NR_SOCKETS; i++) 790 - bind_socket(_metadata, self, variant, i); 555 + bind_socket(_metadata, self, variant, i, 0); 556 + } 557 + 558 + TEST_F(bind_wildcard, reuseaddr) 559 + { 560 + int i; 561 + 562 + for (i = 0; i < NR_SOCKETS; i++) 563 + bind_socket(_metadata, self, variant, i, SO_REUSEADDR); 564 + } 565 + 566 + TEST_F(bind_wildcard, reuseport) 567 + { 568 + int i; 569 + 570 + for (i = 0; i < NR_SOCKETS; i++) 571 + bind_socket(_metadata, self, variant, i, SO_REUSEPORT); 791 572 } 792 573 793 574 TEST_HARNESS_MAIN