xref: /openbmc/linux/tools/testing/selftests/net/bind_wildcard.c (revision 5804c19b80bf625c6a9925317f845e497434d6d3)
113715acfSKuniyuki Iwashima // SPDX-License-Identifier: GPL-2.0
213715acfSKuniyuki Iwashima /* Copyright Amazon.com Inc. or its affiliates. */
313715acfSKuniyuki Iwashima 
413715acfSKuniyuki Iwashima #include <sys/socket.h>
513715acfSKuniyuki Iwashima #include <netinet/in.h>
613715acfSKuniyuki Iwashima 
713715acfSKuniyuki Iwashima #include "../kselftest_harness.h"
813715acfSKuniyuki Iwashima 
9*8637d8e8SKuniyuki Iwashima struct in6_addr in6addr_v4mapped_any = {
10*8637d8e8SKuniyuki Iwashima 	.s6_addr = {
11*8637d8e8SKuniyuki Iwashima 		0, 0, 0, 0,
12*8637d8e8SKuniyuki Iwashima 		0, 0, 0, 0,
13*8637d8e8SKuniyuki Iwashima 		0, 0, 255, 255,
14*8637d8e8SKuniyuki Iwashima 		0, 0, 0, 0
15*8637d8e8SKuniyuki Iwashima 	}
16*8637d8e8SKuniyuki Iwashima };
17*8637d8e8SKuniyuki Iwashima 
18*8637d8e8SKuniyuki Iwashima struct in6_addr in6addr_v4mapped_loopback = {
19*8637d8e8SKuniyuki Iwashima 	.s6_addr = {
20*8637d8e8SKuniyuki Iwashima 		0, 0, 0, 0,
21*8637d8e8SKuniyuki Iwashima 		0, 0, 0, 0,
22*8637d8e8SKuniyuki Iwashima 		0, 0, 255, 255,
23*8637d8e8SKuniyuki Iwashima 		127, 0, 0, 1
24*8637d8e8SKuniyuki Iwashima 	}
25*8637d8e8SKuniyuki Iwashima };
26*8637d8e8SKuniyuki Iwashima 
FIXTURE(bind_wildcard)2713715acfSKuniyuki Iwashima FIXTURE(bind_wildcard)
2813715acfSKuniyuki Iwashima {
2913715acfSKuniyuki Iwashima 	struct sockaddr_in addr4;
3013715acfSKuniyuki Iwashima 	struct sockaddr_in6 addr6;
3113715acfSKuniyuki Iwashima };
3213715acfSKuniyuki Iwashima 
FIXTURE_VARIANT(bind_wildcard)3313715acfSKuniyuki Iwashima FIXTURE_VARIANT(bind_wildcard)
3413715acfSKuniyuki Iwashima {
3513715acfSKuniyuki Iwashima 	const __u32 addr4_const;
3613715acfSKuniyuki Iwashima 	const struct in6_addr *addr6_const;
372895d879SKuniyuki Iwashima 	int expected_errno;
3813715acfSKuniyuki Iwashima };
3913715acfSKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_any_v6_any)4013715acfSKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_any)
4113715acfSKuniyuki Iwashima {
4213715acfSKuniyuki Iwashima 	.addr4_const = INADDR_ANY,
4313715acfSKuniyuki Iwashima 	.addr6_const = &in6addr_any,
442895d879SKuniyuki Iwashima 	.expected_errno = EADDRINUSE,
4513715acfSKuniyuki Iwashima };
4613715acfSKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_any_v6_local)4713715acfSKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_local)
4813715acfSKuniyuki Iwashima {
4913715acfSKuniyuki Iwashima 	.addr4_const = INADDR_ANY,
5013715acfSKuniyuki Iwashima 	.addr6_const = &in6addr_loopback,
512895d879SKuniyuki Iwashima 	.expected_errno = 0,
5213715acfSKuniyuki Iwashima };
5313715acfSKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_any_v6_v4mapped_any)54*8637d8e8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_any)
55*8637d8e8SKuniyuki Iwashima {
56*8637d8e8SKuniyuki Iwashima 	.addr4_const = INADDR_ANY,
57*8637d8e8SKuniyuki Iwashima 	.addr6_const = &in6addr_v4mapped_any,
58*8637d8e8SKuniyuki Iwashima 	.expected_errno = EADDRINUSE,
59*8637d8e8SKuniyuki Iwashima };
60*8637d8e8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_any_v6_v4mapped_local)61*8637d8e8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_any_v6_v4mapped_local)
62*8637d8e8SKuniyuki Iwashima {
63*8637d8e8SKuniyuki Iwashima 	.addr4_const = INADDR_ANY,
64*8637d8e8SKuniyuki Iwashima 	.addr6_const = &in6addr_v4mapped_loopback,
65*8637d8e8SKuniyuki Iwashima 	.expected_errno = EADDRINUSE,
66*8637d8e8SKuniyuki Iwashima };
67*8637d8e8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_local_v6_any)6813715acfSKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_any)
6913715acfSKuniyuki Iwashima {
7013715acfSKuniyuki Iwashima 	.addr4_const = INADDR_LOOPBACK,
7113715acfSKuniyuki Iwashima 	.addr6_const = &in6addr_any,
722895d879SKuniyuki Iwashima 	.expected_errno = EADDRINUSE,
7313715acfSKuniyuki Iwashima };
7413715acfSKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_local_v6_local)7513715acfSKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_local)
7613715acfSKuniyuki Iwashima {
7713715acfSKuniyuki Iwashima 	.addr4_const = INADDR_LOOPBACK,
7813715acfSKuniyuki Iwashima 	.addr6_const = &in6addr_loopback,
792895d879SKuniyuki Iwashima 	.expected_errno = 0,
8013715acfSKuniyuki Iwashima };
8113715acfSKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_local_v6_v4mapped_any)82*8637d8e8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_any)
83*8637d8e8SKuniyuki Iwashima {
84*8637d8e8SKuniyuki Iwashima 	.addr4_const = INADDR_LOOPBACK,
85*8637d8e8SKuniyuki Iwashima 	.addr6_const = &in6addr_v4mapped_any,
86*8637d8e8SKuniyuki Iwashima 	.expected_errno = EADDRINUSE,
87*8637d8e8SKuniyuki Iwashima };
88*8637d8e8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(bind_wildcard,v4_local_v6_v4mapped_local)89*8637d8e8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(bind_wildcard, v4_local_v6_v4mapped_local)
90*8637d8e8SKuniyuki Iwashima {
91*8637d8e8SKuniyuki Iwashima 	.addr4_const = INADDR_LOOPBACK,
92*8637d8e8SKuniyuki Iwashima 	.addr6_const = &in6addr_v4mapped_loopback,
93*8637d8e8SKuniyuki Iwashima 	.expected_errno = EADDRINUSE,
94*8637d8e8SKuniyuki Iwashima };
95*8637d8e8SKuniyuki Iwashima 
FIXTURE_SETUP(bind_wildcard)9613715acfSKuniyuki Iwashima FIXTURE_SETUP(bind_wildcard)
9713715acfSKuniyuki Iwashima {
9813715acfSKuniyuki Iwashima 	self->addr4.sin_family = AF_INET;
9913715acfSKuniyuki Iwashima 	self->addr4.sin_port = htons(0);
10013715acfSKuniyuki Iwashima 	self->addr4.sin_addr.s_addr = htonl(variant->addr4_const);
10113715acfSKuniyuki Iwashima 
10213715acfSKuniyuki Iwashima 	self->addr6.sin6_family = AF_INET6;
10313715acfSKuniyuki Iwashima 	self->addr6.sin6_port = htons(0);
10413715acfSKuniyuki Iwashima 	self->addr6.sin6_addr = *variant->addr6_const;
10513715acfSKuniyuki Iwashima }
10613715acfSKuniyuki Iwashima 
FIXTURE_TEARDOWN(bind_wildcard)10713715acfSKuniyuki Iwashima FIXTURE_TEARDOWN(bind_wildcard)
10813715acfSKuniyuki Iwashima {
10913715acfSKuniyuki Iwashima }
11013715acfSKuniyuki Iwashima 
bind_sockets(struct __test_metadata * _metadata,FIXTURE_DATA (bind_wildcard)* self,int expected_errno,struct sockaddr * addr1,socklen_t addrlen1,struct sockaddr * addr2,socklen_t addrlen2)11113715acfSKuniyuki Iwashima void bind_sockets(struct __test_metadata *_metadata,
11213715acfSKuniyuki Iwashima 		  FIXTURE_DATA(bind_wildcard) *self,
1132895d879SKuniyuki Iwashima 		  int expected_errno,
11413715acfSKuniyuki Iwashima 		  struct sockaddr *addr1, socklen_t addrlen1,
11513715acfSKuniyuki Iwashima 		  struct sockaddr *addr2, socklen_t addrlen2)
11613715acfSKuniyuki Iwashima {
11713715acfSKuniyuki Iwashima 	int fd[2];
11813715acfSKuniyuki Iwashima 	int ret;
11913715acfSKuniyuki Iwashima 
12013715acfSKuniyuki Iwashima 	fd[0] = socket(addr1->sa_family, SOCK_STREAM, 0);
12113715acfSKuniyuki Iwashima 	ASSERT_GT(fd[0], 0);
12213715acfSKuniyuki Iwashima 
12313715acfSKuniyuki Iwashima 	ret = bind(fd[0], addr1, addrlen1);
12413715acfSKuniyuki Iwashima 	ASSERT_EQ(ret, 0);
12513715acfSKuniyuki Iwashima 
12613715acfSKuniyuki Iwashima 	ret = getsockname(fd[0], addr1, &addrlen1);
12713715acfSKuniyuki Iwashima 	ASSERT_EQ(ret, 0);
12813715acfSKuniyuki Iwashima 
12913715acfSKuniyuki Iwashima 	((struct sockaddr_in *)addr2)->sin_port = ((struct sockaddr_in *)addr1)->sin_port;
13013715acfSKuniyuki Iwashima 
13113715acfSKuniyuki Iwashima 	fd[1] = socket(addr2->sa_family, SOCK_STREAM, 0);
13213715acfSKuniyuki Iwashima 	ASSERT_GT(fd[1], 0);
13313715acfSKuniyuki Iwashima 
13413715acfSKuniyuki Iwashima 	ret = bind(fd[1], addr2, addrlen2);
1352895d879SKuniyuki Iwashima 	if (expected_errno) {
13613715acfSKuniyuki Iwashima 		ASSERT_EQ(ret, -1);
1372895d879SKuniyuki Iwashima 		ASSERT_EQ(errno, expected_errno);
13813715acfSKuniyuki Iwashima 	} else {
13913715acfSKuniyuki Iwashima 		ASSERT_EQ(ret, 0);
14013715acfSKuniyuki Iwashima 	}
14113715acfSKuniyuki Iwashima 
14213715acfSKuniyuki Iwashima 	close(fd[1]);
14313715acfSKuniyuki Iwashima 	close(fd[0]);
14413715acfSKuniyuki Iwashima }
14513715acfSKuniyuki Iwashima 
TEST_F(bind_wildcard,v4_v6)14613715acfSKuniyuki Iwashima TEST_F(bind_wildcard, v4_v6)
14713715acfSKuniyuki Iwashima {
1482895d879SKuniyuki Iwashima 	bind_sockets(_metadata, self, variant->expected_errno,
1490071d155SKuniyuki Iwashima 		     (struct sockaddr *)&self->addr4, sizeof(self->addr4),
15013715acfSKuniyuki Iwashima 		     (struct sockaddr *)&self->addr6, sizeof(self->addr6));
15113715acfSKuniyuki Iwashima }
15213715acfSKuniyuki Iwashima 
TEST_F(bind_wildcard,v6_v4)15313715acfSKuniyuki Iwashima TEST_F(bind_wildcard, v6_v4)
15413715acfSKuniyuki Iwashima {
1552895d879SKuniyuki Iwashima 	bind_sockets(_metadata, self, variant->expected_errno,
15613715acfSKuniyuki Iwashima 		     (struct sockaddr *)&self->addr6, sizeof(self->addr6),
15713715acfSKuniyuki Iwashima 		     (struct sockaddr *)&self->addr4, sizeof(self->addr4));
15813715acfSKuniyuki Iwashima }
15913715acfSKuniyuki Iwashima 
16013715acfSKuniyuki Iwashima TEST_HARNESS_MAIN
161