aboutsummaryrefslogtreecommitdiff
path: root/examples/bpf/bpf_cyclic.c
blob: c66cbecce054f45c5d05b189ffcc080970fb70d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "../../include/bpf_api.h"

/* Cyclic dependency example to test the kernel's runtime upper
 * bound on loops. Also demonstrates on how to use direct-actions,
 * loaded as: tc filter add [...] bpf da obj [...]
 */
#define JMP_MAP_ID	0xabccba

BPF_PROG_ARRAY(jmp_tc, JMP_MAP_ID, PIN_OBJECT_NS, 1);

__section_tail(JMP_MAP_ID, 0)
int cls_loop(struct __sk_buff *skb)
{
	char fmt[] = "cb: %u\n";

	trace_printk(fmt, sizeof(fmt), skb->cb[0]++);
	tail_call(skb, &jmp_tc, 0);

	skb->tc_classid = TC_H_MAKE(1, 42);
	return TC_ACT_OK;
}

__section_cls_entry
int cls_entry(struct __sk_buff *skb)
{
	tail_call(skb, &jmp_tc, 0);
	return TC_ACT_SHOT;
}

BPF_LICENSE("GPL");