1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright Amazon.com Inc. or its affiliates. */
4 #include <sys/socket.h>
5 #include <netinet/in.h>
7 #include "../kselftest_harness.h"
11 struct sockaddr_in addr
;
15 FIXTURE_VARIANT(bind_timewait
)
20 FIXTURE_VARIANT_ADD(bind_timewait
, localhost
)
22 .addr_const
= INADDR_LOOPBACK
25 FIXTURE_VARIANT_ADD(bind_timewait
, addrany
)
27 .addr_const
= INADDR_ANY
30 FIXTURE_SETUP(bind_timewait
)
32 self
->addr
.sin_family
= AF_INET
;
33 self
->addr
.sin_port
= 0;
34 self
->addr
.sin_addr
.s_addr
= htonl(variant
->addr_const
);
35 self
->addrlen
= sizeof(self
->addr
);
38 FIXTURE_TEARDOWN(bind_timewait
)
42 void create_timewait_socket(struct __test_metadata
*_metadata
,
43 FIXTURE_DATA(bind_timewait
) *self
)
45 int server_fd
, client_fd
, child_fd
, ret
;
46 struct sockaddr_in addr
;
49 server_fd
= socket(AF_INET
, SOCK_STREAM
, 0);
50 ASSERT_GT(server_fd
, 0);
52 ret
= bind(server_fd
, (struct sockaddr
*)&self
->addr
, self
->addrlen
);
55 ret
= listen(server_fd
, 1);
58 ret
= getsockname(server_fd
, (struct sockaddr
*)&self
->addr
, &self
->addrlen
);
61 client_fd
= socket(AF_INET
, SOCK_STREAM
, 0);
62 ASSERT_GT(client_fd
, 0);
64 ret
= connect(client_fd
, (struct sockaddr
*)&self
->addr
, self
->addrlen
);
67 addrlen
= sizeof(addr
);
68 child_fd
= accept(server_fd
, (struct sockaddr
*)&addr
, &addrlen
);
69 ASSERT_GT(child_fd
, 0);
76 TEST_F(bind_timewait
, 1)
80 create_timewait_socket(_metadata
, self
);
82 fd
= socket(AF_INET
, SOCK_STREAM
, 0);
85 ret
= bind(fd
, (struct sockaddr
*)&self
->addr
, self
->addrlen
);
87 ASSERT_EQ(errno
, EADDRINUSE
);