-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Convert few more selftest to skeletons
Convert few more selftests to use generated BPF skeletons as a demonstration on how to use it. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Martin KaFai Lau <kafai@fb.com> Link: https://lore.kernel.org/bpf/20191214014341.3442258-16-andriin@fb.com
- Loading branch information
Andrii Nakryiko
authored and
Alexei Starovoitov
committed
Dec 15, 2019
1 parent
f3c926a
commit dde53c1
Showing
5 changed files
with
149 additions
and
249 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,90 +1,59 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2019 Facebook */ | ||
#include <test_progs.h> | ||
#include "test_pkt_access.skel.h" | ||
#include "fentry_test.skel.h" | ||
#include "fexit_test.skel.h" | ||
|
||
BPF_EMBED_OBJ(pkt_access, "test_pkt_access.o"); | ||
BPF_EMBED_OBJ(fentry, "fentry_test.o"); | ||
BPF_EMBED_OBJ(fexit, "fexit_test.o"); | ||
|
||
void test_fentry_fexit(void) | ||
{ | ||
struct bpf_prog_load_attr attr_fentry = { | ||
.file = "./fentry_test.o", | ||
}; | ||
struct bpf_prog_load_attr attr_fexit = { | ||
.file = "./fexit_test.o", | ||
}; | ||
|
||
struct bpf_object *obj_fentry = NULL, *obj_fexit = NULL, *pkt_obj; | ||
struct bpf_map *data_map_fentry, *data_map_fexit; | ||
char fentry_name[] = "fentry/bpf_fentry_testX"; | ||
char fexit_name[] = "fexit/bpf_fentry_testX"; | ||
int err, pkt_fd, kfree_skb_fd, i; | ||
struct bpf_link *link[12] = {}; | ||
struct bpf_program *prog[12]; | ||
__u32 duration, retval; | ||
const int zero = 0; | ||
u64 result[12]; | ||
|
||
err = bpf_prog_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS, | ||
&pkt_obj, &pkt_fd); | ||
if (CHECK(err, "prog_load sched cls", "err %d errno %d\n", err, errno)) | ||
struct test_pkt_access *pkt_skel = NULL; | ||
struct fentry_test *fentry_skel = NULL; | ||
struct fexit_test *fexit_skel = NULL; | ||
__u64 *fentry_res, *fexit_res; | ||
__u32 duration = 0, retval; | ||
int err, pkt_fd, i; | ||
|
||
pkt_skel = test_pkt_access__open_and_load(&pkt_access_embed); | ||
if (CHECK(!pkt_skel, "pkt_skel_load", "pkt_access skeleton failed\n")) | ||
return; | ||
err = bpf_prog_load_xattr(&attr_fentry, &obj_fentry, &kfree_skb_fd); | ||
if (CHECK(err, "prog_load fail", "err %d errno %d\n", err, errno)) | ||
fentry_skel = fentry_test__open_and_load(&fentry_embed); | ||
if (CHECK(!fentry_skel, "fentry_skel_load", "fentry skeleton failed\n")) | ||
goto close_prog; | ||
err = bpf_prog_load_xattr(&attr_fexit, &obj_fexit, &kfree_skb_fd); | ||
if (CHECK(err, "prog_load fail", "err %d errno %d\n", err, errno)) | ||
fexit_skel = fexit_test__open_and_load(&fexit_embed); | ||
if (CHECK(!fexit_skel, "fexit_skel_load", "fexit skeleton failed\n")) | ||
goto close_prog; | ||
|
||
for (i = 0; i < 6; i++) { | ||
fentry_name[sizeof(fentry_name) - 2] = '1' + i; | ||
prog[i] = bpf_object__find_program_by_title(obj_fentry, fentry_name); | ||
if (CHECK(!prog[i], "find_prog", "prog %s not found\n", fentry_name)) | ||
goto close_prog; | ||
link[i] = bpf_program__attach_trace(prog[i]); | ||
if (CHECK(IS_ERR(link[i]), "attach_trace", "failed to link\n")) | ||
goto close_prog; | ||
} | ||
data_map_fentry = bpf_object__find_map_by_name(obj_fentry, "fentry_t.bss"); | ||
if (CHECK(!data_map_fentry, "find_data_map", "data map not found\n")) | ||
err = fentry_test__attach(fentry_skel); | ||
if (CHECK(err, "fentry_attach", "fentry attach failed: %d\n", err)) | ||
goto close_prog; | ||
|
||
for (i = 6; i < 12; i++) { | ||
fexit_name[sizeof(fexit_name) - 2] = '1' + i - 6; | ||
prog[i] = bpf_object__find_program_by_title(obj_fexit, fexit_name); | ||
if (CHECK(!prog[i], "find_prog", "prog %s not found\n", fexit_name)) | ||
goto close_prog; | ||
link[i] = bpf_program__attach_trace(prog[i]); | ||
if (CHECK(IS_ERR(link[i]), "attach_trace", "failed to link\n")) | ||
goto close_prog; | ||
} | ||
data_map_fexit = bpf_object__find_map_by_name(obj_fexit, "fexit_te.bss"); | ||
if (CHECK(!data_map_fexit, "find_data_map", "data map not found\n")) | ||
err = fexit_test__attach(fexit_skel); | ||
if (CHECK(err, "fexit_attach", "fexit attach failed: %d\n", err)) | ||
goto close_prog; | ||
|
||
pkt_fd = bpf_program__fd(pkt_skel->progs.test_pkt_access); | ||
err = bpf_prog_test_run(pkt_fd, 1, &pkt_v6, sizeof(pkt_v6), | ||
NULL, NULL, &retval, &duration); | ||
CHECK(err || retval, "ipv6", | ||
"err %d errno %d retval %d duration %d\n", | ||
err, errno, retval, duration); | ||
|
||
err = bpf_map_lookup_elem(bpf_map__fd(data_map_fentry), &zero, &result); | ||
if (CHECK(err, "get_result", | ||
"failed to get output data: %d\n", err)) | ||
goto close_prog; | ||
|
||
err = bpf_map_lookup_elem(bpf_map__fd(data_map_fexit), &zero, result + 6); | ||
if (CHECK(err, "get_result", | ||
"failed to get output data: %d\n", err)) | ||
goto close_prog; | ||
|
||
for (i = 0; i < 12; i++) | ||
if (CHECK(result[i] != 1, "result", "bpf_fentry_test%d failed err %ld\n", | ||
i % 6 + 1, result[i])) | ||
goto close_prog; | ||
fentry_res = (__u64 *)fentry_skel->bss; | ||
fexit_res = (__u64 *)fexit_skel->bss; | ||
printf("%lld\n", fentry_skel->bss->test1_result); | ||
for (i = 0; i < 6; i++) { | ||
CHECK(fentry_res[i] != 1, "result", | ||
"fentry_test%d failed err %lld\n", i + 1, fentry_res[i]); | ||
CHECK(fexit_res[i] != 1, "result", | ||
"fexit_test%d failed err %lld\n", i + 1, fexit_res[i]); | ||
} | ||
|
||
close_prog: | ||
for (i = 0; i < 12; i++) | ||
if (!IS_ERR_OR_NULL(link[i])) | ||
bpf_link__destroy(link[i]); | ||
bpf_object__close(obj_fentry); | ||
bpf_object__close(obj_fexit); | ||
bpf_object__close(pkt_obj); | ||
test_pkt_access__destroy(pkt_skel); | ||
fentry_test__destroy(fentry_skel); | ||
fexit_test__destroy(fexit_skel); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,64 +1,46 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2019 Facebook */ | ||
#include <test_progs.h> | ||
#include "test_pkt_access.skel.h" | ||
#include "fentry_test.skel.h" | ||
|
||
BPF_EMBED_OBJ_DECLARE(pkt_access); | ||
BPF_EMBED_OBJ_DECLARE(fentry); | ||
|
||
void test_fentry_test(void) | ||
{ | ||
struct bpf_prog_load_attr attr = { | ||
.file = "./fentry_test.o", | ||
}; | ||
|
||
char prog_name[] = "fentry/bpf_fentry_testX"; | ||
struct bpf_object *obj = NULL, *pkt_obj; | ||
int err, pkt_fd, kfree_skb_fd, i; | ||
struct bpf_link *link[6] = {}; | ||
struct bpf_program *prog[6]; | ||
struct test_pkt_access *pkt_skel = NULL; | ||
struct fentry_test *fentry_skel = NULL; | ||
int err, pkt_fd, i; | ||
__u32 duration, retval; | ||
struct bpf_map *data_map; | ||
const int zero = 0; | ||
u64 result[6]; | ||
__u64 *result; | ||
|
||
err = bpf_prog_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS, | ||
&pkt_obj, &pkt_fd); | ||
if (CHECK(err, "prog_load sched cls", "err %d errno %d\n", err, errno)) | ||
pkt_skel = test_pkt_access__open_and_load(&pkt_access_embed); | ||
if (CHECK(!pkt_skel, "pkt_skel_load", "pkt_access skeleton failed\n")) | ||
return; | ||
err = bpf_prog_load_xattr(&attr, &obj, &kfree_skb_fd); | ||
if (CHECK(err, "prog_load fail", "err %d errno %d\n", err, errno)) | ||
goto close_prog; | ||
fentry_skel = fentry_test__open_and_load(&fentry_embed); | ||
if (CHECK(!fentry_skel, "fentry_skel_load", "fentry skeleton failed\n")) | ||
goto cleanup; | ||
|
||
for (i = 0; i < 6; i++) { | ||
prog_name[sizeof(prog_name) - 2] = '1' + i; | ||
prog[i] = bpf_object__find_program_by_title(obj, prog_name); | ||
if (CHECK(!prog[i], "find_prog", "prog %s not found\n", prog_name)) | ||
goto close_prog; | ||
link[i] = bpf_program__attach_trace(prog[i]); | ||
if (CHECK(IS_ERR(link[i]), "attach_trace", "failed to link\n")) | ||
goto close_prog; | ||
} | ||
data_map = bpf_object__find_map_by_name(obj, "fentry_t.bss"); | ||
if (CHECK(!data_map, "find_data_map", "data map not found\n")) | ||
goto close_prog; | ||
err = fentry_test__attach(fentry_skel); | ||
if (CHECK(err, "fentry_attach", "fentry attach failed: %d\n", err)) | ||
goto cleanup; | ||
|
||
pkt_fd = bpf_program__fd(pkt_skel->progs.test_pkt_access); | ||
err = bpf_prog_test_run(pkt_fd, 1, &pkt_v6, sizeof(pkt_v6), | ||
NULL, NULL, &retval, &duration); | ||
CHECK(err || retval, "ipv6", | ||
"err %d errno %d retval %d duration %d\n", | ||
err, errno, retval, duration); | ||
|
||
err = bpf_map_lookup_elem(bpf_map__fd(data_map), &zero, &result); | ||
if (CHECK(err, "get_result", | ||
"failed to get output data: %d\n", err)) | ||
goto close_prog; | ||
|
||
for (i = 0; i < 6; i++) | ||
if (CHECK(result[i] != 1, "result", "bpf_fentry_test%d failed err %ld\n", | ||
i + 1, result[i])) | ||
goto close_prog; | ||
result = (__u64 *)fentry_skel->bss; | ||
for (i = 0; i < 6; i++) { | ||
if (CHECK(result[i] != 1, "result", | ||
"fentry_test%d failed err %lld\n", i + 1, result[i])) | ||
goto cleanup; | ||
} | ||
|
||
close_prog: | ||
for (i = 0; i < 6; i++) | ||
if (!IS_ERR_OR_NULL(link[i])) | ||
bpf_link__destroy(link[i]); | ||
bpf_object__close(obj); | ||
bpf_object__close(pkt_obj); | ||
cleanup: | ||
fentry_test__destroy(fentry_skel); | ||
test_pkt_access__destroy(pkt_skel); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.