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, 3); 8 __uint(key_size, sizeof(__u32)); 9 __uint(value_size, sizeof(__u32)); 10} jmp_table SEC(".maps"); 11 12static volatile int count; 13 14__noinline 15int subprog_tail_2(struct __sk_buff *skb) 16{ 17 bpf_tail_call_static(skb, &jmp_table, 2); 18 return skb->len * 3; 19} 20 21__noinline 22int subprog_tail_1(struct __sk_buff *skb) 23{ 24 bpf_tail_call_static(skb, &jmp_table, 1); 25 return skb->len * 2; 26} 27 28__noinline 29int subprog_tail(struct __sk_buff *skb) 30{ 31 bpf_tail_call_static(skb, &jmp_table, 0); 32 return skb->len; 33} 34 35SEC("classifier/1") 36int bpf_func_1(struct __sk_buff *skb) 37{ 38 return subprog_tail_2(skb); 39} 40 41SEC("classifier/2") 42int bpf_func_2(struct __sk_buff *skb) 43{ 44 count++; 45 return subprog_tail_2(skb); 46} 47 48SEC("classifier/0") 49int bpf_func_0(struct __sk_buff *skb) 50{ 51 return subprog_tail_1(skb); 52} 53 54SEC("classifier") 55int entry(struct __sk_buff *skb) 56{ 57 return subprog_tail(skb); 58} 59 60char __license[] SEC("license") = "GPL"; 61int _version SEC("version") = 1; 62