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