810 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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, 017 }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, 125 }26};27 28#define NR_SOCKETS 829 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.050 * 127.0.0.151 * ::52 * ::153 * ::ffff:0.0.0.054 * ::ffff:127.0.0.155 */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_MAIN810