Commit 2ea0aa53 authored by Martin KaFai Lau's avatar Martin KaFai Lau
Browse files

Merge branch 'use network helpers, part 1'



Geliang Tang says:

====================
v5:
 - address Martin's comments for v4. (thanks)
 - drop start_server_addr_opts, add opts as a argument of
   start_server_addr.
 - add opts argument for connect_to_addr too.
 - move some patches out of this set, stay with start_server_addr()
   and connect_to_addr() only in it.

v4:
 - add more patches using make_sockaddr and get_socket_local_port
   helpers.

v3:
 - address comments of Martin and Eduard in v2. (thanks)
 - move "int type" to the first argument of start_server_addr and
   connect_to_addr.
 - add start_server_addr_opts.
 - using "sockaddr_storage" instead of "sockaddr".
 - move start_server_setsockopt patches out of this series.

v2:
 - update patch 6 only, fix errors reported by CI.

This patchset uses public helpers start_server_* and connect_to_* defined
in network_helpers.c to drop duplicate code.
====================

Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
parents 462e5e2a 63a51820
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ struct ipv6_packet pkt_v6 = {
	.tcp.doff = 5,
};

static const struct network_helper_opts default_opts;

int settimeo(int fd, int timeout_ms)
{
	struct timeval timeout = { .tv_sec = 3 };
@@ -185,6 +187,16 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
	return NULL;
}

int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t len,
		      const struct network_helper_opts *opts)
{
	if (!opts)
		opts = &default_opts;

	return __start_server(type, 0, (struct sockaddr *)addr, len,
			      opts->timeout_ms, 0);
}

void free_fds(int *fds, unsigned int nr_close_fds)
{
	if (fds) {
@@ -258,17 +270,24 @@ static int connect_fd_to_addr(int fd,
	return 0;
}

int connect_to_addr(const struct sockaddr_storage *addr, socklen_t addrlen, int type)
int connect_to_addr(int type, const struct sockaddr_storage *addr, socklen_t addrlen,
		    const struct network_helper_opts *opts)
{
	int fd;

	fd = socket(addr->ss_family, type, 0);
	if (!opts)
		opts = &default_opts;

	fd = socket(addr->ss_family, type, opts->proto);
	if (fd < 0) {
		log_err("Failed to create client socket");
		return -1;
	}

	if (connect_fd_to_addr(fd, addr, addrlen, false))
	if (settimeo(fd, opts->timeout_ms))
		goto error_close;

	if (connect_fd_to_addr(fd, addr, addrlen, opts->must_fail))
		goto error_close;

	return fd;
@@ -278,8 +297,6 @@ int connect_to_addr(const struct sockaddr_storage *addr, socklen_t addrlen, int
	return -1;
}

static const struct network_helper_opts default_opts;

int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)
{
	struct sockaddr_storage addr;
+4 −1
Original line number Diff line number Diff line
@@ -53,8 +53,11 @@ int start_mptcp_server(int family, const char *addr, __u16 port,
int *start_reuseport_server(int family, int type, const char *addr_str,
			    __u16 port, int timeout_ms,
			    unsigned int nr_listens);
int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t len,
		      const struct network_helper_opts *opts);
void free_fds(int *fds, unsigned int nr_close_fds);
int connect_to_addr(const struct sockaddr_storage *addr, socklen_t len, int type);
int connect_to_addr(int type, const struct sockaddr_storage *addr, socklen_t len,
		    const struct network_helper_opts *opts);
int connect_to_fd(int server_fd, int timeout_ms);
int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts);
int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms);
+3 −35
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <netinet/tcp.h>

#include <test_progs.h>
#include "network_helpers.h"

#include "progs/test_cls_redirect.h"
#include "test_cls_redirect.skel.h"
@@ -35,39 +36,6 @@ struct tuple {
	struct addr_port dst;
};

static int start_server(const struct sockaddr *addr, socklen_t len, int type)
{
	int fd = socket(addr->sa_family, type, 0);
	if (CHECK_FAIL(fd == -1))
		return -1;
	if (CHECK_FAIL(bind(fd, addr, len) == -1))
		goto err;
	if (type == SOCK_STREAM && CHECK_FAIL(listen(fd, 128) == -1))
		goto err;

	return fd;

err:
	close(fd);
	return -1;
}

static int connect_to_server(const struct sockaddr *addr, socklen_t len,
			     int type)
{
	int fd = socket(addr->sa_family, type, 0);
	if (CHECK_FAIL(fd == -1))
		return -1;
	if (CHECK_FAIL(connect(fd, addr, len)))
		goto err;

	return fd;

err:
	close(fd);
	return -1;
}

static bool fill_addr_port(const struct sockaddr *sa, struct addr_port *ap)
{
	const struct sockaddr_in6 *in6;
@@ -98,14 +66,14 @@ static bool set_up_conn(const struct sockaddr *addr, socklen_t len, int type,
	socklen_t slen = sizeof(ss);
	struct sockaddr *sa = (struct sockaddr *)&ss;

	*server = start_server(addr, len, type);
	*server = start_server_addr(type, (struct sockaddr_storage *)addr, len, NULL);
	if (*server < 0)
		return false;

	if (CHECK_FAIL(getsockname(*server, sa, &slen)))
		goto close_server;

	*conn = connect_to_server(sa, slen, type);
	*conn = connect_to_addr(type, (struct sockaddr_storage *)sa, slen, NULL);
	if (*conn < 0)
		goto close_server;

+5 −50
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include <unistd.h>

#include "test_progs.h"
#include "network_helpers.h"

#define BIND_PORT 1234
#define CONNECT_PORT 4321
@@ -22,8 +23,6 @@
#define NS_SELF "/proc/self/ns/net"
#define SERVER_MAP_PATH "/sys/fs/bpf/tc/globals/server_map"

static const struct timeval timeo_sec = { .tv_sec = 3 };
static const size_t timeo_optlen = sizeof(timeo_sec);
static int stop, duration;

static bool
@@ -73,52 +72,6 @@ configure_stack(void)
	return true;
}

static int
start_server(const struct sockaddr *addr, socklen_t len, int type)
{
	int fd;

	fd = socket(addr->sa_family, type, 0);
	if (CHECK_FAIL(fd == -1))
		goto out;
	if (CHECK_FAIL(setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo_sec,
				  timeo_optlen)))
		goto close_out;
	if (CHECK_FAIL(bind(fd, addr, len) == -1))
		goto close_out;
	if (type == SOCK_STREAM && CHECK_FAIL(listen(fd, 128) == -1))
		goto close_out;

	goto out;
close_out:
	close(fd);
	fd = -1;
out:
	return fd;
}

static int
connect_to_server(const struct sockaddr *addr, socklen_t len, int type)
{
	int fd = -1;

	fd = socket(addr->sa_family, type, 0);
	if (CHECK_FAIL(fd == -1))
		goto out;
	if (CHECK_FAIL(setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo_sec,
				  timeo_optlen)))
		goto close_out;
	if (CHECK_FAIL(connect(fd, addr, len)))
		goto close_out;

	goto out;
close_out:
	close(fd);
	fd = -1;
out:
	return fd;
}

static in_port_t
get_port(int fd)
{
@@ -161,7 +114,7 @@ run_test(int server_fd, const struct sockaddr *addr, socklen_t len, int type)
	in_port_t port;
	int ret = 1;

	client = connect_to_server(addr, len, type);
	client = connect_to_addr(type, (struct sockaddr_storage *)addr, len, NULL);
	if (client == -1) {
		perror("Cannot connect to server");
		goto out;
@@ -310,7 +263,9 @@ void test_sk_assign(void)
			continue;
		prepare_addr(test->addr, test->family, BIND_PORT, false);
		addr = (const struct sockaddr *)test->addr;
		server = start_server(addr, test->len, test->type);
		server = start_server_addr(test->type,
					   (const struct sockaddr_storage *)addr,
					   test->len, NULL);
		if (server == -1)
			goto close;

+3 −3
Original line number Diff line number Diff line
@@ -328,7 +328,7 @@ static void test_bind(struct sock_addr_test *test)
		goto cleanup;

	/* Try to connect to server just in case */
	client = connect_to_addr(&expected_addr, expected_addr_len, test->socket_type);
	client = connect_to_addr(test->socket_type, &expected_addr, expected_addr_len, NULL);
	if (!ASSERT_GE(client, 0, "connect_to_addr"))
		goto cleanup;

@@ -357,7 +357,7 @@ static void test_connect(struct sock_addr_test *test)
	if (!ASSERT_EQ(err, 0, "make_sockaddr"))
		goto cleanup;

	client = connect_to_addr(&addr, addr_len, test->socket_type);
	client = connect_to_addr(test->socket_type, &addr, addr_len, NULL);
	if (!ASSERT_GE(client, 0, "connect_to_addr"))
		goto cleanup;

@@ -538,7 +538,7 @@ static void test_getpeername(struct sock_addr_test *test)
	if (!ASSERT_EQ(err, 0, "make_sockaddr"))
		goto cleanup;

	client = connect_to_addr(&addr, addr_len, test->socket_type);
	client = connect_to_addr(test->socket_type, &addr, addr_len, NULL);
	if (!ASSERT_GE(client, 0, "connect_to_addr"))
		goto cleanup;