tools/testing/selftests/net/tcp_port_share.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/net/tcp_port_share.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/net/tcp_port_share.c
Extension
.c
Size
7847 bytes
Lines
259
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct sockaddr_inet {
	union {
		struct sockaddr_storage ss;
		struct sockaddr_in6 v6;
		struct sockaddr_in v4;
		struct sockaddr sa;
	};
	socklen_t len;
	char str[INET6_ADDRSTRLEN + __builtin_strlen("[]:65535") + 1];
};

const int one = 1;

static int disconnect(int fd)
{
	return connect(fd, &(struct sockaddr){ AF_UNSPEC }, sizeof(struct sockaddr));
}

static int getsockname_port(int fd)
{
	struct sockaddr_inet addr = {};
	int err;

	addr.len = sizeof(addr);
	err = getsockname(fd, &addr.sa, &addr.len);
	if (err)
		return -1;

	switch (addr.sa.sa_family) {
	case AF_INET:
		return ntohs(addr.v4.sin_port);
	case AF_INET6:
		return ntohs(addr.v6.sin6_port);
	default:
		errno = EAFNOSUPPORT;
		return -1;
	}
}

static void make_inet_addr(int af, const char *ip, __u16 port,
			   struct sockaddr_inet *addr)
{
	const char *fmt = "";

	memset(addr, 0, sizeof(*addr));

	switch (af) {
	case AF_INET:
		addr->len = sizeof(addr->v4);
		addr->v4.sin_family = af;
		addr->v4.sin_port = htons(port);
		inet_pton(af, ip, &addr->v4.sin_addr);
		fmt = "%s:%hu";
		break;
	case AF_INET6:
		addr->len = sizeof(addr->v6);
		addr->v6.sin6_family = af;
		addr->v6.sin6_port = htons(port);
		inet_pton(af, ip, &addr->v6.sin6_addr);
		fmt = "[%s]:%hu";
		break;
	}

	snprintf(addr->str, sizeof(addr->str), fmt, ip, port);
}

FIXTURE(tcp_port_share) {};

FIXTURE_VARIANT(tcp_port_share) {
	int domain;
	/* IP to listen on and connect to */
	const char *dst_ip;
	/* Primary IP to connect from */
	const char *src1_ip;
	/* Secondary IP to connect from */
	const char *src2_ip;
	/* IP to bind to in order to block the source port */
	const char *bind_ip;
};

FIXTURE_VARIANT_ADD(tcp_port_share, ipv4) {
	.domain = AF_INET,
	.dst_ip = "127.0.0.1",
	.src1_ip = "127.1.1.1",
	.src2_ip = "127.2.2.2",
	.bind_ip = "127.3.3.3",
};

FIXTURE_VARIANT_ADD(tcp_port_share, ipv6) {
	.domain = AF_INET6,

Annotation

Implementation Notes