1*2c2f96dcSApple OSS Distributions /*
2*2c2f96dcSApple OSS Distributions * Copyright (c) 2022 Apple Inc. All rights reserved.
3*2c2f96dcSApple OSS Distributions *
4*2c2f96dcSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*2c2f96dcSApple OSS Distributions *
6*2c2f96dcSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*2c2f96dcSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*2c2f96dcSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*2c2f96dcSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*2c2f96dcSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*2c2f96dcSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*2c2f96dcSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*2c2f96dcSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*2c2f96dcSApple OSS Distributions *
15*2c2f96dcSApple OSS Distributions * Please obtain a copy of the License at
16*2c2f96dcSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*2c2f96dcSApple OSS Distributions *
18*2c2f96dcSApple OSS Distributions * The Original Code and all software distributed under the License are
19*2c2f96dcSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*2c2f96dcSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*2c2f96dcSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*2c2f96dcSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*2c2f96dcSApple OSS Distributions * Please see the License for the specific language governing rights and
24*2c2f96dcSApple OSS Distributions * limitations under the License.
25*2c2f96dcSApple OSS Distributions *
26*2c2f96dcSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*2c2f96dcSApple OSS Distributions */
28*2c2f96dcSApple OSS Distributions
29*2c2f96dcSApple OSS Distributions #include <sys/fcntl.h>
30*2c2f96dcSApple OSS Distributions #include <sys/socket.h>
31*2c2f96dcSApple OSS Distributions #include <net/if.h>
32*2c2f96dcSApple OSS Distributions #include <netinet/in.h>
33*2c2f96dcSApple OSS Distributions #include <netinet/tcp.h>
34*2c2f96dcSApple OSS Distributions #include <arpa/inet.h>
35*2c2f96dcSApple OSS Distributions
36*2c2f96dcSApple OSS Distributions #include <darwintest.h>
37*2c2f96dcSApple OSS Distributions #include <string.h>
38*2c2f96dcSApple OSS Distributions #include <unistd.h>
39*2c2f96dcSApple OSS Distributions
40*2c2f96dcSApple OSS Distributions #define MAX_IPv6_STR_LEN 64
41*2c2f96dcSApple OSS Distributions
42*2c2f96dcSApple OSS Distributions static char l_addr_str[MAX_IPv6_STR_LEN];
43*2c2f96dcSApple OSS Distributions static char f_addr_str[MAX_IPv6_STR_LEN];
44*2c2f96dcSApple OSS Distributions
45*2c2f96dcSApple OSS Distributions const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
46*2c2f96dcSApple OSS Distributions #define s6_addr32 __u6_addr.__u6_addr32
47*2c2f96dcSApple OSS Distributions
48*2c2f96dcSApple OSS Distributions static void
init_sin_address(struct sockaddr_in * sin)49*2c2f96dcSApple OSS Distributions init_sin_address(struct sockaddr_in *sin)
50*2c2f96dcSApple OSS Distributions {
51*2c2f96dcSApple OSS Distributions memset(sin, 0, sizeof(struct sockaddr_in));
52*2c2f96dcSApple OSS Distributions sin->sin_len = sizeof(struct sockaddr_in);
53*2c2f96dcSApple OSS Distributions sin->sin_family = AF_INET;
54*2c2f96dcSApple OSS Distributions }
55*2c2f96dcSApple OSS Distributions
56*2c2f96dcSApple OSS Distributions static void
init_sin6_address(struct sockaddr_in6 * sin6)57*2c2f96dcSApple OSS Distributions init_sin6_address(struct sockaddr_in6 *sin6)
58*2c2f96dcSApple OSS Distributions {
59*2c2f96dcSApple OSS Distributions memset(sin6, 0, sizeof(struct sockaddr_in6));
60*2c2f96dcSApple OSS Distributions sin6->sin6_len = sizeof(struct sockaddr_in6);
61*2c2f96dcSApple OSS Distributions sin6->sin6_family = AF_INET6;
62*2c2f96dcSApple OSS Distributions }
63*2c2f96dcSApple OSS Distributions
64*2c2f96dcSApple OSS Distributions static int
tcp_send_implied_connect_v4(int client_fd,struct sockaddr_in * sin_to,int expected_error)65*2c2f96dcSApple OSS Distributions tcp_send_implied_connect_v4(int client_fd, struct sockaddr_in *sin_to, int expected_error)
66*2c2f96dcSApple OSS Distributions {
67*2c2f96dcSApple OSS Distributions int listen_fd = -1;
68*2c2f96dcSApple OSS Distributions socklen_t socklen;
69*2c2f96dcSApple OSS Distributions int val = 10;
70*2c2f96dcSApple OSS Distributions struct sockaddr_in sin_local = {};
71*2c2f96dcSApple OSS Distributions struct sockaddr_in sin_peer = {};
72*2c2f96dcSApple OSS Distributions struct sockaddr_in sin;
73*2c2f96dcSApple OSS Distributions
74*2c2f96dcSApple OSS Distributions init_sin_address(&sin);
75*2c2f96dcSApple OSS Distributions init_sin_address(&sin_local);
76*2c2f96dcSApple OSS Distributions init_sin_address(&sin_peer);
77*2c2f96dcSApple OSS Distributions
78*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
79*2c2f96dcSApple OSS Distributions
80*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin)), NULL);
81*2c2f96dcSApple OSS Distributions
82*2c2f96dcSApple OSS Distributions socklen = sizeof(sin);
83*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin, &socklen), NULL);
84*2c2f96dcSApple OSS Distributions
85*2c2f96dcSApple OSS Distributions T_LOG("listening on port: %u", ntohs(sin.sin_port));
86*2c2f96dcSApple OSS Distributions sin_to->sin_port = sin.sin_port;
87*2c2f96dcSApple OSS Distributions
88*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen(listen_fd, 10), NULL);
89*2c2f96dcSApple OSS Distributions
90*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(client_fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &val, sizeof(val)), NULL);
91*2c2f96dcSApple OSS Distributions
92*2c2f96dcSApple OSS Distributions T_LOG("sendmsg with sin_len: %u sin_family: %u sin_port: %u sin_addr: 0x%08x expected_error: %d",
93*2c2f96dcSApple OSS Distributions sin_to->sin_len, sin_to->sin_family, ntohs(sin_to->sin_port), ntohl(sin_to->sin_addr.s_addr), expected_error);
94*2c2f96dcSApple OSS Distributions
95*2c2f96dcSApple OSS Distributions struct iovec iovec = { .iov_base = "", .iov_len = 0 };
96*2c2f96dcSApple OSS Distributions struct msghdr msg = {};
97*2c2f96dcSApple OSS Distributions struct cmsghdr *cmsghdrp;
98*2c2f96dcSApple OSS Distributions char buf[CMSG_SPACE(sizeof(int))];
99*2c2f96dcSApple OSS Distributions
100*2c2f96dcSApple OSS Distributions msg.msg_name = sin_to;
101*2c2f96dcSApple OSS Distributions msg.msg_namelen = sin_to->sin_len;
102*2c2f96dcSApple OSS Distributions msg.msg_iov = &iovec;
103*2c2f96dcSApple OSS Distributions msg.msg_iovlen = 1;
104*2c2f96dcSApple OSS Distributions msg.msg_control = buf;
105*2c2f96dcSApple OSS Distributions msg.msg_controllen = CMSG_SPACE(sizeof(int));
106*2c2f96dcSApple OSS Distributions
107*2c2f96dcSApple OSS Distributions cmsghdrp = CMSG_FIRSTHDR(&msg);
108*2c2f96dcSApple OSS Distributions cmsghdrp->cmsg_len = CMSG_LEN(sizeof(int));
109*2c2f96dcSApple OSS Distributions cmsghdrp->cmsg_level = SOL_SOCKET;
110*2c2f96dcSApple OSS Distributions cmsghdrp->cmsg_type = SCM_RIGHTS;
111*2c2f96dcSApple OSS Distributions
112*2c2f96dcSApple OSS Distributions memcpy(CMSG_DATA(cmsghdrp), &client_fd, sizeof(client_fd));
113*2c2f96dcSApple OSS Distributions
114*2c2f96dcSApple OSS Distributions ssize_t retval = sendmsg(client_fd, &msg, 0);
115*2c2f96dcSApple OSS Distributions
116*2c2f96dcSApple OSS Distributions if (expected_error == 0) {
117*2c2f96dcSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(retval, "sendmsg(client_fd, &msg, 0)");
118*2c2f96dcSApple OSS Distributions } else {
119*2c2f96dcSApple OSS Distributions T_EXPECT_POSIX_FAILURE(retval, expected_error, "sendmsg(client_fd, &msg, 0)");
120*2c2f96dcSApple OSS Distributions }
121*2c2f96dcSApple OSS Distributions
122*2c2f96dcSApple OSS Distributions if (retval == 0) {
123*2c2f96dcSApple OSS Distributions socklen = sizeof(sin_local);
124*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin_local, &socklen), NULL);
125*2c2f96dcSApple OSS Distributions (void)inet_ntop(AF_INET, &sin_local.sin_addr, l_addr_str, sizeof(l_addr_str));
126*2c2f96dcSApple OSS Distributions
127*2c2f96dcSApple OSS Distributions socklen = sizeof(sin_peer);
128*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin_peer, &socklen), NULL);
129*2c2f96dcSApple OSS Distributions (void)inet_ntop(AF_INET, &sin_peer.sin_addr, f_addr_str, sizeof(f_addr_str));
130*2c2f96dcSApple OSS Distributions
131*2c2f96dcSApple OSS Distributions T_LOG("connected from %s:%u to %s:%u",
132*2c2f96dcSApple OSS Distributions l_addr_str, ntohs(sin_local.sin_port),
133*2c2f96dcSApple OSS Distributions f_addr_str, ntohs(sin_peer.sin_port));
134*2c2f96dcSApple OSS Distributions }
135*2c2f96dcSApple OSS Distributions
136*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
137*2c2f96dcSApple OSS Distributions
138*2c2f96dcSApple OSS Distributions return 0;
139*2c2f96dcSApple OSS Distributions }
140*2c2f96dcSApple OSS Distributions
141*2c2f96dcSApple OSS Distributions static int
tcp_send_implied_connect_v6(int client_fd,struct sockaddr_in6 * sin6_to,int expected_error)142*2c2f96dcSApple OSS Distributions tcp_send_implied_connect_v6(int client_fd, struct sockaddr_in6 *sin6_to, int expected_error)
143*2c2f96dcSApple OSS Distributions {
144*2c2f96dcSApple OSS Distributions int listen_fd = -1;
145*2c2f96dcSApple OSS Distributions socklen_t socklen;
146*2c2f96dcSApple OSS Distributions int off = 0;
147*2c2f96dcSApple OSS Distributions int val = 10;
148*2c2f96dcSApple OSS Distributions struct iovec iovec = { .iov_base = "", .iov_len = 0 };
149*2c2f96dcSApple OSS Distributions struct msghdr msg = {};
150*2c2f96dcSApple OSS Distributions struct cmsghdr *cmsghdrp;
151*2c2f96dcSApple OSS Distributions char buf[CMSG_SPACE(sizeof(int))];
152*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6_local = {};
153*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6_peer = {};
154*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6;
155*2c2f96dcSApple OSS Distributions
156*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
157*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6_local);
158*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6_peer);
159*2c2f96dcSApple OSS Distributions
160*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
161*2c2f96dcSApple OSS Distributions
162*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(listen_fd, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)), NULL);
163*2c2f96dcSApple OSS Distributions
164*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(bind(listen_fd, (struct sockaddr *)&sin6, sizeof(sin6)), NULL);
165*2c2f96dcSApple OSS Distributions
166*2c2f96dcSApple OSS Distributions socklen = sizeof(sin6);
167*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(listen_fd, (struct sockaddr *)&sin6, &socklen), NULL);
168*2c2f96dcSApple OSS Distributions
169*2c2f96dcSApple OSS Distributions T_LOG("listening on port: %u", ntohs(sin6.sin6_port));
170*2c2f96dcSApple OSS Distributions sin6_to->sin6_port = sin6.sin6_port;
171*2c2f96dcSApple OSS Distributions
172*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(listen(listen_fd, 10), NULL);
173*2c2f96dcSApple OSS Distributions
174*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(setsockopt(client_fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &val, sizeof(val)), NULL);
175*2c2f96dcSApple OSS Distributions
176*2c2f96dcSApple OSS Distributions msg.msg_name = sin6_to;
177*2c2f96dcSApple OSS Distributions msg.msg_namelen = sin6_to->sin6_len;
178*2c2f96dcSApple OSS Distributions msg.msg_iov = &iovec;
179*2c2f96dcSApple OSS Distributions msg.msg_iovlen = 1;
180*2c2f96dcSApple OSS Distributions msg.msg_control = buf;
181*2c2f96dcSApple OSS Distributions msg.msg_controllen = CMSG_SPACE(sizeof(int));
182*2c2f96dcSApple OSS Distributions
183*2c2f96dcSApple OSS Distributions cmsghdrp = CMSG_FIRSTHDR(&msg);
184*2c2f96dcSApple OSS Distributions cmsghdrp->cmsg_len = CMSG_LEN(sizeof(int));
185*2c2f96dcSApple OSS Distributions cmsghdrp->cmsg_level = SOL_SOCKET;
186*2c2f96dcSApple OSS Distributions cmsghdrp->cmsg_type = SCM_RIGHTS;
187*2c2f96dcSApple OSS Distributions
188*2c2f96dcSApple OSS Distributions memcpy(CMSG_DATA(cmsghdrp), &client_fd, sizeof(client_fd));
189*2c2f96dcSApple OSS Distributions
190*2c2f96dcSApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_to->sin6_addr, l_addr_str, sizeof(l_addr_str));
191*2c2f96dcSApple OSS Distributions
192*2c2f96dcSApple OSS Distributions T_LOG("sendmsg with sin6_len: %u sin6_family: %u sin6_port: %u sin6_addr: %s expected_error: %d",
193*2c2f96dcSApple OSS Distributions sin6_to->sin6_len, sin6_to->sin6_family, ntohs(sin6_to->sin6_port), l_addr_str, expected_error);
194*2c2f96dcSApple OSS Distributions
195*2c2f96dcSApple OSS Distributions ssize_t retval = sendmsg(client_fd, &msg, 0);
196*2c2f96dcSApple OSS Distributions
197*2c2f96dcSApple OSS Distributions if (expected_error == 0) {
198*2c2f96dcSApple OSS Distributions T_EXPECT_POSIX_SUCCESS(retval, "sendmsg(client_fd, &msg, 0)");
199*2c2f96dcSApple OSS Distributions } else {
200*2c2f96dcSApple OSS Distributions T_EXPECT_POSIX_FAILURE(retval, expected_error, "sendmsg(client_fd, &msg, 0)");
201*2c2f96dcSApple OSS Distributions }
202*2c2f96dcSApple OSS Distributions
203*2c2f96dcSApple OSS Distributions if (retval == 0) {
204*2c2f96dcSApple OSS Distributions socklen = sizeof(sin6_local);
205*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getsockname(client_fd, (struct sockaddr *)&sin6_local, &socklen), NULL);
206*2c2f96dcSApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_local.sin6_addr, l_addr_str, sizeof(l_addr_str));
207*2c2f96dcSApple OSS Distributions
208*2c2f96dcSApple OSS Distributions socklen = sizeof(sin6_peer);
209*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(getpeername(client_fd, (struct sockaddr *)&sin6_peer, &socklen), NULL);
210*2c2f96dcSApple OSS Distributions (void)inet_ntop(AF_INET6, &sin6_peer.sin6_addr, f_addr_str, sizeof(f_addr_str));
211*2c2f96dcSApple OSS Distributions
212*2c2f96dcSApple OSS Distributions T_LOG("connected from %s:%u to %s:%u",
213*2c2f96dcSApple OSS Distributions l_addr_str, ntohs(sin6_local.sin6_port),
214*2c2f96dcSApple OSS Distributions f_addr_str, ntohs(sin6_peer.sin6_port));
215*2c2f96dcSApple OSS Distributions }
216*2c2f96dcSApple OSS Distributions
217*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(listen_fd), NULL);
218*2c2f96dcSApple OSS Distributions
219*2c2f96dcSApple OSS Distributions return 0;
220*2c2f96dcSApple OSS Distributions }
221*2c2f96dcSApple OSS Distributions
222*2c2f96dcSApple OSS Distributions
223*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_loopback, "TCP send implied connect with a IPv4 loopback address")
224*2c2f96dcSApple OSS Distributions {
225*2c2f96dcSApple OSS Distributions int s = -1;
226*2c2f96dcSApple OSS Distributions struct sockaddr_in sin = {};
227*2c2f96dcSApple OSS Distributions
228*2c2f96dcSApple OSS Distributions init_sin_address(&sin);
229*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr), 1, NULL);
230*2c2f96dcSApple OSS Distributions
231*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
232*2c2f96dcSApple OSS Distributions
233*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v4(s, &sin, 0), NULL);
234*2c2f96dcSApple OSS Distributions
235*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
236*2c2f96dcSApple OSS Distributions }
237*2c2f96dcSApple OSS Distributions
238*2c2f96dcSApple OSS Distributions
239*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_multicast, "TCP send implied connect with an IPv4 multicast address")
240*2c2f96dcSApple OSS Distributions {
241*2c2f96dcSApple OSS Distributions int s = -1;
242*2c2f96dcSApple OSS Distributions struct sockaddr_in sin = {};
243*2c2f96dcSApple OSS Distributions
244*2c2f96dcSApple OSS Distributions init_sin_address(&sin);
245*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "224.0.0.1", &sin.sin_addr), 1, NULL);
246*2c2f96dcSApple OSS Distributions
247*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
248*2c2f96dcSApple OSS Distributions
249*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v4(s, &sin, EAFNOSUPPORT), NULL);
250*2c2f96dcSApple OSS Distributions
251*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
252*2c2f96dcSApple OSS Distributions }
253*2c2f96dcSApple OSS Distributions
254*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4__broadcast, "TCP send implied connect with the IPv4 broadcast address")
255*2c2f96dcSApple OSS Distributions {
256*2c2f96dcSApple OSS Distributions int s = -1;
257*2c2f96dcSApple OSS Distributions struct sockaddr_in sin = {};
258*2c2f96dcSApple OSS Distributions
259*2c2f96dcSApple OSS Distributions init_sin_address(&sin);
260*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "255.255.255.255", &sin.sin_addr), 1, NULL);
261*2c2f96dcSApple OSS Distributions
262*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
263*2c2f96dcSApple OSS Distributions
264*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v4(s, &sin, EAFNOSUPPORT), NULL);
265*2c2f96dcSApple OSS Distributions
266*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
267*2c2f96dcSApple OSS Distributions }
268*2c2f96dcSApple OSS Distributions
269*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_null, "TCP send implied connect with the null IPv4 address")
270*2c2f96dcSApple OSS Distributions {
271*2c2f96dcSApple OSS Distributions int s = -1;
272*2c2f96dcSApple OSS Distributions struct sockaddr_in sin = {};
273*2c2f96dcSApple OSS Distributions
274*2c2f96dcSApple OSS Distributions init_sin_address(&sin);
275*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET, "0.0.0.0", &sin.sin_addr), 1, NULL);
276*2c2f96dcSApple OSS Distributions
277*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), NULL);
278*2c2f96dcSApple OSS Distributions
279*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v4(s, &sin, 0), NULL);
280*2c2f96dcSApple OSS Distributions
281*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
282*2c2f96dcSApple OSS Distributions }
283*2c2f96dcSApple OSS Distributions
284*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv6_loopback, "TCP send implied connect with the IPv6 loopback address")
285*2c2f96dcSApple OSS Distributions {
286*2c2f96dcSApple OSS Distributions int s = -1;
287*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
288*2c2f96dcSApple OSS Distributions
289*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
290*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL);
291*2c2f96dcSApple OSS Distributions
292*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
293*2c2f96dcSApple OSS Distributions
294*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, 0), NULL);
295*2c2f96dcSApple OSS Distributions
296*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
297*2c2f96dcSApple OSS Distributions }
298*2c2f96dcSApple OSS Distributions
299*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv6_multicast, "TCP send implied connect with a IPv6 multicast address")
300*2c2f96dcSApple OSS Distributions {
301*2c2f96dcSApple OSS Distributions int s = -1;
302*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
303*2c2f96dcSApple OSS Distributions
304*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
305*2c2f96dcSApple OSS Distributions sin6.sin6_scope_id = if_nametoindex("lo0");
306*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "ff01::1", &sin6.sin6_addr), 1, NULL);
307*2c2f96dcSApple OSS Distributions
308*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
309*2c2f96dcSApple OSS Distributions
310*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
311*2c2f96dcSApple OSS Distributions
312*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
313*2c2f96dcSApple OSS Distributions }
314*2c2f96dcSApple OSS Distributions
315*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_null_ipv6, "TCP send implied connect with the IPv6 null address")
316*2c2f96dcSApple OSS Distributions {
317*2c2f96dcSApple OSS Distributions int s = -1;
318*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
319*2c2f96dcSApple OSS Distributions
320*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
321*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::", &sin6.sin6_addr), 1, NULL);
322*2c2f96dcSApple OSS Distributions
323*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
324*2c2f96dcSApple OSS Distributions
325*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, 0), NULL);
326*2c2f96dcSApple OSS Distributions
327*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
328*2c2f96dcSApple OSS Distributions }
329*2c2f96dcSApple OSS Distributions
330*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_multicast_mapped_ipv6, "TCP send implied connect with IPv4 multicast mapped IPv6 address")
331*2c2f96dcSApple OSS Distributions {
332*2c2f96dcSApple OSS Distributions int s = -1;
333*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
334*2c2f96dcSApple OSS Distributions
335*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
336*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:224.0.0.1", &sin6.sin6_addr), 1, NULL);
337*2c2f96dcSApple OSS Distributions
338*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
339*2c2f96dcSApple OSS Distributions
340*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
341*2c2f96dcSApple OSS Distributions
342*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
343*2c2f96dcSApple OSS Distributions }
344*2c2f96dcSApple OSS Distributions
345*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_broadcast_mapped_ipv6, "TCP send implied connect with IPv4 broadcast mapped IPv6 address")
346*2c2f96dcSApple OSS Distributions {
347*2c2f96dcSApple OSS Distributions int s = -1;
348*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
349*2c2f96dcSApple OSS Distributions
350*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
351*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:255.255.255.255", &sin6.sin6_addr), 1, NULL);
352*2c2f96dcSApple OSS Distributions
353*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
354*2c2f96dcSApple OSS Distributions
355*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
356*2c2f96dcSApple OSS Distributions
357*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
358*2c2f96dcSApple OSS Distributions }
359*2c2f96dcSApple OSS Distributions
360*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_null_mapped_ipv6, "TCP send implied connect with IPv4 null mapped IPv6 address")
361*2c2f96dcSApple OSS Distributions {
362*2c2f96dcSApple OSS Distributions int s = -1;
363*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
364*2c2f96dcSApple OSS Distributions
365*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
366*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:0.0.0.0", &sin6.sin6_addr), 1, NULL);
367*2c2f96dcSApple OSS Distributions
368*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
369*2c2f96dcSApple OSS Distributions
370*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, 0), NULL);
371*2c2f96dcSApple OSS Distributions
372*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
373*2c2f96dcSApple OSS Distributions }
374*2c2f96dcSApple OSS Distributions
375*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_multicast_compatible_ipv6, "TCP send implied connect with IPv4 multicast compatible IPv6 address")
376*2c2f96dcSApple OSS Distributions {
377*2c2f96dcSApple OSS Distributions int s = -1;
378*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
379*2c2f96dcSApple OSS Distributions
380*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
381*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::224.0.0.1", &sin6.sin6_addr), 1, NULL);
382*2c2f96dcSApple OSS Distributions
383*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
384*2c2f96dcSApple OSS Distributions
385*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
386*2c2f96dcSApple OSS Distributions
387*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
388*2c2f96dcSApple OSS Distributions }
389*2c2f96dcSApple OSS Distributions
390*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_broadcast_compatible_ipv6, "TCP send implied connect with IPv4 broadcast compatible IPv6 address")
391*2c2f96dcSApple OSS Distributions {
392*2c2f96dcSApple OSS Distributions int s = -1;
393*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
394*2c2f96dcSApple OSS Distributions
395*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
396*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::255.255.255.255", &sin6.sin6_addr), 1, NULL);
397*2c2f96dcSApple OSS Distributions
398*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
399*2c2f96dcSApple OSS Distributions
400*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, EAFNOSUPPORT), NULL);
401*2c2f96dcSApple OSS Distributions
402*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
403*2c2f96dcSApple OSS Distributions }
404*2c2f96dcSApple OSS Distributions
405*2c2f96dcSApple OSS Distributions T_DECL(tcp_send_implied_connect_ipv4_null_compatible_ipv6, "TCP send implied connect with IPv4 null compatible IPv6 address")
406*2c2f96dcSApple OSS Distributions {
407*2c2f96dcSApple OSS Distributions int s = -1;
408*2c2f96dcSApple OSS Distributions struct sockaddr_in6 sin6 = {};
409*2c2f96dcSApple OSS Distributions
410*2c2f96dcSApple OSS Distributions init_sin6_address(&sin6);
411*2c2f96dcSApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::0.0.0.0", &sin6.sin6_addr), 1, NULL);
412*2c2f96dcSApple OSS Distributions
413*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), NULL);
414*2c2f96dcSApple OSS Distributions
415*2c2f96dcSApple OSS Distributions T_EXPECT_NULL(tcp_send_implied_connect_v6(s, &sin6, 0), NULL);
416*2c2f96dcSApple OSS Distributions
417*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(close(s), NULL);
418*2c2f96dcSApple OSS Distributions }
419