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: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
commit
2ea0aa5358
@ -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 @@ close_fds:
|
||||
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 @@ error_close:
|
||||
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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user