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