2020-09-17 00:10:10 +03:00
// SPDX-License-Identifier: GPL-2.0
# include <linux/bpf.h>
# include <bpf/bpf_helpers.h>
2021-07-08 01:38:48 +03:00
struct {
__uint ( type , BPF_MAP_TYPE_ARRAY ) ;
__uint ( max_entries , 1 ) ;
__uint ( key_size , sizeof ( __u32 ) ) ;
__uint ( value_size , sizeof ( __u32 ) ) ;
} nop_table SEC ( " .maps " ) ;
2020-09-17 00:10:10 +03:00
struct {
__uint ( type , BPF_MAP_TYPE_PROG_ARRAY ) ;
__uint ( max_entries , 3 ) ;
__uint ( key_size , sizeof ( __u32 ) ) ;
__uint ( value_size , sizeof ( __u32 ) ) ;
} jmp_table SEC ( " .maps " ) ;
2021-05-07 08:41:15 +03:00
int count = 0 ;
2021-07-08 01:38:48 +03:00
int noise = 0 ;
__always_inline int subprog_noise ( void )
{
__u32 key = 0 ;
bpf_map_lookup_elem ( & nop_table , & key ) ;
return 0 ;
}
2020-09-17 00:10:10 +03:00
__noinline
int subprog_tail_2 ( struct __sk_buff * skb )
{
2021-07-08 01:38:48 +03:00
if ( noise )
subprog_noise ( ) ;
2020-09-30 18:18:19 +03:00
bpf_tail_call_static ( skb , & jmp_table , 2 ) ;
2020-09-17 00:10:10 +03:00
return skb - > len * 3 ;
}
__noinline
int subprog_tail_1 ( struct __sk_buff * skb )
{
2020-09-30 18:18:19 +03:00
bpf_tail_call_static ( skb , & jmp_table , 1 ) ;
2020-09-17 00:10:10 +03:00
return skb - > len * 2 ;
}
__noinline
int subprog_tail ( struct __sk_buff * skb )
{
2020-09-30 18:18:19 +03:00
bpf_tail_call_static ( skb , & jmp_table , 0 ) ;
2020-09-17 00:10:10 +03:00
return skb - > len ;
}
2021-09-28 19:19:39 +03:00
SEC ( " tc " )
int classifier_1 ( struct __sk_buff * skb )
2020-09-17 00:10:10 +03:00
{
return subprog_tail_2 ( skb ) ;
}
2021-09-28 19:19:39 +03:00
SEC ( " tc " )
int classifier_2 ( struct __sk_buff * skb )
2020-09-17 00:10:10 +03:00
{
count + + ;
return subprog_tail_2 ( skb ) ;
}
2021-09-28 19:19:39 +03:00
SEC ( " tc " )
int classifier_0 ( struct __sk_buff * skb )
2020-09-17 00:10:10 +03:00
{
return subprog_tail_1 ( skb ) ;
}
2021-09-28 19:19:39 +03:00
SEC ( " tc " )
2020-09-17 00:10:10 +03:00
int entry ( struct __sk_buff * skb )
{
return subprog_tail ( skb ) ;
}
char __license [ ] SEC ( " license " ) = " GPL " ;