15e0b0a4cSJakub Sitnicki // SPDX-License-Identifier: GPL-2.0
25e0b0a4cSJakub Sitnicki #include <linux/bpf.h>
35e0b0a4cSJakub Sitnicki #include <bpf/bpf_helpers.h>
4*c8ed6685SAndrii Nakryiko #include "bpf_misc.h"
55e0b0a4cSJakub Sitnicki 
65e0b0a4cSJakub Sitnicki #define __unused __attribute__((unused))
75e0b0a4cSJakub Sitnicki 
85e0b0a4cSJakub Sitnicki struct {
95e0b0a4cSJakub Sitnicki 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
105e0b0a4cSJakub Sitnicki 	__uint(max_entries, 1);
115e0b0a4cSJakub Sitnicki 	__uint(key_size, sizeof(__u32));
125e0b0a4cSJakub Sitnicki 	__uint(value_size, sizeof(__u32));
135e0b0a4cSJakub Sitnicki } jmp_table SEC(".maps");
145e0b0a4cSJakub Sitnicki 
155e0b0a4cSJakub Sitnicki int done = 0;
165e0b0a4cSJakub Sitnicki 
175e0b0a4cSJakub Sitnicki SEC("tc")
classifier_0(struct __sk_buff * skb __unused)185e0b0a4cSJakub Sitnicki int classifier_0(struct __sk_buff *skb __unused)
195e0b0a4cSJakub Sitnicki {
205e0b0a4cSJakub Sitnicki 	done = 1;
215e0b0a4cSJakub Sitnicki 	return 0;
225e0b0a4cSJakub Sitnicki }
235e0b0a4cSJakub Sitnicki 
245e0b0a4cSJakub Sitnicki static __noinline
subprog_tail(struct __sk_buff * skb)255e0b0a4cSJakub Sitnicki int subprog_tail(struct __sk_buff *skb)
265e0b0a4cSJakub Sitnicki {
275e0b0a4cSJakub Sitnicki 	/* Don't propagate the constant to the caller */
285e0b0a4cSJakub Sitnicki 	volatile int ret = 1;
295e0b0a4cSJakub Sitnicki 
305e0b0a4cSJakub Sitnicki 	bpf_tail_call_static(skb, &jmp_table, 0);
315e0b0a4cSJakub Sitnicki 	return ret;
325e0b0a4cSJakub Sitnicki }
335e0b0a4cSJakub Sitnicki 
345e0b0a4cSJakub Sitnicki SEC("tc")
entry(struct __sk_buff * skb)355e0b0a4cSJakub Sitnicki int entry(struct __sk_buff *skb)
365e0b0a4cSJakub Sitnicki {
375e0b0a4cSJakub Sitnicki 	/* Have data on stack which size is not a multiple of 8 */
385e0b0a4cSJakub Sitnicki 	volatile char arr[1] = {};
395e0b0a4cSJakub Sitnicki 
40*c8ed6685SAndrii Nakryiko 	__sink(arr[0]);
41*c8ed6685SAndrii Nakryiko 
425e0b0a4cSJakub Sitnicki 	return subprog_tail(skb);
435e0b0a4cSJakub Sitnicki }
445e0b0a4cSJakub Sitnicki 
455e0b0a4cSJakub Sitnicki char __license[] SEC("license") = "GPL";
46