Skip to content

Commit 7ae2e00

Browse files
netoptimizerAlexei Starovoitov
authored andcommitted
selftests/bpf: Xdp_adjust_tail add grow tail tests
Extend BPF selftest xdp_adjust_tail with grow tail tests, which is added as subtest's. The first grow test stays in same form as original shrink test. The second grow test use the newer bpf_prog_test_run_xattr() calls, and does extra checking of data contents. Signed-off-by: Jesper Dangaard Brouer <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Link: https://lore.kernel.org/bpf/158945350567.97035.9632611946765811876.stgit@firesoul
1 parent 68545fb commit 7ae2e00

File tree

2 files changed

+144
-5
lines changed

2 files changed

+144
-5
lines changed

tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c

Lines changed: 111 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
void test_xdp_adjust_tail_shrink(void)
66
{
77
const char *file = "./test_xdp_adjust_tail_shrink.o";
8+
__u32 duration, retval, size, expect_sz;
89
struct bpf_object *obj;
9-
char buf[128];
10-
__u32 duration, retval, size;
1110
int err, prog_fd;
11+
char buf[128];
1212

1313
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
1414
if (CHECK_FAIL(err))
@@ -21,15 +21,121 @@ void test_xdp_adjust_tail_shrink(void)
2121
"ipv4", "err %d errno %d retval %d size %d\n",
2222
err, errno, retval, size);
2323

24+
expect_sz = sizeof(pkt_v6) - 20; /* Test shrink with 20 bytes */
2425
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
2526
buf, &size, &retval, &duration);
26-
CHECK(err || retval != XDP_TX || size != 54,
27-
"ipv6", "err %d errno %d retval %d size %d\n",
27+
CHECK(err || retval != XDP_TX || size != expect_sz,
28+
"ipv6", "err %d errno %d retval %d size %d expect-size %d\n",
29+
err, errno, retval, size, expect_sz);
30+
bpf_object__close(obj);
31+
}
32+
33+
void test_xdp_adjust_tail_grow(void)
34+
{
35+
const char *file = "./test_xdp_adjust_tail_grow.o";
36+
struct bpf_object *obj;
37+
char buf[4096]; /* avoid segfault: large buf to hold grow results */
38+
__u32 duration, retval, size, expect_sz;
39+
int err, prog_fd;
40+
41+
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
42+
if (CHECK_FAIL(err))
43+
return;
44+
45+
err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
46+
buf, &size, &retval, &duration);
47+
CHECK(err || retval != XDP_DROP,
48+
"ipv4", "err %d errno %d retval %d size %d\n",
2849
err, errno, retval, size);
50+
51+
expect_sz = sizeof(pkt_v6) + 40; /* Test grow with 40 bytes */
52+
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6) /* 74 */,
53+
buf, &size, &retval, &duration);
54+
CHECK(err || retval != XDP_TX || size != expect_sz,
55+
"ipv6", "err %d errno %d retval %d size %d expect-size %d\n",
56+
err, errno, retval, size, expect_sz);
57+
58+
bpf_object__close(obj);
59+
}
60+
61+
void test_xdp_adjust_tail_grow2(void)
62+
{
63+
const char *file = "./test_xdp_adjust_tail_grow.o";
64+
char buf[4096]; /* avoid segfault: large buf to hold grow results */
65+
int tailroom = 320; /* SKB_DATA_ALIGN(sizeof(struct skb_shared_info))*/;
66+
struct bpf_object *obj;
67+
int err, cnt, i;
68+
int max_grow;
69+
70+
struct bpf_prog_test_run_attr tattr = {
71+
.repeat = 1,
72+
.data_in = &buf,
73+
.data_out = &buf,
74+
.data_size_in = 0, /* Per test */
75+
.data_size_out = 0, /* Per test */
76+
};
77+
78+
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &tattr.prog_fd);
79+
if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
80+
return;
81+
82+
/* Test case-64 */
83+
memset(buf, 1, sizeof(buf));
84+
tattr.data_size_in = 64; /* Determine test case via pkt size */
85+
tattr.data_size_out = 128; /* Limit copy_size */
86+
/* Kernel side alloc packet memory area that is zero init */
87+
err = bpf_prog_test_run_xattr(&tattr);
88+
89+
CHECK_ATTR(errno != ENOSPC /* Due limit copy_size in bpf_test_finish */
90+
|| tattr.retval != XDP_TX
91+
|| tattr.data_size_out != 192, /* Expected grow size */
92+
"case-64",
93+
"err %d errno %d retval %d size %d\n",
94+
err, errno, tattr.retval, tattr.data_size_out);
95+
96+
/* Extra checks for data contents */
97+
CHECK_ATTR(tattr.data_size_out != 192
98+
|| buf[0] != 1 || buf[63] != 1 /* 0-63 memset to 1 */
99+
|| buf[64] != 0 || buf[127] != 0 /* 64-127 memset to 0 */
100+
|| buf[128] != 1 || buf[191] != 1, /*128-191 memset to 1 */
101+
"case-64-data",
102+
"err %d errno %d retval %d size %d\n",
103+
err, errno, tattr.retval, tattr.data_size_out);
104+
105+
/* Test case-128 */
106+
memset(buf, 2, sizeof(buf));
107+
tattr.data_size_in = 128; /* Determine test case via pkt size */
108+
tattr.data_size_out = sizeof(buf); /* Copy everything */
109+
err = bpf_prog_test_run_xattr(&tattr);
110+
111+
max_grow = 4096 - XDP_PACKET_HEADROOM - tailroom; /* 3520 */
112+
CHECK_ATTR(err
113+
|| tattr.retval != XDP_TX
114+
|| tattr.data_size_out != max_grow,/* Expect max grow size */
115+
"case-128",
116+
"err %d errno %d retval %d size %d expect-size %d\n",
117+
err, errno, tattr.retval, tattr.data_size_out, max_grow);
118+
119+
/* Extra checks for data content: Count grow size, will contain zeros */
120+
for (i = 0, cnt = 0; i < sizeof(buf); i++) {
121+
if (buf[i] == 0)
122+
cnt++;
123+
}
124+
CHECK_ATTR((cnt != (max_grow - tattr.data_size_in)) /* Grow increase */
125+
|| tattr.data_size_out != max_grow, /* Total grow size */
126+
"case-128-data",
127+
"err %d errno %d retval %d size %d grow-size %d\n",
128+
err, errno, tattr.retval, tattr.data_size_out, cnt);
129+
29130
bpf_object__close(obj);
30131
}
31132

32133
void test_xdp_adjust_tail(void)
33134
{
34-
test_xdp_adjust_tail_shrink();
135+
if (test__start_subtest("xdp_adjust_tail_shrink"))
136+
test_xdp_adjust_tail_shrink();
137+
if (test__start_subtest("xdp_adjust_tail_grow"))
138+
test_xdp_adjust_tail_grow();
139+
if (test__start_subtest("xdp_adjust_tail_grow2"))
140+
test_xdp_adjust_tail_grow2();
35141
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <linux/bpf.h>
3+
#include <bpf/bpf_helpers.h>
4+
5+
SEC("xdp_adjust_tail_grow")
6+
int _xdp_adjust_tail_grow(struct xdp_md *xdp)
7+
{
8+
void *data_end = (void *)(long)xdp->data_end;
9+
void *data = (void *)(long)xdp->data;
10+
unsigned int data_len;
11+
int offset = 0;
12+
13+
/* Data length determine test case */
14+
data_len = data_end - data;
15+
16+
if (data_len == 54) { /* sizeof(pkt_v4) */
17+
offset = 4096; /* test too large offset */
18+
} else if (data_len == 74) { /* sizeof(pkt_v6) */
19+
offset = 40;
20+
} else if (data_len == 64) {
21+
offset = 128;
22+
} else if (data_len == 128) {
23+
offset = 4096 - 256 - 320 - data_len; /* Max tail grow 3520 */
24+
} else {
25+
return XDP_ABORTED; /* No matching test */
26+
}
27+
28+
if (bpf_xdp_adjust_tail(xdp, offset))
29+
return XDP_DROP;
30+
return XDP_TX;
31+
}
32+
33+
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)