brintos

brintos / linux-shallow public Read only

0
0
Text · 1.8 KiB · cb9fdf5 Raw
93 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright Amazon.com Inc. or its affiliates. */3 4#include <sys/socket.h>5#include <netinet/in.h>6 7#include "../kselftest_harness.h"8 9FIXTURE(bind_timewait)10{11	struct sockaddr_in addr;12	socklen_t addrlen;13};14 15FIXTURE_VARIANT(bind_timewait)16{17	__u32 addr_const;18};19 20FIXTURE_VARIANT_ADD(bind_timewait, localhost)21{22	.addr_const = INADDR_LOOPBACK23};24 25FIXTURE_VARIANT_ADD(bind_timewait, addrany)26{27	.addr_const = INADDR_ANY28};29 30FIXTURE_SETUP(bind_timewait)31{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);36}37 38FIXTURE_TEARDOWN(bind_timewait)39{40}41 42void create_timewait_socket(struct __test_metadata *_metadata,43			    FIXTURE_DATA(bind_timewait) *self)44{45	int server_fd, client_fd, child_fd, ret;46	struct sockaddr_in addr;47	socklen_t addrlen;48 49	server_fd = socket(AF_INET, SOCK_STREAM, 0);50	ASSERT_GT(server_fd, 0);51 52	ret = bind(server_fd, (struct sockaddr *)&self->addr, self->addrlen);53	ASSERT_EQ(ret, 0);54 55	ret = listen(server_fd, 1);56	ASSERT_EQ(ret, 0);57 58	ret = getsockname(server_fd, (struct sockaddr *)&self->addr, &self->addrlen);59	ASSERT_EQ(ret, 0);60 61	client_fd = socket(AF_INET, SOCK_STREAM, 0);62	ASSERT_GT(client_fd, 0);63 64	ret = connect(client_fd, (struct sockaddr *)&self->addr, self->addrlen);65	ASSERT_EQ(ret, 0);66 67	addrlen = sizeof(addr);68	child_fd = accept(server_fd, (struct sockaddr *)&addr, &addrlen);69	ASSERT_GT(child_fd, 0);70 71	close(child_fd);72	close(client_fd);73	close(server_fd);74}75 76TEST_F(bind_timewait, 1)77{78	int fd, ret;79 80	create_timewait_socket(_metadata, self);81 82	fd = socket(AF_INET, SOCK_STREAM, 0);83	ASSERT_GT(fd, 0);84 85	ret = bind(fd, (struct sockaddr *)&self->addr, self->addrlen);86	ASSERT_EQ(ret, -1);87	ASSERT_EQ(errno, EADDRINUSE);88 89	close(fd);90}91 92TEST_HARNESS_MAIN93