1*4f1223e8SApple OSS Distributions /*
2*4f1223e8SApple OSS Distributions * Copyright (c) 2021-2024 Apple Inc. All rights reserved.
3*4f1223e8SApple OSS Distributions *
4*4f1223e8SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*4f1223e8SApple OSS Distributions *
6*4f1223e8SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*4f1223e8SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*4f1223e8SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*4f1223e8SApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*4f1223e8SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*4f1223e8SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*4f1223e8SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*4f1223e8SApple OSS Distributions * terms of an Apple operating system software license agreement.
14*4f1223e8SApple OSS Distributions *
15*4f1223e8SApple OSS Distributions * Please obtain a copy of the License at
16*4f1223e8SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*4f1223e8SApple OSS Distributions *
18*4f1223e8SApple OSS Distributions * The Original Code and all software distributed under the License are
19*4f1223e8SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*4f1223e8SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*4f1223e8SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*4f1223e8SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*4f1223e8SApple OSS Distributions * Please see the License for the specific language governing rights and
24*4f1223e8SApple OSS Distributions * limitations under the License.
25*4f1223e8SApple OSS Distributions *
26*4f1223e8SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*4f1223e8SApple OSS Distributions */
28*4f1223e8SApple OSS Distributions
29*4f1223e8SApple OSS Distributions #include <sys/fcntl.h>
30*4f1223e8SApple OSS Distributions #include <sys/socket.h>
31*4f1223e8SApple OSS Distributions #include <net/if.h>
32*4f1223e8SApple OSS Distributions #include <netinet/in.h>
33*4f1223e8SApple OSS Distributions #include <netinet/tcp.h>
34*4f1223e8SApple OSS Distributions #include <arpa/inet.h>
35*4f1223e8SApple OSS Distributions
36*4f1223e8SApple OSS Distributions #include <darwintest.h>
37*4f1223e8SApple OSS Distributions #include <string.h>
38*4f1223e8SApple OSS Distributions #include <unistd.h>
39*4f1223e8SApple OSS Distributions
40*4f1223e8SApple OSS Distributions #include "net_test_lib.h"
41*4f1223e8SApple OSS Distributions
42*4f1223e8SApple OSS Distributions T_GLOBAL_META(
43*4f1223e8SApple OSS Distributions T_META_NAMESPACE("xnu.net"),
44*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
45*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("networking"),
46*4f1223e8SApple OSS Distributions T_META_CHECK_LEAKS(false),
47*4f1223e8SApple OSS Distributions T_META_ENABLED(!TARGET_OS_BRIDGE));
48*4f1223e8SApple OSS Distributions
49*4f1223e8SApple OSS Distributions
50*4f1223e8SApple OSS Distributions #define MAX_IPv6_STR_LEN 64
51*4f1223e8SApple OSS Distributions
52*4f1223e8SApple OSS Distributions static char l_addr_str[MAX_IPv6_STR_LEN];
53*4f1223e8SApple OSS Distributions static char f_addr_str[MAX_IPv6_STR_LEN];
54*4f1223e8SApple OSS Distributions
55*4f1223e8SApple OSS Distributions const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
56*4f1223e8SApple OSS Distributions #define s6_addr32 __u6_addr.__u6_addr32
57*4f1223e8SApple OSS Distributions
58*4f1223e8SApple OSS Distributions static void
init_sin_address(struct sockaddr_in * sin)59*4f1223e8SApple OSS Distributions init_sin_address(struct sockaddr_in *sin)
60*4f1223e8SApple OSS Distributions {
61*4f1223e8SApple OSS Distributions memset(sin, 0, sizeof(struct sockaddr_in));
62*4f1223e8SApple OSS Distributions sin->sin_len = sizeof(struct sockaddr_in);
63*4f1223e8SApple OSS Distributions sin->sin_family = AF_INET;
64*4f1223e8SApple OSS Distributions }
65*4f1223e8SApple OSS Distributions
66*4f1223e8SApple OSS Distributions static void
init_sin6_address(struct sockaddr_in6 * sin6)67*4f1223e8SApple OSS Distributions init_sin6_address(struct sockaddr_in6 *sin6)
68*4f1223e8SApple OSS Distributions {
69*4f1223e8SApple OSS Distributions memset(sin6, 0, sizeof(struct sockaddr_in6));
70*4f1223e8SApple OSS Distributions sin6->sin6_len = sizeof(struct sockaddr_in6);
71*4f1223e8SApple OSS Distributions sin6->sin6_family = AF_INET6;
72*4f1223e8SApple OSS Distributions }
73*4f1223e8SApple OSS Distributions
74*4f1223e8SApple OSS Distributions static int
tcp_connect_v4(int client_fd,struct sockaddr_in * sin_to,int expected_error)75*4f1223e8SApple OSS Distributions tcp_connect_v4(int client_fd, struct sockaddr_in *sin_to, int expected_error)
76*4f1223e8SApple OSS Distributions {
77*4f1223e8SApple OSS Distributions int listen_fd = -1;
78*4f1223e8SApple OSS Distributions socklen_t socklen;
79*4f1223e8SApple OSS Distributions int val = 2;
80*4f1223e8SApple OSS Distributions struct sockaddr_in sin_local = { 0 };
81*4f1223e8SApple OSS Distributions struct sockaddr_in sin_peer = { 0 };
82*4f1223e8SApple OSS Distributions struct sockaddr_in sin;
83*4f1223e8SApple OSS Distributions
84*4f1223e8SApple OSS Distributions init_sin_address(&sin);
85*4f1223e8SApple OSS Distributions init_sin_address(&sin_local);
86*4f1223e8SApple OSS Distributions init_sin_address(&sin_peer);
87*4f1223e8SApple OSS Distributions
88*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
89*4f1223e8SApple OSS Distributions
90*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin)), NULL);
91*4f1223e8SApple OSS Distributions
92*4f1223e8SApple OSS Distributions socklen = sizeof(sin);
93*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin, &socklen), NULL);
94*4f1223e8SApple OSS Distributions
95*4f1223e8SApple OSS Distributions T_LOG("listening on port: %u", ntohs(sin.sin_port));
96*4f1223e8SApple OSS Distributions sin_to->sin_port = sin.sin_port;
97*4f1223e8SApple OSS Distributions
98*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen(listen_fd, 10), NULL);
99*4f1223e8SApple OSS Distributions
100*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(client_fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &val, sizeof(val)), NULL);
101*4f1223e8SApple OSS Distributions
102*4f1223e8SApple OSS Distributions T_LOG("connect with sin_len: %u sin_family: %u sin_port: %u sin_addr: 0x%08x expected_error: %d",
103*4f1223e8SApple 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*4f1223e8SApple OSS Distributions
105*4f1223e8SApple OSS Distributions if (expected_error == 0) {
106*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_SUCCESS(connect(client_fd, (struct sockaddr *)sin_to, sizeof(struct sockaddr_in)), NULL);
107*4f1223e8SApple OSS Distributions
108*4f1223e8SApple OSS Distributions socklen = sizeof(sin_local);
109*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin_local, &socklen), NULL);
110*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET, &sin_local.sin_addr, l_addr_str, sizeof(l_addr_str));
111*4f1223e8SApple OSS Distributions
112*4f1223e8SApple OSS Distributions socklen = sizeof(sin_peer);
113*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin_peer, &socklen), NULL);
114*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET, &sin_peer.sin_addr, f_addr_str, sizeof(f_addr_str));
115*4f1223e8SApple OSS Distributions
116*4f1223e8SApple OSS Distributions T_LOG("connected from %s:%u to %s:%u",
117*4f1223e8SApple OSS Distributions l_addr_str, ntohs(sin_local.sin_port),
118*4f1223e8SApple OSS Distributions f_addr_str, ntohs(sin_peer.sin_port));
119*4f1223e8SApple OSS Distributions } else {
120*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_FAILURE(connect(client_fd, (struct sockaddr *)sin_to, sizeof(struct sockaddr_in)), expected_error, NULL);
121*4f1223e8SApple OSS Distributions }
122*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
123*4f1223e8SApple OSS Distributions
124*4f1223e8SApple OSS Distributions return 0;
125*4f1223e8SApple OSS Distributions }
126*4f1223e8SApple OSS Distributions
127*4f1223e8SApple OSS Distributions static int
tcp_connect_v6(int client_fd,struct sockaddr_in6 * sin6_to,int expected_error)128*4f1223e8SApple OSS Distributions tcp_connect_v6(int client_fd, struct sockaddr_in6 *sin6_to, int expected_error)
129*4f1223e8SApple OSS Distributions {
130*4f1223e8SApple OSS Distributions int listen_fd = -1;
131*4f1223e8SApple OSS Distributions socklen_t socklen;
132*4f1223e8SApple OSS Distributions int off = 0;
133*4f1223e8SApple OSS Distributions int val = 30;
134*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_local = { 0 };
135*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_peer = { 0 };
136*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6;
137*4f1223e8SApple OSS Distributions
138*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
139*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_local);
140*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_peer);
141*4f1223e8SApple OSS Distributions
142*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
143*4f1223e8SApple OSS Distributions
144*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(listen_fd, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)), NULL);
145*4f1223e8SApple OSS Distributions
146*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin6, sizeof(sin6)), NULL);
147*4f1223e8SApple OSS Distributions
148*4f1223e8SApple OSS Distributions socklen = sizeof(sin6);
149*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin6, &socklen), NULL);
150*4f1223e8SApple OSS Distributions
151*4f1223e8SApple OSS Distributions T_LOG("listening on port: %u", ntohs(sin6.sin6_port));
152*4f1223e8SApple OSS Distributions sin6_to->sin6_port = sin6.sin6_port;
153*4f1223e8SApple OSS Distributions
154*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen(listen_fd, 10), NULL);
155*4f1223e8SApple OSS Distributions
156*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(client_fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &val, sizeof(val)), NULL);
157*4f1223e8SApple OSS Distributions
158*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_to->sin6_addr, l_addr_str, sizeof(l_addr_str));
159*4f1223e8SApple OSS Distributions T_LOG("connect with sin6_len: %u sin6_family: %u sin6_port: %u sin6_addr: %s expected_error: %d",
160*4f1223e8SApple OSS Distributions sin6_to->sin6_len, sin6_to->sin6_family, ntohs(sin6_to->sin6_port), l_addr_str, expected_error);
161*4f1223e8SApple OSS Distributions
162*4f1223e8SApple OSS Distributions if (expected_error == 0) {
163*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_SUCCESS(connect(client_fd, (struct sockaddr *)sin6_to, sizeof(struct sockaddr_in6)), NULL);
164*4f1223e8SApple OSS Distributions
165*4f1223e8SApple OSS Distributions socklen = sizeof(sin6_local);
166*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin6_local, &socklen), NULL);
167*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_local.sin6_addr, l_addr_str, sizeof(l_addr_str));
168*4f1223e8SApple OSS Distributions
169*4f1223e8SApple OSS Distributions socklen = sizeof(sin6_peer);
170*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin6_peer, &socklen), NULL);
171*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_peer.sin6_addr, f_addr_str, sizeof(f_addr_str));
172*4f1223e8SApple OSS Distributions
173*4f1223e8SApple OSS Distributions T_LOG("connected from %s:%u to %s:%u",
174*4f1223e8SApple OSS Distributions l_addr_str, ntohs(sin6_local.sin6_port),
175*4f1223e8SApple OSS Distributions f_addr_str, ntohs(sin6_peer.sin6_port));
176*4f1223e8SApple OSS Distributions } else {
177*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_FAILURE(connect(client_fd, (struct sockaddr *)sin6_to, sizeof(struct sockaddr_in6)), expected_error, NULL);
178*4f1223e8SApple OSS Distributions }
179*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
180*4f1223e8SApple OSS Distributions
181*4f1223e8SApple OSS Distributions return 0;
182*4f1223e8SApple OSS Distributions }
183*4f1223e8SApple OSS Distributions
184*4f1223e8SApple OSS Distributions static int
tcp_connectx_v4(int client_fd,struct sockaddr_in * sin_to,struct sockaddr_in * sin_from,int expected_error)185*4f1223e8SApple OSS Distributions tcp_connectx_v4(int client_fd, struct sockaddr_in *sin_to, struct sockaddr_in *sin_from, int expected_error)
186*4f1223e8SApple OSS Distributions {
187*4f1223e8SApple OSS Distributions int listen_fd = -1;
188*4f1223e8SApple OSS Distributions socklen_t socklen;
189*4f1223e8SApple OSS Distributions int val = 30;
190*4f1223e8SApple OSS Distributions struct sockaddr_in sin_listener;
191*4f1223e8SApple OSS Distributions sa_endpoints_t sae = { 0 };
192*4f1223e8SApple OSS Distributions
193*4f1223e8SApple OSS Distributions init_sin_address(&sin_listener);
194*4f1223e8SApple OSS Distributions
195*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
196*4f1223e8SApple OSS Distributions
197*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin_listener, sizeof(sin_listener)), NULL);
198*4f1223e8SApple OSS Distributions
199*4f1223e8SApple OSS Distributions socklen = sizeof(sin_listener);
200*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin_listener, &socklen), NULL);
201*4f1223e8SApple OSS Distributions
202*4f1223e8SApple OSS Distributions T_LOG("listening on port: %u", ntohs(sin_listener.sin_port));
203*4f1223e8SApple OSS Distributions sin_to->sin_port = sin_listener.sin_port;
204*4f1223e8SApple OSS Distributions
205*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen(listen_fd, 10), NULL);
206*4f1223e8SApple OSS Distributions
207*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(client_fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &val, sizeof(val)), NULL);
208*4f1223e8SApple OSS Distributions
209*4f1223e8SApple OSS Distributions if (sin_from != NULL) {
210*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET, &sin_from->sin_addr, l_addr_str, sizeof(l_addr_str));
211*4f1223e8SApple OSS Distributions sae.sae_srcaddr = (struct sockaddr *)sin_from;
212*4f1223e8SApple OSS Distributions sae.sae_srcaddrlen = sin_from->sin_len;
213*4f1223e8SApple OSS Distributions } else {
214*4f1223e8SApple OSS Distributions snprintf(l_addr_str, sizeof(l_addr_str), "");
215*4f1223e8SApple OSS Distributions }
216*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET, &sin_to->sin_addr, f_addr_str, sizeof(f_addr_str));
217*4f1223e8SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)sin_to;
218*4f1223e8SApple OSS Distributions sae.sae_dstaddrlen = sin_to->sin_len;
219*4f1223e8SApple OSS Distributions
220*4f1223e8SApple OSS Distributions T_LOG("connectx expected_error: %d from %s:%u (len: %u fam: %u) to %s:%u (len: %u fam: %u)",
221*4f1223e8SApple OSS Distributions expected_error,
222*4f1223e8SApple OSS Distributions l_addr_str, sin_from != NULL ? ntohs(sin_from->sin_port) : 0,
223*4f1223e8SApple OSS Distributions sin_from != NULL ? sin_from->sin_len : 0, sin_from != NULL ? sin_from->sin_family : 0,
224*4f1223e8SApple OSS Distributions f_addr_str, ntohs(sin_to->sin_port), sin_to->sin_len, sin_to->sin_family);
225*4f1223e8SApple OSS Distributions
226*4f1223e8SApple OSS Distributions if (expected_error == 0) {
227*4f1223e8SApple OSS Distributions struct sockaddr_in sin_local = { 0 };
228*4f1223e8SApple OSS Distributions struct sockaddr_in sin_peer = { 0 };
229*4f1223e8SApple OSS Distributions
230*4f1223e8SApple OSS Distributions init_sin_address(&sin_local);
231*4f1223e8SApple OSS Distributions init_sin_address(&sin_peer);
232*4f1223e8SApple OSS Distributions
233*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_SUCCESS(connectx(client_fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL), NULL);
234*4f1223e8SApple OSS Distributions
235*4f1223e8SApple OSS Distributions socklen = sizeof(sin_local);
236*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin_local, &socklen), NULL);
237*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET, &sin_local.sin_addr, l_addr_str, sizeof(l_addr_str));
238*4f1223e8SApple OSS Distributions
239*4f1223e8SApple OSS Distributions socklen = sizeof(sin_peer);
240*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin_peer, &socklen), NULL);
241*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET, &sin_peer.sin_addr, f_addr_str, sizeof(f_addr_str));
242*4f1223e8SApple OSS Distributions
243*4f1223e8SApple OSS Distributions T_LOG("connected from %s:%u to %s:%u",
244*4f1223e8SApple OSS Distributions l_addr_str, ntohs(sin_local.sin_port),
245*4f1223e8SApple OSS Distributions f_addr_str, ntohs(sin_peer.sin_port));
246*4f1223e8SApple OSS Distributions } else {
247*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_FAILURE(connectx(client_fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL), expected_error, NULL);
248*4f1223e8SApple OSS Distributions }
249*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
250*4f1223e8SApple OSS Distributions
251*4f1223e8SApple OSS Distributions return 0;
252*4f1223e8SApple OSS Distributions }
253*4f1223e8SApple OSS Distributions
254*4f1223e8SApple OSS Distributions static int
tcp_connectx_v6(int client_fd,struct sockaddr_in6 * sin6_to,struct sockaddr_in6 * sin6_from,int expected_error)255*4f1223e8SApple OSS Distributions tcp_connectx_v6(int client_fd, struct sockaddr_in6 *sin6_to, struct sockaddr_in6 *sin6_from, int expected_error)
256*4f1223e8SApple OSS Distributions {
257*4f1223e8SApple OSS Distributions int listen_fd = -1;
258*4f1223e8SApple OSS Distributions socklen_t socklen;
259*4f1223e8SApple OSS Distributions int off = 0;
260*4f1223e8SApple OSS Distributions int val = 30;
261*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_listener;
262*4f1223e8SApple OSS Distributions sa_endpoints_t sae = { 0 };
263*4f1223e8SApple OSS Distributions
264*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_listener);
265*4f1223e8SApple OSS Distributions
266*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
267*4f1223e8SApple OSS Distributions
268*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(listen_fd, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)), NULL);
269*4f1223e8SApple OSS Distributions
270*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin6_listener, sizeof(sin6_listener)), NULL);
271*4f1223e8SApple OSS Distributions
272*4f1223e8SApple OSS Distributions socklen = sizeof(sin6_listener);
273*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin6_listener, &socklen), NULL);
274*4f1223e8SApple OSS Distributions
275*4f1223e8SApple OSS Distributions T_LOG("listening on port: %u", ntohs(sin6_listener.sin6_port));
276*4f1223e8SApple OSS Distributions sin6_to->sin6_port = sin6_listener.sin6_port;
277*4f1223e8SApple OSS Distributions
278*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen(listen_fd, 10), NULL);
279*4f1223e8SApple OSS Distributions
280*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(client_fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &val, sizeof(val)), NULL);
281*4f1223e8SApple OSS Distributions
282*4f1223e8SApple OSS Distributions if (sin6_from != NULL) {
283*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_from->sin6_addr, l_addr_str, sizeof(l_addr_str));
284*4f1223e8SApple OSS Distributions sae.sae_srcaddr = (struct sockaddr *)sin6_from;
285*4f1223e8SApple OSS Distributions sae.sae_srcaddrlen = sin6_from->sin6_len;
286*4f1223e8SApple OSS Distributions } else {
287*4f1223e8SApple OSS Distributions snprintf(l_addr_str, sizeof(l_addr_str), "");
288*4f1223e8SApple OSS Distributions }
289*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_to->sin6_addr, f_addr_str, sizeof(f_addr_str));
290*4f1223e8SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)sin6_to;
291*4f1223e8SApple OSS Distributions sae.sae_dstaddrlen = sin6_to->sin6_len;
292*4f1223e8SApple OSS Distributions
293*4f1223e8SApple OSS Distributions T_LOG("connectx expected_error: %d from %s:%u (len: %u fam: %u) to %s:%u (len: %u fam: %u)",
294*4f1223e8SApple OSS Distributions expected_error,
295*4f1223e8SApple OSS Distributions l_addr_str, sin6_from != NULL ? ntohs(sin6_from->sin6_port) : 0,
296*4f1223e8SApple OSS Distributions sin6_from != NULL ? sin6_from->sin6_len : 0, sin6_from != NULL ? sin6_from->sin6_family : 0,
297*4f1223e8SApple OSS Distributions f_addr_str, ntohs(sin6_to->sin6_port), sin6_to->sin6_len, sin6_to->sin6_family);
298*4f1223e8SApple OSS Distributions
299*4f1223e8SApple OSS Distributions if (expected_error == 0) {
300*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_local = { 0 };
301*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_peer = { 0 };
302*4f1223e8SApple OSS Distributions
303*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_local);
304*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_peer);
305*4f1223e8SApple OSS Distributions
306*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_SUCCESS(connectx(client_fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL), NULL);
307*4f1223e8SApple OSS Distributions
308*4f1223e8SApple OSS Distributions socklen = sizeof(sin6_local);
309*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin6_local, &socklen), NULL);
310*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_local.sin6_addr, l_addr_str, sizeof(l_addr_str));
311*4f1223e8SApple OSS Distributions
312*4f1223e8SApple OSS Distributions socklen = sizeof(sin6_peer);
313*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin6_peer, &socklen), NULL);
314*4f1223e8SApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_peer.sin6_addr, f_addr_str, sizeof(f_addr_str));
315*4f1223e8SApple OSS Distributions
316*4f1223e8SApple OSS Distributions T_LOG("connected from %s:%u to %s:%u",
317*4f1223e8SApple OSS Distributions l_addr_str, ntohs(sin6_local.sin6_port),
318*4f1223e8SApple OSS Distributions f_addr_str, ntohs(sin6_peer.sin6_port));
319*4f1223e8SApple OSS Distributions } else {
320*4f1223e8SApple OSS Distributions T_EXPECT_POSIX_FAILURE(connectx(client_fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL), expected_error, NULL);
321*4f1223e8SApple OSS Distributions }
322*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
323*4f1223e8SApple OSS Distributions
324*4f1223e8SApple OSS Distributions return 0;
325*4f1223e8SApple OSS Distributions }
326*4f1223e8SApple OSS Distributions
327*4f1223e8SApple OSS Distributions static int
tcp_bind_v4(int client_fd,struct sockaddr_in * sin,int expected_error)328*4f1223e8SApple OSS Distributions tcp_bind_v4(int client_fd, struct sockaddr_in *sin, int expected_error)
329*4f1223e8SApple OSS Distributions {
330*4f1223e8SApple OSS Distributions int retval = bind(client_fd, (const struct sockaddr *)sin, sin->sin_len);
331*4f1223e8SApple OSS Distributions
332*4f1223e8SApple OSS Distributions if (expected_error == 0) {
333*4f1223e8SApple OSS Distributions if (retval == 0) {
334*4f1223e8SApple OSS Distributions T_PASS("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == 0");
335*4f1223e8SApple OSS Distributions } else if (errno == EADDRNOTAVAIL || errno == EAGAIN) {
336*4f1223e8SApple OSS Distributions T_SKIP("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
337*4f1223e8SApple OSS Distributions } else {
338*4f1223e8SApple OSS Distributions T_FAIL("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
339*4f1223e8SApple OSS Distributions }
340*4f1223e8SApple OSS Distributions } else {
341*4f1223e8SApple OSS Distributions if (retval == 0) {
342*4f1223e8SApple OSS Distributions T_FAIL("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == 0, expected errno: %d - %s", expected_error, strerror(expected_error));
343*4f1223e8SApple OSS Distributions } else if (errno == expected_error) {
344*4f1223e8SApple OSS Distributions T_PASS("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1, expected errno: %d - %s", expected_error, strerror(expected_error));
345*4f1223e8SApple OSS Distributions } else if (errno == EADDRNOTAVAIL || errno == EAGAIN) {
346*4f1223e8SApple OSS Distributions T_SKIP("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
347*4f1223e8SApple OSS Distributions } else {
348*4f1223e8SApple OSS Distributions T_FAIL("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
349*4f1223e8SApple OSS Distributions }
350*4f1223e8SApple OSS Distributions }
351*4f1223e8SApple OSS Distributions return 0;
352*4f1223e8SApple OSS Distributions }
353*4f1223e8SApple OSS Distributions
354*4f1223e8SApple OSS Distributions static int
tcp_bind_v6(int client_fd,struct sockaddr_in6 * sin6,int expected_error)355*4f1223e8SApple OSS Distributions tcp_bind_v6(int client_fd, struct sockaddr_in6 *sin6, int expected_error)
356*4f1223e8SApple OSS Distributions {
357*4f1223e8SApple OSS Distributions int retval = bind(client_fd, (const struct sockaddr *)sin6, sin6->sin6_len);
358*4f1223e8SApple OSS Distributions
359*4f1223e8SApple OSS Distributions if (expected_error == 0) {
360*4f1223e8SApple OSS Distributions if (retval == 0) {
361*4f1223e8SApple OSS Distributions T_PASS("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == 0");
362*4f1223e8SApple OSS Distributions } else if (errno == EADDRNOTAVAIL || errno == EAGAIN) {
363*4f1223e8SApple OSS Distributions T_SKIP("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
364*4f1223e8SApple OSS Distributions } else {
365*4f1223e8SApple OSS Distributions T_FAIL("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
366*4f1223e8SApple OSS Distributions }
367*4f1223e8SApple OSS Distributions } else {
368*4f1223e8SApple OSS Distributions if (retval == 0) {
369*4f1223e8SApple OSS Distributions T_FAIL("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == 0, expected errno: %d - %s", expected_error, strerror(expected_error));
370*4f1223e8SApple OSS Distributions } else if (errno == expected_error) {
371*4f1223e8SApple OSS Distributions T_PASS("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1, expected errno: %d - %s", expected_error, strerror(expected_error));
372*4f1223e8SApple OSS Distributions } else if (errno == EADDRNOTAVAIL || errno == EAGAIN) {
373*4f1223e8SApple OSS Distributions T_SKIP("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
374*4f1223e8SApple OSS Distributions } else {
375*4f1223e8SApple OSS Distributions T_FAIL("bind(client_fd, (const struct sockaddr *)sin, sin->sin_len) == -1 errno: %d - %s", errno, strerror(errno));
376*4f1223e8SApple OSS Distributions }
377*4f1223e8SApple OSS Distributions }
378*4f1223e8SApple OSS Distributions return 0;
379*4f1223e8SApple OSS Distributions }
380*4f1223e8SApple OSS Distributions
381*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_loopback, "TCP bind with a IPv4 loopback address", T_META_TAG_VM_PREFERRED)
382*4f1223e8SApple OSS Distributions {
383*4f1223e8SApple OSS Distributions int s = -1;
384*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
385*4f1223e8SApple OSS Distributions
386*4f1223e8SApple OSS Distributions init_sin_address(&sin);
387*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr), 1, NULL);
388*4f1223e8SApple OSS Distributions
389*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
390*4f1223e8SApple OSS Distributions
391*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v4(s, &sin, 0), NULL);
392*4f1223e8SApple OSS Distributions
393*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
394*4f1223e8SApple OSS Distributions }
395*4f1223e8SApple OSS Distributions
396*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_loopback, "TCP connect with a IPv4 loopback address", T_META_TAG_VM_PREFERRED)
397*4f1223e8SApple OSS Distributions {
398*4f1223e8SApple OSS Distributions int s = -1;
399*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
400*4f1223e8SApple OSS Distributions
401*4f1223e8SApple OSS Distributions init_sin_address(&sin);
402*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr), 1, NULL);
403*4f1223e8SApple OSS Distributions
404*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
405*4f1223e8SApple OSS Distributions
406*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v4(s, &sin, 0), NULL);
407*4f1223e8SApple OSS Distributions
408*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
409*4f1223e8SApple OSS Distributions }
410*4f1223e8SApple OSS Distributions
411*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_multicast, "TCP bind with a IPv4 multicast address", T_META_TAG_VM_PREFERRED)
412*4f1223e8SApple OSS Distributions {
413*4f1223e8SApple OSS Distributions int s = -1;
414*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
415*4f1223e8SApple OSS Distributions
416*4f1223e8SApple OSS Distributions init_sin_address(&sin);
417*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "224.0.0.1", &sin.sin_addr), 1, NULL);
418*4f1223e8SApple OSS Distributions
419*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
420*4f1223e8SApple OSS Distributions
421*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v4(s, &sin, EAFNOSUPPORT), NULL);
422*4f1223e8SApple OSS Distributions
423*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
424*4f1223e8SApple OSS Distributions }
425*4f1223e8SApple OSS Distributions
426*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_multicast, "TCP connect with an IPv4 multicast address", T_META_TAG_VM_PREFERRED)
427*4f1223e8SApple OSS Distributions {
428*4f1223e8SApple OSS Distributions int s = -1;
429*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
430*4f1223e8SApple OSS Distributions
431*4f1223e8SApple OSS Distributions init_sin_address(&sin);
432*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "224.0.0.1", &sin.sin_addr), 1, NULL);
433*4f1223e8SApple OSS Distributions
434*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
435*4f1223e8SApple OSS Distributions
436*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v4(s, &sin, EAFNOSUPPORT), NULL);
437*4f1223e8SApple OSS Distributions
438*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
439*4f1223e8SApple OSS Distributions }
440*4f1223e8SApple OSS Distributions
441*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4__broadcast, "TCP bind with the IPv4 broadcast address", T_META_TAG_VM_PREFERRED)
442*4f1223e8SApple OSS Distributions {
443*4f1223e8SApple OSS Distributions int s = -1;
444*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
445*4f1223e8SApple OSS Distributions
446*4f1223e8SApple OSS Distributions init_sin_address(&sin);
447*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "255.255.255.255", &sin.sin_addr), 1, NULL);
448*4f1223e8SApple OSS Distributions
449*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
450*4f1223e8SApple OSS Distributions
451*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v4(s, &sin, EAFNOSUPPORT), NULL);
452*4f1223e8SApple OSS Distributions
453*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
454*4f1223e8SApple OSS Distributions }
455*4f1223e8SApple OSS Distributions
456*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4__broadcast, "TCP connect with the IPv4 broadcast address", T_META_TAG_VM_PREFERRED)
457*4f1223e8SApple OSS Distributions {
458*4f1223e8SApple OSS Distributions int s = -1;
459*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
460*4f1223e8SApple OSS Distributions
461*4f1223e8SApple OSS Distributions init_sin_address(&sin);
462*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "255.255.255.255", &sin.sin_addr), 1, NULL);
463*4f1223e8SApple OSS Distributions
464*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
465*4f1223e8SApple OSS Distributions
466*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v4(s, &sin, EAFNOSUPPORT), NULL);
467*4f1223e8SApple OSS Distributions
468*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
469*4f1223e8SApple OSS Distributions }
470*4f1223e8SApple OSS Distributions
471*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_null, "TCP bind with the null IPv4 address", T_META_TAG_VM_PREFERRED)
472*4f1223e8SApple OSS Distributions {
473*4f1223e8SApple OSS Distributions int s = -1;
474*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
475*4f1223e8SApple OSS Distributions
476*4f1223e8SApple OSS Distributions init_sin_address(&sin);
477*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "0.0.0.0", &sin.sin_addr), 1, NULL);
478*4f1223e8SApple OSS Distributions
479*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
480*4f1223e8SApple OSS Distributions
481*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v4(s, &sin, 0), NULL);
482*4f1223e8SApple OSS Distributions
483*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
484*4f1223e8SApple OSS Distributions }
485*4f1223e8SApple OSS Distributions
486*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_null, "TCP connect with the null IPv4 address", T_META_TAG_VM_PREFERRED)
487*4f1223e8SApple OSS Distributions {
488*4f1223e8SApple OSS Distributions int s = -1;
489*4f1223e8SApple OSS Distributions struct sockaddr_in sin = { 0 };
490*4f1223e8SApple OSS Distributions
491*4f1223e8SApple OSS Distributions init_sin_address(&sin);
492*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "0.0.0.0", &sin.sin_addr), 1, NULL);
493*4f1223e8SApple OSS Distributions
494*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
495*4f1223e8SApple OSS Distributions
496*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v4(s, &sin, 0), NULL);
497*4f1223e8SApple OSS Distributions
498*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
499*4f1223e8SApple OSS Distributions }
500*4f1223e8SApple OSS Distributions
501*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv6_loopback, "TCP bind with the IPv6 loopback address", T_META_TAG_VM_PREFERRED)
502*4f1223e8SApple OSS Distributions {
503*4f1223e8SApple OSS Distributions int s = -1;
504*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
505*4f1223e8SApple OSS Distributions
506*4f1223e8SApple OSS Distributions sin6.sin6_scope_id = if_nametoindex("lo0");
507*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
508*4f1223e8SApple OSS Distributions
509*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
510*4f1223e8SApple OSS Distributions
511*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
512*4f1223e8SApple OSS Distributions
513*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
514*4f1223e8SApple OSS Distributions
515*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
516*4f1223e8SApple OSS Distributions }
517*4f1223e8SApple OSS Distributions
518*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv6_loopback, "TCP connect with the IPv6 loopback address", T_META_TAG_VM_PREFERRED)
519*4f1223e8SApple OSS Distributions {
520*4f1223e8SApple OSS Distributions int s = -1;
521*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
522*4f1223e8SApple OSS Distributions
523*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
524*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
525*4f1223e8SApple OSS Distributions
526*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
527*4f1223e8SApple OSS Distributions
528*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
529*4f1223e8SApple OSS Distributions
530*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
531*4f1223e8SApple OSS Distributions }
532*4f1223e8SApple OSS Distributions
533*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv6_multicast, "TCP bind with a IPv6 multicast address", T_META_TAG_VM_PREFERRED)
534*4f1223e8SApple OSS Distributions {
535*4f1223e8SApple OSS Distributions int s = -1;
536*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
537*4f1223e8SApple OSS Distributions
538*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
539*4f1223e8SApple OSS Distributions sin6.sin6_scope_id = if_nametoindex("lo0");
540*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "ff01::1", &sin6.sin6_addr), 1, NULL);
541*4f1223e8SApple OSS Distributions
542*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
543*4f1223e8SApple OSS Distributions
544*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, EAFNOSUPPORT), NULL);
545*4f1223e8SApple OSS Distributions
546*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
547*4f1223e8SApple OSS Distributions }
548*4f1223e8SApple OSS Distributions
549*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv6_multicast, "TCP connect with a IPv6 multicast address", T_META_TAG_VM_PREFERRED)
550*4f1223e8SApple OSS Distributions {
551*4f1223e8SApple OSS Distributions int s = -1;
552*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
553*4f1223e8SApple OSS Distributions
554*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
555*4f1223e8SApple OSS Distributions sin6.sin6_scope_id = if_nametoindex("lo0");
556*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "ff01::1", &sin6.sin6_addr), 1, NULL);
557*4f1223e8SApple OSS Distributions
558*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
559*4f1223e8SApple OSS Distributions
560*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
561*4f1223e8SApple OSS Distributions
562*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
563*4f1223e8SApple OSS Distributions }
564*4f1223e8SApple OSS Distributions
565*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_null_ipv6, "TCP bind with the IPv6 null address", T_META_TAG_VM_PREFERRED)
566*4f1223e8SApple OSS Distributions {
567*4f1223e8SApple OSS Distributions int s = -1;
568*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
569*4f1223e8SApple OSS Distributions
570*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
571*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::", &sin6.sin6_addr), 1, NULL);
572*4f1223e8SApple OSS Distributions
573*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
574*4f1223e8SApple OSS Distributions
575*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
576*4f1223e8SApple OSS Distributions
577*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
578*4f1223e8SApple OSS Distributions }
579*4f1223e8SApple OSS Distributions
580*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_null_ipv6, "TCP connect with the IPv6 null address", T_META_TAG_VM_PREFERRED)
581*4f1223e8SApple OSS Distributions {
582*4f1223e8SApple OSS Distributions int s = -1;
583*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
584*4f1223e8SApple OSS Distributions
585*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
586*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::", &sin6.sin6_addr), 1, NULL);
587*4f1223e8SApple OSS Distributions
588*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
589*4f1223e8SApple OSS Distributions
590*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
591*4f1223e8SApple OSS Distributions
592*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
593*4f1223e8SApple OSS Distributions }
594*4f1223e8SApple OSS Distributions
595*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_multicast_mapped_ipv6, "TCP bind with IPv4 multicast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
596*4f1223e8SApple OSS Distributions {
597*4f1223e8SApple OSS Distributions int s = -1;
598*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
599*4f1223e8SApple OSS Distributions
600*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
601*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:224.0.0.1", &sin6.sin6_addr), 1, NULL);
602*4f1223e8SApple OSS Distributions
603*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
604*4f1223e8SApple OSS Distributions
605*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, EAFNOSUPPORT), NULL);
606*4f1223e8SApple OSS Distributions
607*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
608*4f1223e8SApple OSS Distributions }
609*4f1223e8SApple OSS Distributions
610*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_multicast_mapped_ipv6, "TCP connect with IPv4 multicast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
611*4f1223e8SApple OSS Distributions {
612*4f1223e8SApple OSS Distributions int s = -1;
613*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
614*4f1223e8SApple OSS Distributions
615*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
616*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:224.0.0.1", &sin6.sin6_addr), 1, NULL);
617*4f1223e8SApple OSS Distributions
618*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
619*4f1223e8SApple OSS Distributions
620*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
621*4f1223e8SApple OSS Distributions
622*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
623*4f1223e8SApple OSS Distributions }
624*4f1223e8SApple OSS Distributions
625*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_broadcast_mapped_ipv6, "TCP bind with IPv4 broadcast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
626*4f1223e8SApple OSS Distributions {
627*4f1223e8SApple OSS Distributions int s = -1;
628*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
629*4f1223e8SApple OSS Distributions
630*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
631*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:255.255.255.255", &sin6.sin6_addr), 1, NULL);
632*4f1223e8SApple OSS Distributions
633*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
634*4f1223e8SApple OSS Distributions
635*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, EAFNOSUPPORT), NULL);
636*4f1223e8SApple OSS Distributions
637*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
638*4f1223e8SApple OSS Distributions }
639*4f1223e8SApple OSS Distributions
640*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_broadcast_mapped_ipv6, "TCP connect with IPv4 broadcast mapped IPv6 address", T_META_TAG_VM_PREFERRED)
641*4f1223e8SApple OSS Distributions {
642*4f1223e8SApple OSS Distributions int s = -1;
643*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
644*4f1223e8SApple OSS Distributions
645*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
646*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:255.255.255.255", &sin6.sin6_addr), 1, NULL);
647*4f1223e8SApple OSS Distributions
648*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
649*4f1223e8SApple OSS Distributions
650*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
651*4f1223e8SApple OSS Distributions
652*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
653*4f1223e8SApple OSS Distributions }
654*4f1223e8SApple OSS Distributions
655*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_loobpack_mapped_ipv6, "TCP bind with IPv4 loopback mapped IPv6 address")
656*4f1223e8SApple OSS Distributions {
657*4f1223e8SApple OSS Distributions int s = -1;
658*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
659*4f1223e8SApple OSS Distributions
660*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
661*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
662*4f1223e8SApple OSS Distributions
663*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
664*4f1223e8SApple OSS Distributions
665*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
666*4f1223e8SApple OSS Distributions
667*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
668*4f1223e8SApple OSS Distributions }
669*4f1223e8SApple OSS Distributions
670*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_loobpack_mapped_ipv6, "TCP connect with IPv4 loopback mapped IPv6 address")
671*4f1223e8SApple OSS Distributions {
672*4f1223e8SApple OSS Distributions int s = -1;
673*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
674*4f1223e8SApple OSS Distributions
675*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
676*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
677*4f1223e8SApple OSS Distributions
678*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
679*4f1223e8SApple OSS Distributions
680*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
681*4f1223e8SApple OSS Distributions
682*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
683*4f1223e8SApple OSS Distributions }
684*4f1223e8SApple OSS Distributions
685*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_null_mapped_ipv6, "TCP bind with IPv4 null mapped IPv6 address", T_META_TAG_VM_PREFERRED)
686*4f1223e8SApple OSS Distributions {
687*4f1223e8SApple OSS Distributions int s = -1;
688*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
689*4f1223e8SApple OSS Distributions
690*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
691*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:0.0.0.0", &sin6.sin6_addr), 1, NULL);
692*4f1223e8SApple OSS Distributions
693*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
694*4f1223e8SApple OSS Distributions
695*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
696*4f1223e8SApple OSS Distributions
697*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
698*4f1223e8SApple OSS Distributions }
699*4f1223e8SApple OSS Distributions
700*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_null_mapped_ipv6, "TCP connect with IPv4 null mapped IPv6 address", T_META_TAG_VM_PREFERRED)
701*4f1223e8SApple OSS Distributions {
702*4f1223e8SApple OSS Distributions int s = -1;
703*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
704*4f1223e8SApple OSS Distributions
705*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
706*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:0.0.0.0", &sin6.sin6_addr), 1, NULL);
707*4f1223e8SApple OSS Distributions
708*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
709*4f1223e8SApple OSS Distributions
710*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
711*4f1223e8SApple OSS Distributions
712*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
713*4f1223e8SApple OSS Distributions }
714*4f1223e8SApple OSS Distributions
715*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_multicast_compatible_ipv6, "TCP bind with IPv4 multicast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
716*4f1223e8SApple OSS Distributions {
717*4f1223e8SApple OSS Distributions int s = -1;
718*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
719*4f1223e8SApple OSS Distributions
720*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
721*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::224.0.0.1", &sin6.sin6_addr), 1, NULL);
722*4f1223e8SApple OSS Distributions
723*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
724*4f1223e8SApple OSS Distributions
725*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
726*4f1223e8SApple OSS Distributions
727*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
728*4f1223e8SApple OSS Distributions }
729*4f1223e8SApple OSS Distributions
730*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_multicast_compatible_ipv6, "TCP connect with IPv4 multicast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
731*4f1223e8SApple OSS Distributions {
732*4f1223e8SApple OSS Distributions int s = -1;
733*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
734*4f1223e8SApple OSS Distributions
735*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
736*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::224.0.0.1", &sin6.sin6_addr), 1, NULL);
737*4f1223e8SApple OSS Distributions
738*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
739*4f1223e8SApple OSS Distributions
740*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
741*4f1223e8SApple OSS Distributions
742*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
743*4f1223e8SApple OSS Distributions }
744*4f1223e8SApple OSS Distributions
745*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_broadcast_compatible_ipv6, "TCP bind with IPv4 broadcast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
746*4f1223e8SApple OSS Distributions {
747*4f1223e8SApple OSS Distributions int s = -1;
748*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
749*4f1223e8SApple OSS Distributions
750*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
751*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::255.255.255.255", &sin6.sin6_addr), 1, NULL);
752*4f1223e8SApple OSS Distributions
753*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
754*4f1223e8SApple OSS Distributions
755*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
756*4f1223e8SApple OSS Distributions
757*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
758*4f1223e8SApple OSS Distributions }
759*4f1223e8SApple OSS Distributions
760*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_broadcast_compatible_ipv6, "TCP connect with IPv4 broadcast compatible IPv6 address", T_META_TAG_VM_PREFERRED)
761*4f1223e8SApple OSS Distributions {
762*4f1223e8SApple OSS Distributions int s = -1;
763*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
764*4f1223e8SApple OSS Distributions
765*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
766*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::255.255.255.255", &sin6.sin6_addr), 1, NULL);
767*4f1223e8SApple OSS Distributions
768*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
769*4f1223e8SApple OSS Distributions
770*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
771*4f1223e8SApple OSS Distributions
772*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
773*4f1223e8SApple OSS Distributions }
774*4f1223e8SApple OSS Distributions
775*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_null_compatible_ipv6, "TCP bind with IPv4 null compatible IPv6 address", T_META_TAG_VM_PREFERRED)
776*4f1223e8SApple OSS Distributions {
777*4f1223e8SApple OSS Distributions int s = -1;
778*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
779*4f1223e8SApple OSS Distributions
780*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
781*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::0.0.0.0", &sin6.sin6_addr), 1, NULL);
782*4f1223e8SApple OSS Distributions
783*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
784*4f1223e8SApple OSS Distributions
785*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
786*4f1223e8SApple OSS Distributions
787*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
788*4f1223e8SApple OSS Distributions }
789*4f1223e8SApple OSS Distributions
790*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_null_compatible_ipv6, "TCP connect with IPv4 null compatible IPv6 address", T_META_TAG_VM_PREFERRED)
791*4f1223e8SApple OSS Distributions {
792*4f1223e8SApple OSS Distributions int s = -1;
793*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
794*4f1223e8SApple OSS Distributions
795*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
796*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::0.0.0.0", &sin6.sin6_addr), 1, NULL);
797*4f1223e8SApple OSS Distributions
798*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
799*4f1223e8SApple OSS Distributions
800*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
801*4f1223e8SApple OSS Distributions
802*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
803*4f1223e8SApple OSS Distributions }
804*4f1223e8SApple OSS Distributions
805*4f1223e8SApple OSS Distributions T_DECL(tcp_connect_ipv4_mapped_ipv6_r77991079, "rdar://77991079", T_META_TAG_VM_PREFERRED)
806*4f1223e8SApple OSS Distributions {
807*4f1223e8SApple OSS Distributions int s = -1;
808*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
809*4f1223e8SApple OSS Distributions
810*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
811*4f1223e8SApple OSS Distributions
812*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
813*4f1223e8SApple OSS Distributions sin6.sin6_port = htons(20001);
814*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:0.0.0.5", &sin6.sin6_addr), 1, NULL);
815*4f1223e8SApple OSS Distributions sin6.sin6_scope_id = (uint32_t)-1;
816*4f1223e8SApple OSS Distributions
817*4f1223e8SApple OSS Distributions connect(s, (struct sockaddr *)&sin6, sizeof(struct sockaddr_in6));
818*4f1223e8SApple OSS Distributions
819*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::", &sin6.sin6_addr), 1, NULL);
820*4f1223e8SApple OSS Distributions sin6.sin6_scope_id = 0xff;
821*4f1223e8SApple OSS Distributions
822*4f1223e8SApple OSS Distributions connect(s, (struct sockaddr *)&sin6, sizeof(struct sockaddr_in6));
823*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
824*4f1223e8SApple OSS Distributions }
825*4f1223e8SApple OSS Distributions
826*4f1223e8SApple OSS Distributions T_DECL(tcp_connectx_ipv4_loopback, "TCP connectx with the IPv6 loopback address", T_META_TAG_VM_PREFERRED)
827*4f1223e8SApple OSS Distributions {
828*4f1223e8SApple OSS Distributions int s = -1;
829*4f1223e8SApple OSS Distributions struct sockaddr_in sin_dst = { 0 };
830*4f1223e8SApple OSS Distributions
831*4f1223e8SApple OSS Distributions init_sin_address(&sin_dst);
832*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "127.0.0.1", &sin_dst.sin_addr), 1, NULL);
833*4f1223e8SApple OSS Distributions
834*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
835*4f1223e8SApple OSS Distributions
836*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connectx_v4(s, &sin_dst, NULL, 0), NULL);
837*4f1223e8SApple OSS Distributions
838*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
839*4f1223e8SApple OSS Distributions }
840*4f1223e8SApple OSS Distributions
841*4f1223e8SApple OSS Distributions T_DECL(tcp_connectx_ipv6_loopback, "TCP connectx with the IPv6 loopback address", T_META_TAG_VM_PREFERRED)
842*4f1223e8SApple OSS Distributions {
843*4f1223e8SApple OSS Distributions int s = -1;
844*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 };
845*4f1223e8SApple OSS Distributions
846*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_dst);
847*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL);
848*4f1223e8SApple OSS Distributions
849*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
850*4f1223e8SApple OSS Distributions
851*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connectx_v6(s, &sin6_dst, NULL, 0), NULL);
852*4f1223e8SApple OSS Distributions
853*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
854*4f1223e8SApple OSS Distributions }
855*4f1223e8SApple OSS Distributions
856*4f1223e8SApple OSS Distributions T_DECL(tcp_connectx_ipv6_loopback_src_port, "TCP connectx with the IPv6 loopback address with a source port", T_META_TAG_VM_PREFERRED)
857*4f1223e8SApple OSS Distributions {
858*4f1223e8SApple OSS Distributions int s = -1;
859*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 };
860*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6_src = { 0 };
861*4f1223e8SApple OSS Distributions
862*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_dst);
863*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL);
864*4f1223e8SApple OSS Distributions
865*4f1223e8SApple OSS Distributions init_sin6_address(&sin6_src);
866*4f1223e8SApple OSS Distributions sin6_src.sin6_port = htons(12345);
867*4f1223e8SApple OSS Distributions
868*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
869*4f1223e8SApple OSS Distributions
870*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connectx_v6(s, &sin6_dst, &sin6_src, 0), NULL);
871*4f1223e8SApple OSS Distributions
872*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
873*4f1223e8SApple OSS Distributions }
874*4f1223e8SApple OSS Distributions
875*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_mapped_connect_pv4_mapped, "TCP bind IPv4 mapped IPv6 address and connect to IPv4 mapped IPv6 address", T_META_TAG_VM_PREFERRED)
876*4f1223e8SApple OSS Distributions {
877*4f1223e8SApple OSS Distributions int s = -1;
878*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
879*4f1223e8SApple OSS Distributions
880*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
881*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
882*4f1223e8SApple OSS Distributions
883*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
884*4f1223e8SApple OSS Distributions
885*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
886*4f1223e8SApple OSS Distributions
887*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
888*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
889*4f1223e8SApple OSS Distributions
890*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
891*4f1223e8SApple OSS Distributions
892*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
893*4f1223e8SApple OSS Distributions }
894*4f1223e8SApple OSS Distributions
895*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv6_connect_pv6, "TCP bind IPv6 address and connect IPv6 address", T_META_TAG_VM_PREFERRED)
896*4f1223e8SApple OSS Distributions {
897*4f1223e8SApple OSS Distributions int s = -1;
898*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
899*4f1223e8SApple OSS Distributions
900*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
901*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
902*4f1223e8SApple OSS Distributions
903*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
904*4f1223e8SApple OSS Distributions
905*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
906*4f1223e8SApple OSS Distributions
907*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
908*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
909*4f1223e8SApple OSS Distributions
910*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, 0), NULL);
911*4f1223e8SApple OSS Distributions
912*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
913*4f1223e8SApple OSS Distributions }
914*4f1223e8SApple OSS Distributions
915*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv4_mapped_connect_ipv6, "TCP bind IPv4 mapped IPv6 address and connect IPv6 address", T_META_TAG_VM_PREFERRED)
916*4f1223e8SApple OSS Distributions {
917*4f1223e8SApple OSS Distributions int s = -1;
918*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
919*4f1223e8SApple OSS Distributions
920*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
921*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
922*4f1223e8SApple OSS Distributions
923*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
924*4f1223e8SApple OSS Distributions
925*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
926*4f1223e8SApple OSS Distributions
927*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
928*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
929*4f1223e8SApple OSS Distributions
930*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
931*4f1223e8SApple OSS Distributions
932*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
933*4f1223e8SApple OSS Distributions }
934*4f1223e8SApple OSS Distributions
935*4f1223e8SApple OSS Distributions T_DECL(tcp_bind_ipv6_connect_ipv4_mapped, "TCP bind Pv6 address and connect IPv4 mapped IPv6 address", T_META_TAG_VM_PREFERRED)
936*4f1223e8SApple OSS Distributions {
937*4f1223e8SApple OSS Distributions int s = -1;
938*4f1223e8SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 };
939*4f1223e8SApple OSS Distributions
940*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
941*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
942*4f1223e8SApple OSS Distributions
943*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
944*4f1223e8SApple OSS Distributions
945*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_bind_v6(s, &sin6, 0), NULL);
946*4f1223e8SApple OSS Distributions
947*4f1223e8SApple OSS Distributions init_sin6_address(&sin6);
948*4f1223e8SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL);
949*4f1223e8SApple OSS Distributions
950*4f1223e8SApple OSS Distributions T_EXPECT_NULL(tcp_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
951*4f1223e8SApple OSS Distributions
952*4f1223e8SApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
953*4f1223e8SApple OSS Distributions }
954