xref: /xnu-12377.81.4/tests/udp_bind_connect.c (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1*043036a2SApple OSS Distributions /*
2*043036a2SApple OSS Distributions  * Copyright (c) 2022-2024 Apple Inc. All rights reserved.
3*043036a2SApple OSS Distributions  *
4*043036a2SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*043036a2SApple OSS Distributions  *
6*043036a2SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*043036a2SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*043036a2SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*043036a2SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*043036a2SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*043036a2SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*043036a2SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*043036a2SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*043036a2SApple OSS Distributions  *
15*043036a2SApple OSS Distributions  * Please obtain a copy of the License at
16*043036a2SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*043036a2SApple OSS Distributions  *
18*043036a2SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*043036a2SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*043036a2SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*043036a2SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*043036a2SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*043036a2SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*043036a2SApple OSS Distributions  * limitations under the License.
25*043036a2SApple OSS Distributions  *
26*043036a2SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*043036a2SApple OSS Distributions  */
28*043036a2SApple OSS Distributions 
29*043036a2SApple OSS Distributions #include <sys/fcntl.h>
30*043036a2SApple OSS Distributions #include <sys/socket.h>
31*043036a2SApple OSS Distributions 
32*043036a2SApple OSS Distributions #include <net/if.h>
33*043036a2SApple OSS Distributions #include <net/route.h>
34*043036a2SApple OSS Distributions 
35*043036a2SApple OSS Distributions #include <netinet/in.h>
36*043036a2SApple OSS Distributions 
37*043036a2SApple OSS Distributions #include <stdbool.h>
38*043036a2SApple OSS Distributions #include <stdlib.h>
39*043036a2SApple OSS Distributions #include <string.h>
40*043036a2SApple OSS Distributions #include <unistd.h>
41*043036a2SApple OSS Distributions 
42*043036a2SApple OSS Distributions #include <arpa/inet.h>
43*043036a2SApple OSS Distributions 
44*043036a2SApple OSS Distributions #include <darwintest.h>
45*043036a2SApple OSS Distributions 
46*043036a2SApple OSS Distributions #include "net_test_lib.h"
47*043036a2SApple OSS Distributions 
48*043036a2SApple OSS Distributions T_GLOBAL_META(
49*043036a2SApple OSS Distributions 	T_META_NAMESPACE("xnu.net"),
50*043036a2SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
51*043036a2SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("networking")
52*043036a2SApple OSS Distributions 	);
53*043036a2SApple OSS Distributions 
54*043036a2SApple OSS Distributions #define MAX_IPv6_STR_LEN        64
55*043036a2SApple OSS Distributions 
56*043036a2SApple OSS Distributions static char l_addr_str[MAX_IPv6_STR_LEN];
57*043036a2SApple OSS Distributions static char f_addr_str[MAX_IPv6_STR_LEN];
58*043036a2SApple OSS Distributions 
59*043036a2SApple OSS Distributions const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
60*043036a2SApple OSS Distributions #define s6_addr32 __u6_addr.__u6_addr32
61*043036a2SApple OSS Distributions 
62*043036a2SApple OSS Distributions 
63*043036a2SApple OSS Distributions static void
init_sin_address(struct sockaddr_in * sin)64*043036a2SApple OSS Distributions init_sin_address(struct sockaddr_in *sin)
65*043036a2SApple OSS Distributions {
66*043036a2SApple OSS Distributions 	memset(sin, 0, sizeof(struct sockaddr_in));
67*043036a2SApple OSS Distributions 	sin->sin_len = sizeof(struct sockaddr_in);
68*043036a2SApple OSS Distributions 	sin->sin_family = AF_INET;
69*043036a2SApple OSS Distributions }
70*043036a2SApple OSS Distributions 
71*043036a2SApple OSS Distributions static void
init_sin6_address(struct sockaddr_in6 * sin6)72*043036a2SApple OSS Distributions init_sin6_address(struct sockaddr_in6 *sin6)
73*043036a2SApple OSS Distributions {
74*043036a2SApple OSS Distributions 	memset(sin6, 0, sizeof(struct sockaddr_in6));
75*043036a2SApple OSS Distributions 	sin6->sin6_len = sizeof(struct sockaddr_in6);
76*043036a2SApple OSS Distributions 	sin6->sin6_family = AF_INET6;
77*043036a2SApple OSS Distributions }
78*043036a2SApple OSS Distributions 
79*043036a2SApple OSS Distributions static void
udp_connect_v4(int client_fd,struct sockaddr_in * sin_to,int expected_error)80*043036a2SApple OSS Distributions udp_connect_v4(int client_fd, struct sockaddr_in *sin_to, int expected_error)
81*043036a2SApple OSS Distributions {
82*043036a2SApple OSS Distributions 	int listen_fd = -1;
83*043036a2SApple OSS Distributions 	socklen_t socklen;
84*043036a2SApple OSS Distributions 	struct sockaddr_in sin_local = { 0 };
85*043036a2SApple OSS Distributions 	struct sockaddr_in sin_peer = { 0 };
86*043036a2SApple OSS Distributions 	struct sockaddr_in sin;
87*043036a2SApple OSS Distributions 
88*043036a2SApple OSS Distributions 	init_sin_address(&sin);
89*043036a2SApple OSS Distributions 	init_sin_address(&sin_local);
90*043036a2SApple OSS Distributions 	init_sin_address(&sin_peer);
91*043036a2SApple OSS Distributions 
92*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
93*043036a2SApple OSS Distributions 
94*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin)), NULL);
95*043036a2SApple OSS Distributions 
96*043036a2SApple OSS Distributions 	socklen = sizeof(sin);
97*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin, &socklen), NULL);
98*043036a2SApple OSS Distributions 
99*043036a2SApple OSS Distributions 	T_LOG("listening on port: %u", ntohs(sin.sin_port));
100*043036a2SApple OSS Distributions 	sin_to->sin_port = sin.sin_port;
101*043036a2SApple OSS Distributions 
102*043036a2SApple OSS Distributions 	T_LOG("connect with sin_len: %u sin_family: %u sin_port: %u sin_addr: 0x%08x expected_error: %d",
103*043036a2SApple OSS Distributions 	    sin_to->sin_len, sin_to->sin_family, ntohs(sin_to->sin_port), ntohl(sin_to->sin_addr.s_addr), expected_error);
104*043036a2SApple OSS Distributions 
105*043036a2SApple OSS Distributions 	if (expected_error == 0) {
106*043036a2SApple OSS Distributions 		T_EXPECT_POSIX_SUCCESS(connect(client_fd, (struct sockaddr *)sin_to, sizeof(struct sockaddr_in)), NULL);
107*043036a2SApple OSS Distributions 
108*043036a2SApple OSS Distributions 		socklen = sizeof(sin_local);
109*043036a2SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin_local, &socklen), NULL);
110*043036a2SApple OSS Distributions 		(void)inet_ntop(AF_INET, &sin_local.sin_addr, l_addr_str, sizeof(l_addr_str));
111*043036a2SApple OSS Distributions 
112*043036a2SApple OSS Distributions 		socklen = sizeof(sin_peer);
113*043036a2SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin_peer, &socklen), NULL);
114*043036a2SApple OSS Distributions 		(void)inet_ntop(AF_INET, &sin_peer.sin_addr, f_addr_str, sizeof(f_addr_str));
115*043036a2SApple OSS Distributions 
116*043036a2SApple OSS Distributions 		T_LOG("connected from %s:%u to %s:%u",
117*043036a2SApple OSS Distributions 		    l_addr_str, ntohs(sin_local.sin_port),
118*043036a2SApple OSS Distributions 		    f_addr_str, ntohs(sin_peer.sin_port));
119*043036a2SApple OSS Distributions 	} else {
120*043036a2SApple OSS Distributions 		T_EXPECT_POSIX_FAILURE(connect(client_fd, (struct sockaddr *)sin_to, sizeof(struct sockaddr_in)), expected_error, NULL);
121*043036a2SApple OSS Distributions 	}
122*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
123*043036a2SApple OSS Distributions }
124*043036a2SApple OSS Distributions 
125*043036a2SApple OSS Distributions static void
udp_connect_v6(int client_fd,struct sockaddr_in6 * sin6_to,int expected_error)126*043036a2SApple OSS Distributions udp_connect_v6(int client_fd, struct sockaddr_in6 *sin6_to, int expected_error)
127*043036a2SApple OSS Distributions {
128*043036a2SApple OSS Distributions 	int listen_fd = -1;
129*043036a2SApple OSS Distributions 	socklen_t socklen;
130*043036a2SApple OSS Distributions 	int off = 0;
131*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6_local = { 0 };
132*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6_peer = { 0 };
133*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6;
134*043036a2SApple OSS Distributions 
135*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
136*043036a2SApple OSS Distributions 	init_sin6_address(&sin6_local);
137*043036a2SApple OSS Distributions 	init_sin6_address(&sin6_peer);
138*043036a2SApple OSS Distributions 
139*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
140*043036a2SApple OSS Distributions 
141*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(setsockopt(listen_fd, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)), NULL);
142*043036a2SApple OSS Distributions 
143*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin6, sizeof(sin6)), NULL);
144*043036a2SApple OSS Distributions 
145*043036a2SApple OSS Distributions 	socklen = sizeof(sin6);
146*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin6, &socklen), NULL);
147*043036a2SApple OSS Distributions 
148*043036a2SApple OSS Distributions 	T_LOG("listening on port: %u", ntohs(sin6.sin6_port));
149*043036a2SApple OSS Distributions 	sin6_to->sin6_port = sin6.sin6_port;
150*043036a2SApple OSS Distributions 
151*043036a2SApple OSS Distributions 	(void)inet_ntop(AF_INET6, &sin6_to->sin6_addr, l_addr_str, sizeof(l_addr_str));
152*043036a2SApple OSS Distributions 	T_LOG("connect with sin6_len: %u sin6_family: %u sin6_port: %u sin6_addr: %s expected_error: %d",
153*043036a2SApple OSS Distributions 	    sin6_to->sin6_len, sin6_to->sin6_family, ntohs(sin6_to->sin6_port), l_addr_str, expected_error);
154*043036a2SApple OSS Distributions 
155*043036a2SApple OSS Distributions 	if (expected_error == 0) {
156*043036a2SApple OSS Distributions 		T_EXPECT_POSIX_SUCCESS(connect(client_fd, (struct sockaddr *)sin6_to, sizeof(struct sockaddr_in6)), NULL);
157*043036a2SApple OSS Distributions 
158*043036a2SApple OSS Distributions 		socklen = sizeof(sin6_local);
159*043036a2SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin6_local, &socklen), NULL);
160*043036a2SApple OSS Distributions 		(void)inet_ntop(AF_INET6, &sin6_local.sin6_addr, l_addr_str, sizeof(l_addr_str));
161*043036a2SApple OSS Distributions 
162*043036a2SApple OSS Distributions 		socklen = sizeof(sin6_peer);
163*043036a2SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin6_peer, &socklen), NULL);
164*043036a2SApple OSS Distributions 		(void)inet_ntop(AF_INET6, &sin6_peer.sin6_addr, f_addr_str, sizeof(f_addr_str));
165*043036a2SApple OSS Distributions 
166*043036a2SApple OSS Distributions 		T_LOG("connected from %s:%u to %s:%u",
167*043036a2SApple OSS Distributions 		    l_addr_str, ntohs(sin6_local.sin6_port),
168*043036a2SApple OSS Distributions 		    f_addr_str, ntohs(sin6_peer.sin6_port));
169*043036a2SApple OSS Distributions 	} else {
170*043036a2SApple OSS Distributions 		T_EXPECT_POSIX_FAILURE(connect(client_fd, (struct sockaddr *)sin6_to, sizeof(struct sockaddr_in6)), expected_error, NULL);
171*043036a2SApple OSS Distributions 	}
172*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
173*043036a2SApple OSS Distributions }
174*043036a2SApple OSS Distributions 
175*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_loopback, "UDP bind with a IPv4 loopback address", T_META_TAG_VM_PREFERRED)
176*043036a2SApple OSS Distributions {
177*043036a2SApple OSS Distributions 	int s = -1;
178*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
179*043036a2SApple OSS Distributions 
180*043036a2SApple OSS Distributions 	init_sin_address(&sin);
181*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr), 1, NULL);
182*043036a2SApple OSS Distributions 
183*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
184*043036a2SApple OSS Distributions 
185*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin, sizeof(sin)), 0, NULL);
186*043036a2SApple OSS Distributions 
187*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
188*043036a2SApple OSS Distributions }
189*043036a2SApple OSS Distributions 
190*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_loopback, "UDP connect with a IPv4 loopback address", T_META_TAG_VM_PREFERRED)
191*043036a2SApple OSS Distributions {
192*043036a2SApple OSS Distributions 	int s = -1;
193*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
194*043036a2SApple OSS Distributions 
195*043036a2SApple OSS Distributions 	init_sin_address(&sin);
196*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr), 1, NULL);
197*043036a2SApple OSS Distributions 
198*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
199*043036a2SApple OSS Distributions 
200*043036a2SApple OSS Distributions 	udp_connect_v4(s, &sin, 0);
201*043036a2SApple OSS Distributions 
202*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
203*043036a2SApple OSS Distributions }
204*043036a2SApple OSS Distributions 
205*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_multicast, "UDP bind with a IPv4 multicast address", T_META_TAG_VM_PREFERRED)
206*043036a2SApple OSS Distributions {
207*043036a2SApple OSS Distributions 	int s = -1;
208*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
209*043036a2SApple OSS Distributions 
210*043036a2SApple OSS Distributions 	init_sin_address(&sin);
211*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "224.0.0.1", &sin.sin_addr), 1, NULL);
212*043036a2SApple OSS Distributions 
213*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
214*043036a2SApple OSS Distributions 
215*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin, sizeof(sin)), NULL);
216*043036a2SApple OSS Distributions 
217*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
218*043036a2SApple OSS Distributions }
219*043036a2SApple OSS Distributions 
220*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_multicast, "UDP connect with an IPv4 multicast address", T_META_TAG_VM_PREFERRED)
221*043036a2SApple OSS Distributions {
222*043036a2SApple OSS Distributions 	if (!has_ipv4_default_route()) {
223*043036a2SApple OSS Distributions 		T_SKIP("test require IPv4 default route");
224*043036a2SApple OSS Distributions 	}
225*043036a2SApple OSS Distributions 
226*043036a2SApple OSS Distributions 	int s = -1;
227*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
228*043036a2SApple OSS Distributions 
229*043036a2SApple OSS Distributions 	init_sin_address(&sin);
230*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "224.0.0.1", &sin.sin_addr), 1, NULL);
231*043036a2SApple OSS Distributions 
232*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
233*043036a2SApple OSS Distributions 
234*043036a2SApple OSS Distributions 	udp_connect_v4(s, &sin, 0);
235*043036a2SApple OSS Distributions 
236*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
237*043036a2SApple OSS Distributions }
238*043036a2SApple OSS Distributions 
239*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_broadcast, "UDP bind with the IPv4 broadcast address", T_META_TAG_VM_PREFERRED)
240*043036a2SApple OSS Distributions {
241*043036a2SApple OSS Distributions 	int s = -1;
242*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
243*043036a2SApple OSS Distributions 
244*043036a2SApple OSS Distributions 	init_sin_address(&sin);
245*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "255.255.255.255", &sin.sin_addr), 1, NULL);
246*043036a2SApple OSS Distributions 
247*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
248*043036a2SApple OSS Distributions 
249*043036a2SApple OSS Distributions 	T_EXPECT_POSIX_FAILURE(bind(s, (const struct sockaddr *)&sin, sizeof(sin)), EADDRNOTAVAIL, NULL);
250*043036a2SApple OSS Distributions 
251*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
252*043036a2SApple OSS Distributions }
253*043036a2SApple OSS Distributions 
254*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_broadcast, "UDP connect with the IPv4 broadcast address", T_META_TAG_VM_PREFERRED)
255*043036a2SApple OSS Distributions {
256*043036a2SApple OSS Distributions 	if (!has_ipv4_default_route()) {
257*043036a2SApple OSS Distributions 		T_SKIP("test require IPv4 default route");
258*043036a2SApple OSS Distributions 	}
259*043036a2SApple OSS Distributions 
260*043036a2SApple OSS Distributions 	int s = -1;
261*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
262*043036a2SApple OSS Distributions 
263*043036a2SApple OSS Distributions 	init_sin_address(&sin);
264*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "255.255.255.255", &sin.sin_addr), 1, NULL);
265*043036a2SApple OSS Distributions 
266*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
267*043036a2SApple OSS Distributions 
268*043036a2SApple OSS Distributions 	udp_connect_v4(s, &sin, 0);
269*043036a2SApple OSS Distributions 
270*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
271*043036a2SApple OSS Distributions }
272*043036a2SApple OSS Distributions 
273*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_null, "UDP bind with the null IPv4 address", T_META_TAG_VM_PREFERRED)
274*043036a2SApple OSS Distributions {
275*043036a2SApple OSS Distributions 	int s = -1;
276*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
277*043036a2SApple OSS Distributions 
278*043036a2SApple OSS Distributions 	init_sin_address(&sin);
279*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "0.0.0.0", &sin.sin_addr), 1, NULL);
280*043036a2SApple OSS Distributions 
281*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
282*043036a2SApple OSS Distributions 
283*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin, sizeof(sin)), NULL);
284*043036a2SApple OSS Distributions 
285*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
286*043036a2SApple OSS Distributions }
287*043036a2SApple OSS Distributions 
288*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_null, "UDP connect with the null IPv4 address", T_META_TAG_VM_PREFERRED)
289*043036a2SApple OSS Distributions {
290*043036a2SApple OSS Distributions 	if (!has_ipv4_default_route()) {
291*043036a2SApple OSS Distributions 		T_SKIP("test require IPv4 default route");
292*043036a2SApple OSS Distributions 	}
293*043036a2SApple OSS Distributions 
294*043036a2SApple OSS Distributions 	int s = -1;
295*043036a2SApple OSS Distributions 	struct sockaddr_in sin = { 0 };
296*043036a2SApple OSS Distributions 
297*043036a2SApple OSS Distributions 	init_sin_address(&sin);
298*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET, "0.0.0.0", &sin.sin_addr), 1, NULL);
299*043036a2SApple OSS Distributions 
300*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), NULL);
301*043036a2SApple OSS Distributions 
302*043036a2SApple OSS Distributions 	udp_connect_v4(s, &sin, 0);
303*043036a2SApple OSS Distributions 
304*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
305*043036a2SApple OSS Distributions }
306*043036a2SApple OSS Distributions 
307*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv6_loopback, "UDP bind with the IPv6 loopback address", T_META_TAG_VM_PREFERRED)
308*043036a2SApple OSS Distributions {
309*043036a2SApple OSS Distributions 	int s = -1;
310*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
311*043036a2SApple OSS Distributions 
312*043036a2SApple OSS Distributions 	sin6.sin6_scope_id = if_nametoindex("lo0");
313*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
314*043036a2SApple OSS Distributions 
315*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
316*043036a2SApple OSS Distributions 
317*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
318*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), NULL);
319*043036a2SApple OSS Distributions 
320*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
321*043036a2SApple OSS Distributions }
322*043036a2SApple OSS Distributions 
323*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv6_loopback, "UDP connect with the IPv6 loopback address", T_META_TAG_VM_PREFERRED)
324*043036a2SApple OSS Distributions {
325*043036a2SApple OSS Distributions 	int s = -1;
326*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
327*043036a2SApple OSS Distributions 
328*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
329*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
330*043036a2SApple OSS Distributions 
331*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
332*043036a2SApple OSS Distributions 
333*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
334*043036a2SApple OSS Distributions 
335*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
336*043036a2SApple OSS Distributions }
337*043036a2SApple OSS Distributions 
338*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv6_multicast, "UDP bind with a IPv6 multicast address", T_META_TAG_VM_PREFERRED)
339*043036a2SApple OSS Distributions {
340*043036a2SApple OSS Distributions 	int s = -1;
341*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
342*043036a2SApple OSS Distributions 
343*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
344*043036a2SApple OSS Distributions 	sin6.sin6_scope_id = if_nametoindex("lo0");
345*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "ff01::1", &sin6.sin6_addr), 1, NULL);
346*043036a2SApple OSS Distributions 
347*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
348*043036a2SApple OSS Distributions 
349*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), NULL);
350*043036a2SApple OSS Distributions 
351*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
352*043036a2SApple OSS Distributions }
353*043036a2SApple OSS Distributions 
354*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv6_multicast, "UDP connect with a IPv6 multicast address", T_META_TAG_VM_PREFERRED)
355*043036a2SApple OSS Distributions {
356*043036a2SApple OSS Distributions 	int s = -1;
357*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
358*043036a2SApple OSS Distributions 
359*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
360*043036a2SApple OSS Distributions 	sin6.sin6_scope_id = if_nametoindex("lo0");
361*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "ff01::1", &sin6.sin6_addr), 1, NULL);
362*043036a2SApple OSS Distributions 
363*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
364*043036a2SApple OSS Distributions 
365*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
366*043036a2SApple OSS Distributions 
367*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
368*043036a2SApple OSS Distributions }
369*043036a2SApple OSS Distributions 
370*043036a2SApple OSS Distributions T_DECL(udp_bind_null_ipv6, "UDP bind with the IPv6 null address", T_META_TAG_VM_PREFERRED)
371*043036a2SApple OSS Distributions {
372*043036a2SApple OSS Distributions 	int s = -1;
373*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
374*043036a2SApple OSS Distributions 
375*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
376*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::", &sin6.sin6_addr), 1, NULL);
377*043036a2SApple OSS Distributions 
378*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
379*043036a2SApple OSS Distributions 
380*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), NULL);
381*043036a2SApple OSS Distributions 
382*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
383*043036a2SApple OSS Distributions }
384*043036a2SApple OSS Distributions 
385*043036a2SApple OSS Distributions T_DECL(udp_connect_null_ipv6, "UDP connect with the IPv6 null address", T_META_TAG_VM_PREFERRED)
386*043036a2SApple OSS Distributions {
387*043036a2SApple OSS Distributions 	int s = -1;
388*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
389*043036a2SApple OSS Distributions 
390*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
391*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::", &sin6.sin6_addr), 1, NULL);
392*043036a2SApple OSS Distributions 
393*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
394*043036a2SApple OSS Distributions 
395*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
396*043036a2SApple OSS Distributions 
397*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
398*043036a2SApple OSS Distributions }
399*043036a2SApple OSS Distributions 
400*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_multicast_mapped_ipv6, "UDP bind with IPv4 multicast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
401*043036a2SApple OSS Distributions {
402*043036a2SApple OSS Distributions 	int s = -1;
403*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
404*043036a2SApple OSS Distributions 
405*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
406*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:224.0.0.1", &sin6.sin6_addr), 1, NULL);
407*043036a2SApple OSS Distributions 
408*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
409*043036a2SApple OSS Distributions 
410*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), NULL);
411*043036a2SApple OSS Distributions 
412*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
413*043036a2SApple OSS Distributions }
414*043036a2SApple OSS Distributions 
415*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_multicast_mapped_ipv6, "UDP connect with IPv4 multicast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
416*043036a2SApple OSS Distributions {
417*043036a2SApple OSS Distributions 	if (!has_ipv4_default_route()) {
418*043036a2SApple OSS Distributions 		T_SKIP("test require IPv4 default route");
419*043036a2SApple OSS Distributions 	}
420*043036a2SApple OSS Distributions 
421*043036a2SApple OSS Distributions 	int s = -1;
422*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
423*043036a2SApple OSS Distributions 
424*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
425*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:224.0.0.1", &sin6.sin6_addr), 1, NULL);
426*043036a2SApple OSS Distributions 
427*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
428*043036a2SApple OSS Distributions 
429*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
430*043036a2SApple OSS Distributions 
431*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
432*043036a2SApple OSS Distributions }
433*043036a2SApple OSS Distributions 
434*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_broadcast_mapped_ipv6, "UDP bind with IPv4 broadcast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
435*043036a2SApple OSS Distributions {
436*043036a2SApple OSS Distributions 	int s = -1;
437*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
438*043036a2SApple OSS Distributions 
439*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
440*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:255.255.255.255", &sin6.sin6_addr), 1, NULL);
441*043036a2SApple OSS Distributions 
442*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
443*043036a2SApple OSS Distributions 
444*043036a2SApple OSS Distributions 	T_EXPECT_POSIX_FAILURE(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), EADDRNOTAVAIL, NULL);
445*043036a2SApple OSS Distributions 
446*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
447*043036a2SApple OSS Distributions }
448*043036a2SApple OSS Distributions 
449*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_broadcast_mapped_ipv6, "UDP connect with IPv4 broadcast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
450*043036a2SApple OSS Distributions {
451*043036a2SApple OSS Distributions 	if (!has_ipv4_default_route()) {
452*043036a2SApple OSS Distributions 		T_SKIP("test require IPv4 default route");
453*043036a2SApple OSS Distributions 	}
454*043036a2SApple OSS Distributions 
455*043036a2SApple OSS Distributions 	int s = -1;
456*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
457*043036a2SApple OSS Distributions 
458*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
459*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:255.255.255.255", &sin6.sin6_addr), 1, NULL);
460*043036a2SApple OSS Distributions 
461*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
462*043036a2SApple OSS Distributions 
463*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
464*043036a2SApple OSS Distributions 
465*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
466*043036a2SApple OSS Distributions }
467*043036a2SApple OSS Distributions 
468*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_null_mapped_ipv6, "UDP bind with IPv4 null mapped IPv6 address", T_META_TAG_VM_PREFERRED)
469*043036a2SApple OSS Distributions {
470*043036a2SApple OSS Distributions 	int s = -1;
471*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
472*043036a2SApple OSS Distributions 
473*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
474*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:0.0.0.0", &sin6.sin6_addr), 1, NULL);
475*043036a2SApple OSS Distributions 
476*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
477*043036a2SApple OSS Distributions 
478*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
479*043036a2SApple OSS Distributions 
480*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
481*043036a2SApple OSS Distributions }
482*043036a2SApple OSS Distributions 
483*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_null_mapped_ipv6, "UDP connect with IPv4 null mapped IPv6 address", T_META_TAG_VM_PREFERRED)
484*043036a2SApple OSS Distributions {
485*043036a2SApple OSS Distributions 	if (!has_ipv4_default_route()) {
486*043036a2SApple OSS Distributions 		T_SKIP("test require IPv4 default route");
487*043036a2SApple OSS Distributions 	}
488*043036a2SApple OSS Distributions 
489*043036a2SApple OSS Distributions 	int s = -1;
490*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
491*043036a2SApple OSS Distributions 
492*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
493*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:0.0.0.0", &sin6.sin6_addr), 1, NULL);
494*043036a2SApple OSS Distributions 
495*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
496*043036a2SApple OSS Distributions 
497*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
498*043036a2SApple OSS Distributions 
499*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
500*043036a2SApple OSS Distributions }
501*043036a2SApple OSS Distributions 
502*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_multicast_compatible_ipv6, "UDP bind with IPv4 multicast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
503*043036a2SApple OSS Distributions {
504*043036a2SApple OSS Distributions 	int s = -1;
505*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
506*043036a2SApple OSS Distributions 
507*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
508*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::224.0.0.1", &sin6.sin6_addr), 1, NULL);
509*043036a2SApple OSS Distributions 
510*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
511*043036a2SApple OSS Distributions 
512*043036a2SApple OSS Distributions 	T_EXPECT_POSIX_FAILURE(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), EADDRNOTAVAIL, NULL);
513*043036a2SApple OSS Distributions 
514*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
515*043036a2SApple OSS Distributions }
516*043036a2SApple OSS Distributions 
517*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_multicast_compatible_ipv6, "UDP connect with IPv4 multicast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
518*043036a2SApple OSS Distributions {
519*043036a2SApple OSS Distributions 	if (!has_ipv6_default_route()) {
520*043036a2SApple OSS Distributions 		T_SKIP("test require IPv6 default route");
521*043036a2SApple OSS Distributions 	}
522*043036a2SApple OSS Distributions 
523*043036a2SApple OSS Distributions 	int s = -1;
524*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
525*043036a2SApple OSS Distributions 
526*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
527*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::224.0.0.1", &sin6.sin6_addr), 1, NULL);
528*043036a2SApple OSS Distributions 
529*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
530*043036a2SApple OSS Distributions 
531*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
532*043036a2SApple OSS Distributions 
533*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
534*043036a2SApple OSS Distributions }
535*043036a2SApple OSS Distributions 
536*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_broadcast_compatible_ipv6, "UDP bind with IPv4 broadcast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
537*043036a2SApple OSS Distributions {
538*043036a2SApple OSS Distributions 	int s = -1;
539*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
540*043036a2SApple OSS Distributions 
541*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
542*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::255.255.255.255", &sin6.sin6_addr), 1, NULL);
543*043036a2SApple OSS Distributions 
544*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
545*043036a2SApple OSS Distributions 
546*043036a2SApple OSS Distributions 	T_EXPECT_POSIX_FAILURE(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), EADDRNOTAVAIL, NULL);
547*043036a2SApple OSS Distributions 
548*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
549*043036a2SApple OSS Distributions }
550*043036a2SApple OSS Distributions 
551*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_broadcast_compatible_ipv6, "UDP connect with IPv4 broadcast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
552*043036a2SApple OSS Distributions {
553*043036a2SApple OSS Distributions 	if (!has_ipv6_default_route()) {
554*043036a2SApple OSS Distributions 		T_SKIP("test require IPv6 default route");
555*043036a2SApple OSS Distributions 	}
556*043036a2SApple OSS Distributions 
557*043036a2SApple OSS Distributions 	int s = -1;
558*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
559*043036a2SApple OSS Distributions 
560*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
561*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::255.255.255.255", &sin6.sin6_addr), 1, NULL);
562*043036a2SApple OSS Distributions 
563*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
564*043036a2SApple OSS Distributions 
565*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
566*043036a2SApple OSS Distributions 
567*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
568*043036a2SApple OSS Distributions }
569*043036a2SApple OSS Distributions 
570*043036a2SApple OSS Distributions T_DECL(udp_bind_ipv4_null_compatible_ipv6, "UDP bind with IPv4 null compatible IPv6 address", T_META_TAG_VM_PREFERRED)
571*043036a2SApple OSS Distributions {
572*043036a2SApple OSS Distributions 	int s = -1;
573*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
574*043036a2SApple OSS Distributions 
575*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
576*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::0.0.0.0", &sin6.sin6_addr), 1, NULL);
577*043036a2SApple OSS Distributions 
578*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
579*043036a2SApple OSS Distributions 
580*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(bind(s, (const struct sockaddr *)&sin6, sizeof(sin6)), NULL);
581*043036a2SApple OSS Distributions 
582*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
583*043036a2SApple OSS Distributions }
584*043036a2SApple OSS Distributions 
585*043036a2SApple OSS Distributions T_DECL(udp_connect_ipv4_null_compatible_ipv6, "UDP connect with IPv4 null compatible IPv6 address", T_META_TAG_VM_PREFERRED)
586*043036a2SApple OSS Distributions {
587*043036a2SApple OSS Distributions 	if (!has_ipv6_default_route()) {
588*043036a2SApple OSS Distributions 		T_SKIP("test require IPv6 default route");
589*043036a2SApple OSS Distributions 	}
590*043036a2SApple OSS Distributions 
591*043036a2SApple OSS Distributions 	int s = -1;
592*043036a2SApple OSS Distributions 	struct sockaddr_in6 sin6 = { 0 };
593*043036a2SApple OSS Distributions 
594*043036a2SApple OSS Distributions 	init_sin6_address(&sin6);
595*043036a2SApple OSS Distributions 	T_ASSERT_EQ(inet_pton(AF_INET6, "::0.0.0.0", &sin6.sin6_addr), 1, NULL);
596*043036a2SApple OSS Distributions 
597*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), NULL);
598*043036a2SApple OSS Distributions 
599*043036a2SApple OSS Distributions 	udp_connect_v6(s, &sin6, 0);
600*043036a2SApple OSS Distributions 
601*043036a2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(s), NULL);
602*043036a2SApple OSS Distributions }
603