xref: /xnu-11215.61.5/tests/v4mappedv6_join_group.c (revision 4f1223e81cd707a65cc109d0b8ad6653699da3c4)
1*4f1223e8SApple OSS Distributions /*
2*4f1223e8SApple OSS Distributions  * Copyright (c) 2024 Apple Inc. All rights reserved.
3*4f1223e8SApple OSS Distributions  *
4*4f1223e8SApple OSS Distributions  * Chris Jarrett-Davies <[email protected]>
5*4f1223e8SApple OSS Distributions  * SEAR Red Team / 2024-Mar-20
6*4f1223e8SApple OSS Distributions  */
7*4f1223e8SApple OSS Distributions 
8*4f1223e8SApple OSS Distributions #include <darwintest.h>
9*4f1223e8SApple OSS Distributions #include <stdio.h>
10*4f1223e8SApple OSS Distributions 
11*4f1223e8SApple OSS Distributions #include <darwintest.h>
12*4f1223e8SApple OSS Distributions 
13*4f1223e8SApple OSS Distributions #include <string.h>
14*4f1223e8SApple OSS Distributions #include <strings.h>
15*4f1223e8SApple OSS Distributions 
16*4f1223e8SApple OSS Distributions #include <arpa/inet.h>
17*4f1223e8SApple OSS Distributions #include <netinet/in.h>
18*4f1223e8SApple OSS Distributions #include <sys/socket.h>
19*4f1223e8SApple OSS Distributions #include <unistd.h>
20*4f1223e8SApple OSS Distributions 
21*4f1223e8SApple OSS Distributions T_GLOBAL_META(
22*4f1223e8SApple OSS Distributions 	T_META_NAMESPACE("xnu.net"),
23*4f1223e8SApple OSS Distributions 	T_META_ASROOT(true),
24*4f1223e8SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
25*4f1223e8SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("networking"),
26*4f1223e8SApple OSS Distributions 	T_META_ENABLED(!TARGET_OS_BRIDGE),
27*4f1223e8SApple OSS Distributions 	T_META_CHECK_LEAKS(false));
28*4f1223e8SApple OSS Distributions 
29*4f1223e8SApple OSS Distributions T_DECL(v4mappedv6_join_group, "Tests setting IPV6_JOIN_GROUP on an IPv4-mapped IPv6 address")
30*4f1223e8SApple OSS Distributions {
31*4f1223e8SApple OSS Distributions 	int s;
32*4f1223e8SApple OSS Distributions 	struct sockaddr_in6 sin6 = {
33*4f1223e8SApple OSS Distributions 		.sin6_family = AF_INET6,
34*4f1223e8SApple OSS Distributions 		.sin6_len = sizeof(struct sockaddr_in6),
35*4f1223e8SApple OSS Distributions 		.sin6_port = 1337
36*4f1223e8SApple OSS Distributions 	};
37*4f1223e8SApple OSS Distributions 	struct ipv6_mreq mreq = {};
38*4f1223e8SApple OSS Distributions 
39*4f1223e8SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), "create socket");
40*4f1223e8SApple OSS Distributions 
41*4f1223e8SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6.sin6_addr), "inet_pton");
42*4f1223e8SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(connect(s, (const struct sockaddr *)&sin6, sizeof(sin6)), "connect");
43*4f1223e8SApple OSS Distributions 
44*4f1223e8SApple OSS Distributions 	memset((unsigned char *)&mreq.ipv6mr_multiaddr, 0xff, 16);
45*4f1223e8SApple OSS Distributions 
46*4f1223e8SApple OSS Distributions 	// This should now fail (but not panic)
47*4f1223e8SApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)), EADDRNOTAVAIL, "setsockopt IPV6_JOIN_GROUP");
48*4f1223e8SApple OSS Distributions }
49