xref: /linux/tools/testing/selftests/net/bind_wildcard.c (revision 5b9b2e6baf9ed944a97d5a29c3386ac79937e8fc)
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 
9 static const __u32 in4addr_any = INADDR_ANY;
10 static const __u32 in4addr_loopback = INADDR_LOOPBACK;
11 static 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 };
19 static 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 
30 FIXTURE(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 
41 FIXTURE_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) */
61 FIXTURE_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 
75 FIXTURE_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) */
90 FIXTURE_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 
104 FIXTURE_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 
119 FIXTURE_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 
133 FIXTURE_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 
147 FIXTURE_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 
161 FIXTURE_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 
175 FIXTURE_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 
190 FIXTURE_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 
204 FIXTURE_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 
218 FIXTURE_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) */
233 FIXTURE_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 
247 FIXTURE_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 
262 FIXTURE_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 
276 FIXTURE_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 
291 FIXTURE_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 
305 FIXTURE_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 
319 FIXTURE_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 
333 FIXTURE_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 
347 FIXTURE_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 
361 FIXTURE_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) */
376 FIXTURE_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 
390 FIXTURE_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 
405 FIXTURE_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 
420 FIXTURE_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 
435 FIXTURE_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 
449 FIXTURE_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 
464 FIXTURE_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 
478 FIXTURE_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 
493 FIXTURE_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 
507 FIXTURE_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 
522 FIXTURE_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 
536 FIXTURE_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 
551 FIXTURE_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 
565 FIXTURE_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 
579 FIXTURE_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 
593 FIXTURE_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 
608 FIXTURE_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 
622 FIXTURE_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 
636 FIXTURE_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 
650 FIXTURE_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 
665 FIXTURE_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 
679 FIXTURE_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 
693 static 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 
717 FIXTURE_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 
731 FIXTURE_TEARDOWN(bind_wildcard)
732 {
733 	int i;
734 
735 	for (i = 0; i < NR_SOCKETS; i++)
736 		close(self->fd[i]);
737 }
738 
739 void 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 
785 TEST_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 
793 TEST_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 
801 TEST_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 
809 TEST_HARNESS_MAIN
810