tailcall_bpf2bpf4.c (1342B)
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_ARRAY); 7 __uint(max_entries, 1); 8 __uint(key_size, sizeof(__u32)); 9 __uint(value_size, sizeof(__u32)); 10} nop_table SEC(".maps"); 11 12struct { 13 __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 14 __uint(max_entries, 3); 15 __uint(key_size, sizeof(__u32)); 16 __uint(value_size, sizeof(__u32)); 17} jmp_table SEC(".maps"); 18 19int count = 0; 20int noise = 0; 21 22__always_inline int subprog_noise(void) 23{ 24 __u32 key = 0; 25 26 bpf_map_lookup_elem(&nop_table, &key); 27 return 0; 28} 29 30__noinline 31int subprog_tail_2(struct __sk_buff *skb) 32{ 33 if (noise) 34 subprog_noise(); 35 bpf_tail_call_static(skb, &jmp_table, 2); 36 return skb->len * 3; 37} 38 39__noinline 40int subprog_tail_1(struct __sk_buff *skb) 41{ 42 bpf_tail_call_static(skb, &jmp_table, 1); 43 return skb->len * 2; 44} 45 46__noinline 47int subprog_tail(struct __sk_buff *skb) 48{ 49 bpf_tail_call_static(skb, &jmp_table, 0); 50 return skb->len; 51} 52 53SEC("tc") 54int classifier_1(struct __sk_buff *skb) 55{ 56 return subprog_tail_2(skb); 57} 58 59SEC("tc") 60int classifier_2(struct __sk_buff *skb) 61{ 62 count++; 63 return subprog_tail_2(skb); 64} 65 66SEC("tc") 67int classifier_0(struct __sk_buff *skb) 68{ 69 return subprog_tail_1(skb); 70} 71 72SEC("tc") 73int entry(struct __sk_buff *skb) 74{ 75 return subprog_tail(skb); 76} 77 78char __license[] SEC("license") = "GPL";