1*de1e4e89SAndroid Build Coastguard Worker #include "../../include/bpf_api.h"
2*de1e4e89SAndroid Build Coastguard Worker
3*de1e4e89SAndroid Build Coastguard Worker /* This example demonstrates how classifier run-time behaviour
4*de1e4e89SAndroid Build Coastguard Worker * can be altered with tail calls. We start out with an empty
5*de1e4e89SAndroid Build Coastguard Worker * jmp_tc array, then add section aaa to the array slot 0, and
6*de1e4e89SAndroid Build Coastguard Worker * later on atomically replace it with section bbb. Note that
7*de1e4e89SAndroid Build Coastguard Worker * as shown in other examples, the tc loader can prepopulate
8*de1e4e89SAndroid Build Coastguard Worker * tail called sections, here we start out with an empty one
9*de1e4e89SAndroid Build Coastguard Worker * on purpose to show it can also be done this way.
10*de1e4e89SAndroid Build Coastguard Worker *
11*de1e4e89SAndroid Build Coastguard Worker * tc filter add dev foo parent ffff: bpf obj graft.o
12*de1e4e89SAndroid Build Coastguard Worker * tc exec bpf dbg
13*de1e4e89SAndroid Build Coastguard Worker * [...]
14*de1e4e89SAndroid Build Coastguard Worker * Socket Thread-20229 [001] ..s. 138993.003923: : fallthrough
15*de1e4e89SAndroid Build Coastguard Worker * <idle>-0 [001] ..s. 138993.202265: : fallthrough
16*de1e4e89SAndroid Build Coastguard Worker * Socket Thread-20229 [001] ..s. 138994.004149: : fallthrough
17*de1e4e89SAndroid Build Coastguard Worker * [...]
18*de1e4e89SAndroid Build Coastguard Worker *
19*de1e4e89SAndroid Build Coastguard Worker * tc exec bpf graft m:globals/jmp_tc key 0 obj graft.o sec aaa
20*de1e4e89SAndroid Build Coastguard Worker * tc exec bpf dbg
21*de1e4e89SAndroid Build Coastguard Worker * [...]
22*de1e4e89SAndroid Build Coastguard Worker * Socket Thread-19818 [002] ..s. 139012.053587: : aaa
23*de1e4e89SAndroid Build Coastguard Worker * <idle>-0 [002] ..s. 139012.172359: : aaa
24*de1e4e89SAndroid Build Coastguard Worker * Socket Thread-19818 [001] ..s. 139012.173556: : aaa
25*de1e4e89SAndroid Build Coastguard Worker * [...]
26*de1e4e89SAndroid Build Coastguard Worker *
27*de1e4e89SAndroid Build Coastguard Worker * tc exec bpf graft m:globals/jmp_tc key 0 obj graft.o sec bbb
28*de1e4e89SAndroid Build Coastguard Worker * tc exec bpf dbg
29*de1e4e89SAndroid Build Coastguard Worker * [...]
30*de1e4e89SAndroid Build Coastguard Worker * Socket Thread-19818 [002] ..s. 139022.102967: : bbb
31*de1e4e89SAndroid Build Coastguard Worker * <idle>-0 [002] ..s. 139022.155640: : bbb
32*de1e4e89SAndroid Build Coastguard Worker * Socket Thread-19818 [001] ..s. 139022.156730: : bbb
33*de1e4e89SAndroid Build Coastguard Worker * [...]
34*de1e4e89SAndroid Build Coastguard Worker */
35*de1e4e89SAndroid Build Coastguard Worker
36*de1e4e89SAndroid Build Coastguard Worker struct bpf_elf_map __section_maps jmp_tc = {
37*de1e4e89SAndroid Build Coastguard Worker .type = BPF_MAP_TYPE_PROG_ARRAY,
38*de1e4e89SAndroid Build Coastguard Worker .size_key = sizeof(uint32_t),
39*de1e4e89SAndroid Build Coastguard Worker .size_value = sizeof(uint32_t),
40*de1e4e89SAndroid Build Coastguard Worker .pinning = PIN_GLOBAL_NS,
41*de1e4e89SAndroid Build Coastguard Worker .max_elem = 1,
42*de1e4e89SAndroid Build Coastguard Worker };
43*de1e4e89SAndroid Build Coastguard Worker
44*de1e4e89SAndroid Build Coastguard Worker __section("aaa")
cls_aaa(struct __sk_buff * skb)45*de1e4e89SAndroid Build Coastguard Worker int cls_aaa(struct __sk_buff *skb)
46*de1e4e89SAndroid Build Coastguard Worker {
47*de1e4e89SAndroid Build Coastguard Worker printt("aaa\n");
48*de1e4e89SAndroid Build Coastguard Worker return TC_H_MAKE(1, 42);
49*de1e4e89SAndroid Build Coastguard Worker }
50*de1e4e89SAndroid Build Coastguard Worker
51*de1e4e89SAndroid Build Coastguard Worker __section("bbb")
cls_bbb(struct __sk_buff * skb)52*de1e4e89SAndroid Build Coastguard Worker int cls_bbb(struct __sk_buff *skb)
53*de1e4e89SAndroid Build Coastguard Worker {
54*de1e4e89SAndroid Build Coastguard Worker printt("bbb\n");
55*de1e4e89SAndroid Build Coastguard Worker return TC_H_MAKE(1, 43);
56*de1e4e89SAndroid Build Coastguard Worker }
57*de1e4e89SAndroid Build Coastguard Worker
58*de1e4e89SAndroid Build Coastguard Worker __section_cls_entry
cls_entry(struct __sk_buff * skb)59*de1e4e89SAndroid Build Coastguard Worker int cls_entry(struct __sk_buff *skb)
60*de1e4e89SAndroid Build Coastguard Worker {
61*de1e4e89SAndroid Build Coastguard Worker tail_call(skb, &jmp_tc, 0);
62*de1e4e89SAndroid Build Coastguard Worker printt("fallthrough\n");
63*de1e4e89SAndroid Build Coastguard Worker return BPF_H_DEFAULT;
64*de1e4e89SAndroid Build Coastguard Worker }
65*de1e4e89SAndroid Build Coastguard Worker
66*de1e4e89SAndroid Build Coastguard Worker BPF_LICENSE("GPL");
67