Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <linux/bpf.h>
0003 
0004 #include <bpf/bpf_helpers.h>
0005 
0006 struct {
0007     __uint(type, BPF_MAP_TYPE_PROG_ARRAY);
0008     __uint(max_entries, 3);
0009     __uint(key_size, sizeof(__u32));
0010     __uint(value_size, sizeof(__u32));
0011 } jmp_table SEC(".maps");
0012 
0013 #define TAIL_FUNC(x)                \
0014     SEC("tc")               \
0015     int classifier_##x(struct __sk_buff *skb)   \
0016     {                   \
0017         return x;           \
0018     }
0019 TAIL_FUNC(0)
0020 TAIL_FUNC(1)
0021 TAIL_FUNC(2)
0022 
0023 SEC("tc")
0024 int entry(struct __sk_buff *skb)
0025 {
0026     /* Multiple locations to make sure we patch
0027      * all of them.
0028      */
0029     bpf_tail_call_static(skb, &jmp_table, 0);
0030     bpf_tail_call_static(skb, &jmp_table, 0);
0031     bpf_tail_call_static(skb, &jmp_table, 0);
0032     bpf_tail_call_static(skb, &jmp_table, 0);
0033 
0034     bpf_tail_call_static(skb, &jmp_table, 1);
0035     bpf_tail_call_static(skb, &jmp_table, 1);
0036     bpf_tail_call_static(skb, &jmp_table, 1);
0037     bpf_tail_call_static(skb, &jmp_table, 1);
0038 
0039     bpf_tail_call_static(skb, &jmp_table, 2);
0040     bpf_tail_call_static(skb, &jmp_table, 2);
0041     bpf_tail_call_static(skb, &jmp_table, 2);
0042     bpf_tail_call_static(skb, &jmp_table, 2);
0043 
0044     return 3;
0045 }
0046 
0047 char __license[] SEC("license") = "GPL";