5e0b0a4c52
Cover the case when tail call count needs to be passed from BPF function to BPF function, and the caller has data on stack. Specifically when the size of data allocated on BPF stack is not a multiple on 8. Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20220616162037.535469-3-jakub@cloudflare.com
43 lines
801 B
C
43 lines
801 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
|
|
#define __unused __attribute__((unused))
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
|
|
__uint(max_entries, 1);
|
|
__uint(key_size, sizeof(__u32));
|
|
__uint(value_size, sizeof(__u32));
|
|
} jmp_table SEC(".maps");
|
|
|
|
int done = 0;
|
|
|
|
SEC("tc")
|
|
int classifier_0(struct __sk_buff *skb __unused)
|
|
{
|
|
done = 1;
|
|
return 0;
|
|
}
|
|
|
|
static __noinline
|
|
int subprog_tail(struct __sk_buff *skb)
|
|
{
|
|
/* Don't propagate the constant to the caller */
|
|
volatile int ret = 1;
|
|
|
|
bpf_tail_call_static(skb, &jmp_table, 0);
|
|
return ret;
|
|
}
|
|
|
|
SEC("tc")
|
|
int entry(struct __sk_buff *skb)
|
|
{
|
|
/* Have data on stack which size is not a multiple of 8 */
|
|
volatile char arr[1] = {};
|
|
|
|
return subprog_tail(skb);
|
|
}
|
|
|
|
char __license[] SEC("license") = "GPL";
|