13b037911SMaciej Fijalkowski // SPDX-License-Identifier: GPL-2.0
23b037911SMaciej Fijalkowski #include <linux/bpf.h>
33b037911SMaciej Fijalkowski #include <bpf/bpf_helpers.h>
43b037911SMaciej Fijalkowski #include "bpf_legacy.h"
53b037911SMaciej Fijalkowski 
63b037911SMaciej Fijalkowski struct {
73b037911SMaciej Fijalkowski 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
83b037911SMaciej Fijalkowski 	__uint(max_entries, 1);
93b037911SMaciej Fijalkowski 	__uint(key_size, sizeof(__u32));
103b037911SMaciej Fijalkowski 	__uint(value_size, sizeof(__u32));
113b037911SMaciej Fijalkowski } jmp_table SEC(".maps");
123b037911SMaciej Fijalkowski 
133b037911SMaciej Fijalkowski static __noinline
subprog_tail(struct __sk_buff * skb)143b037911SMaciej Fijalkowski int subprog_tail(struct __sk_buff *skb)
153b037911SMaciej Fijalkowski {
163b037911SMaciej Fijalkowski 	if (load_byte(skb, 0))
17faef26faSDaniel Borkmann 		bpf_tail_call_static(skb, &jmp_table, 1);
183b037911SMaciej Fijalkowski 	else
19faef26faSDaniel Borkmann 		bpf_tail_call_static(skb, &jmp_table, 0);
203b037911SMaciej Fijalkowski 	return 1;
213b037911SMaciej Fijalkowski }
223b037911SMaciej Fijalkowski 
23256eab48SAndrii Nakryiko int count = 0;
243b037911SMaciej Fijalkowski 
25*c22bdd28SAndrii Nakryiko SEC("tc")
classifier_0(struct __sk_buff * skb)26*c22bdd28SAndrii Nakryiko int classifier_0(struct __sk_buff *skb)
273b037911SMaciej Fijalkowski {
283b037911SMaciej Fijalkowski 	count++;
293b037911SMaciej Fijalkowski 	return subprog_tail(skb);
303b037911SMaciej Fijalkowski }
313b037911SMaciej Fijalkowski 
32*c22bdd28SAndrii Nakryiko SEC("tc")
entry(struct __sk_buff * skb)333b037911SMaciej Fijalkowski int entry(struct __sk_buff *skb)
343b037911SMaciej Fijalkowski {
35faef26faSDaniel Borkmann 	bpf_tail_call_static(skb, &jmp_table, 0);
363b037911SMaciej Fijalkowski 
373b037911SMaciej Fijalkowski 	return 0;
383b037911SMaciej Fijalkowski }
393b037911SMaciej Fijalkowski 
403b037911SMaciej Fijalkowski char __license[] SEC("license") = "GPL";
41