xref: /aosp_15_r20/external/iproute2/examples/bpf/bpf_graft.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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