1dbd7eb14SDaniel Borkmann // SPDX-License-Identifier: GPL-2.0
2dbd7eb14SDaniel Borkmann #include <linux/bpf.h>
3dbd7eb14SDaniel Borkmann 
4dbd7eb14SDaniel Borkmann #include <bpf/bpf_helpers.h>
5dbd7eb14SDaniel Borkmann 
6dbd7eb14SDaniel Borkmann struct {
7dbd7eb14SDaniel Borkmann 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
8dbd7eb14SDaniel Borkmann 	__uint(max_entries, 1);
9dbd7eb14SDaniel Borkmann 	__uint(key_size, sizeof(__u32));
10dbd7eb14SDaniel Borkmann 	__uint(value_size, sizeof(__u32));
11dbd7eb14SDaniel Borkmann } jmp_table SEC(".maps");
12dbd7eb14SDaniel Borkmann 
13dbd7eb14SDaniel Borkmann int count, which;
14dbd7eb14SDaniel Borkmann 
15*c22bdd28SAndrii Nakryiko SEC("tc")
classifier_0(struct __sk_buff * skb)16*c22bdd28SAndrii Nakryiko int classifier_0(struct __sk_buff *skb)
17dbd7eb14SDaniel Borkmann {
18dbd7eb14SDaniel Borkmann 	count++;
19dbd7eb14SDaniel Borkmann 	if (__builtin_constant_p(which))
20dbd7eb14SDaniel Borkmann 		__bpf_unreachable();
21dbd7eb14SDaniel Borkmann 	bpf_tail_call(skb, &jmp_table, which);
22dbd7eb14SDaniel Borkmann 	return 1;
23dbd7eb14SDaniel Borkmann }
24dbd7eb14SDaniel Borkmann 
25*c22bdd28SAndrii Nakryiko SEC("tc")
entry(struct __sk_buff * skb)26dbd7eb14SDaniel Borkmann int entry(struct __sk_buff *skb)
27dbd7eb14SDaniel Borkmann {
28dbd7eb14SDaniel Borkmann 	if (__builtin_constant_p(which))
29dbd7eb14SDaniel Borkmann 		__bpf_unreachable();
30dbd7eb14SDaniel Borkmann 	bpf_tail_call(skb, &jmp_table, which);
31dbd7eb14SDaniel Borkmann 	return 0;
32dbd7eb14SDaniel Borkmann }
33dbd7eb14SDaniel Borkmann 
34dbd7eb14SDaniel Borkmann char __license[] SEC("license") = "GPL";
35