-
Notifications
You must be signed in to change notification settings - Fork 123
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Add tailcall_bpf2bpf tests
Add four tests to tailcalls selftest explicitly named "tailcall_bpf2bpf_X" as their purpose is to validate that combination of tailcalls with bpf2bpf calls are working properly. These tests also validate LD_ABS from subprograms. Signed-off-by: Maciej Fijalkowski <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]>
- Loading branch information
Showing
5 changed files
with
533 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <linux/bpf.h> | ||
#include <bpf/bpf_helpers.h> | ||
|
||
struct { | ||
__uint(type, BPF_MAP_TYPE_PROG_ARRAY); | ||
__uint(max_entries, 2); | ||
__uint(key_size, sizeof(__u32)); | ||
__uint(value_size, sizeof(__u32)); | ||
} jmp_table SEC(".maps"); | ||
|
||
#define TAIL_FUNC(x) \ | ||
SEC("classifier/" #x) \ | ||
int bpf_func_##x(struct __sk_buff *skb) \ | ||
{ \ | ||
return x; \ | ||
} | ||
TAIL_FUNC(0) | ||
TAIL_FUNC(1) | ||
|
||
static __noinline | ||
int subprog_tail(struct __sk_buff *skb) | ||
{ | ||
bpf_tail_call(skb, &jmp_table, 0); | ||
|
||
return skb->len * 2; | ||
} | ||
|
||
SEC("classifier") | ||
int entry(struct __sk_buff *skb) | ||
{ | ||
bpf_tail_call(skb, &jmp_table, 1); | ||
|
||
return subprog_tail(skb); | ||
} | ||
|
||
char __license[] SEC("license") = "GPL"; | ||
int _version SEC("version") = 1; |
Oops, something went wrong.