brintos

brintos / linux-shallow public Read only

0
0
Text · 1.1 KiB · a7fb91c Raw
63 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/bpf.h>3#include <bpf/bpf_helpers.h>4#include "bpf_misc.h"5 6int classifier_0(struct __sk_buff *skb);7 8struct {9	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);10	__uint(max_entries, 1);11	__uint(key_size, sizeof(__u32));12	__array(values, void (void));13} jmp_table0 SEC(".maps") = {14	.values = {15		[0] = (void *) &classifier_0,16	},17};18 19struct {20	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);21	__uint(max_entries, 1);22	__uint(key_size, sizeof(__u32));23	__array(values, void (void));24} jmp_table1 SEC(".maps") = {25	.values = {26		[0] = (void *) &classifier_0,27	},28};29 30int count = 0;31 32static __noinline33int subprog_tail(struct __sk_buff *skb, void *jmp_table)34{35	bpf_tail_call_static(skb, jmp_table, 0);36	return 0;37}38 39__auxiliary40SEC("tc")41int classifier_0(struct __sk_buff *skb)42{43	count++;44	subprog_tail(skb, &jmp_table0);45	subprog_tail(skb, &jmp_table1);46	return count;47}48 49__success50__retval(33)51SEC("tc")52int tailcall_bpf2bpf_hierarchy_3(struct __sk_buff *skb)53{54	int ret = 0;55 56	bpf_tail_call_static(skb, &jmp_table0, 0);57 58	__sink(ret);59	return ret;60}61 62char __license[] SEC("license") = "GPL";63