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, i: 0, family: variant->family[0], addr_const: variant->addr[0]);
720 setup_addr(self, i: 1, family: variant->family[1], addr_const: 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, reuse: 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

source code of linux/tools/testing/selftests/net/bind_wildcard.c