forked from torvalds/linux
Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
bpf: selftest: Add kfunc_call test
This patch adds two kernel function bpf_kfunc_call_test[12]() for the selftest's test_run purpose. They will be allowed for tc_cls prog. The selftest calling the kernel function bpf_kfunc_call_test[12]() is also added in this patch. Signed-off-by: Martin KaFai Lau <kafai@fb.com>
- Loading branch information
1 parent
e5c1544
commit 5839e49467b4593db0b16c1343cf9d9d60cc6dcd
Showing
5 changed files
with
162 additions
and
0 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
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
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 |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| // SPDX-License-Identifier: GPL-2.0 | ||
| /* Copyright (c) 2021 Facebook */ | ||
| #include <test_progs.h> | ||
| #include <network_helpers.h> | ||
| #include "kfunc_call_test.skel.h" | ||
| #include "kfunc_call_test_subprog.skel.h" | ||
|
|
||
| static __u32 duration; | ||
|
|
||
| static void test_main(void) | ||
| { | ||
| struct kfunc_call_test *skel; | ||
| int prog_fd, retval, err; | ||
|
|
||
| skel = kfunc_call_test__open_and_load(); | ||
| if (!ASSERT_OK_PTR(skel, "skel")) | ||
| return; | ||
|
|
||
| prog_fd = bpf_program__fd(skel->progs.kfunc_call_test1); | ||
| err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), | ||
| NULL, NULL, (__u32 *)&retval, &duration); | ||
|
|
||
| if (ASSERT_OK(err, "bpf_prog_test_run(test1)")) | ||
| ASSERT_EQ(retval, 12, "test1-retval"); | ||
|
|
||
| prog_fd = bpf_program__fd(skel->progs.kfunc_call_test2); | ||
| err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), | ||
| NULL, NULL, (__u32 *)&retval, &duration); | ||
| if (ASSERT_OK(err, "bpf_prog_test_run(test2)")) | ||
| ASSERT_EQ(retval, 3, "test2-retval"); | ||
|
|
||
| kfunc_call_test__destroy(skel); | ||
| } | ||
|
|
||
| static void test_subprog(void) | ||
| { | ||
| struct kfunc_call_test_subprog *skel; | ||
| int prog_fd, retval, err; | ||
|
|
||
| skel = kfunc_call_test_subprog__open_and_load(); | ||
| if (!ASSERT_OK_PTR(skel, "skel")) | ||
| return; | ||
|
|
||
| prog_fd = bpf_program__fd(skel->progs.kfunc_call_test1); | ||
| err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), | ||
| NULL, NULL, (__u32 *)&retval, &duration); | ||
|
|
||
| if (ASSERT_OK(err, "bpf_prog_test_run(test1)")) | ||
| ASSERT_EQ(retval, 10, "test1-retval"); | ||
|
|
||
| kfunc_call_test_subprog__destroy(skel); | ||
| } | ||
|
|
||
| void test_kfunc_call(void) | ||
| { | ||
| if (test__start_subtest("main")) | ||
| test_main(); | ||
|
|
||
| if (test__start_subtest("subprog")) | ||
| test_subprog(); | ||
| } |
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 |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| // SPDX-License-Identifier: GPL-2.0 | ||
| /* Copyright (c) 2021 Facebook */ | ||
| #include <linux/bpf.h> | ||
| #include <bpf/bpf_helpers.h> | ||
| #include "bpf_tcp_helpers.h" | ||
|
|
||
| extern __u64 bpf_kfunc_call_test1(struct sock *sk, __u32 a, __u64 b, | ||
| __u32 c, __u64 d) __ksym; | ||
| extern int bpf_kfunc_call_test2(struct sock *sk, __u32 a, __u32 b) __ksym; | ||
|
|
||
| SEC("classifier/test2") | ||
| int kfunc_call_test2(struct __sk_buff *skb) | ||
| { | ||
| struct bpf_sock *sk = skb->sk; | ||
|
|
||
| if (!sk) | ||
| return -1; | ||
|
|
||
| sk = bpf_sk_fullsock(sk); | ||
| if (!sk) | ||
| return -1; | ||
|
|
||
| return bpf_kfunc_call_test2((struct sock *)sk, 1, 2); | ||
| } | ||
|
|
||
| SEC("classifier/test1") | ||
| int kfunc_call_test1(struct __sk_buff *skb) | ||
| { | ||
| struct bpf_sock *sk = skb->sk; | ||
| __u64 a = 1ULL << 32; | ||
| __u32 ret; | ||
|
|
||
| if (!sk) | ||
| return -1; | ||
|
|
||
| sk = bpf_sk_fullsock(sk); | ||
| if (!sk) | ||
| return -1; | ||
|
|
||
| a = bpf_kfunc_call_test1((struct sock *)sk, 1, a | 2, 3, a | 4); | ||
|
|
||
| ret = a >> 32; /* ret should be 2 */ | ||
| ret += (__u32)a; /* ret should be 12 */ | ||
|
|
||
| return ret; | ||
| } | ||
|
|
||
| char _license[] SEC("license") = "GPL"; |
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 |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| // SPDX-License-Identifier: GPL-2.0 | ||
| /* Copyright (c) 2021 Facebook */ | ||
| #include <linux/bpf.h> | ||
| #include <bpf/bpf_helpers.h> | ||
| #include "bpf_tcp_helpers.h" | ||
|
|
||
| extern __u64 bpf_kfunc_call_test1(struct sock *sk, __u32 a, __u64 b, | ||
| __u32 c, __u64 d) __ksym; | ||
|
|
||
| __attribute__ ((noinline)) | ||
| int f1(struct __sk_buff *skb) | ||
| { | ||
| struct bpf_sock *sk = skb->sk; | ||
|
|
||
| if (!sk) | ||
| return -1; | ||
|
|
||
| sk = bpf_sk_fullsock(sk); | ||
| if (!sk) | ||
| return -1; | ||
|
|
||
| return (__u32)bpf_kfunc_call_test1((struct sock *)sk, 1, 2, 3, 4); | ||
| } | ||
|
|
||
| SEC("classifier/test1_subprog") | ||
| int kfunc_call_test1(struct __sk_buff *skb) | ||
| { | ||
| return f1(skb); | ||
| } | ||
|
|
||
| char _license[] SEC("license") = "GPL"; |