Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
 1// SPDX-License-Identifier: GPL-2.0
 2#include <linux/bpf.h>
 3#include <bpf/bpf_helpers.h>
 4#include "bpf_misc.h"
 5
 6int classifier_0(struct __sk_buff *skb);
 7int classifier_1(struct __sk_buff *skb);
 8
 9struct {
10	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
11	__uint(max_entries, 2);
12	__uint(key_size, sizeof(__u32));
13	__array(values, void (void));
14} jmp_table SEC(".maps") = {
15	.values = {
16		[0] = (void *) &classifier_0,
17		[1] = (void *) &classifier_1,
18	},
19};
20
21int count0 = 0;
22int count1 = 0;
23
24static __noinline
25int subprog_tail0(struct __sk_buff *skb)
26{
27	bpf_tail_call_static(skb, &jmp_table, 0);
28	return 0;
29}
30
31__auxiliary
32SEC("tc")
33int classifier_0(struct __sk_buff *skb)
34{
35	count0++;
36	subprog_tail0(skb);
37	return 0;
38}
39
40static __noinline
41int subprog_tail1(struct __sk_buff *skb)
42{
43	bpf_tail_call_static(skb, &jmp_table, 1);
44	return 0;
45}
46
47__auxiliary
48SEC("tc")
49int classifier_1(struct __sk_buff *skb)
50{
51	count1++;
52	subprog_tail1(skb);
53	return 0;
54}
55
56__success
57__retval(33)
58SEC("tc")
59int tailcall_bpf2bpf_hierarchy_2(struct __sk_buff *skb)
60{
61	int ret = 0;
62
63	subprog_tail0(skb);
64	subprog_tail1(skb);
65
66	__sink(ret);
67	return (count1 << 16) | count0;
68}
69
70char __license[] SEC("license") = "GPL";