mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
Merge branch 'use network helpers, part 10'
Geliang Tang says: ==================== This set is part 10 of series "use network helpers" all BPF selftests wide. Patches 1-3 drop local functions make_client(), make_socket() and inetaddr_len() in sk_lookup.c. Patch 4 drops a useless function __start_server() in network_helpers.c. ==================== Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
This commit is contained in:
commit
1edf364a8a
|
|
@ -80,12 +80,15 @@ int settimeo(int fd, int timeout_ms)
|
|||
|
||||
#define save_errno_close(fd) ({ int __save = errno; close(fd); errno = __save; })
|
||||
|
||||
static int __start_server(int type, const struct sockaddr *addr, socklen_t addrlen,
|
||||
const struct network_helper_opts *opts)
|
||||
int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t addrlen,
|
||||
const struct network_helper_opts *opts)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = socket(addr->sa_family, type, opts->proto);
|
||||
if (!opts)
|
||||
opts = &default_opts;
|
||||
|
||||
fd = socket(addr->ss_family, type, opts->proto);
|
||||
if (fd < 0) {
|
||||
log_err("Failed to create server socket");
|
||||
return -1;
|
||||
|
|
@ -100,7 +103,7 @@ static int __start_server(int type, const struct sockaddr *addr, socklen_t addrl
|
|||
goto error_close;
|
||||
}
|
||||
|
||||
if (bind(fd, addr, addrlen) < 0) {
|
||||
if (bind(fd, (struct sockaddr *)addr, addrlen) < 0) {
|
||||
log_err("Failed to bind socket");
|
||||
goto error_close;
|
||||
}
|
||||
|
|
@ -131,7 +134,7 @@ int start_server_str(int family, int type, const char *addr_str, __u16 port,
|
|||
if (make_sockaddr(family, addr_str, port, &addr, &addrlen))
|
||||
return -1;
|
||||
|
||||
return __start_server(type, (struct sockaddr *)&addr, addrlen, opts);
|
||||
return start_server_addr(type, &addr, addrlen, opts);
|
||||
}
|
||||
|
||||
int start_server(int family, int type, const char *addr_str, __u16 port,
|
||||
|
|
@ -173,7 +176,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
|
|||
if (!fds)
|
||||
return NULL;
|
||||
|
||||
fds[0] = __start_server(type, (struct sockaddr *)&addr, addrlen, &opts);
|
||||
fds[0] = start_server_addr(type, &addr, addrlen, &opts);
|
||||
if (fds[0] == -1)
|
||||
goto close_fds;
|
||||
nr_fds = 1;
|
||||
|
|
@ -182,7 +185,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
|
|||
goto close_fds;
|
||||
|
||||
for (; nr_fds < nr_listens; nr_fds++) {
|
||||
fds[nr_fds] = __start_server(type, (struct sockaddr *)&addr, addrlen, &opts);
|
||||
fds[nr_fds] = start_server_addr(type, &addr, addrlen, &opts);
|
||||
if (fds[nr_fds] == -1)
|
||||
goto close_fds;
|
||||
}
|
||||
|
|
@ -194,15 +197,6 @@ 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, (struct sockaddr *)addr, len, opts);
|
||||
}
|
||||
|
||||
void free_fds(int *fds, unsigned int nr_close_fds)
|
||||
{
|
||||
if (fds) {
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@
|
|||
#define INT_IP6 "fd00::2"
|
||||
#define INT_PORT 8008
|
||||
|
||||
#define IO_TIMEOUT_SEC 3
|
||||
|
||||
enum server {
|
||||
SERVER_A = 0,
|
||||
SERVER_B = 1,
|
||||
|
|
@ -108,46 +106,6 @@ static int attach_reuseport(int sock_fd, struct bpf_program *reuseport_prog)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static socklen_t inetaddr_len(const struct sockaddr_storage *addr)
|
||||
{
|
||||
return (addr->ss_family == AF_INET ? sizeof(struct sockaddr_in) :
|
||||
addr->ss_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0);
|
||||
}
|
||||
|
||||
static int make_socket(int sotype, const char *ip, int port,
|
||||
struct sockaddr_storage *addr)
|
||||
{
|
||||
struct timeval timeo = { .tv_sec = IO_TIMEOUT_SEC };
|
||||
int err, family, fd;
|
||||
|
||||
family = is_ipv6(ip) ? AF_INET6 : AF_INET;
|
||||
err = make_sockaddr(family, ip, port, addr, NULL);
|
||||
if (CHECK(err, "make_address", "failed\n"))
|
||||
return -1;
|
||||
|
||||
fd = socket(addr->ss_family, sotype, 0);
|
||||
if (CHECK(fd < 0, "socket", "failed\n")) {
|
||||
log_err("failed to make socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
|
||||
if (CHECK(err, "setsockopt(SO_SNDTIMEO)", "failed\n")) {
|
||||
log_err("failed to set SNDTIMEO");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo));
|
||||
if (CHECK(err, "setsockopt(SO_RCVTIMEO)", "failed\n")) {
|
||||
log_err("failed to set RCVTIMEO");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
static int setsockopts(int fd, void *opts)
|
||||
{
|
||||
struct cb_opts *co = (struct cb_opts *)opts;
|
||||
|
|
@ -229,27 +187,6 @@ static int make_server(int sotype, const char *ip, int port,
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int make_client(int sotype, const char *ip, int port)
|
||||
{
|
||||
struct sockaddr_storage addr = {0};
|
||||
int err, fd;
|
||||
|
||||
fd = make_socket(sotype, ip, port, &addr);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
err = connect(fd, (void *)&addr, inetaddr_len(&addr));
|
||||
if (CHECK(err, "make_client", "connect")) {
|
||||
log_err("failed to connect client socket");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return fd;
|
||||
fail:
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static __u64 socket_cookie(int fd)
|
||||
{
|
||||
__u64 cookie;
|
||||
|
|
@ -646,8 +583,9 @@ static void run_lookup_prog(const struct test *t)
|
|||
goto close;
|
||||
}
|
||||
|
||||
client_fd = make_client(t->sotype, t->connect_to.ip, t->connect_to.port);
|
||||
if (client_fd < 0)
|
||||
client_fd = connect_to_addr_str(is_ipv6(t->connect_to.ip) ? AF_INET6 : AF_INET,
|
||||
t->sotype, t->connect_to.ip, t->connect_to.port, NULL);
|
||||
if (!ASSERT_OK_FD(client_fd, "connect_to_addr_str"))
|
||||
goto close;
|
||||
|
||||
if (t->sotype == SOCK_STREAM)
|
||||
|
|
@ -862,9 +800,11 @@ static void test_redirect_lookup(struct test_sk_lookup *skel)
|
|||
|
||||
static void drop_on_lookup(const struct test *t)
|
||||
{
|
||||
int family = is_ipv6(t->connect_to.ip) ? AF_INET6 : AF_INET;
|
||||
struct sockaddr_storage dst = {};
|
||||
int client_fd, server_fd, err;
|
||||
struct bpf_link *lookup_link;
|
||||
socklen_t len;
|
||||
ssize_t n;
|
||||
|
||||
lookup_link = attach_lookup_prog(t->lookup_prog);
|
||||
|
|
@ -876,12 +816,14 @@ static void drop_on_lookup(const struct test *t)
|
|||
if (server_fd < 0)
|
||||
goto detach;
|
||||
|
||||
client_fd = make_socket(t->sotype, t->connect_to.ip,
|
||||
t->connect_to.port, &dst);
|
||||
if (client_fd < 0)
|
||||
client_fd = client_socket(family, t->sotype, NULL);
|
||||
if (!ASSERT_OK_FD(client_fd, "client_socket"))
|
||||
goto close_srv;
|
||||
|
||||
err = connect(client_fd, (void *)&dst, inetaddr_len(&dst));
|
||||
err = make_sockaddr(family, t->connect_to.ip, t->connect_to.port, &dst, &len);
|
||||
if (!ASSERT_OK(err, "make_sockaddr"))
|
||||
goto close_all;
|
||||
err = connect(client_fd, (void *)&dst, len);
|
||||
if (t->sotype == SOCK_DGRAM) {
|
||||
err = send_byte(client_fd);
|
||||
if (err)
|
||||
|
|
@ -976,9 +918,11 @@ static void test_drop_on_lookup(struct test_sk_lookup *skel)
|
|||
|
||||
static void drop_on_reuseport(const struct test *t)
|
||||
{
|
||||
int family = is_ipv6(t->connect_to.ip) ? AF_INET6 : AF_INET;
|
||||
struct sockaddr_storage dst = { 0 };
|
||||
int client, server1, server2, err;
|
||||
struct bpf_link *lookup_link;
|
||||
socklen_t len;
|
||||
ssize_t n;
|
||||
|
||||
lookup_link = attach_lookup_prog(t->lookup_prog);
|
||||
|
|
@ -1000,12 +944,14 @@ static void drop_on_reuseport(const struct test *t)
|
|||
if (server2 < 0)
|
||||
goto close_srv1;
|
||||
|
||||
client = make_socket(t->sotype, t->connect_to.ip,
|
||||
t->connect_to.port, &dst);
|
||||
if (client < 0)
|
||||
client = client_socket(family, t->sotype, NULL);
|
||||
if (!ASSERT_OK_FD(client, "client_socket"))
|
||||
goto close_srv2;
|
||||
|
||||
err = connect(client, (void *)&dst, inetaddr_len(&dst));
|
||||
err = make_sockaddr(family, t->connect_to.ip, t->connect_to.port, &dst, &len);
|
||||
if (!ASSERT_OK(err, "make_sockaddr"))
|
||||
goto close_all;
|
||||
err = connect(client, (void *)&dst, len);
|
||||
if (t->sotype == SOCK_DGRAM) {
|
||||
err = send_byte(client);
|
||||
if (err)
|
||||
|
|
@ -1152,8 +1098,8 @@ static void run_sk_assign_connected(struct test_sk_lookup *skel,
|
|||
if (server_fd < 0)
|
||||
return;
|
||||
|
||||
connected_fd = make_client(sotype, EXT_IP4, EXT_PORT);
|
||||
if (connected_fd < 0)
|
||||
connected_fd = connect_to_addr_str(AF_INET, sotype, EXT_IP4, EXT_PORT, NULL);
|
||||
if (!ASSERT_OK_FD(connected_fd, "connect_to_addr_str"))
|
||||
goto out_close_server;
|
||||
|
||||
/* Put a connected socket in redirect map */
|
||||
|
|
@ -1166,8 +1112,8 @@ static void run_sk_assign_connected(struct test_sk_lookup *skel,
|
|||
goto out_close_connected;
|
||||
|
||||
/* Try to redirect TCP SYN / UDP packet to a connected socket */
|
||||
client_fd = make_client(sotype, EXT_IP4, EXT_PORT);
|
||||
if (client_fd < 0)
|
||||
client_fd = connect_to_addr_str(AF_INET, sotype, EXT_IP4, EXT_PORT, NULL);
|
||||
if (!ASSERT_OK_FD(client_fd, "connect_to_addr_str"))
|
||||
goto out_unlink_prog;
|
||||
if (sotype == SOCK_DGRAM) {
|
||||
send_byte(client_fd);
|
||||
|
|
@ -1219,6 +1165,7 @@ static void run_multi_prog_lookup(const struct test_multi_prog *t)
|
|||
int map_fd, server_fd, client_fd;
|
||||
struct bpf_link *link1, *link2;
|
||||
int prog_idx, done, err;
|
||||
socklen_t len;
|
||||
|
||||
map_fd = bpf_map__fd(t->run_map);
|
||||
|
||||
|
|
@ -1248,11 +1195,14 @@ static void run_multi_prog_lookup(const struct test_multi_prog *t)
|
|||
if (err)
|
||||
goto out_close_server;
|
||||
|
||||
client_fd = make_socket(SOCK_STREAM, EXT_IP4, EXT_PORT, &dst);
|
||||
if (client_fd < 0)
|
||||
client_fd = client_socket(AF_INET, SOCK_STREAM, NULL);
|
||||
if (!ASSERT_OK_FD(client_fd, "client_socket"))
|
||||
goto out_close_server;
|
||||
|
||||
err = connect(client_fd, (void *)&dst, inetaddr_len(&dst));
|
||||
err = make_sockaddr(AF_INET, EXT_IP4, EXT_PORT, &dst, &len);
|
||||
if (!ASSERT_OK(err, "make_sockaddr"))
|
||||
goto out_close_client;
|
||||
err = connect(client_fd, (void *)&dst, len);
|
||||
if (CHECK(err && !t->expect_errno, "connect",
|
||||
"unexpected error %d\n", errno))
|
||||
goto out_close_client;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user