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

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
...@@ -52,6 +52,8 @@ struct ipv6_packet pkt_v6 = { ...@@ -52,6 +52,8 @@ struct ipv6_packet pkt_v6 = {
.tcp.doff = 5, .tcp.doff = 5,
}; };
static const struct network_helper_opts default_opts;
int settimeo(int fd, int timeout_ms) int settimeo(int fd, int timeout_ms)
{ {
struct timeval timeout = { .tv_sec = 3 }; struct timeval timeout = { .tv_sec = 3 };
...@@ -185,6 +187,16 @@ int *start_reuseport_server(int family, int type, const char *addr_str, ...@@ -185,6 +187,16 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
return NULL; 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) void free_fds(int *fds, unsigned int nr_close_fds)
{ {
if (fds) { if (fds) {
...@@ -258,17 +270,24 @@ static int connect_fd_to_addr(int fd, ...@@ -258,17 +270,24 @@ static int connect_fd_to_addr(int fd,
return 0; 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; 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) { if (fd < 0) {
log_err("Failed to create client socket"); log_err("Failed to create client socket");
return -1; 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; goto error_close;
return fd; return fd;
...@@ -278,8 +297,6 @@ int connect_to_addr(const struct sockaddr_storage *addr, socklen_t addrlen, int ...@@ -278,8 +297,6 @@ int connect_to_addr(const struct sockaddr_storage *addr, socklen_t addrlen, int
return -1; return -1;
} }
static const struct network_helper_opts default_opts;
int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts) int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
......
...@@ -53,8 +53,11 @@ int start_mptcp_server(int family, const char *addr, __u16 port, ...@@ -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, int *start_reuseport_server(int family, int type, const char *addr_str,
__u16 port, int timeout_ms, __u16 port, int timeout_ms,
unsigned int nr_listens); 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); 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(int server_fd, int timeout_ms);
int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts); 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); int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <netinet/tcp.h> #include <netinet/tcp.h>
#include <test_progs.h> #include <test_progs.h>
#include "network_helpers.h"
#include "progs/test_cls_redirect.h" #include "progs/test_cls_redirect.h"
#include "test_cls_redirect.skel.h" #include "test_cls_redirect.skel.h"
...@@ -35,39 +36,6 @@ struct tuple { ...@@ -35,39 +36,6 @@ struct tuple {
struct addr_port dst; 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) static bool fill_addr_port(const struct sockaddr *sa, struct addr_port *ap)
{ {
const struct sockaddr_in6 *in6; const struct sockaddr_in6 *in6;
...@@ -98,14 +66,14 @@ static bool set_up_conn(const struct sockaddr *addr, socklen_t len, int type, ...@@ -98,14 +66,14 @@ static bool set_up_conn(const struct sockaddr *addr, socklen_t len, int type,
socklen_t slen = sizeof(ss); socklen_t slen = sizeof(ss);
struct sockaddr *sa = (struct sockaddr *)&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) if (*server < 0)
return false; return false;
if (CHECK_FAIL(getsockname(*server, sa, &slen))) if (CHECK_FAIL(getsockname(*server, sa, &slen)))
goto close_server; goto close_server;
*conn = connect_to_server(sa, slen, type); *conn = connect_to_addr(type, (struct sockaddr_storage *)sa, slen, NULL);
if (*conn < 0) if (*conn < 0)
goto close_server; goto close_server;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <unistd.h> #include <unistd.h>
#include "test_progs.h" #include "test_progs.h"
#include "network_helpers.h"
#define BIND_PORT 1234 #define BIND_PORT 1234
#define CONNECT_PORT 4321 #define CONNECT_PORT 4321
...@@ -22,8 +23,6 @@ ...@@ -22,8 +23,6 @@
#define NS_SELF "/proc/self/ns/net" #define NS_SELF "/proc/self/ns/net"
#define SERVER_MAP_PATH "/sys/fs/bpf/tc/globals/server_map" #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 int stop, duration;
static bool static bool
...@@ -73,52 +72,6 @@ configure_stack(void) ...@@ -73,52 +72,6 @@ configure_stack(void)
return true; 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 static in_port_t
get_port(int fd) get_port(int fd)
{ {
...@@ -161,7 +114,7 @@ run_test(int server_fd, const struct sockaddr *addr, socklen_t len, int type) ...@@ -161,7 +114,7 @@ run_test(int server_fd, const struct sockaddr *addr, socklen_t len, int type)
in_port_t port; in_port_t port;
int ret = 1; int ret = 1;
client = connect_to_server(addr, len, type); client = connect_to_addr(type, (struct sockaddr_storage *)addr, len, NULL);
if (client == -1) { if (client == -1) {
perror("Cannot connect to server"); perror("Cannot connect to server");
goto out; goto out;
...@@ -310,7 +263,9 @@ void test_sk_assign(void) ...@@ -310,7 +263,9 @@ void test_sk_assign(void)
continue; continue;
prepare_addr(test->addr, test->family, BIND_PORT, false); prepare_addr(test->addr, test->family, BIND_PORT, false);
addr = (const struct sockaddr *)test->addr; 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) if (server == -1)
goto close; goto close;
......
...@@ -328,7 +328,7 @@ static void test_bind(struct sock_addr_test *test) ...@@ -328,7 +328,7 @@ static void test_bind(struct sock_addr_test *test)
goto cleanup; goto cleanup;
/* Try to connect to server just in case */ /* 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")) if (!ASSERT_GE(client, 0, "connect_to_addr"))
goto cleanup; goto cleanup;
...@@ -357,7 +357,7 @@ static void test_connect(struct sock_addr_test *test) ...@@ -357,7 +357,7 @@ static void test_connect(struct sock_addr_test *test)
if (!ASSERT_EQ(err, 0, "make_sockaddr")) if (!ASSERT_EQ(err, 0, "make_sockaddr"))
goto cleanup; 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")) if (!ASSERT_GE(client, 0, "connect_to_addr"))
goto cleanup; goto cleanup;
...@@ -538,7 +538,7 @@ static void test_getpeername(struct sock_addr_test *test) ...@@ -538,7 +538,7 @@ static void test_getpeername(struct sock_addr_test *test)
if (!ASSERT_EQ(err, 0, "make_sockaddr")) if (!ASSERT_EQ(err, 0, "make_sockaddr"))
goto cleanup; 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")) if (!ASSERT_GE(client, 0, "connect_to_addr"))
goto cleanup; goto cleanup;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment