1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/bpf.h> 3 #include <bpf/bpf_helpers.h> 4 5 struct { 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("tc") \ 14 int classifier_##x(struct __sk_buff *skb) \ 15 { \ 16 return x; \ 17 } 18 TAIL_FUNC(0) 19 TAIL_FUNC(1) 20 21 static __noinline 22 int subprog_tail(struct __sk_buff *skb) 23 { 24 bpf_tail_call_static(skb, &jmp_table, 0); 25 26 return skb->len * 2; 27 } 28 29 SEC("tc") 30 int entry(struct __sk_buff *skb) 31 { 32 bpf_tail_call_static(skb, &jmp_table, 1); 33 34 return subprog_tail(skb); 35 } 36 37 char __license[] SEC("license") = "GPL"; 38