brintos

brintos / linux-shallow public Read only

0
0
Text · 20.6 KiB · b7b54d6 Raw
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