Skip to content

Commit d0b3d2d

Browse files
author
Alexei Starovoitov
committed
Merge branch 'selftests/bpf: Migrate test_tcpbpf_user to be a part of test_progs'
Alexander Duyck says: ==================== Move the test functionality from test_tcpbpf_user into the test_progs framework so that it will be run any time the test_progs framework is run. This will help to prevent future test escapes as the individual tests, such as test_tcpbpf_user, are less likely to be run by developers and CI tests. As a part of moving it over the series goes through and updates the code to make use of the existing APIs included in the test_progs framework. This is meant to simplify and streamline the test code and avoid duplication of effort. v2: Dropped test_tcpbpf_user from .gitignore Replaced CHECK_FAIL calls with CHECK calls Minimized changes in patch 1 when moving the file Updated stg mail command line to display renames in submission Added shutdown logic to end of run_test function to guarantee close Added patch that replaces the two maps with use of global variables v3: Left err at -1 while we are performing send/recv calls w/ data Drop extra labels from test_tcpbpf_user in favor of keeping err label Dropped redundant zero init for tcpbpf_globals result and key Dropped replacing of "printf(" with "fprintf(stderr, " Fixed error in use of ASSERT_OK_PTR which was skipping of run_test Replaced "{ 0 }" with "{}" in init of global in test_tcpbpf_kern.c Added "Acked-by" from Martin KaiFai Lau and Andrii Nakryiko ==================== Acked-by: Martin KaFai Lau <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]>
2 parents 8aaeed8 + 21b5177 commit d0b3d2d

File tree

8 files changed

+157
-371
lines changed

8 files changed

+157
-371
lines changed

tools/testing/selftests/bpf/.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ FEATURE-DUMP.libbpf
88
fixdep
99
test_dev_cgroup
1010
/test_progs*
11-
test_tcpbpf_user
1211
test_verifier_log
1312
feature
1413
test_sock

tools/testing/selftests/bpf/Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ LDLIBS += -lcap -lelf -lz -lrt -lpthread
3232

3333
# Order correspond to 'make run_tests' order
3434
TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
35-
test_verifier_log test_dev_cgroup test_tcpbpf_user \
35+
test_verifier_log test_dev_cgroup \
3636
test_sock test_sockmap get_cgroup_id_user test_socket_cookie \
3737
test_cgroup_storage \
3838
test_netcnt test_tcpnotify_user test_sysctl \
@@ -163,7 +163,6 @@ $(OUTPUT)/test_sock: cgroup_helpers.c
163163
$(OUTPUT)/test_sock_addr: cgroup_helpers.c
164164
$(OUTPUT)/test_socket_cookie: cgroup_helpers.c
165165
$(OUTPUT)/test_sockmap: cgroup_helpers.c
166-
$(OUTPUT)/test_tcpbpf_user: cgroup_helpers.c
167166
$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c
168167
$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c
169168
$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <test_progs.h>
3+
#include <network_helpers.h>
4+
5+
#include "test_tcpbpf.h"
6+
#include "test_tcpbpf_kern.skel.h"
7+
8+
#define LO_ADDR6 "::1"
9+
#define CG_NAME "/tcpbpf-user-test"
10+
11+
static __u32 duration;
12+
13+
static void verify_result(struct tcpbpf_globals *result)
14+
{
15+
__u32 expected_events = ((1 << BPF_SOCK_OPS_TIMEOUT_INIT) |
16+
(1 << BPF_SOCK_OPS_RWND_INIT) |
17+
(1 << BPF_SOCK_OPS_TCP_CONNECT_CB) |
18+
(1 << BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) |
19+
(1 << BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) |
20+
(1 << BPF_SOCK_OPS_NEEDS_ECN) |
21+
(1 << BPF_SOCK_OPS_STATE_CB) |
22+
(1 << BPF_SOCK_OPS_TCP_LISTEN_CB));
23+
24+
/* check global map */
25+
CHECK(expected_events != result->event_map, "event_map",
26+
"unexpected event_map: actual 0x%08x != expected 0x%08x\n",
27+
result->event_map, expected_events);
28+
29+
ASSERT_EQ(result->bytes_received, 501, "bytes_received");
30+
ASSERT_EQ(result->bytes_acked, 1002, "bytes_acked");
31+
ASSERT_EQ(result->data_segs_in, 1, "data_segs_in");
32+
ASSERT_EQ(result->data_segs_out, 1, "data_segs_out");
33+
ASSERT_EQ(result->bad_cb_test_rv, 0x80, "bad_cb_test_rv");
34+
ASSERT_EQ(result->good_cb_test_rv, 0, "good_cb_test_rv");
35+
ASSERT_EQ(result->num_listen, 1, "num_listen");
36+
37+
/* 3 comes from one listening socket + both ends of the connection */
38+
ASSERT_EQ(result->num_close_events, 3, "num_close_events");
39+
40+
/* check setsockopt for SAVE_SYN */
41+
ASSERT_EQ(result->tcp_save_syn, 0, "tcp_save_syn");
42+
43+
/* check getsockopt for SAVED_SYN */
44+
ASSERT_EQ(result->tcp_saved_syn, 1, "tcp_saved_syn");
45+
}
46+
47+
static void run_test(struct tcpbpf_globals *result)
48+
{
49+
int listen_fd = -1, cli_fd = -1, accept_fd = -1;
50+
char buf[1000];
51+
int err = -1;
52+
int i, rv;
53+
54+
listen_fd = start_server(AF_INET6, SOCK_STREAM, LO_ADDR6, 0, 0);
55+
if (CHECK(listen_fd == -1, "start_server", "listen_fd:%d errno:%d\n",
56+
listen_fd, errno))
57+
goto done;
58+
59+
cli_fd = connect_to_fd(listen_fd, 0);
60+
if (CHECK(cli_fd == -1, "connect_to_fd(listen_fd)",
61+
"cli_fd:%d errno:%d\n", cli_fd, errno))
62+
goto done;
63+
64+
accept_fd = accept(listen_fd, NULL, NULL);
65+
if (CHECK(accept_fd == -1, "accept(listen_fd)",
66+
"accept_fd:%d errno:%d\n", accept_fd, errno))
67+
goto done;
68+
69+
/* Send 1000B of '+'s from cli_fd -> accept_fd */
70+
for (i = 0; i < 1000; i++)
71+
buf[i] = '+';
72+
73+
rv = send(cli_fd, buf, 1000, 0);
74+
if (CHECK(rv != 1000, "send(cli_fd)", "rv:%d errno:%d\n", rv, errno))
75+
goto done;
76+
77+
rv = recv(accept_fd, buf, 1000, 0);
78+
if (CHECK(rv != 1000, "recv(accept_fd)", "rv:%d errno:%d\n", rv, errno))
79+
goto done;
80+
81+
/* Send 500B of '.'s from accept_fd ->cli_fd */
82+
for (i = 0; i < 500; i++)
83+
buf[i] = '.';
84+
85+
rv = send(accept_fd, buf, 500, 0);
86+
if (CHECK(rv != 500, "send(accept_fd)", "rv:%d errno:%d\n", rv, errno))
87+
goto done;
88+
89+
rv = recv(cli_fd, buf, 500, 0);
90+
if (CHECK(rv != 500, "recv(cli_fd)", "rv:%d errno:%d\n", rv, errno))
91+
goto done;
92+
93+
/*
94+
* shutdown accept first to guarantee correct ordering for
95+
* bytes_received and bytes_acked when we go to verify the results.
96+
*/
97+
shutdown(accept_fd, SHUT_WR);
98+
err = recv(cli_fd, buf, 1, 0);
99+
if (CHECK(err, "recv(cli_fd) for fin", "err:%d errno:%d\n", err, errno))
100+
goto done;
101+
102+
shutdown(cli_fd, SHUT_WR);
103+
err = recv(accept_fd, buf, 1, 0);
104+
CHECK(err, "recv(accept_fd) for fin", "err:%d errno:%d\n", err, errno);
105+
done:
106+
if (accept_fd != -1)
107+
close(accept_fd);
108+
if (cli_fd != -1)
109+
close(cli_fd);
110+
if (listen_fd != -1)
111+
close(listen_fd);
112+
113+
if (!err)
114+
verify_result(result);
115+
}
116+
117+
void test_tcpbpf_user(void)
118+
{
119+
struct test_tcpbpf_kern *skel;
120+
int cg_fd = -1;
121+
122+
skel = test_tcpbpf_kern__open_and_load();
123+
if (CHECK(!skel, "open and load skel", "failed"))
124+
return;
125+
126+
cg_fd = test__join_cgroup(CG_NAME);
127+
if (CHECK(cg_fd < 0, "test__join_cgroup(" CG_NAME ")",
128+
"cg_fd:%d errno:%d", cg_fd, errno))
129+
goto err;
130+
131+
skel->links.bpf_testcb = bpf_program__attach_cgroup(skel->progs.bpf_testcb, cg_fd);
132+
if (!ASSERT_OK_PTR(skel->links.bpf_testcb, "attach_cgroup(bpf_testcb)"))
133+
goto err;
134+
135+
run_test(&skel->bss->global);
136+
137+
err:
138+
if (cg_fd != -1)
139+
close(cg_fd);
140+
test_tcpbpf_kern__destroy(skel);
141+
}

tools/testing/selftests/bpf/progs/test_tcpbpf_kern.c

Lines changed: 13 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,7 @@
1414
#include <bpf/bpf_endian.h>
1515
#include "test_tcpbpf.h"
1616

17-
struct {
18-
__uint(type, BPF_MAP_TYPE_ARRAY);
19-
__uint(max_entries, 4);
20-
__type(key, __u32);
21-
__type(value, struct tcpbpf_globals);
22-
} global_map SEC(".maps");
23-
24-
struct {
25-
__uint(type, BPF_MAP_TYPE_ARRAY);
26-
__uint(max_entries, 2);
27-
__type(key, __u32);
28-
__type(value, int);
29-
} sockopt_results SEC(".maps");
30-
31-
static inline void update_event_map(int event)
32-
{
33-
__u32 key = 0;
34-
struct tcpbpf_globals g, *gp;
35-
36-
gp = bpf_map_lookup_elem(&global_map, &key);
37-
if (gp == NULL) {
38-
struct tcpbpf_globals g = {0};
39-
40-
g.event_map |= (1 << event);
41-
bpf_map_update_elem(&global_map, &key, &g,
42-
BPF_ANY);
43-
} else {
44-
g = *gp;
45-
g.event_map |= (1 << event);
46-
bpf_map_update_elem(&global_map, &key, &g,
47-
BPF_ANY);
48-
}
49-
}
50-
17+
struct tcpbpf_globals global = {};
5118
int _version SEC("version") = 1;
5219

5320
SEC("sockops")
@@ -105,29 +72,15 @@ int bpf_testcb(struct bpf_sock_ops *skops)
10572

10673
op = (int) skops->op;
10774

108-
update_event_map(op);
75+
global.event_map |= (1 << op);
10976

11077
switch (op) {
11178
case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB:
11279
/* Test failure to set largest cb flag (assumes not defined) */
113-
bad_call_rv = bpf_sock_ops_cb_flags_set(skops, 0x80);
80+
global.bad_cb_test_rv = bpf_sock_ops_cb_flags_set(skops, 0x80);
11481
/* Set callback */
115-
good_call_rv = bpf_sock_ops_cb_flags_set(skops,
82+
global.good_cb_test_rv = bpf_sock_ops_cb_flags_set(skops,
11683
BPF_SOCK_OPS_STATE_CB_FLAG);
117-
/* Update results */
118-
{
119-
__u32 key = 0;
120-
struct tcpbpf_globals g, *gp;
121-
122-
gp = bpf_map_lookup_elem(&global_map, &key);
123-
if (!gp)
124-
break;
125-
g = *gp;
126-
g.bad_cb_test_rv = bad_call_rv;
127-
g.good_cb_test_rv = good_call_rv;
128-
bpf_map_update_elem(&global_map, &key, &g,
129-
BPF_ANY);
130-
}
13184
break;
13285
case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB:
13386
skops->sk_txhash = 0x12345f;
@@ -143,10 +96,8 @@ int bpf_testcb(struct bpf_sock_ops *skops)
14396

14497
thdr = (struct tcphdr *)(header + offset);
14598
v = thdr->syn;
146-
__u32 key = 1;
14799

148-
bpf_map_update_elem(&sockopt_results, &key, &v,
149-
BPF_ANY);
100+
global.tcp_saved_syn = v;
150101
}
151102
}
152103
break;
@@ -156,35 +107,24 @@ int bpf_testcb(struct bpf_sock_ops *skops)
156107
break;
157108
case BPF_SOCK_OPS_STATE_CB:
158109
if (skops->args[1] == BPF_TCP_CLOSE) {
159-
__u32 key = 0;
160-
struct tcpbpf_globals g, *gp;
161-
162-
gp = bpf_map_lookup_elem(&global_map, &key);
163-
if (!gp)
164-
break;
165-
g = *gp;
166110
if (skops->args[0] == BPF_TCP_LISTEN) {
167-
g.num_listen++;
111+
global.num_listen++;
168112
} else {
169-
g.total_retrans = skops->total_retrans;
170-
g.data_segs_in = skops->data_segs_in;
171-
g.data_segs_out = skops->data_segs_out;
172-
g.bytes_received = skops->bytes_received;
173-
g.bytes_acked = skops->bytes_acked;
113+
global.total_retrans = skops->total_retrans;
114+
global.data_segs_in = skops->data_segs_in;
115+
global.data_segs_out = skops->data_segs_out;
116+
global.bytes_received = skops->bytes_received;
117+
global.bytes_acked = skops->bytes_acked;
174118
}
175-
g.num_close_events++;
176-
bpf_map_update_elem(&global_map, &key, &g,
177-
BPF_ANY);
119+
global.num_close_events++;
178120
}
179121
break;
180122
case BPF_SOCK_OPS_TCP_LISTEN_CB:
181123
bpf_sock_ops_cb_flags_set(skops, BPF_SOCK_OPS_STATE_CB_FLAG);
182124
v = bpf_setsockopt(skops, IPPROTO_TCP, TCP_SAVE_SYN,
183125
&save_syn, sizeof(save_syn));
184126
/* Update global map w/ result of setsock opt */
185-
__u32 key = 0;
186-
187-
bpf_map_update_elem(&sockopt_results, &key, &v, BPF_ANY);
127+
global.tcp_save_syn = v;
188128
break;
189129
default:
190130
rv = -1;

tools/testing/selftests/bpf/tcp_client.py

Lines changed: 0 additions & 50 deletions
This file was deleted.

0 commit comments

Comments
 (0)