2019-11-22 21:08:01 +01:00
// SPDX-License-Identifier: GPL-2.0
# include <linux/bpf.h>
2020-01-20 14:06:45 +01:00
# include <bpf/bpf_helpers.h>
2019-11-22 21:08:01 +01:00
struct {
__uint ( type , BPF_MAP_TYPE_PROG_ARRAY ) ;
__uint ( max_entries , 5 ) ;
__uint ( key_size , sizeof ( __u32 ) ) ;
__uint ( value_size , sizeof ( __u32 ) ) ;
} jmp_table SEC ( " .maps " ) ;
2021-09-28 09:19:39 -07:00
SEC ( " tc " )
int classifier_0 ( struct __sk_buff * skb )
2019-11-22 21:08:01 +01:00
{
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 1 ) ;
2019-11-22 21:08:01 +01:00
return 0 ;
}
2021-09-28 09:19:39 -07:00
SEC ( " tc " )
int classifier_1 ( struct __sk_buff * skb )
2019-11-22 21:08:01 +01:00
{
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 2 ) ;
2019-11-22 21:08:01 +01:00
return 1 ;
}
2021-09-28 09:19:39 -07:00
SEC ( " tc " )
int classifier_2 ( struct __sk_buff * skb )
2019-11-22 21:08:01 +01:00
{
return 2 ;
}
2021-09-28 09:19:39 -07:00
SEC ( " tc " )
int classifier_3 ( struct __sk_buff * skb )
2019-11-22 21:08:01 +01:00
{
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 4 ) ;
2019-11-22 21:08:01 +01:00
return 3 ;
}
2021-09-28 09:19:39 -07:00
SEC ( " tc " )
int classifier_4 ( struct __sk_buff * skb )
2019-11-22 21:08:01 +01:00
{
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 3 ) ;
2019-11-22 21:08:01 +01:00
return 4 ;
}
2021-09-28 09:19:39 -07:00
SEC ( " tc " )
2019-11-22 21:08:01 +01:00
int entry ( struct __sk_buff * skb )
{
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 0 ) ;
2019-11-22 21:08:01 +01:00
/* Check multi-prog update. */
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 2 ) ;
2019-11-22 21:08:01 +01:00
/* Check tail call limit. */
2020-09-30 17:18:19 +02:00
bpf_tail_call_static ( skb , & jmp_table , 3 ) ;
2019-11-22 21:08:01 +01:00
return 3 ;
}
char __license [ ] SEC ( " license " ) = " GPL " ;