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