1*43a90889SApple OSS Distributions /* 2*43a90889SApple OSS Distributions * Copyright (c) 2023-2024 Apple Inc. All rights reserved. 3*43a90889SApple OSS Distributions * 4*43a90889SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*43a90889SApple OSS Distributions * 6*43a90889SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*43a90889SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*43a90889SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*43a90889SApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*43a90889SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*43a90889SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*43a90889SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*43a90889SApple OSS Distributions * terms of an Apple operating system software license agreement. 14*43a90889SApple OSS Distributions * 15*43a90889SApple OSS Distributions * Please obtain a copy of the License at 16*43a90889SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*43a90889SApple OSS Distributions * 18*43a90889SApple OSS Distributions * The Original Code and all software distributed under the License are 19*43a90889SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*43a90889SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*43a90889SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*43a90889SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*43a90889SApple OSS Distributions * Please see the License for the specific language governing rights and 24*43a90889SApple OSS Distributions * limitations under the License. 25*43a90889SApple OSS Distributions * 26*43a90889SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*43a90889SApple OSS Distributions */ 28*43a90889SApple OSS Distributions 29*43a90889SApple OSS Distributions #include <sys/fcntl.h> 30*43a90889SApple OSS Distributions #include <sys/socket.h> 31*43a90889SApple OSS Distributions #include <net/if.h> 32*43a90889SApple OSS Distributions #include <netinet/in.h> 33*43a90889SApple OSS Distributions #include <netinet/tcp.h> 34*43a90889SApple OSS Distributions #include <arpa/inet.h> 35*43a90889SApple OSS Distributions 36*43a90889SApple OSS Distributions #include <darwintest.h> 37*43a90889SApple OSS Distributions #include <pthread.h> 38*43a90889SApple OSS Distributions #include <stdbool.h> 39*43a90889SApple OSS Distributions #include <string.h> 40*43a90889SApple OSS Distributions #include <unistd.h> 41*43a90889SApple OSS Distributions 42*43a90889SApple OSS Distributions /* 43*43a90889SApple OSS Distributions * The test is disabled on platforms that could be limited in term of CPU 44*43a90889SApple OSS Distributions * or memory because this stress test that cycles rapidly through a lot of socket 45*43a90889SApple OSS Distributions */ 46*43a90889SApple OSS Distributions T_GLOBAL_META( 47*43a90889SApple OSS Distributions T_META_NAMESPACE("xnu.net"), 48*43a90889SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"), 49*43a90889SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("networking"), 50*43a90889SApple OSS Distributions T_META_CHECK_LEAKS(false), 51*43a90889SApple OSS Distributions T_META_ENABLED(TARGET_OS_OSX || TARGET_OS_IPHONE)); 52*43a90889SApple OSS Distributions 53*43a90889SApple OSS Distributions #define SECONDS_TO_SLEEP 3 54*43a90889SApple OSS Distributions 55*43a90889SApple OSS Distributions #if 0 56*43a90889SApple OSS Distributions 57*43a90889SApple OSS Distributions static int fd = -1; 58*43a90889SApple OSS Distributions static bool finished = false; 59*43a90889SApple OSS Distributions static bool is_tcp = false; 60*43a90889SApple OSS Distributions 61*43a90889SApple OSS Distributions static void 62*43a90889SApple OSS Distributions init_sin6_address(struct sockaddr_in6 *sin6) 63*43a90889SApple OSS Distributions { 64*43a90889SApple OSS Distributions memset(sin6, 0, sizeof(struct sockaddr_in6)); 65*43a90889SApple OSS Distributions sin6->sin6_len = sizeof(struct sockaddr_in6); 66*43a90889SApple OSS Distributions sin6->sin6_family = AF_INET6; 67*43a90889SApple OSS Distributions } 68*43a90889SApple OSS Distributions 69*43a90889SApple OSS Distributions static void 70*43a90889SApple OSS Distributions setnonblocking(int s) 71*43a90889SApple OSS Distributions { 72*43a90889SApple OSS Distributions int flags; 73*43a90889SApple OSS Distributions 74*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(flags = fcntl(s, F_GETFL, 0), NULL); 75*43a90889SApple OSS Distributions 76*43a90889SApple OSS Distributions flags |= O_NONBLOCK; 77*43a90889SApple OSS Distributions 78*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(flags = fcntl(s, F_SETFL, flags), NULL); 79*43a90889SApple OSS Distributions } 80*43a90889SApple OSS Distributions 81*43a90889SApple OSS Distributions static void * 82*43a90889SApple OSS Distributions bind4_racer(void *arg) 83*43a90889SApple OSS Distributions { 84*43a90889SApple OSS Distributions #pragma unused(arg) 85*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 86*43a90889SApple OSS Distributions 87*43a90889SApple OSS Distributions init_sin6_address(&sin6); 88*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL); 89*43a90889SApple OSS Distributions sin6.sin6_port = htons(1234); 90*43a90889SApple OSS Distributions 91*43a90889SApple OSS Distributions while (finished == false) { 92*43a90889SApple OSS Distributions (void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len); 93*43a90889SApple OSS Distributions } 94*43a90889SApple OSS Distributions return NULL; 95*43a90889SApple OSS Distributions } 96*43a90889SApple OSS Distributions 97*43a90889SApple OSS Distributions static void * 98*43a90889SApple OSS Distributions bind6_racer(void *arg) 99*43a90889SApple OSS Distributions { 100*43a90889SApple OSS Distributions #pragma unused(arg) 101*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 102*43a90889SApple OSS Distributions 103*43a90889SApple OSS Distributions init_sin6_address(&sin6); 104*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL); 105*43a90889SApple OSS Distributions sin6.sin6_port = htons(1234); 106*43a90889SApple OSS Distributions 107*43a90889SApple OSS Distributions while (finished == false) { 108*43a90889SApple OSS Distributions (void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len); 109*43a90889SApple OSS Distributions } 110*43a90889SApple OSS Distributions return NULL; 111*43a90889SApple OSS Distributions } 112*43a90889SApple OSS Distributions 113*43a90889SApple OSS Distributions static void * 114*43a90889SApple OSS Distributions connect6_racer(void *arg) 115*43a90889SApple OSS Distributions { 116*43a90889SApple OSS Distributions #pragma unused(arg) 117*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 118*43a90889SApple OSS Distributions 119*43a90889SApple OSS Distributions init_sin6_address(&sin6); 120*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL); 121*43a90889SApple OSS Distributions sin6.sin6_port = htons(3456); 122*43a90889SApple OSS Distributions 123*43a90889SApple OSS Distributions while (finished == false) { 124*43a90889SApple OSS Distributions (void)connect(fd, (struct sockaddr*)&sin6, sin6.sin6_len); 125*43a90889SApple OSS Distributions } 126*43a90889SApple OSS Distributions return NULL; 127*43a90889SApple OSS Distributions } 128*43a90889SApple OSS Distributions 129*43a90889SApple OSS Distributions static void * 130*43a90889SApple OSS Distributions connect4_racer(void *arg) 131*43a90889SApple OSS Distributions { 132*43a90889SApple OSS Distributions #pragma unused(arg) 133*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 134*43a90889SApple OSS Distributions 135*43a90889SApple OSS Distributions init_sin6_address(&sin6); 136*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL); 137*43a90889SApple OSS Distributions sin6.sin6_port = htons(3456); 138*43a90889SApple OSS Distributions 139*43a90889SApple OSS Distributions while (finished == false) { 140*43a90889SApple OSS Distributions (void)connect(fd, (struct sockaddr*)&sin6, sin6.sin6_len); 141*43a90889SApple OSS Distributions } 142*43a90889SApple OSS Distributions return NULL; 143*43a90889SApple OSS Distributions } 144*43a90889SApple OSS Distributions 145*43a90889SApple OSS Distributions static void * 146*43a90889SApple OSS Distributions bind6_leader(void *arg) 147*43a90889SApple OSS Distributions { 148*43a90889SApple OSS Distributions #pragma unused(arg) 149*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 150*43a90889SApple OSS Distributions 151*43a90889SApple OSS Distributions init_sin6_address(&sin6); 152*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL); 153*43a90889SApple OSS Distributions 154*43a90889SApple OSS Distributions while (finished == false) { 155*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 156*43a90889SApple OSS Distributions 157*43a90889SApple OSS Distributions setnonblocking(fd); 158*43a90889SApple OSS Distributions 159*43a90889SApple OSS Distributions (void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len); 160*43a90889SApple OSS Distributions 161*43a90889SApple OSS Distributions close(fd); 162*43a90889SApple OSS Distributions } 163*43a90889SApple OSS Distributions return NULL; 164*43a90889SApple OSS Distributions } 165*43a90889SApple OSS Distributions 166*43a90889SApple OSS Distributions static void * 167*43a90889SApple OSS Distributions bind4_leader(void *arg) 168*43a90889SApple OSS Distributions { 169*43a90889SApple OSS Distributions #pragma unused(arg) 170*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 171*43a90889SApple OSS Distributions 172*43a90889SApple OSS Distributions init_sin6_address(&sin6); 173*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL); 174*43a90889SApple OSS Distributions 175*43a90889SApple OSS Distributions while (finished == false) { 176*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 177*43a90889SApple OSS Distributions 178*43a90889SApple OSS Distributions setnonblocking(fd); 179*43a90889SApple OSS Distributions 180*43a90889SApple OSS Distributions (void)bind(fd, (struct sockaddr*)&sin6, sin6.sin6_len); 181*43a90889SApple OSS Distributions 182*43a90889SApple OSS Distributions close(fd); 183*43a90889SApple OSS Distributions } 184*43a90889SApple OSS Distributions return NULL; 185*43a90889SApple OSS Distributions } 186*43a90889SApple OSS Distributions 187*43a90889SApple OSS Distributions static void * 188*43a90889SApple OSS Distributions send6_racer(void *arg) 189*43a90889SApple OSS Distributions { 190*43a90889SApple OSS Distributions #pragma unused(arg) 191*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 192*43a90889SApple OSS Distributions 193*43a90889SApple OSS Distributions init_sin6_address(&sin6); 194*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL); 195*43a90889SApple OSS Distributions sin6.sin6_port = htons(3456); 196*43a90889SApple OSS Distributions 197*43a90889SApple OSS Distributions while (finished == false) { 198*43a90889SApple OSS Distributions (void)sendto(fd, "", 1, 0, (struct sockaddr*)&sin6, sin6.sin6_len); 199*43a90889SApple OSS Distributions } 200*43a90889SApple OSS Distributions return NULL; 201*43a90889SApple OSS Distributions } 202*43a90889SApple OSS Distributions 203*43a90889SApple OSS Distributions static void * 204*43a90889SApple OSS Distributions send4_racer(void *arg) 205*43a90889SApple OSS Distributions { 206*43a90889SApple OSS Distributions #pragma unused(arg) 207*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 208*43a90889SApple OSS Distributions 209*43a90889SApple OSS Distributions init_sin6_address(&sin6); 210*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), 1, NULL); 211*43a90889SApple OSS Distributions sin6.sin6_port = htons(3456); 212*43a90889SApple OSS Distributions 213*43a90889SApple OSS Distributions while (finished == false) { 214*43a90889SApple OSS Distributions (void)sendto(fd, "", 1, 0, (struct sockaddr*)&sin6, sin6.sin6_len); 215*43a90889SApple OSS Distributions } 216*43a90889SApple OSS Distributions return NULL; 217*43a90889SApple OSS Distributions } 218*43a90889SApple OSS Distributions 219*43a90889SApple OSS Distributions static void * 220*43a90889SApple OSS Distributions send6_leader(void *arg) 221*43a90889SApple OSS Distributions { 222*43a90889SApple OSS Distributions #pragma unused(arg) 223*43a90889SApple OSS Distributions struct sockaddr_in6 sin6 = { 0 }; 224*43a90889SApple OSS Distributions 225*43a90889SApple OSS Distributions init_sin6_address(&sin6); 226*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6.sin6_addr), 1, NULL); 227*43a90889SApple OSS Distributions sin6.sin6_port = htons(3456); 228*43a90889SApple OSS Distributions 229*43a90889SApple OSS Distributions while (finished == false) { 230*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 231*43a90889SApple OSS Distributions 232*43a90889SApple OSS Distributions setnonblocking(fd); 233*43a90889SApple OSS Distributions 234*43a90889SApple OSS Distributions (void)sendto(fd, "", 1, 0, (struct sockaddr*)&sin6, sin6.sin6_len); 235*43a90889SApple OSS Distributions 236*43a90889SApple OSS Distributions close(fd); 237*43a90889SApple OSS Distributions } 238*43a90889SApple OSS Distributions return NULL; 239*43a90889SApple OSS Distributions } 240*43a90889SApple OSS Distributions 241*43a90889SApple OSS Distributions static void * 242*43a90889SApple OSS Distributions connectx6_leader(void *arg) 243*43a90889SApple OSS Distributions { 244*43a90889SApple OSS Distributions #pragma unused(arg) 245*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 }; 246*43a90889SApple OSS Distributions sa_endpoints_t sae = { 0 }; 247*43a90889SApple OSS Distributions 248*43a90889SApple OSS Distributions init_sin6_address(&sin6_dst); 249*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL); 250*43a90889SApple OSS Distributions sin6_dst.sin6_port = htons(3456); 251*43a90889SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)&sin6_dst; 252*43a90889SApple OSS Distributions sae.sae_dstaddrlen = sin6_dst.sin6_len; 253*43a90889SApple OSS Distributions 254*43a90889SApple OSS Distributions while (finished == false) { 255*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 256*43a90889SApple OSS Distributions 257*43a90889SApple OSS Distributions setnonblocking(fd); 258*43a90889SApple OSS Distributions 259*43a90889SApple OSS Distributions (void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL); 260*43a90889SApple OSS Distributions 261*43a90889SApple OSS Distributions close(fd); 262*43a90889SApple OSS Distributions } 263*43a90889SApple OSS Distributions return NULL; 264*43a90889SApple OSS Distributions } 265*43a90889SApple OSS Distributions 266*43a90889SApple OSS Distributions static void * 267*43a90889SApple OSS Distributions connectx4_leader(void *arg) 268*43a90889SApple OSS Distributions { 269*43a90889SApple OSS Distributions #pragma unused(arg) 270*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 }; 271*43a90889SApple OSS Distributions sa_endpoints_t sae = { 0 }; 272*43a90889SApple OSS Distributions 273*43a90889SApple OSS Distributions init_sin6_address(&sin6_dst); 274*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_dst.sin6_addr), 1, NULL); 275*43a90889SApple OSS Distributions sin6_dst.sin6_port = htons(3456); 276*43a90889SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)&sin6_dst; 277*43a90889SApple OSS Distributions sae.sae_dstaddrlen = sin6_dst.sin6_len; 278*43a90889SApple OSS Distributions 279*43a90889SApple OSS Distributions while (finished == false) { 280*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 281*43a90889SApple OSS Distributions 282*43a90889SApple OSS Distributions setnonblocking(fd); 283*43a90889SApple OSS Distributions 284*43a90889SApple OSS Distributions (void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL); 285*43a90889SApple OSS Distributions 286*43a90889SApple OSS Distributions close(fd); 287*43a90889SApple OSS Distributions } 288*43a90889SApple OSS Distributions return NULL; 289*43a90889SApple OSS Distributions } 290*43a90889SApple OSS Distributions 291*43a90889SApple OSS Distributions static void * 292*43a90889SApple OSS Distributions connectx6_binding_leader(void *arg) 293*43a90889SApple OSS Distributions { 294*43a90889SApple OSS Distributions #pragma unused(arg) 295*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_src = { 0 }; 296*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 }; 297*43a90889SApple OSS Distributions sa_endpoints_t sae = { 0 }; 298*43a90889SApple OSS Distributions 299*43a90889SApple OSS Distributions init_sin6_address(&sin6_src); 300*43a90889SApple OSS Distributions sin6_src.sin6_port = htons(1234); 301*43a90889SApple OSS Distributions sae.sae_srcaddr = (struct sockaddr *)&sin6_src; 302*43a90889SApple OSS Distributions sae.sae_srcaddrlen = sin6_src.sin6_len; 303*43a90889SApple OSS Distributions 304*43a90889SApple OSS Distributions init_sin6_address(&sin6_dst); 305*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL); 306*43a90889SApple OSS Distributions sin6_dst.sin6_port = htons(3456); 307*43a90889SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)&sin6_dst; 308*43a90889SApple OSS Distributions sae.sae_dstaddrlen = sin6_dst.sin6_len; 309*43a90889SApple OSS Distributions 310*43a90889SApple OSS Distributions while (finished == false) { 311*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 312*43a90889SApple OSS Distributions 313*43a90889SApple OSS Distributions setnonblocking(fd); 314*43a90889SApple OSS Distributions 315*43a90889SApple OSS Distributions (void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL); 316*43a90889SApple OSS Distributions 317*43a90889SApple OSS Distributions close(fd); 318*43a90889SApple OSS Distributions } 319*43a90889SApple OSS Distributions return NULL; 320*43a90889SApple OSS Distributions } 321*43a90889SApple OSS Distributions 322*43a90889SApple OSS Distributions static void * 323*43a90889SApple OSS Distributions connectx4_binding_leader(void *arg) 324*43a90889SApple OSS Distributions { 325*43a90889SApple OSS Distributions #pragma unused(arg) 326*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_src = { 0 }; 327*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 }; 328*43a90889SApple OSS Distributions sa_endpoints_t sae = { 0 }; 329*43a90889SApple OSS Distributions 330*43a90889SApple OSS Distributions init_sin6_address(&sin6_src); 331*43a90889SApple OSS Distributions sin6_src.sin6_port = htons(1234); 332*43a90889SApple OSS Distributions sae.sae_srcaddr = (struct sockaddr *)&sin6_src; 333*43a90889SApple OSS Distributions sae.sae_srcaddrlen = sin6_src.sin6_len; 334*43a90889SApple OSS Distributions 335*43a90889SApple OSS Distributions init_sin6_address(&sin6_dst); 336*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_dst.sin6_addr), 1, NULL); 337*43a90889SApple OSS Distributions sin6_dst.sin6_port = htons(3456); 338*43a90889SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)&sin6_dst; 339*43a90889SApple OSS Distributions sae.sae_dstaddrlen = sin6_dst.sin6_len; 340*43a90889SApple OSS Distributions 341*43a90889SApple OSS Distributions while (finished == false) { 342*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 343*43a90889SApple OSS Distributions 344*43a90889SApple OSS Distributions setnonblocking(fd); 345*43a90889SApple OSS Distributions 346*43a90889SApple OSS Distributions (void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL); 347*43a90889SApple OSS Distributions 348*43a90889SApple OSS Distributions close(fd); 349*43a90889SApple OSS Distributions } 350*43a90889SApple OSS Distributions return NULL; 351*43a90889SApple OSS Distributions } 352*43a90889SApple OSS Distributions 353*43a90889SApple OSS Distributions static void * 354*43a90889SApple OSS Distributions connectx6_racer(void *arg) 355*43a90889SApple OSS Distributions { 356*43a90889SApple OSS Distributions #pragma unused(arg) 357*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 }; 358*43a90889SApple OSS Distributions sa_endpoints_t sae = { 0 }; 359*43a90889SApple OSS Distributions 360*43a90889SApple OSS Distributions init_sin6_address(&sin6_dst); 361*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::1", &sin6_dst.sin6_addr), 1, NULL); 362*43a90889SApple OSS Distributions sin6_dst.sin6_port = htons(3456); 363*43a90889SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)&sin6_dst; 364*43a90889SApple OSS Distributions sae.sae_dstaddrlen = sin6_dst.sin6_len; 365*43a90889SApple OSS Distributions 366*43a90889SApple OSS Distributions while (finished == false) { 367*43a90889SApple OSS Distributions (void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL); 368*43a90889SApple OSS Distributions } 369*43a90889SApple OSS Distributions return NULL; 370*43a90889SApple OSS Distributions } 371*43a90889SApple OSS Distributions 372*43a90889SApple OSS Distributions static void * 373*43a90889SApple OSS Distributions connectx4_racer(void *arg) 374*43a90889SApple OSS Distributions { 375*43a90889SApple OSS Distributions #pragma unused(arg) 376*43a90889SApple OSS Distributions struct sockaddr_in6 sin6_dst = { 0 }; 377*43a90889SApple OSS Distributions sa_endpoints_t sae = { 0 }; 378*43a90889SApple OSS Distributions 379*43a90889SApple OSS Distributions init_sin6_address(&sin6_dst); 380*43a90889SApple OSS Distributions T_ASSERT_EQ(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_dst.sin6_addr), 1, NULL); 381*43a90889SApple OSS Distributions sin6_dst.sin6_port = htons(3456); 382*43a90889SApple OSS Distributions sae.sae_dstaddr = (struct sockaddr *)&sin6_dst; 383*43a90889SApple OSS Distributions sae.sae_dstaddrlen = sin6_dst.sin6_len; 384*43a90889SApple OSS Distributions 385*43a90889SApple OSS Distributions while (finished == false) { 386*43a90889SApple OSS Distributions (void)connectx(fd, &sae, SAE_ASSOCID_ANY, 0, NULL, 0, 0, NULL); 387*43a90889SApple OSS Distributions } 388*43a90889SApple OSS Distributions return NULL; 389*43a90889SApple OSS Distributions } 390*43a90889SApple OSS Distributions 391*43a90889SApple OSS Distributions static void * 392*43a90889SApple OSS Distributions listen6_leader(void *arg) 393*43a90889SApple OSS Distributions { 394*43a90889SApple OSS Distributions #pragma unused(arg) 395*43a90889SApple OSS Distributions 396*43a90889SApple OSS Distributions while (finished == false) { 397*43a90889SApple OSS Distributions int val = 1; 398*43a90889SApple OSS Distributions 399*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 400*43a90889SApple OSS Distributions 401*43a90889SApple OSS Distributions setnonblocking(fd); 402*43a90889SApple OSS Distributions 403*43a90889SApple OSS Distributions /* Note: The following may fail of an IPv4 racer has won the bind race */ 404*43a90889SApple OSS Distributions (void)setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)); 405*43a90889SApple OSS Distributions 406*43a90889SApple OSS Distributions (void)listen(fd, 5); 407*43a90889SApple OSS Distributions 408*43a90889SApple OSS Distributions close(fd); 409*43a90889SApple OSS Distributions } 410*43a90889SApple OSS Distributions return NULL; 411*43a90889SApple OSS Distributions } 412*43a90889SApple OSS Distributions 413*43a90889SApple OSS Distributions static void * 414*43a90889SApple OSS Distributions listen4_leader(void *arg) 415*43a90889SApple OSS Distributions { 416*43a90889SApple OSS Distributions #pragma unused(arg) 417*43a90889SApple OSS Distributions 418*43a90889SApple OSS Distributions while (finished == false) { 419*43a90889SApple OSS Distributions int val = 0; 420*43a90889SApple OSS Distributions 421*43a90889SApple OSS Distributions T_QUIET; T_EXPECT_POSIX_SUCCESS(fd = socket(AF_INET6, is_tcp ? SOCK_STREAM : SOCK_DGRAM, 0), "socket"); 422*43a90889SApple OSS Distributions 423*43a90889SApple OSS Distributions setnonblocking(fd); 424*43a90889SApple OSS Distributions 425*43a90889SApple OSS Distributions /* Note: The following may fail of an IPv4 racer has won the bind race */ 426*43a90889SApple OSS Distributions (void)setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)); 427*43a90889SApple OSS Distributions 428*43a90889SApple OSS Distributions (void)listen(fd, 5); 429*43a90889SApple OSS Distributions 430*43a90889SApple OSS Distributions close(fd); 431*43a90889SApple OSS Distributions } 432*43a90889SApple OSS Distributions return NULL; 433*43a90889SApple OSS Distributions } 434*43a90889SApple OSS Distributions 435*43a90889SApple OSS Distributions static void 436*43a90889SApple OSS Distributions do_bind_race(bool do_test_tcp, void *(*leader)(void *), void *(*racer)(void *)) 437*43a90889SApple OSS Distributions { 438*43a90889SApple OSS Distributions pthread_t runner1; 439*43a90889SApple OSS Distributions pthread_t runner2; 440*43a90889SApple OSS Distributions 441*43a90889SApple OSS Distributions is_tcp = do_test_tcp; 442*43a90889SApple OSS Distributions 443*43a90889SApple OSS Distributions if (pthread_create(&runner1, NULL, leader, NULL)) { 444*43a90889SApple OSS Distributions T_ASSERT_FAIL("pthread_create failed"); 445*43a90889SApple OSS Distributions } 446*43a90889SApple OSS Distributions 447*43a90889SApple OSS Distributions if (pthread_create(&runner2, NULL, racer, NULL)) { 448*43a90889SApple OSS Distributions T_ASSERT_FAIL("pthread_create failed"); 449*43a90889SApple OSS Distributions } 450*43a90889SApple OSS Distributions 451*43a90889SApple OSS Distributions sleep(SECONDS_TO_SLEEP); 452*43a90889SApple OSS Distributions 453*43a90889SApple OSS Distributions finished = true; 454*43a90889SApple OSS Distributions 455*43a90889SApple OSS Distributions pthread_join(runner1, 0); 456*43a90889SApple OSS Distributions pthread_join(runner2, 0); 457*43a90889SApple OSS Distributions } 458*43a90889SApple OSS Distributions 459*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind6_bind4_race, "race bind calls with TCP sockets") 460*43a90889SApple OSS Distributions { 461*43a90889SApple OSS Distributions do_bind_race(true, bind6_leader, bind4_racer); 462*43a90889SApple OSS Distributions } 463*43a90889SApple OSS Distributions 464*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind6_connect4_race, "race bind calls with TCP sockets") 465*43a90889SApple OSS Distributions { 466*43a90889SApple OSS Distributions do_bind_race(true, bind6_leader, connect4_racer); 467*43a90889SApple OSS Distributions } 468*43a90889SApple OSS Distributions 469*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind4_connect6_race, "race bind calls with TCP sockets") 470*43a90889SApple OSS Distributions { 471*43a90889SApple OSS Distributions do_bind_race(true, bind4_leader, connect6_racer); 472*43a90889SApple OSS Distributions } 473*43a90889SApple OSS Distributions 474*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind6_send4_race, "race bind calls with TCP sockets") 475*43a90889SApple OSS Distributions { 476*43a90889SApple OSS Distributions do_bind_race(true, bind6_leader, send4_racer); 477*43a90889SApple OSS Distributions } 478*43a90889SApple OSS Distributions 479*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind4_send6_race, "race bind calls with TCP sockets") 480*43a90889SApple OSS Distributions { 481*43a90889SApple OSS Distributions do_bind_race(true, bind4_leader, send6_racer); 482*43a90889SApple OSS Distributions } 483*43a90889SApple OSS Distributions 484*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_send6_send4_race, "race bind calls with TCP sockets") 485*43a90889SApple OSS Distributions { 486*43a90889SApple OSS Distributions do_bind_race(true, send6_leader, send4_racer); 487*43a90889SApple OSS Distributions } 488*43a90889SApple OSS Distributions 489*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind6_connectx4_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 490*43a90889SApple OSS Distributions { 491*43a90889SApple OSS Distributions do_bind_race(true, bind6_leader, connectx4_racer); 492*43a90889SApple OSS Distributions } 493*43a90889SApple OSS Distributions 494*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_bind4_connectx6_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 495*43a90889SApple OSS Distributions { 496*43a90889SApple OSS Distributions do_bind_race(true, bind4_leader, connectx6_racer); 497*43a90889SApple OSS Distributions } 498*43a90889SApple OSS Distributions 499*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_bind6_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 500*43a90889SApple OSS Distributions { 501*43a90889SApple OSS Distributions do_bind_race(true, connectx4_leader, bind6_racer); 502*43a90889SApple OSS Distributions } 503*43a90889SApple OSS Distributions 504*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_bind4_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 505*43a90889SApple OSS Distributions { 506*43a90889SApple OSS Distributions do_bind_race(true, connectx6_leader, bind4_racer); 507*43a90889SApple OSS Distributions } 508*43a90889SApple OSS Distributions 509*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_connect6_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 510*43a90889SApple OSS Distributions { 511*43a90889SApple OSS Distributions do_bind_race(true, connectx4_leader, connect6_racer); 512*43a90889SApple OSS Distributions } 513*43a90889SApple OSS Distributions 514*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_connect4_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 515*43a90889SApple OSS Distributions { 516*43a90889SApple OSS Distributions do_bind_race(true, connectx6_leader, connect4_racer); 517*43a90889SApple OSS Distributions } 518*43a90889SApple OSS Distributions 519*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_binding_bind6_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 520*43a90889SApple OSS Distributions { 521*43a90889SApple OSS Distributions do_bind_race(true, connectx4_binding_leader, bind6_racer); 522*43a90889SApple OSS Distributions } 523*43a90889SApple OSS Distributions 524*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_binding_bind4_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 525*43a90889SApple OSS Distributions { 526*43a90889SApple OSS Distributions do_bind_race(true, connectx6_binding_leader, bind4_racer); 527*43a90889SApple OSS Distributions } 528*43a90889SApple OSS Distributions 529*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx4_binding_connect6_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 530*43a90889SApple OSS Distributions { 531*43a90889SApple OSS Distributions do_bind_race(true, connectx4_binding_leader, connect6_racer); 532*43a90889SApple OSS Distributions } 533*43a90889SApple OSS Distributions 534*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_connectx6_binding_connect4_race, "race bind calls with TCP sockets", T_META_ENABLED(false)) 535*43a90889SApple OSS Distributions { 536*43a90889SApple OSS Distributions do_bind_race(true, connectx6_binding_leader, connect4_racer); 537*43a90889SApple OSS Distributions } 538*43a90889SApple OSS Distributions 539*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_listen6_bind4_race, "race bind calls with TCP sockets") 540*43a90889SApple OSS Distributions { 541*43a90889SApple OSS Distributions do_bind_race(true, listen6_leader, bind4_racer); 542*43a90889SApple OSS Distributions } 543*43a90889SApple OSS Distributions 544*43a90889SApple OSS Distributions T_DECL(ipv6_tcp_listen4_bind6_race, "race bind calls with TCP sockets") 545*43a90889SApple OSS Distributions { 546*43a90889SApple OSS Distributions do_bind_race(true, listen4_leader, bind6_racer); 547*43a90889SApple OSS Distributions } 548*43a90889SApple OSS Distributions 549*43a90889SApple OSS Distributions 550*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind6_bind4_race, "race bind calls with UDP sockets") 551*43a90889SApple OSS Distributions { 552*43a90889SApple OSS Distributions do_bind_race(false, bind6_leader, bind4_racer); 553*43a90889SApple OSS Distributions } 554*43a90889SApple OSS Distributions 555*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind6_connect4_race, "race bind calls with UDP sockets") 556*43a90889SApple OSS Distributions { 557*43a90889SApple OSS Distributions do_bind_race(false, bind6_leader, connect4_racer); 558*43a90889SApple OSS Distributions } 559*43a90889SApple OSS Distributions 560*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind4_connect6_race, "race bind calls with UDP sockets") 561*43a90889SApple OSS Distributions { 562*43a90889SApple OSS Distributions do_bind_race(false, bind4_leader, connect6_racer); 563*43a90889SApple OSS Distributions } 564*43a90889SApple OSS Distributions 565*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind6_send4_race, "race bind calls with UDP sockets") 566*43a90889SApple OSS Distributions { 567*43a90889SApple OSS Distributions do_bind_race(false, bind6_leader, send4_racer); 568*43a90889SApple OSS Distributions } 569*43a90889SApple OSS Distributions 570*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind4_send6_race, "race bind calls with UDP sockets") 571*43a90889SApple OSS Distributions { 572*43a90889SApple OSS Distributions do_bind_race(false, bind4_leader, send6_racer); 573*43a90889SApple OSS Distributions } 574*43a90889SApple OSS Distributions 575*43a90889SApple OSS Distributions T_DECL(ipv6_udp_send6_send4_race, "race bind calls with UDP sockets") 576*43a90889SApple OSS Distributions { 577*43a90889SApple OSS Distributions do_bind_race(false, send6_leader, send4_racer); 578*43a90889SApple OSS Distributions } 579*43a90889SApple OSS Distributions 580*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind6_connectx4_race, "race bind calls with UDP sockets", T_META_ENABLED(false)) 581*43a90889SApple OSS Distributions { 582*43a90889SApple OSS Distributions do_bind_race(false, bind6_leader, connectx4_racer); 583*43a90889SApple OSS Distributions } 584*43a90889SApple OSS Distributions 585*43a90889SApple OSS Distributions T_DECL(ipv6_udp_bind4_connectx6_race, "race bind calls with UDP sockets", T_META_ENABLED(false)) 586*43a90889SApple OSS Distributions { 587*43a90889SApple OSS Distributions do_bind_race(false, bind4_leader, connectx6_racer); 588*43a90889SApple OSS Distributions } 589*43a90889SApple OSS Distributions 590*43a90889SApple OSS Distributions T_DECL(ipv6_udp_connectx4_bind6_race, "race bind calls with UDP sockets", T_META_ENABLED(false)) 591*43a90889SApple OSS Distributions { 592*43a90889SApple OSS Distributions do_bind_race(false, connectx4_leader, bind6_racer); 593*43a90889SApple OSS Distributions } 594*43a90889SApple OSS Distributions 595*43a90889SApple OSS Distributions T_DECL(ipv6_udp_connectx6_bind4_race, "race bind calls with UDP sockets", T_META_ENABLED(false)) 596*43a90889SApple OSS Distributions { 597*43a90889SApple OSS Distributions do_bind_race(false, connectx6_leader, bind4_racer); 598*43a90889SApple OSS Distributions } 599*43a90889SApple OSS Distributions 600*43a90889SApple OSS Distributions T_DECL(ipv6_udp_connectx4_connect6_race, "race bind calls with UDP sockets", T_META_ENABLED(false)) 601*43a90889SApple OSS Distributions { 602*43a90889SApple OSS Distributions do_bind_race(false, connectx4_leader, connect6_racer); 603*43a90889SApple OSS Distributions } 604*43a90889SApple OSS Distributions 605*43a90889SApple OSS Distributions T_DECL(ipv6_udp_connectx6_connect4_race, "race bind calls with UDP sockets", T_META_ENABLED(false)) 606*43a90889SApple OSS Distributions { 607*43a90889SApple OSS Distributions do_bind_race(false, connectx6_leader, connect4_racer); 608*43a90889SApple OSS Distributions } 609*43a90889SApple OSS Distributions #else 610*43a90889SApple OSS Distributions 611*43a90889SApple OSS Distributions T_DECL(stub, "test suite disabled") 612*43a90889SApple OSS Distributions { 613*43a90889SApple OSS Distributions T_EXPECT_TRUE(true, "disabled by rdar://137741815"); 614*43a90889SApple OSS Distributions } 615*43a90889SApple OSS Distributions 616*43a90889SApple OSS Distributions #endif /* 0 */ 617