99126abec5
This patch makes a few changes to the network_helpers.c 1) Enforce SO_RCVTIMEO and SO_SNDTIMEO This patch enforces timeout to the network fds through setsockopt SO_RCVTIMEO and SO_SNDTIMEO. It will remove the need for SOCK_NONBLOCK that requires a more demanding timeout logic with epoll/select, e.g. epoll_create, epoll_ctrl, and then epoll_wait for timeout. That removes the need for connect_wait() from the cgroup_skb_sk_lookup.c. The needed change is made in cgroup_skb_sk_lookup.c. 2) start_server(): Add optional addr_str and port to start_server(). That removes the need of the start_server_with_port(). The caller can pass addr_str==NULL and/or port==0. I have a future tcp-hdr-opt test that will pass a non-NULL addr_str and it is in general useful for other future tests. "int timeout_ms" is also added to control the timeout on the "accept(listen_fd)". 3) connect_to_fd(): Fully use the server_fd. The server sock address has already been obtained from getsockname(server_fd). The sockaddr includes the family, so the "int family" arg is redundant. Since the server address is obtained from server_fd, there is little reason not to get the server's socket type from the server_fd also. getsockopt(server_fd) can be used to do that, so "int type" arg is also removed. "int timeout_ms" is added. 4) connect_fd_to_fd(): "int timeout_ms" is added. Some code is also refactored to connect_fd_to_addr() which is shared with connect_to_fd(). 5) Preserve errno: Some callers need to check errno, e.g. cgroup_skb_sk_lookup.c. Make changes to do it more consistently in save_errno_close() and log_err(). Signed-off-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20200702004852.2103003-1-kafai@fb.com
72 lines
1.6 KiB
C
72 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
/*
|
|
* Copyright 2020 Google LLC.
|
|
*/
|
|
|
|
#include <test_progs.h>
|
|
#include <network_helpers.h>
|
|
|
|
void test_load_bytes_relative(void)
|
|
{
|
|
int server_fd, cgroup_fd, prog_fd, map_fd, client_fd;
|
|
int err;
|
|
struct bpf_object *obj;
|
|
struct bpf_program *prog;
|
|
struct bpf_map *test_result;
|
|
__u32 duration = 0;
|
|
|
|
__u32 map_key = 0;
|
|
__u32 map_value = 0;
|
|
|
|
cgroup_fd = test__join_cgroup("/load_bytes_relative");
|
|
if (CHECK_FAIL(cgroup_fd < 0))
|
|
return;
|
|
|
|
server_fd = start_server(AF_INET, SOCK_STREAM, NULL, 0, 0);
|
|
if (CHECK_FAIL(server_fd < 0))
|
|
goto close_cgroup_fd;
|
|
|
|
err = bpf_prog_load("./load_bytes_relative.o", BPF_PROG_TYPE_CGROUP_SKB,
|
|
&obj, &prog_fd);
|
|
if (CHECK_FAIL(err))
|
|
goto close_server_fd;
|
|
|
|
test_result = bpf_object__find_map_by_name(obj, "test_result");
|
|
if (CHECK_FAIL(!test_result))
|
|
goto close_bpf_object;
|
|
|
|
map_fd = bpf_map__fd(test_result);
|
|
if (map_fd < 0)
|
|
goto close_bpf_object;
|
|
|
|
prog = bpf_object__find_program_by_name(obj, "load_bytes_relative");
|
|
if (CHECK_FAIL(!prog))
|
|
goto close_bpf_object;
|
|
|
|
err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_INET_EGRESS,
|
|
BPF_F_ALLOW_MULTI);
|
|
if (CHECK_FAIL(err))
|
|
goto close_bpf_object;
|
|
|
|
client_fd = connect_to_fd(server_fd, 0);
|
|
if (CHECK_FAIL(client_fd < 0))
|
|
goto close_bpf_object;
|
|
close(client_fd);
|
|
|
|
err = bpf_map_lookup_elem(map_fd, &map_key, &map_value);
|
|
if (CHECK_FAIL(err))
|
|
goto close_bpf_object;
|
|
|
|
CHECK(map_value != 1, "bpf", "bpf program returned failure");
|
|
|
|
close_bpf_object:
|
|
bpf_object__close(obj);
|
|
|
|
close_server_fd:
|
|
close(server_fd);
|
|
|
|
close_cgroup_fd:
|
|
close(cgroup_fd);
|
|
}
|