1// SPDX-License-Identifier: GPL-2.0 2/* Copyright Amazon.com Inc. or its affiliates. */ 3 4#include <sys/socket.h> 5#include <netinet/in.h> 6 7#include "../kselftest_harness.h" 8 9static const __u32 in4addr_any = INADDR_ANY; 10static const __u32 in4addr_loopback = INADDR_LOOPBACK; 11static const struct in6_addr in6addr_v4mapped_any = { 12 .s6_addr = { 13 0, 0, 0, 0, 14 0, 0, 0, 0, 15 0, 0, 255, 255, 16 0, 0, 0, 0 17 } 18}; 19static const struct in6_addr in6addr_v4mapped_loopback = { 20 .s6_addr = { 21 0, 0, 0, 0, 22 0, 0, 0, 0, 23 0, 0, 255, 255, 24 127, 0, 0, 1 25 } 26}; 27 28#define NR_SOCKETS 8 29 30FIXTURE(bind_wildcard) 31{ 32 int fd[NR_SOCKETS]; 33 socklen_t addrlen[NR_SOCKETS]; 34 union { 35 struct sockaddr addr; 36 struct sockaddr_in addr4; 37 struct sockaddr_in6 addr6; 38 } addr[NR_SOCKETS]; 39}; 40 41FIXTURE_VARIANT(bind_wildcard) 42{ 43 sa_family_t family[2]; 44 const void *addr[2]; 45 bool ipv6_only[2]; 46 47 /* 6 bind() calls below follow two bind() for the defined 2 addresses: 48 * 49 * 0.0.0.0 50 * 127.0.0.1 51 * :: 52 * ::1 53 * ::ffff:0.0.0.0 54 * ::ffff:127.0.0.1 55 */ 56 int expected_errno[NR_SOCKETS]; 57 int expected_reuse_errno[NR_SOCKETS]; 58}; 59 60/* (IPv4, IPv4) */ 61FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v4_local) 62{ 63 .family = {AF_INET, AF_INET}, 64 .addr = {&in4addr_any, &in4addr_loopback}, 65 .expected_errno = {0, EADDRINUSE, 66 EADDRINUSE, EADDRINUSE, 67 EADDRINUSE, 0, 68 EADDRINUSE, EADDRINUSE}, 69 .expected_reuse_errno = {0, 0, 70 EADDRINUSE, EADDRINUSE, 71 EADDRINUSE, 0, 72 EADDRINUSE, EADDRINUSE}, 73}; 74 75FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v4_any) 76{ 77 .family = {AF_INET, AF_INET}, 78 .addr = {&in4addr_loopback, &in4addr_any}, 79 .expected_errno = {0, EADDRINUSE, 80 EADDRINUSE, EADDRINUSE, 81 EADDRINUSE, 0, 82 EADDRINUSE, EADDRINUSE}, 83 .expected_reuse_errno = {0, 0, 84 EADDRINUSE, EADDRINUSE, 85 EADDRINUSE, 0, 86 EADDRINUSE, EADDRINUSE}, 87}; 88 89/* (IPv4, IPv6) */ 90FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any) 91{ 92 .family = {AF_INET, AF_INET6}, 93 .addr = {&in4addr_any, &in6addr_any}, 94 .expected_errno = {0, EADDRINUSE, 95 EADDRINUSE, EADDRINUSE, 96 EADDRINUSE, 0, 97 EADDRINUSE, EADDRINUSE}, 98 .expected_reuse_errno = {0, 0, 99 EADDRINUSE, EADDRINUSE, 100 EADDRINUSE, EADDRINUSE, 101 EADDRINUSE, EADDRINUSE}, 102}; 103 104FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any_only) 105{ 106 .family = {AF_INET, AF_INET6}, 107 .addr = {&in4addr_any, &in6addr_any}, 108 .ipv6_only = {false, true}, 109 .expected_errno = {0, 0, 110 EADDRINUSE, EADDRINUSE, 111 EADDRINUSE, EADDRINUSE, 112 EADDRINUSE, EADDRINUSE}, 113 .expected_reuse_errno = {0, 0, 114 EADDRINUSE, EADDRINUSE, 115 EADDRINUSE, EADDRINUSE, 116 EADDRINUSE, EADDRINUSE}, 117}; 118 119FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local) 120{ 121 .family = {AF_INET, AF_INET6}, 122 .addr = {&in4addr_any, &in6addr_loopback}, 123 .expected_errno = {0, 0, 124 EADDRINUSE, EADDRINUSE, 125 EADDRINUSE, EADDRINUSE, 126 EADDRINUSE, EADDRINUSE}, 127 .expected_reuse_errno = {0, 0, 128 EADDRINUSE, EADDRINUSE, 129 EADDRINUSE, EADDRINUSE, 130 EADDRINUSE, EADDRINUSE}, 131}; 132 133FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_any) 134{ 135 .family = {AF_INET, AF_INET6}, 136 .addr = {&in4addr_any, &in6addr_v4mapped_any}, 137 .expected_errno = {0, EADDRINUSE, 138 EADDRINUSE, EADDRINUSE, 139 EADDRINUSE, 0, 140 EADDRINUSE, EADDRINUSE}, 141 .expected_reuse_errno = {0, 0, 142 EADDRINUSE, EADDRINUSE, 143 EADDRINUSE, 0, 144 EADDRINUSE, EADDRINUSE}, 145}; 146 147FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_local) 148{ 149 .family = {AF_INET, AF_INET6}, 150 .addr = {&in4addr_any, &in6addr_v4mapped_loopback}, 151 .expected_errno = {0, EADDRINUSE, 152 EADDRINUSE, EADDRINUSE, 153 EADDRINUSE, 0, 154 EADDRINUSE, EADDRINUSE}, 155 .expected_reuse_errno = {0, 0, 156 EADDRINUSE, EADDRINUSE, 157 EADDRINUSE, 0, 158 EADDRINUSE, EADDRINUSE}, 159}; 160 161FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any) 162{ 163 .family = {AF_INET, AF_INET6}, 164 .addr = {&in4addr_loopback, &in6addr_any}, 165 .expected_errno = {0, EADDRINUSE, 166 EADDRINUSE, EADDRINUSE, 167 EADDRINUSE, 0, 168 EADDRINUSE, EADDRINUSE}, 169 .expected_reuse_errno = {0, 0, 170 EADDRINUSE, EADDRINUSE, 171 EADDRINUSE, EADDRINUSE, 172 EADDRINUSE, EADDRINUSE}, 173}; 174 175FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any_only) 176{ 177 .family = {AF_INET, AF_INET6}, 178 .addr = {&in4addr_loopback, &in6addr_any}, 179 .ipv6_only = {false, true}, 180 .expected_errno = {0, 0, 181 EADDRINUSE, EADDRINUSE, 182 EADDRINUSE, EADDRINUSE, 183 EADDRINUSE, EADDRINUSE}, 184 .expected_reuse_errno = {0, 0, 185 EADDRINUSE, EADDRINUSE, 186 EADDRINUSE, EADDRINUSE, 187 EADDRINUSE, EADDRINUSE}, 188}; 189 190FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_local) 191{ 192 .family = {AF_INET, AF_INET6}, 193 .addr = {&in4addr_loopback, &in6addr_loopback}, 194 .expected_errno = {0, 0, 195 EADDRINUSE, EADDRINUSE, 196 EADDRINUSE, EADDRINUSE, 197 EADDRINUSE, EADDRINUSE}, 198 .expected_reuse_errno = {0, 0, 199 EADDRINUSE, EADDRINUSE, 200 EADDRINUSE, EADDRINUSE, 201 EADDRINUSE, EADDRINUSE}, 202}; 203 204FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_any) 205{ 206 .family = {AF_INET, AF_INET6}, 207 .addr = {&in4addr_loopback, &in6addr_v4mapped_any}, 208 .expected_errno = {0, EADDRINUSE, 209 EADDRINUSE, EADDRINUSE, 210 EADDRINUSE, 0, 211 EADDRINUSE, EADDRINUSE}, 212 .expected_reuse_errno = {0, 0, 213 EADDRINUSE, EADDRINUSE, 214 EADDRINUSE, 0, 215 EADDRINUSE, EADDRINUSE}, 216}; 217 218FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_local) 219{ 220 .family = {AF_INET, AF_INET6}, 221 .addr = {&in4addr_loopback, &in6addr_v4mapped_loopback}, 222 .expected_errno = {0, EADDRINUSE, 223 EADDRINUSE, EADDRINUSE, 224 EADDRINUSE, 0, 225 EADDRINUSE, EADDRINUSE}, 226 .expected_reuse_errno = {0, 0, 227 EADDRINUSE, EADDRINUSE, 228 EADDRINUSE, 0, 229 EADDRINUSE, EADDRINUSE}, 230}; 231 232/* (IPv6, IPv4) */ 233FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_any) 234{ 235 .family = {AF_INET6, AF_INET}, 236 .addr = {&in6addr_any, &in4addr_any}, 237 .expected_errno = {0, EADDRINUSE, 238 EADDRINUSE, EADDRINUSE, 239 EADDRINUSE, EADDRINUSE, 240 EADDRINUSE, EADDRINUSE}, 241 .expected_reuse_errno = {0, 0, 242 EADDRINUSE, EADDRINUSE, 243 EADDRINUSE, EADDRINUSE, 244 EADDRINUSE, EADDRINUSE}, 245}; 246 247FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_any) 248{ 249 .family = {AF_INET6, AF_INET}, 250 .addr = {&in6addr_any, &in4addr_any}, 251 .ipv6_only = {true, false}, 252 .expected_errno = {0, 0, 253 EADDRINUSE, EADDRINUSE, 254 EADDRINUSE, EADDRINUSE, 255 EADDRINUSE, EADDRINUSE}, 256 .expected_reuse_errno = {0, 0, 257 EADDRINUSE, EADDRINUSE, 258 EADDRINUSE, EADDRINUSE, 259 EADDRINUSE, EADDRINUSE}, 260}; 261 262FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v4_local) 263{ 264 .family = {AF_INET6, AF_INET}, 265 .addr = {&in6addr_any, &in4addr_loopback}, 266 .expected_errno = {0, EADDRINUSE, 267 EADDRINUSE, EADDRINUSE, 268 EADDRINUSE, EADDRINUSE, 269 EADDRINUSE, EADDRINUSE}, 270 .expected_reuse_errno = {0, 0, 271 EADDRINUSE, EADDRINUSE, 272 EADDRINUSE, EADDRINUSE, 273 EADDRINUSE, EADDRINUSE}, 274}; 275 276FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v4_local) 277{ 278 .family = {AF_INET6, AF_INET}, 279 .addr = {&in6addr_any, &in4addr_loopback}, 280 .ipv6_only = {true, false}, 281 .expected_errno = {0, 0, 282 EADDRINUSE, EADDRINUSE, 283 EADDRINUSE, EADDRINUSE, 284 EADDRINUSE, EADDRINUSE}, 285 .expected_reuse_errno = {0, 0, 286 EADDRINUSE, EADDRINUSE, 287 EADDRINUSE, EADDRINUSE, 288 EADDRINUSE, EADDRINUSE}, 289}; 290 291FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_any) 292{ 293 .family = {AF_INET6, AF_INET}, 294 .addr = {&in6addr_loopback, &in4addr_any}, 295 .expected_errno = {0, 0, 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 305FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v4_local) 306{ 307 .family = {AF_INET6, AF_INET}, 308 .addr = {&in6addr_loopback, &in4addr_loopback}, 309 .expected_errno = {0, 0, 310 EADDRINUSE, EADDRINUSE, 311 EADDRINUSE, EADDRINUSE, 312 EADDRINUSE, EADDRINUSE}, 313 .expected_reuse_errno = {0, 0, 314 EADDRINUSE, EADDRINUSE, 315 EADDRINUSE, EADDRINUSE, 316 EADDRINUSE, EADDRINUSE}, 317}; 318 319FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_any) 320{ 321 .family = {AF_INET6, AF_INET}, 322 .addr = {&in6addr_v4mapped_any, &in4addr_any}, 323 .expected_errno = {0, EADDRINUSE, 324 EADDRINUSE, EADDRINUSE, 325 EADDRINUSE, 0, 326 EADDRINUSE, EADDRINUSE}, 327 .expected_reuse_errno = {0, 0, 328 EADDRINUSE, EADDRINUSE, 329 EADDRINUSE, 0, 330 EADDRINUSE, EADDRINUSE}, 331}; 332 333FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v4_local) 334{ 335 .family = {AF_INET6, AF_INET}, 336 .addr = {&in6addr_v4mapped_any, &in4addr_loopback}, 337 .expected_errno = {0, EADDRINUSE, 338 EADDRINUSE, EADDRINUSE, 339 EADDRINUSE, 0, 340 EADDRINUSE, EADDRINUSE}, 341 .expected_reuse_errno = {0, 0, 342 EADDRINUSE, EADDRINUSE, 343 EADDRINUSE, 0, 344 EADDRINUSE, EADDRINUSE}, 345}; 346 347FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_any) 348{ 349 .family = {AF_INET6, AF_INET}, 350 .addr = {&in6addr_v4mapped_loopback, &in4addr_any}, 351 .expected_errno = {0, EADDRINUSE, 352 EADDRINUSE, EADDRINUSE, 353 EADDRINUSE, 0, 354 EADDRINUSE, EADDRINUSE}, 355 .expected_reuse_errno = {0, 0, 356 EADDRINUSE, EADDRINUSE, 357 EADDRINUSE, 0, 358 EADDRINUSE, EADDRINUSE}, 359}; 360 361FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_local_v4_local) 362{ 363 .family = {AF_INET6, AF_INET}, 364 .addr = {&in6addr_v4mapped_loopback, &in4addr_loopback}, 365 .expected_errno = {0, EADDRINUSE, 366 EADDRINUSE, EADDRINUSE, 367 EADDRINUSE, 0, 368 EADDRINUSE, EADDRINUSE}, 369 .expected_reuse_errno = {0, 0, 370 EADDRINUSE, EADDRINUSE, 371 EADDRINUSE, 0, 372 EADDRINUSE, EADDRINUSE}, 373}; 374 375/* (IPv6, IPv6) */ 376FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_any) 377{ 378 .family = {AF_INET6, AF_INET6}, 379 .addr = {&in6addr_any, &in6addr_any}, 380 .expected_errno = {0, EADDRINUSE, 381 EADDRINUSE, EADDRINUSE, 382 EADDRINUSE, EADDRINUSE, 383 EADDRINUSE, EADDRINUSE}, 384 .expected_reuse_errno = {0, 0, 385 EADDRINUSE, EADDRINUSE, 386 EADDRINUSE, EADDRINUSE, 387 EADDRINUSE, EADDRINUSE}, 388}; 389 390FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_any) 391{ 392 .family = {AF_INET6, AF_INET6}, 393 .addr = {&in6addr_any, &in6addr_any}, 394 .ipv6_only = {true, false}, 395 .expected_errno = {0, EADDRINUSE, 396 0, EADDRINUSE, 397 EADDRINUSE, EADDRINUSE, 398 EADDRINUSE, EADDRINUSE}, 399 .expected_reuse_errno = {0, 0, 400 EADDRINUSE, EADDRINUSE, 401 EADDRINUSE, EADDRINUSE, 402 EADDRINUSE, EADDRINUSE}, 403}; 404 405FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_any_only) 406{ 407 .family = {AF_INET6, AF_INET6}, 408 .addr = {&in6addr_any, &in6addr_any}, 409 .ipv6_only = {false, true}, 410 .expected_errno = {0, EADDRINUSE, 411 EADDRINUSE, EADDRINUSE, 412 EADDRINUSE, EADDRINUSE, 413 EADDRINUSE, EADDRINUSE}, 414 .expected_reuse_errno = {0, 0, 415 EADDRINUSE, EADDRINUSE, 416 EADDRINUSE, EADDRINUSE, 417 EADDRINUSE, EADDRINUSE}, 418}; 419 420FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_any_only) 421{ 422 .family = {AF_INET6, AF_INET6}, 423 .addr = {&in6addr_any, &in6addr_any}, 424 .ipv6_only = {true, true}, 425 .expected_errno = {0, EADDRINUSE, 426 0, EADDRINUSE, 427 EADDRINUSE, EADDRINUSE, 428 EADDRINUSE, EADDRINUSE}, 429 .expected_reuse_errno = {0, 0, 430 0, EADDRINUSE, 431 EADDRINUSE, EADDRINUSE, 432 EADDRINUSE, EADDRINUSE}, 433}; 434 435FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_local) 436{ 437 .family = {AF_INET6, AF_INET6}, 438 .addr = {&in6addr_any, &in6addr_loopback}, 439 .expected_errno = {0, EADDRINUSE, 440 EADDRINUSE, EADDRINUSE, 441 EADDRINUSE, EADDRINUSE, 442 EADDRINUSE, EADDRINUSE}, 443 .expected_reuse_errno = {0, 0, 444 EADDRINUSE, EADDRINUSE, 445 EADDRINUSE, EADDRINUSE, 446 EADDRINUSE, EADDRINUSE}, 447}; 448 449FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_local) 450{ 451 .family = {AF_INET6, AF_INET6}, 452 .addr = {&in6addr_any, &in6addr_loopback}, 453 .ipv6_only = {true, false}, 454 .expected_errno = {0, EADDRINUSE, 455 0, EADDRINUSE, 456 EADDRINUSE, EADDRINUSE, 457 EADDRINUSE, EADDRINUSE}, 458 .expected_reuse_errno = {0, 0, 459 0, EADDRINUSE, 460 EADDRINUSE, EADDRINUSE, 461 EADDRINUSE, EADDRINUSE}, 462}; 463 464FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_any) 465{ 466 .family = {AF_INET6, AF_INET6}, 467 .addr = {&in6addr_any, &in6addr_v4mapped_any}, 468 .expected_errno = {0, EADDRINUSE, 469 EADDRINUSE, EADDRINUSE, 470 EADDRINUSE, EADDRINUSE, 471 EADDRINUSE, EADDRINUSE}, 472 .expected_reuse_errno = {0, 0, 473 EADDRINUSE, EADDRINUSE, 474 EADDRINUSE, EADDRINUSE, 475 EADDRINUSE, EADDRINUSE}, 476}; 477 478FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_any) 479{ 480 .family = {AF_INET6, AF_INET6}, 481 .addr = {&in6addr_any, &in6addr_v4mapped_any}, 482 .ipv6_only = {true, false}, 483 .expected_errno = {0, 0, 484 EADDRINUSE, EADDRINUSE, 485 EADDRINUSE, EADDRINUSE, 486 EADDRINUSE, EADDRINUSE}, 487 .expected_reuse_errno = {0, 0, 488 EADDRINUSE, EADDRINUSE, 489 EADDRINUSE, EADDRINUSE, 490 EADDRINUSE, EADDRINUSE}, 491}; 492 493FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_v6_v4mapped_local) 494{ 495 .family = {AF_INET6, AF_INET6}, 496 .addr = {&in6addr_any, &in6addr_v4mapped_loopback}, 497 .expected_errno = {0, EADDRINUSE, 498 EADDRINUSE, EADDRINUSE, 499 EADDRINUSE, EADDRINUSE, 500 EADDRINUSE, EADDRINUSE}, 501 .expected_reuse_errno = {0, 0, 502 EADDRINUSE, EADDRINUSE, 503 EADDRINUSE, EADDRINUSE, 504 EADDRINUSE, EADDRINUSE}, 505}; 506 507FIXTURE_VARIANT_ADD(bind_wildcard, v6_any_only_v6_v4mapped_local) 508{ 509 .family = {AF_INET6, AF_INET6}, 510 .addr = {&in6addr_any, &in6addr_v4mapped_loopback}, 511 .ipv6_only = {true, false}, 512 .expected_errno = {0, 0, 513 EADDRINUSE, EADDRINUSE, 514 EADDRINUSE, EADDRINUSE, 515 EADDRINUSE, EADDRINUSE}, 516 .expected_reuse_errno = {0, 0, 517 EADDRINUSE, EADDRINUSE, 518 EADDRINUSE, EADDRINUSE, 519 EADDRINUSE, EADDRINUSE}, 520}; 521 522FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any) 523{ 524 .family = {AF_INET6, AF_INET6}, 525 .addr = {&in6addr_loopback, &in6addr_any}, 526 .expected_errno = {0, EADDRINUSE, 527 0, EADDRINUSE, 528 EADDRINUSE, EADDRINUSE, 529 EADDRINUSE, EADDRINUSE}, 530 .expected_reuse_errno = {0, 0, 531 EADDRINUSE, EADDRINUSE, 532 EADDRINUSE, EADDRINUSE, 533 EADDRINUSE, EADDRINUSE}, 534}; 535 536FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_any_only) 537{ 538 .family = {AF_INET6, AF_INET6}, 539 .addr = {&in6addr_loopback, &in6addr_any}, 540 .ipv6_only = {false, true}, 541 .expected_errno = {0, EADDRINUSE, 542 0, EADDRINUSE, 543 EADDRINUSE, EADDRINUSE, 544 EADDRINUSE, EADDRINUSE}, 545 .expected_reuse_errno = {0, 0, 546 0, EADDRINUSE, 547 EADDRINUSE, EADDRINUSE, 548 EADDRINUSE, EADDRINUSE}, 549}; 550 551FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_any) 552{ 553 .family = {AF_INET6, AF_INET6}, 554 .addr = {&in6addr_loopback, &in6addr_v4mapped_any}, 555 .expected_errno = {0, 0, 556 EADDRINUSE, EADDRINUSE, 557 EADDRINUSE, EADDRINUSE, 558 EADDRINUSE, EADDRINUSE}, 559 .expected_reuse_errno = {0, 0, 560 EADDRINUSE, EADDRINUSE, 561 EADDRINUSE, EADDRINUSE, 562 EADDRINUSE, EADDRINUSE}, 563}; 564 565FIXTURE_VARIANT_ADD(bind_wildcard, v6_local_v6_v4mapped_local) 566{ 567 .family = {AF_INET6, AF_INET6}, 568 .addr = {&in6addr_loopback, &in6addr_v4mapped_loopback}, 569 .expected_errno = {0, 0, 570 EADDRINUSE, EADDRINUSE, 571 EADDRINUSE, EADDRINUSE, 572 EADDRINUSE, EADDRINUSE}, 573 .expected_reuse_errno = {0, 0, 574 EADDRINUSE, EADDRINUSE, 575 EADDRINUSE, EADDRINUSE, 576 EADDRINUSE, EADDRINUSE}, 577}; 578 579FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any) 580{ 581 .family = {AF_INET6, AF_INET6}, 582 .addr = {&in6addr_v4mapped_any, &in6addr_any}, 583 .expected_errno = {0, EADDRINUSE, 584 EADDRINUSE, EADDRINUSE, 585 EADDRINUSE, 0, 586 EADDRINUSE, EADDRINUSE}, 587 .expected_reuse_errno = {0, 0, 588 EADDRINUSE, EADDRINUSE, 589 EADDRINUSE, EADDRINUSE, 590 EADDRINUSE, EADDRINUSE}, 591}; 592 593FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_any_only) 594{ 595 .family = {AF_INET6, AF_INET6}, 596 .addr = {&in6addr_v4mapped_any, &in6addr_any}, 597 .ipv6_only = {false, true}, 598 .expected_errno = {0, 0, 599 EADDRINUSE, EADDRINUSE, 600 EADDRINUSE, EADDRINUSE, 601 EADDRINUSE, EADDRINUSE}, 602 .expected_reuse_errno = {0, 0, 603 EADDRINUSE, EADDRINUSE, 604 EADDRINUSE, EADDRINUSE, 605 EADDRINUSE, EADDRINUSE}, 606}; 607 608FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_local) 609{ 610 .family = {AF_INET6, AF_INET6}, 611 .addr = {&in6addr_v4mapped_any, &in6addr_loopback}, 612 .expected_errno = {0, 0, 613 EADDRINUSE, EADDRINUSE, 614 EADDRINUSE, EADDRINUSE, 615 EADDRINUSE, EADDRINUSE}, 616 .expected_reuse_errno = {0, 0, 617 EADDRINUSE, EADDRINUSE, 618 EADDRINUSE, EADDRINUSE, 619 EADDRINUSE, EADDRINUSE}, 620}; 621 622FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_any_v6_v4mapped_local) 623{ 624 .family = {AF_INET6, AF_INET6}, 625 .addr = {&in6addr_v4mapped_any, &in6addr_v4mapped_loopback}, 626 .expected_errno = {0, EADDRINUSE, 627 EADDRINUSE, EADDRINUSE, 628 EADDRINUSE, 0, 629 EADDRINUSE, EADDRINUSE}, 630 .expected_reuse_errno = {0, 0, 631 EADDRINUSE, EADDRINUSE, 632 EADDRINUSE, 0, 633 EADDRINUSE, EADDRINUSE}, 634}; 635 636FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any) 637{ 638 .family = {AF_INET6, AF_INET6}, 639 .addr = {&in6addr_v4mapped_loopback, &in6addr_any}, 640 .expected_errno = {0, EADDRINUSE, 641 EADDRINUSE, EADDRINUSE, 642 EADDRINUSE, 0, 643 EADDRINUSE, EADDRINUSE}, 644 .expected_reuse_errno = {0, 0, 645 EADDRINUSE, EADDRINUSE, 646 EADDRINUSE, EADDRINUSE, 647 EADDRINUSE, EADDRINUSE}, 648}; 649 650FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_any_only) 651{ 652 .family = {AF_INET6, AF_INET6}, 653 .addr = {&in6addr_v4mapped_loopback, &in6addr_any}, 654 .ipv6_only = {false, true}, 655 .expected_errno = {0, 0, 656 EADDRINUSE, EADDRINUSE, 657 EADDRINUSE, EADDRINUSE, 658 EADDRINUSE, EADDRINUSE}, 659 .expected_reuse_errno = {0, 0, 660 EADDRINUSE, EADDRINUSE, 661 EADDRINUSE, EADDRINUSE, 662 EADDRINUSE, EADDRINUSE}, 663}; 664 665FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_local) 666{ 667 .family = {AF_INET6, AF_INET6}, 668 .addr = {&in6addr_v4mapped_loopback, &in6addr_loopback}, 669 .expected_errno = {0, 0, 670 EADDRINUSE, EADDRINUSE, 671 EADDRINUSE, EADDRINUSE, 672 EADDRINUSE, EADDRINUSE}, 673 .expected_reuse_errno = {0, 0, 674 EADDRINUSE, EADDRINUSE, 675 EADDRINUSE, EADDRINUSE, 676 EADDRINUSE, EADDRINUSE}, 677}; 678 679FIXTURE_VARIANT_ADD(bind_wildcard, v6_v4mapped_loopback_v6_v4mapped_any) 680{ 681 .family = {AF_INET6, AF_INET6}, 682 .addr = {&in6addr_v4mapped_loopback, &in6addr_v4mapped_any}, 683 .expected_errno = {0, EADDRINUSE, 684 EADDRINUSE, EADDRINUSE, 685 EADDRINUSE, 0, 686 EADDRINUSE, EADDRINUSE}, 687 .expected_reuse_errno = {0, 0, 688 EADDRINUSE, EADDRINUSE, 689 EADDRINUSE, 0, 690 EADDRINUSE, EADDRINUSE}, 691}; 692 693static void setup_addr(FIXTURE_DATA(bind_wildcard) *self, int i, 694 int family, const void *addr_const) 695{ 696 if (family == AF_INET) { 697 struct sockaddr_in *addr4 = &self->addr[i].addr4; 698 const __u32 *addr4_const = addr_const; 699 700 addr4->sin_family = AF_INET; 701 addr4->sin_port = htons(0); 702 addr4->sin_addr.s_addr = htonl(*addr4_const); 703 704 self->addrlen[i] = sizeof(struct sockaddr_in); 705 } else { 706 struct sockaddr_in6 *addr6 = &self->addr[i].addr6; 707 const struct in6_addr *addr6_const = addr_const; 708 709 addr6->sin6_family = AF_INET6; 710 addr6->sin6_port = htons(0); 711 addr6->sin6_addr = *addr6_const; 712 713 self->addrlen[i] = sizeof(struct sockaddr_in6); 714 } 715} 716 717FIXTURE_SETUP(bind_wildcard) 718{ 719 setup_addr(self, 0, variant->family[0], variant->addr[0]); 720 setup_addr(self, 1, variant->family[1], variant->addr[1]); 721 722 setup_addr(self, 2, AF_INET, &in4addr_any); 723 setup_addr(self, 3, AF_INET, &in4addr_loopback); 724 725 setup_addr(self, 4, AF_INET6, &in6addr_any); 726 setup_addr(self, 5, AF_INET6, &in6addr_loopback); 727 setup_addr(self, 6, AF_INET6, &in6addr_v4mapped_any); 728 setup_addr(self, 7, AF_INET6, &in6addr_v4mapped_loopback); 729} 730 731FIXTURE_TEARDOWN(bind_wildcard) 732{ 733 int i; 734 735 for (i = 0; i < NR_SOCKETS; i++) 736 close(self->fd[i]); 737} 738 739void bind_socket(struct __test_metadata *_metadata, 740 FIXTURE_DATA(bind_wildcard) *self, 741 const FIXTURE_VARIANT(bind_wildcard) *variant, 742 int i, int reuse) 743{ 744 int ret; 745 746 self->fd[i] = socket(self->addr[i].addr.sa_family, SOCK_STREAM, 0); 747 ASSERT_GT(self->fd[i], 0); 748 749 if (i < 2 && variant->ipv6_only[i]) { 750 ret = setsockopt(self->fd[i], SOL_IPV6, IPV6_V6ONLY, &(int){1}, sizeof(int)); 751 ASSERT_EQ(ret, 0); 752 } 753 754 if (i < 2 && reuse) { 755 ret = setsockopt(self->fd[i], SOL_SOCKET, reuse, &(int){1}, sizeof(int)); 756 ASSERT_EQ(ret, 0); 757 } 758 759 self->addr[i].addr4.sin_port = self->addr[0].addr4.sin_port; 760 761 ret = bind(self->fd[i], &self->addr[i].addr, self->addrlen[i]); 762 763 if (reuse) { 764 if (variant->expected_reuse_errno[i]) { 765 ASSERT_EQ(ret, -1); 766 ASSERT_EQ(errno, variant->expected_reuse_errno[i]); 767 } else { 768 ASSERT_EQ(ret, 0); 769 } 770 } else { 771 if (variant->expected_errno[i]) { 772 ASSERT_EQ(ret, -1); 773 ASSERT_EQ(errno, variant->expected_errno[i]); 774 } else { 775 ASSERT_EQ(ret, 0); 776 } 777 } 778 779 if (i == 0) { 780 ret = getsockname(self->fd[0], &self->addr[0].addr, &self->addrlen[0]); 781 ASSERT_EQ(ret, 0); 782 } 783} 784 785TEST_F(bind_wildcard, plain) 786{ 787 int i; 788 789 for (i = 0; i < NR_SOCKETS; i++) 790 bind_socket(_metadata, self, variant, i, 0); 791} 792 793TEST_F(bind_wildcard, reuseaddr) 794{ 795 int i; 796 797 for (i = 0; i < NR_SOCKETS; i++) 798 bind_socket(_metadata, self, variant, i, SO_REUSEADDR); 799} 800 801TEST_F(bind_wildcard, reuseport) 802{ 803 int i; 804 805 for (i = 0; i < NR_SOCKETS; i++) 806 bind_socket(_metadata, self, variant, i, SO_REUSEPORT); 807} 808 809TEST_HARNESS_MAIN 810