xref: /xnu-12377.1.9/tests/ipv6_bind_race.c (revision f6217f891ac0bb64f3d375211650a4c1ff8ca1ea)
1*f6217f89SApple OSS Distributions /*
2*f6217f89SApple OSS Distributions  * Copyright (c) 2023-2024 Apple Inc. All rights reserved.
3*f6217f89SApple OSS Distributions  *
4*f6217f89SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*f6217f89SApple OSS Distributions  *
6*f6217f89SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*f6217f89SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*f6217f89SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*f6217f89SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*f6217f89SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*f6217f89SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*f6217f89SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*f6217f89SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*f6217f89SApple OSS Distributions  *
15*f6217f89SApple OSS Distributions  * Please obtain a copy of the License at
16*f6217f89SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*f6217f89SApple OSS Distributions  *
18*f6217f89SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*f6217f89SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*f6217f89SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*f6217f89SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*f6217f89SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*f6217f89SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*f6217f89SApple OSS Distributions  * limitations under the License.
25*f6217f89SApple OSS Distributions  *
26*f6217f89SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*f6217f89SApple OSS Distributions  */
28*f6217f89SApple OSS Distributions 
29*f6217f89SApple OSS Distributions #include <sys/fcntl.h>
30*f6217f89SApple OSS Distributions #include <sys/socket.h>
31*f6217f89SApple OSS Distributions #include <net/if.h>
32*f6217f89SApple OSS Distributions #include <netinet/in.h>
33*f6217f89SApple OSS Distributions #include <netinet/tcp.h>
34*f6217f89SApple OSS Distributions #include <arpa/inet.h>
35*f6217f89SApple OSS Distributions 
36*f6217f89SApple OSS Distributions #include <darwintest.h>
37*f6217f89SApple OSS Distributions #include <pthread.h>
38*f6217f89SApple OSS Distributions #include <stdbool.h>
39*f6217f89SApple OSS Distributions #include <string.h>
40*f6217f89SApple OSS Distributions #include <unistd.h>
41*f6217f89SApple OSS Distributions 
42*f6217f89SApple OSS Distributions #include "net_test_lib.h"
43*f6217f89SApple OSS Distributions 
44*f6217f89SApple OSS Distributions /*
45*f6217f89SApple OSS Distributions  * The test is disabled on platforms that could be limited in term of CPU
46*f6217f89SApple OSS Distributions  * or memory because this stress test that cycles rapidly through a lot of socket
47*f6217f89SApple OSS Distributions  */
48*f6217f89SApple OSS Distributions T_GLOBAL_META(
49*f6217f89SApple OSS Distributions 	T_META_NAMESPACE("xnu.net"),
50*f6217f89SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
51*f6217f89SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("networking"),
52*f6217f89SApple OSS Distributions 	T_META_CHECK_LEAKS(false),
53*f6217f89SApple OSS Distributions 	T_META_ENABLED(TARGET_OS_OSX || TARGET_OS_IPHONE));
54*f6217f89SApple OSS Distributions 
55*f6217f89SApple OSS Distributions #define SECONDS_TO_SLEEP 3
56*f6217f89SApple OSS Distributions 
57*f6217f89SApple OSS Distributions #if 0
58*f6217f89SApple OSS Distributions 
59*f6217f89SApple OSS Distributions static int fd = -1;
60*f6217f89SApple OSS Distributions static bool finished = false;
61*f6217f89SApple OSS Distributions static bool is_tcp = false;
62*f6217f89SApple OSS Distributions 
63*f6217f89SApple OSS Distributions static void
64*f6217f89SApple OSS Distributions init_sin6_address(struct sockaddr_in6 *sin6)
65*f6217f89SApple OSS Distributions {
66*f6217f89SApple OSS Distributions 	memset(sin6, 0, sizeof(struct sockaddr_in6));
67*f6217f89SApple OSS Distributions 	sin6->sin6_len = sizeof(struct sockaddr_in6);
68*f6217f89SApple OSS Distributions 	sin6->sin6_family = AF_INET6;
69*f6217f89SApple OSS Distributions }
70*f6217f89SApple OSS Distributions 
71*f6217f89SApple OSS Distributions static void
72*f6217f89SApple OSS Distributions setnonblocking(int s)
73*f6217f89SApple OSS Distributions {
74*f6217f89SApple OSS Distributions 	int flags;
75*f6217f89SApple OSS Distributions 
76*f6217f89SApple OSS Distributions 	T_QUIET; T_EXPECT_POSIX_SUCCESS(flags = fcntl(s, F_GETFL, 0), NULL);
77*f6217f89SApple OSS Distributions 
78*f6217f89SApple OSS Distributions 	flags |= O_NONBLOCK;
79*f6217f89SApple OSS Distributions 
80*f6217f89SApple OSS Distributions 	T_QUIET; T_EXPECT_POSIX_SUCCESS(flags = fcntl(s, F_SETFL, flags), NULL);
81*f6217f89SApple OSS Distributions }
82*f6217f89SApple OSS Distributions 
83*f6217f89SApple OSS Distributions static void *
84*f6217f89SApple OSS Distributions bind4_racer(void *arg)
85*f6217f89SApple OSS Distributions {
86*f6217f89SApple OSS Distributions #pragma unused(arg)
87*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
88*f6217f89SApple OSS Distributions 
89*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
90*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
91*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(1234);
92*f6217f89SApple OSS Distributions 
93*f6217f89SApple OSS Distributions 	while (finished == false) {
94*f6217f89SApple OSS Distributions 		(void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len);
95*f6217f89SApple OSS Distributions 	}
96*f6217f89SApple OSS Distributions 	return NULL;
97*f6217f89SApple OSS Distributions }
98*f6217f89SApple OSS Distributions 
99*f6217f89SApple OSS Distributions static void *
100*f6217f89SApple OSS Distributions bind6_racer(void *arg)
101*f6217f89SApple OSS Distributions {
102*f6217f89SApple OSS Distributions #pragma unused(arg)
103*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
104*f6217f89SApple OSS Distributions 
105*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
106*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
107*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(1234);
108*f6217f89SApple OSS Distributions 
109*f6217f89SApple OSS Distributions 	while (finished == false) {
110*f6217f89SApple OSS Distributions 		(void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len);
111*f6217f89SApple OSS Distributions 	}
112*f6217f89SApple OSS Distributions 	return NULL;
113*f6217f89SApple OSS Distributions }
114*f6217f89SApple OSS Distributions 
115*f6217f89SApple OSS Distributions static void *
116*f6217f89SApple OSS Distributions connect6_racer(void *arg)
117*f6217f89SApple OSS Distributions {
118*f6217f89SApple OSS Distributions #pragma unused(arg)
119*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
120*f6217f89SApple OSS Distributions 
121*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
122*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
123*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(3456);
124*f6217f89SApple OSS Distributions 
125*f6217f89SApple OSS Distributions 	while (finished == false) {
126*f6217f89SApple OSS Distributions 		(void)connect(fd, (struct sockaddr*)&sin6, sin6.sin6_len);
127*f6217f89SApple OSS Distributions 	}
128*f6217f89SApple OSS Distributions 	return NULL;
129*f6217f89SApple OSS Distributions }
130*f6217f89SApple OSS Distributions 
131*f6217f89SApple OSS Distributions static void *
132*f6217f89SApple OSS Distributions connect4_racer(void *arg)
133*f6217f89SApple OSS Distributions {
134*f6217f89SApple OSS Distributions #pragma unused(arg)
135*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
136*f6217f89SApple OSS Distributions 
137*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
138*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
139*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(3456);
140*f6217f89SApple OSS Distributions 
141*f6217f89SApple OSS Distributions 	while (finished == false) {
142*f6217f89SApple OSS Distributions 		(void)connect(fd, (struct sockaddr*)&sin6, sin6.sin6_len);
143*f6217f89SApple OSS Distributions 	}
144*f6217f89SApple OSS Distributions 	return NULL;
145*f6217f89SApple OSS Distributions }
146*f6217f89SApple OSS Distributions 
147*f6217f89SApple OSS Distributions static void *
148*f6217f89SApple OSS Distributions bind6_leader(void *arg)
149*f6217f89SApple OSS Distributions {
150*f6217f89SApple OSS Distributions #pragma unused(arg)
151*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
152*f6217f89SApple OSS Distributions 
153*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
154*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
155*f6217f89SApple OSS Distributions 
156*f6217f89SApple OSS Distributions 	while (finished == false) {
157*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
158*f6217f89SApple OSS Distributions 
159*f6217f89SApple OSS Distributions 		setnonblocking(fd);
160*f6217f89SApple OSS Distributions 
161*f6217f89SApple OSS Distributions 		(void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len);
162*f6217f89SApple OSS Distributions 
163*f6217f89SApple OSS Distributions 		close(fd);
164*f6217f89SApple OSS Distributions 	}
165*f6217f89SApple OSS Distributions 	return NULL;
166*f6217f89SApple OSS Distributions }
167*f6217f89SApple OSS Distributions 
168*f6217f89SApple OSS Distributions static void *
169*f6217f89SApple OSS Distributions bind4_leader(void *arg)
170*f6217f89SApple OSS Distributions {
171*f6217f89SApple OSS Distributions #pragma unused(arg)
172*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
173*f6217f89SApple OSS Distributions 
174*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
175*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
176*f6217f89SApple OSS Distributions 
177*f6217f89SApple OSS Distributions 	while (finished == false) {
178*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
179*f6217f89SApple OSS Distributions 
180*f6217f89SApple OSS Distributions 		setnonblocking(fd);
181*f6217f89SApple OSS Distributions 
182*f6217f89SApple OSS Distributions 		(void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len);
183*f6217f89SApple OSS Distributions 
184*f6217f89SApple OSS Distributions 		close(fd);
185*f6217f89SApple OSS Distributions 	}
186*f6217f89SApple OSS Distributions 	return NULL;
187*f6217f89SApple OSS Distributions }
188*f6217f89SApple OSS Distributions 
189*f6217f89SApple OSS Distributions static void *
190*f6217f89SApple OSS Distributions send6_racer(void *arg)
191*f6217f89SApple OSS Distributions {
192*f6217f89SApple OSS Distributions #pragma unused(arg)
193*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
194*f6217f89SApple OSS Distributions 
195*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
196*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
197*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(3456);
198*f6217f89SApple OSS Distributions 
199*f6217f89SApple OSS Distributions 	while (finished == false) {
200*f6217f89SApple OSS Distributions 		(void)sendto(fd, "", 1, 0, (struct sockaddr*)&sin6, sin6.sin6_len);
201*f6217f89SApple OSS Distributions 	}
202*f6217f89SApple OSS Distributions 	return NULL;
203*f6217f89SApple OSS Distributions }
204*f6217f89SApple OSS Distributions 
205*f6217f89SApple OSS Distributions static void *
206*f6217f89SApple OSS Distributions send4_racer(void *arg)
207*f6217f89SApple OSS Distributions {
208*f6217f89SApple OSS Distributions #pragma unused(arg)
209*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
210*f6217f89SApple OSS Distributions 
211*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
212*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
213*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(3456);
214*f6217f89SApple OSS Distributions 
215*f6217f89SApple OSS Distributions 	while (finished == false) {
216*f6217f89SApple OSS Distributions 		(void)sendto(fd, "", 1, 0, (struct sockaddr*)&sin6, sin6.sin6_len);
217*f6217f89SApple OSS Distributions 	}
218*f6217f89SApple OSS Distributions 	return NULL;
219*f6217f89SApple OSS Distributions }
220*f6217f89SApple OSS Distributions 
221*f6217f89SApple OSS Distributions static void *
222*f6217f89SApple OSS Distributions send6_leader(void *arg)
223*f6217f89SApple OSS Distributions {
224*f6217f89SApple OSS Distributions #pragma unused(arg)
225*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
226*f6217f89SApple OSS Distributions 
227*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6);
228*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
229*f6217f89SApple OSS Distributions 	sin6.sin6_port = htons(3456);
230*f6217f89SApple OSS Distributions 
231*f6217f89SApple OSS Distributions 	while (finished == false) {
232*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
233*f6217f89SApple OSS Distributions 
234*f6217f89SApple OSS Distributions 		setnonblocking(fd);
235*f6217f89SApple OSS Distributions 
236*f6217f89SApple OSS Distributions 		(void)sendto(fd, "", 1, 0, (struct sockaddr*)&sin6, sin6.sin6_len);
237*f6217f89SApple OSS Distributions 
238*f6217f89SApple OSS Distributions 		close(fd);
239*f6217f89SApple OSS Distributions 	}
240*f6217f89SApple OSS Distributions 	return NULL;
241*f6217f89SApple OSS Distributions }
242*f6217f89SApple OSS Distributions 
243*f6217f89SApple OSS Distributions static void *
244*f6217f89SApple OSS Distributions connectx6_leader(void *arg)
245*f6217f89SApple OSS Distributions {
246*f6217f89SApple OSS Distributions #pragma unused(arg)
247*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_dst = { 0 };
248*f6217f89SApple OSS Distributions 	sa_endpoints_t sae = { 0 };
249*f6217f89SApple OSS Distributions 
250*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_dst);
251*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL);
252*f6217f89SApple OSS Distributions 	sin6_dst.sin6_port = htons(3456);
253*f6217f89SApple OSS Distributions 	sae.sae_dstaddr = (struct sockaddr *)&sin6_dst;
254*f6217f89SApple OSS Distributions 	sae.sae_dstaddrlen = sin6_dst.sin6_len;
255*f6217f89SApple OSS Distributions 
256*f6217f89SApple OSS Distributions 	while (finished == false) {
257*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
258*f6217f89SApple OSS Distributions 
259*f6217f89SApple OSS Distributions 		setnonblocking(fd);
260*f6217f89SApple OSS Distributions 
261*f6217f89SApple OSS Distributions 		(void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL);
262*f6217f89SApple OSS Distributions 
263*f6217f89SApple OSS Distributions 		close(fd);
264*f6217f89SApple OSS Distributions 	}
265*f6217f89SApple OSS Distributions 	return NULL;
266*f6217f89SApple OSS Distributions }
267*f6217f89SApple OSS Distributions 
268*f6217f89SApple OSS Distributions static void *
269*f6217f89SApple OSS Distributions connectx4_leader(void *arg)
270*f6217f89SApple OSS Distributions {
271*f6217f89SApple OSS Distributions #pragma unused(arg)
272*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_dst = { 0 };
273*f6217f89SApple OSS Distributions 	sa_endpoints_t sae = { 0 };
274*f6217f89SApple OSS Distributions 
275*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_dst);
276*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_dst.sin6_addr), 1, NULL);
277*f6217f89SApple OSS Distributions 	sin6_dst.sin6_port = htons(3456);
278*f6217f89SApple OSS Distributions 	sae.sae_dstaddr = (struct sockaddr *)&sin6_dst;
279*f6217f89SApple OSS Distributions 	sae.sae_dstaddrlen = sin6_dst.sin6_len;
280*f6217f89SApple OSS Distributions 
281*f6217f89SApple OSS Distributions 	while (finished == false) {
282*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
283*f6217f89SApple OSS Distributions 
284*f6217f89SApple OSS Distributions 		setnonblocking(fd);
285*f6217f89SApple OSS Distributions 
286*f6217f89SApple OSS Distributions 		(void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL);
287*f6217f89SApple OSS Distributions 
288*f6217f89SApple OSS Distributions 		close(fd);
289*f6217f89SApple OSS Distributions 	}
290*f6217f89SApple OSS Distributions 	return NULL;
291*f6217f89SApple OSS Distributions }
292*f6217f89SApple OSS Distributions 
293*f6217f89SApple OSS Distributions static void *
294*f6217f89SApple OSS Distributions connectx6_binding_leader(void *arg)
295*f6217f89SApple OSS Distributions {
296*f6217f89SApple OSS Distributions #pragma unused(arg)
297*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_src = { 0 };
298*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_dst = { 0 };
299*f6217f89SApple OSS Distributions 	sa_endpoints_t sae = { 0 };
300*f6217f89SApple OSS Distributions 
301*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_src);
302*f6217f89SApple OSS Distributions 	sin6_src.sin6_port = htons(1234);
303*f6217f89SApple OSS Distributions 	sae.sae_srcaddr = (struct sockaddr *)&sin6_src;
304*f6217f89SApple OSS Distributions 	sae.sae_srcaddrlen = sin6_src.sin6_len;
305*f6217f89SApple OSS Distributions 
306*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_dst);
307*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL);
308*f6217f89SApple OSS Distributions 	sin6_dst.sin6_port = htons(3456);
309*f6217f89SApple OSS Distributions 	sae.sae_dstaddr = (struct sockaddr *)&sin6_dst;
310*f6217f89SApple OSS Distributions 	sae.sae_dstaddrlen = sin6_dst.sin6_len;
311*f6217f89SApple OSS Distributions 
312*f6217f89SApple OSS Distributions 	while (finished == false) {
313*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
314*f6217f89SApple OSS Distributions 
315*f6217f89SApple OSS Distributions 		setnonblocking(fd);
316*f6217f89SApple OSS Distributions 
317*f6217f89SApple OSS Distributions 		(void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL);
318*f6217f89SApple OSS Distributions 
319*f6217f89SApple OSS Distributions 		close(fd);
320*f6217f89SApple OSS Distributions 	}
321*f6217f89SApple OSS Distributions 	return NULL;
322*f6217f89SApple OSS Distributions }
323*f6217f89SApple OSS Distributions 
324*f6217f89SApple OSS Distributions static void *
325*f6217f89SApple OSS Distributions connectx4_binding_leader(void *arg)
326*f6217f89SApple OSS Distributions {
327*f6217f89SApple OSS Distributions #pragma unused(arg)
328*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_src = { 0 };
329*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_dst = { 0 };
330*f6217f89SApple OSS Distributions 	sa_endpoints_t sae = { 0 };
331*f6217f89SApple OSS Distributions 
332*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_src);
333*f6217f89SApple OSS Distributions 	sin6_src.sin6_port = htons(1234);
334*f6217f89SApple OSS Distributions 	sae.sae_srcaddr = (struct sockaddr *)&sin6_src;
335*f6217f89SApple OSS Distributions 	sae.sae_srcaddrlen = sin6_src.sin6_len;
336*f6217f89SApple OSS Distributions 
337*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_dst);
338*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_dst.sin6_addr), 1, NULL);
339*f6217f89SApple OSS Distributions 	sin6_dst.sin6_port = htons(3456);
340*f6217f89SApple OSS Distributions 	sae.sae_dstaddr = (struct sockaddr *)&sin6_dst;
341*f6217f89SApple OSS Distributions 	sae.sae_dstaddrlen = sin6_dst.sin6_len;
342*f6217f89SApple OSS Distributions 
343*f6217f89SApple OSS Distributions 	while (finished == false) {
344*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
345*f6217f89SApple OSS Distributions 
346*f6217f89SApple OSS Distributions 		setnonblocking(fd);
347*f6217f89SApple OSS Distributions 
348*f6217f89SApple OSS Distributions 		(void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL);
349*f6217f89SApple OSS Distributions 
350*f6217f89SApple OSS Distributions 		close(fd);
351*f6217f89SApple OSS Distributions 	}
352*f6217f89SApple OSS Distributions 	return NULL;
353*f6217f89SApple OSS Distributions }
354*f6217f89SApple OSS Distributions 
355*f6217f89SApple OSS Distributions static void *
356*f6217f89SApple OSS Distributions connectx6_racer(void *arg)
357*f6217f89SApple OSS Distributions {
358*f6217f89SApple OSS Distributions #pragma unused(arg)
359*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_dst = { 0 };
360*f6217f89SApple OSS Distributions 	sa_endpoints_t sae = { 0 };
361*f6217f89SApple OSS Distributions 
362*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_dst);
363*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL);
364*f6217f89SApple OSS Distributions 	sin6_dst.sin6_port = htons(3456);
365*f6217f89SApple OSS Distributions 	sae.sae_dstaddr = (struct sockaddr *)&sin6_dst;
366*f6217f89SApple OSS Distributions 	sae.sae_dstaddrlen = sin6_dst.sin6_len;
367*f6217f89SApple OSS Distributions 
368*f6217f89SApple OSS Distributions 	while (finished == false) {
369*f6217f89SApple OSS Distributions 		(void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL);
370*f6217f89SApple OSS Distributions 	}
371*f6217f89SApple OSS Distributions 	return NULL;
372*f6217f89SApple OSS Distributions }
373*f6217f89SApple OSS Distributions 
374*f6217f89SApple OSS Distributions static void *
375*f6217f89SApple OSS Distributions connectx4_racer(void *arg)
376*f6217f89SApple OSS Distributions {
377*f6217f89SApple OSS Distributions #pragma unused(arg)
378*f6217f89SApple OSS Distributions 	struct sockaddr_in6 sin6_dst = { 0 };
379*f6217f89SApple OSS Distributions 	sa_endpoints_t sae = { 0 };
380*f6217f89SApple OSS Distributions 
381*f6217f89SApple OSS Distributions 	init_sin6_address(&sin6_dst);
382*f6217f89SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_dst.sin6_addr), 1, NULL);
383*f6217f89SApple OSS Distributions 	sin6_dst.sin6_port = htons(3456);
384*f6217f89SApple OSS Distributions 	sae.sae_dstaddr = (struct sockaddr *)&sin6_dst;
385*f6217f89SApple OSS Distributions 	sae.sae_dstaddrlen = sin6_dst.sin6_len;
386*f6217f89SApple OSS Distributions 
387*f6217f89SApple OSS Distributions 	while (finished == false) {
388*f6217f89SApple OSS Distributions 		(void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL);
389*f6217f89SApple OSS Distributions 	}
390*f6217f89SApple OSS Distributions 	return NULL;
391*f6217f89SApple OSS Distributions }
392*f6217f89SApple OSS Distributions 
393*f6217f89SApple OSS Distributions static void *
394*f6217f89SApple OSS Distributions listen6_leader(void *arg)
395*f6217f89SApple OSS Distributions {
396*f6217f89SApple OSS Distributions #pragma unused(arg)
397*f6217f89SApple OSS Distributions 
398*f6217f89SApple OSS Distributions 	while (finished == false) {
399*f6217f89SApple OSS Distributions 		int val = 1;
400*f6217f89SApple OSS Distributions 
401*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
402*f6217f89SApple OSS Distributions 
403*f6217f89SApple OSS Distributions 		setnonblocking(fd);
404*f6217f89SApple OSS Distributions 
405*f6217f89SApple OSS Distributions 		/* Note: The following may fail of an IPv4 racer has won the bind race */
406*f6217f89SApple OSS Distributions 		(void)setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
407*f6217f89SApple OSS Distributions 
408*f6217f89SApple OSS Distributions 		(void)listen(fd, 5);
409*f6217f89SApple OSS Distributions 
410*f6217f89SApple OSS Distributions 		close(fd);
411*f6217f89SApple OSS Distributions 	}
412*f6217f89SApple OSS Distributions 	return NULL;
413*f6217f89SApple OSS Distributions }
414*f6217f89SApple OSS Distributions 
415*f6217f89SApple OSS Distributions static void *
416*f6217f89SApple OSS Distributions listen4_leader(void *arg)
417*f6217f89SApple OSS Distributions {
418*f6217f89SApple OSS Distributions #pragma unused(arg)
419*f6217f89SApple OSS Distributions 
420*f6217f89SApple OSS Distributions 	while (finished == false) {
421*f6217f89SApple OSS Distributions 		int val = 0;
422*f6217f89SApple OSS Distributions 
423*f6217f89SApple OSS Distributions 		T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket");
424*f6217f89SApple OSS Distributions 
425*f6217f89SApple OSS Distributions 		setnonblocking(fd);
426*f6217f89SApple OSS Distributions 
427*f6217f89SApple OSS Distributions 		/* Note: The following may fail of an IPv4 racer has won the bind race */
428*f6217f89SApple OSS Distributions 		(void)setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
429*f6217f89SApple OSS Distributions 
430*f6217f89SApple OSS Distributions 		(void)listen(fd, 5);
431*f6217f89SApple OSS Distributions 
432*f6217f89SApple OSS Distributions 		close(fd);
433*f6217f89SApple OSS Distributions 	}
434*f6217f89SApple OSS Distributions 	return NULL;
435*f6217f89SApple OSS Distributions }
436*f6217f89SApple OSS Distributions 
437*f6217f89SApple OSS Distributions static void
438*f6217f89SApple OSS Distributions do_bind_race(bool do_test_tcp, void *(*leader)(void *), void *(*racer)(void *))
439*f6217f89SApple OSS Distributions {
440*f6217f89SApple OSS Distributions 	pthread_t runner1;
441*f6217f89SApple OSS Distributions 	pthread_t runner2;
442*f6217f89SApple OSS Distributions 
443*f6217f89SApple OSS Distributions 	is_tcp = do_test_tcp;
444*f6217f89SApple OSS Distributions 
445*f6217f89SApple OSS Distributions 	if (pthread_create(&runner1, NULL, leader, NULL)) {
446*f6217f89SApple OSS Distributions 		T_ASSERT_FAIL("pthread_create failed");
447*f6217f89SApple OSS Distributions 	}
448*f6217f89SApple OSS Distributions 
449*f6217f89SApple OSS Distributions 	if (pthread_create(&runner2, NULL, racer, NULL)) {
450*f6217f89SApple OSS Distributions 		T_ASSERT_FAIL("pthread_create failed");
451*f6217f89SApple OSS Distributions 	}
452*f6217f89SApple OSS Distributions 
453*f6217f89SApple OSS Distributions 	sleep(SECONDS_TO_SLEEP);
454*f6217f89SApple OSS Distributions 
455*f6217f89SApple OSS Distributions 	finished = true;
456*f6217f89SApple OSS Distributions 
457*f6217f89SApple OSS Distributions 	pthread_join(runner1, 0);
458*f6217f89SApple OSS Distributions 	pthread_join(runner2, 0);
459*f6217f89SApple OSS Distributions 
460*f6217f89SApple OSS Distributions 	force_zone_gc();
461*f6217f89SApple OSS Distributions }
462*f6217f89SApple OSS Distributions 
463*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind6_bind4_race, "race bind calls with TCP sockets")
464*f6217f89SApple OSS Distributions {
465*f6217f89SApple OSS Distributions 	do_bind_race(true, bind6_leader, bind4_racer);
466*f6217f89SApple OSS Distributions }
467*f6217f89SApple OSS Distributions 
468*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind6_connect4_race, "race bind calls with TCP sockets")
469*f6217f89SApple OSS Distributions {
470*f6217f89SApple OSS Distributions 	do_bind_race(true, bind6_leader, connect4_racer);
471*f6217f89SApple OSS Distributions }
472*f6217f89SApple OSS Distributions 
473*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind4_connect6_race, "race bind calls with TCP sockets")
474*f6217f89SApple OSS Distributions {
475*f6217f89SApple OSS Distributions 	do_bind_race(true, bind4_leader, connect6_racer);
476*f6217f89SApple OSS Distributions }
477*f6217f89SApple OSS Distributions 
478*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind6_send4_race, "race bind calls with TCP sockets")
479*f6217f89SApple OSS Distributions {
480*f6217f89SApple OSS Distributions 	do_bind_race(true, bind6_leader, send4_racer);
481*f6217f89SApple OSS Distributions }
482*f6217f89SApple OSS Distributions 
483*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind4_send6_race, "race bind calls with TCP sockets")
484*f6217f89SApple OSS Distributions {
485*f6217f89SApple OSS Distributions 	do_bind_race(true, bind4_leader, send6_racer);
486*f6217f89SApple OSS Distributions }
487*f6217f89SApple OSS Distributions 
488*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_send6_send4_race, "race bind calls with TCP sockets")
489*f6217f89SApple OSS Distributions {
490*f6217f89SApple OSS Distributions 	do_bind_race(true, send6_leader, send4_racer);
491*f6217f89SApple OSS Distributions }
492*f6217f89SApple OSS Distributions 
493*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind6_connectx4_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
494*f6217f89SApple OSS Distributions {
495*f6217f89SApple OSS Distributions 	do_bind_race(true, bind6_leader, connectx4_racer);
496*f6217f89SApple OSS Distributions }
497*f6217f89SApple OSS Distributions 
498*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_bind4_connectx6_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
499*f6217f89SApple OSS Distributions {
500*f6217f89SApple OSS Distributions 	do_bind_race(true, bind4_leader, connectx6_racer);
501*f6217f89SApple OSS Distributions }
502*f6217f89SApple OSS Distributions 
503*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_bind6_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
504*f6217f89SApple OSS Distributions {
505*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx4_leader, bind6_racer);
506*f6217f89SApple OSS Distributions }
507*f6217f89SApple OSS Distributions 
508*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_bind4_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
509*f6217f89SApple OSS Distributions {
510*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx6_leader, bind4_racer);
511*f6217f89SApple OSS Distributions }
512*f6217f89SApple OSS Distributions 
513*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_connect6_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
514*f6217f89SApple OSS Distributions {
515*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx4_leader, connect6_racer);
516*f6217f89SApple OSS Distributions }
517*f6217f89SApple OSS Distributions 
518*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_connect4_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
519*f6217f89SApple OSS Distributions {
520*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx6_leader, connect4_racer);
521*f6217f89SApple OSS Distributions }
522*f6217f89SApple OSS Distributions 
523*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_binding_bind6_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
524*f6217f89SApple OSS Distributions {
525*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx4_binding_leader, bind6_racer);
526*f6217f89SApple OSS Distributions }
527*f6217f89SApple OSS Distributions 
528*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_binding_bind4_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
529*f6217f89SApple OSS Distributions {
530*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx6_binding_leader, bind4_racer);
531*f6217f89SApple OSS Distributions }
532*f6217f89SApple OSS Distributions 
533*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_binding_connect6_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
534*f6217f89SApple OSS Distributions {
535*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx4_binding_leader, connect6_racer);
536*f6217f89SApple OSS Distributions }
537*f6217f89SApple OSS Distributions 
538*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_binding_connect4_race, "race bind calls with TCP sockets", T_META_ENABLED(false))
539*f6217f89SApple OSS Distributions {
540*f6217f89SApple OSS Distributions 	do_bind_race(true, connectx6_binding_leader, connect4_racer);
541*f6217f89SApple OSS Distributions }
542*f6217f89SApple OSS Distributions 
543*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_listen6_bind4_race, "race bind calls with TCP sockets")
544*f6217f89SApple OSS Distributions {
545*f6217f89SApple OSS Distributions 	do_bind_race(true, listen6_leader, bind4_racer);
546*f6217f89SApple OSS Distributions }
547*f6217f89SApple OSS Distributions 
548*f6217f89SApple OSS Distributions T_DECL(ipv6_tcp_listen4_bind6_race, "race bind calls with TCP sockets")
549*f6217f89SApple OSS Distributions {
550*f6217f89SApple OSS Distributions 	do_bind_race(true, listen4_leader, bind6_racer);
551*f6217f89SApple OSS Distributions }
552*f6217f89SApple OSS Distributions 
553*f6217f89SApple OSS Distributions 
554*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind6_bind4_race, "race bind  calls with UDP sockets")
555*f6217f89SApple OSS Distributions {
556*f6217f89SApple OSS Distributions 	do_bind_race(false, bind6_leader, bind4_racer);
557*f6217f89SApple OSS Distributions }
558*f6217f89SApple OSS Distributions 
559*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind6_connect4_race, "race bind calls with UDP sockets")
560*f6217f89SApple OSS Distributions {
561*f6217f89SApple OSS Distributions 	do_bind_race(false, bind6_leader, connect4_racer);
562*f6217f89SApple OSS Distributions }
563*f6217f89SApple OSS Distributions 
564*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind4_connect6_race, "race bind calls with UDP sockets")
565*f6217f89SApple OSS Distributions {
566*f6217f89SApple OSS Distributions 	do_bind_race(false, bind4_leader, connect6_racer);
567*f6217f89SApple OSS Distributions }
568*f6217f89SApple OSS Distributions 
569*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind6_send4_race, "race bind calls with UDP sockets")
570*f6217f89SApple OSS Distributions {
571*f6217f89SApple OSS Distributions 	do_bind_race(false, bind6_leader, send4_racer);
572*f6217f89SApple OSS Distributions }
573*f6217f89SApple OSS Distributions 
574*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind4_send6_race, "race bind calls with UDP sockets")
575*f6217f89SApple OSS Distributions {
576*f6217f89SApple OSS Distributions 	do_bind_race(false, bind4_leader, send6_racer);
577*f6217f89SApple OSS Distributions }
578*f6217f89SApple OSS Distributions 
579*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_send6_send4_race, "race bind calls with UDP sockets")
580*f6217f89SApple OSS Distributions {
581*f6217f89SApple OSS Distributions 	do_bind_race(false, send6_leader, send4_racer);
582*f6217f89SApple OSS Distributions }
583*f6217f89SApple OSS Distributions 
584*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind6_connectx4_race, "race bind calls with UDP sockets", T_META_ENABLED(false))
585*f6217f89SApple OSS Distributions {
586*f6217f89SApple OSS Distributions 	do_bind_race(false, bind6_leader, connectx4_racer);
587*f6217f89SApple OSS Distributions }
588*f6217f89SApple OSS Distributions 
589*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_bind4_connectx6_race, "race bind calls with UDP sockets", T_META_ENABLED(false))
590*f6217f89SApple OSS Distributions {
591*f6217f89SApple OSS Distributions 	do_bind_race(false, bind4_leader, connectx6_racer);
592*f6217f89SApple OSS Distributions }
593*f6217f89SApple OSS Distributions 
594*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_connectx4_bind6_race, "race bind calls with UDP sockets", T_META_ENABLED(false))
595*f6217f89SApple OSS Distributions {
596*f6217f89SApple OSS Distributions 	do_bind_race(false, connectx4_leader, bind6_racer);
597*f6217f89SApple OSS Distributions }
598*f6217f89SApple OSS Distributions 
599*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_connectx6_bind4_race, "race bind calls with UDP sockets", T_META_ENABLED(false))
600*f6217f89SApple OSS Distributions {
601*f6217f89SApple OSS Distributions 	do_bind_race(false, connectx6_leader, bind4_racer);
602*f6217f89SApple OSS Distributions }
603*f6217f89SApple OSS Distributions 
604*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_connectx4_connect6_race, "race bind calls with UDP sockets", T_META_ENABLED(false))
605*f6217f89SApple OSS Distributions {
606*f6217f89SApple OSS Distributions 	do_bind_race(false, connectx4_leader, connect6_racer);
607*f6217f89SApple OSS Distributions }
608*f6217f89SApple OSS Distributions 
609*f6217f89SApple OSS Distributions T_DECL(ipv6_udp_connectx6_connect4_race, "race bind calls with UDP sockets", T_META_ENABLED(false))
610*f6217f89SApple OSS Distributions {
611*f6217f89SApple OSS Distributions 	do_bind_race(false, connectx6_leader, connect4_racer);
612*f6217f89SApple OSS Distributions }
613*f6217f89SApple OSS Distributions #else
614*f6217f89SApple OSS Distributions 
615*f6217f89SApple OSS Distributions T_DECL(stub, "test suite disabled")
616*f6217f89SApple OSS Distributions {
617*f6217f89SApple OSS Distributions 	T_EXPECT_TRUE(true, "disabled by rdar://137741815");
618*f6217f89SApple OSS Distributions }
619*f6217f89SApple OSS Distributions 
620*f6217f89SApple OSS Distributions #endif /* 0 */
621