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