79 lines · c
1// SPDX-License-Identifier: GPL-2.02#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 22static __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__noinline31int 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__noinline40int 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__noinline47int 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";79