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