xref: /aosp_15_r20/external/iproute2/examples/bpf/bpf_cyclic.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker #include "../../include/bpf_api.h"
2*de1e4e89SAndroid Build Coastguard Worker 
3*de1e4e89SAndroid Build Coastguard Worker /* Cyclic dependency example to test the kernel's runtime upper
4*de1e4e89SAndroid Build Coastguard Worker  * bound on loops. Also demonstrates on how to use direct-actions,
5*de1e4e89SAndroid Build Coastguard Worker  * loaded as: tc filter add [...] bpf da obj [...]
6*de1e4e89SAndroid Build Coastguard Worker  */
7*de1e4e89SAndroid Build Coastguard Worker #define JMP_MAP_ID	0xabccba
8*de1e4e89SAndroid Build Coastguard Worker 
9*de1e4e89SAndroid Build Coastguard Worker struct bpf_elf_map __section_maps jmp_tc = {
10*de1e4e89SAndroid Build Coastguard Worker 	.type		= BPF_MAP_TYPE_PROG_ARRAY,
11*de1e4e89SAndroid Build Coastguard Worker 	.id		= JMP_MAP_ID,
12*de1e4e89SAndroid Build Coastguard Worker 	.size_key	= sizeof(uint32_t),
13*de1e4e89SAndroid Build Coastguard Worker 	.size_value	= sizeof(uint32_t),
14*de1e4e89SAndroid Build Coastguard Worker 	.pinning	= PIN_OBJECT_NS,
15*de1e4e89SAndroid Build Coastguard Worker 	.max_elem	= 1,
16*de1e4e89SAndroid Build Coastguard Worker };
17*de1e4e89SAndroid Build Coastguard Worker 
18*de1e4e89SAndroid Build Coastguard Worker __section_tail(JMP_MAP_ID, 0)
cls_loop(struct __sk_buff * skb)19*de1e4e89SAndroid Build Coastguard Worker int cls_loop(struct __sk_buff *skb)
20*de1e4e89SAndroid Build Coastguard Worker {
21*de1e4e89SAndroid Build Coastguard Worker 	printt("cb: %u\n", skb->cb[0]++);
22*de1e4e89SAndroid Build Coastguard Worker 	tail_call(skb, &jmp_tc, 0);
23*de1e4e89SAndroid Build Coastguard Worker 
24*de1e4e89SAndroid Build Coastguard Worker 	skb->tc_classid = TC_H_MAKE(1, 42);
25*de1e4e89SAndroid Build Coastguard Worker 	return TC_ACT_OK;
26*de1e4e89SAndroid Build Coastguard Worker }
27*de1e4e89SAndroid Build Coastguard Worker 
28*de1e4e89SAndroid Build Coastguard Worker __section_cls_entry
cls_entry(struct __sk_buff * skb)29*de1e4e89SAndroid Build Coastguard Worker int cls_entry(struct __sk_buff *skb)
30*de1e4e89SAndroid Build Coastguard Worker {
31*de1e4e89SAndroid Build Coastguard Worker 	tail_call(skb, &jmp_tc, 0);
32*de1e4e89SAndroid Build Coastguard Worker 	return TC_ACT_SHOT;
33*de1e4e89SAndroid Build Coastguard Worker }
34*de1e4e89SAndroid Build Coastguard Worker 
35*de1e4e89SAndroid Build Coastguard Worker BPF_LICENSE("GPL");
36