1// SPDX-License-Identifier: GPL-2.0 2#include <linux/bpf.h> 3#include <bpf/bpf_helpers.h> 4 5struct { 6 __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 7 __uint(max_entries, 2); 8 __uint(key_size, sizeof(__u32)); 9 __uint(value_size, sizeof(__u32)); 10} jmp_table SEC(".maps"); 11 12#define TAIL_FUNC(x) \ 13 SEC("classifier/" #x) \ 14 int bpf_func_##x(struct __sk_buff *skb) \ 15 { \ 16 return x; \ 17 } 18TAIL_FUNC(0) 19TAIL_FUNC(1) 20 21static __noinline 22int subprog_tail(struct __sk_buff *skb) 23{ 24 bpf_tail_call_static(skb, &jmp_table, 0); 25 26 return skb->len * 2; 27} 28 29SEC("classifier") 30int entry(struct __sk_buff *skb) 31{ 32 bpf_tail_call_static(skb, &jmp_table, 1); 33 34 return subprog_tail(skb); 35} 36 37char __license[] SEC("license") = "GPL"; 38int _version SEC("version") = 1; 39