1b83b936fSLeon Hwang // SPDX-License-Identifier: GPL-2.0 2b83b936fSLeon Hwang /* Copyright Leon Hwang */ 3b83b936fSLeon Hwang 4b83b936fSLeon Hwang #include "vmlinux.h" 5b83b936fSLeon Hwang #include <bpf/bpf_helpers.h> 6b83b936fSLeon Hwang #include <bpf/bpf_tracing.h> 7b83b936fSLeon Hwang 8b83b936fSLeon Hwang struct { 9b83b936fSLeon Hwang __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 10b83b936fSLeon Hwang __uint(max_entries, 1); 11b83b936fSLeon Hwang __uint(key_size, sizeof(__u32)); 12b83b936fSLeon Hwang __uint(value_size, sizeof(__u32)); 13b83b936fSLeon Hwang } jmp_table SEC(".maps"); 14b83b936fSLeon Hwang 15b83b936fSLeon Hwang int count = 0; 16b83b936fSLeon Hwang 17b83b936fSLeon Hwang static __noinline subprog_tail(void * ctx)18b83b936fSLeon Hwangint subprog_tail(void *ctx) 19b83b936fSLeon Hwang { 20b83b936fSLeon Hwang bpf_tail_call_static(ctx, &jmp_table, 0); 21b83b936fSLeon Hwang return 0; 22b83b936fSLeon Hwang } 23b83b936fSLeon Hwang 24b83b936fSLeon Hwang SEC("fentry/dummy") BPF_PROG(fentry,struct sk_buff * skb)25b83b936fSLeon Hwangint BPF_PROG(fentry, struct sk_buff *skb) 26b83b936fSLeon Hwang { 27b83b936fSLeon Hwang count++; 28b83b936fSLeon Hwang subprog_tail(ctx); 29b83b936fSLeon Hwang subprog_tail(ctx); 30b83b936fSLeon Hwang 31b83b936fSLeon Hwang return 0; 32b83b936fSLeon Hwang } 33b83b936fSLeon Hwang 34b83b936fSLeon Hwang 35b83b936fSLeon Hwang char _license[] SEC("license") = "GPL"; 36