Skip to content

Commit 909be70

Browse files
fomichevkernel-patches-bot
authored andcommitted
From: YiFei Zhu <[email protected]>
This is a simple test to check that loading and dumping metadata in btftool works, whether or not metadata contents are used by the program. A C test is also added to make sure the skeleton code can read the metadata values. Cc: YiFei Zhu <[email protected]> Signed-off-by: YiFei Zhu <[email protected]> Signed-off-by: Stanislav Fomichev <[email protected]> --- tools/testing/selftests/bpf/Makefile | 3 +- .../selftests/bpf/prog_tests/metadata.c | 81 ++++++++++++++++++ .../selftests/bpf/progs/metadata_unused.c | 15 ++++ .../selftests/bpf/progs/metadata_used.c | 15 ++++ .../selftests/bpf/test_bpftool_metadata.sh | 82 +++++++++++++++++++ 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/metadata.c create mode 100644 tools/testing/selftests/bpf/progs/metadata_unused.c create mode 100644 tools/testing/selftests/bpf/progs/metadata_used.c create mode 100755 tools/testing/selftests/bpf/test_bpftool_metadata.sh
1 parent e9c06a5 commit 909be70

File tree

5 files changed

+195
-1
lines changed

5 files changed

+195
-1
lines changed

tools/testing/selftests/bpf/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ TEST_PROGS := test_kmod.sh \
6868
test_tc_edt.sh \
6969
test_xdping.sh \
7070
test_bpftool_build.sh \
71-
test_bpftool.sh
71+
test_bpftool.sh \
72+
test_bpftool_metadata.sh \
7273

7374
TEST_PROGS_EXTENDED := with_addr.sh \
7475
with_tunnels.sh \
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
3+
/*
4+
* Copyright 2020 Google LLC.
5+
*/
6+
7+
#include <test_progs.h>
8+
#include <cgroup_helpers.h>
9+
#include <network_helpers.h>
10+
11+
#include "metadata_unused.skel.h"
12+
#include "metadata_used.skel.h"
13+
14+
static int duration;
15+
16+
static void test_metadata_unused(void)
17+
{
18+
struct metadata_unused *obj;
19+
int err;
20+
21+
obj = metadata_unused__open_and_load();
22+
if (CHECK(!obj, "skel-load", "errno %d", errno))
23+
return;
24+
25+
/* Assert that we can access the metadata in skel and the values are
26+
* what we expect.
27+
*/
28+
if (CHECK(strncmp(obj->rodata->bpf_metadata_a, "foo",
29+
sizeof(obj->rodata->bpf_metadata_a)),
30+
"bpf_metadata_a", "expected \"foo\", value differ"))
31+
goto close_bpf_object;
32+
if (CHECK(obj->rodata->bpf_metadata_b != 1, "bpf_metadata_b",
33+
"expected 1, got %d", obj->rodata->bpf_metadata_b))
34+
goto close_bpf_object;
35+
36+
/* Assert that binding metadata map to prog again succeeds. */
37+
err = bpf_prog_bind_map(bpf_program__fd(obj->progs.prog),
38+
bpf_map__fd(obj->maps.rodata), NULL);
39+
CHECK(err, "rebind_map", "errno %d, expected 0", errno);
40+
41+
close_bpf_object:
42+
metadata_unused__destroy(obj);
43+
}
44+
45+
static void test_metadata_used(void)
46+
{
47+
struct metadata_used *obj;
48+
int err;
49+
50+
obj = metadata_used__open_and_load();
51+
if (CHECK(!obj, "skel-load", "errno %d", errno))
52+
return;
53+
54+
/* Assert that we can access the metadata in skel and the values are
55+
* what we expect.
56+
*/
57+
if (CHECK(strncmp(obj->rodata->bpf_metadata_a, "bar",
58+
sizeof(obj->rodata->bpf_metadata_a)),
59+
"metadata_a", "expected \"bar\", value differ"))
60+
goto close_bpf_object;
61+
if (CHECK(obj->rodata->bpf_metadata_b != 2, "metadata_b",
62+
"expected 2, got %d", obj->rodata->bpf_metadata_b))
63+
goto close_bpf_object;
64+
65+
/* Assert that binding metadata map to prog again succeeds. */
66+
err = bpf_prog_bind_map(bpf_program__fd(obj->progs.prog),
67+
bpf_map__fd(obj->maps.rodata), NULL);
68+
CHECK(err, "rebind_map", "errno %d, expected 0", errno);
69+
70+
close_bpf_object:
71+
metadata_used__destroy(obj);
72+
}
73+
74+
void test_metadata(void)
75+
{
76+
if (test__start_subtest("unused"))
77+
test_metadata_unused();
78+
79+
if (test__start_subtest("used"))
80+
test_metadata_used();
81+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
3+
#include <linux/bpf.h>
4+
#include <bpf/bpf_helpers.h>
5+
6+
const char bpf_metadata_a[] SEC(".rodata") = "foo";
7+
const int bpf_metadata_b SEC(".rodata") = 1;
8+
9+
SEC("cgroup_skb/egress")
10+
int prog(struct xdp_md *ctx)
11+
{
12+
return 0;
13+
}
14+
15+
char _license[] SEC("license") = "GPL";
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
3+
#include <linux/bpf.h>
4+
#include <bpf/bpf_helpers.h>
5+
6+
const char bpf_metadata_a[] SEC(".rodata") = "bar";
7+
const int bpf_metadata_b SEC(".rodata") = 2;
8+
9+
SEC("cgroup_skb/egress")
10+
int prog(struct xdp_md *ctx)
11+
{
12+
return bpf_metadata_b ? 1 : 0;
13+
}
14+
15+
char _license[] SEC("license") = "GPL";
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0
3+
4+
# Kselftest framework requirement - SKIP code is 4.
5+
ksft_skip=4
6+
7+
TESTNAME=bpftool_metadata
8+
BPF_FS=$(awk '$3 == "bpf" {print $2; exit}' /proc/mounts)
9+
BPF_DIR=$BPF_FS/test_$TESTNAME
10+
11+
_cleanup()
12+
{
13+
set +e
14+
rm -rf $BPF_DIR 2> /dev/null
15+
}
16+
17+
cleanup_skip()
18+
{
19+
echo "selftests: $TESTNAME [SKIP]"
20+
_cleanup
21+
22+
exit $ksft_skip
23+
}
24+
25+
cleanup()
26+
{
27+
if [ "$?" = 0 ]; then
28+
echo "selftests: $TESTNAME [PASS]"
29+
else
30+
echo "selftests: $TESTNAME [FAILED]"
31+
fi
32+
_cleanup
33+
}
34+
35+
if [ $(id -u) -ne 0 ]; then
36+
echo "selftests: $TESTNAME [SKIP] Need root privileges"
37+
exit $ksft_skip
38+
fi
39+
40+
if [ -z "$BPF_FS" ]; then
41+
echo "selftests: $TESTNAME [SKIP] Could not run test without bpffs mounted"
42+
exit $ksft_skip
43+
fi
44+
45+
if ! bpftool version > /dev/null 2>&1; then
46+
echo "selftests: $TESTNAME [SKIP] Could not run test without bpftool"
47+
exit $ksft_skip
48+
fi
49+
50+
set -e
51+
52+
trap cleanup_skip EXIT
53+
54+
mkdir $BPF_DIR
55+
56+
trap cleanup EXIT
57+
58+
bpftool prog load metadata_unused.o $BPF_DIR/unused
59+
60+
METADATA_PLAIN="$(bpftool prog)"
61+
echo "$METADATA_PLAIN" | grep 'a = "foo"' > /dev/null
62+
echo "$METADATA_PLAIN" | grep 'b = 1' > /dev/null
63+
64+
bpftool prog --json | grep '"metadata":{"a":"foo","b":1}' > /dev/null
65+
66+
bpftool map | grep 'metadata.rodata' > /dev/null
67+
68+
rm $BPF_DIR/unused
69+
70+
bpftool prog load metadata_used.o $BPF_DIR/used
71+
72+
METADATA_PLAIN="$(bpftool prog)"
73+
echo "$METADATA_PLAIN" | grep 'a = "bar"' > /dev/null
74+
echo "$METADATA_PLAIN" | grep 'b = 2' > /dev/null
75+
76+
bpftool prog --json | grep '"metadata":{"a":"bar","b":2}' > /dev/null
77+
78+
bpftool map | grep 'metadata.rodata' > /dev/null
79+
80+
rm $BPF_DIR/used
81+
82+
exit 0

0 commit comments

Comments
 (0)