Skip to content

Commit

Permalink
Merge branch 'use network helpers, part 10'
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Martin KaFai Lau committed Jul 23, 2024
2 parents 229d6db + b27a9ab commit ba1cf16
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 96 deletions.
26 changes: 10 additions & 16 deletions tools/testing/selftests/bpf/network_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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) {
Expand Down
110 changes: 30 additions & 80 deletions tools/testing/selftests/bpf/prog_tests/sk_lookup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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 */
Expand All @@ -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);
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit ba1cf16

Please sign in to comment.