brintos

brintos / linux-shallow public Read only

0
0
Text · 1.3 KiB · a017d6b Raw
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