tailcall2.c (1054B)
1// SPDX-License-Identifier: GPL-2.0 2#include <linux/bpf.h> 3 4#include <bpf/bpf_helpers.h> 5 6struct { 7 __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 8 __uint(max_entries, 5); 9 __uint(key_size, sizeof(__u32)); 10 __uint(value_size, sizeof(__u32)); 11} jmp_table SEC(".maps"); 12 13SEC("tc") 14int classifier_0(struct __sk_buff *skb) 15{ 16 bpf_tail_call_static(skb, &jmp_table, 1); 17 return 0; 18} 19 20SEC("tc") 21int classifier_1(struct __sk_buff *skb) 22{ 23 bpf_tail_call_static(skb, &jmp_table, 2); 24 return 1; 25} 26 27SEC("tc") 28int classifier_2(struct __sk_buff *skb) 29{ 30 return 2; 31} 32 33SEC("tc") 34int classifier_3(struct __sk_buff *skb) 35{ 36 bpf_tail_call_static(skb, &jmp_table, 4); 37 return 3; 38} 39 40SEC("tc") 41int classifier_4(struct __sk_buff *skb) 42{ 43 bpf_tail_call_static(skb, &jmp_table, 3); 44 return 4; 45} 46 47SEC("tc") 48int entry(struct __sk_buff *skb) 49{ 50 bpf_tail_call_static(skb, &jmp_table, 0); 51 /* Check multi-prog update. */ 52 bpf_tail_call_static(skb, &jmp_table, 2); 53 /* Check tail call limit. */ 54 bpf_tail_call_static(skb, &jmp_table, 3); 55 return 3; 56} 57 58char __license[] SEC("license") = "GPL";