1#include "../../include/bpf_api.h"
2
3/* Cyclic dependency example to test the kernel's runtime upper
4 * bound on loops. Also demonstrates on how to use direct-actions,
5 * loaded as: tc filter add [...] bpf da obj [...]
6 */
7#define JMP_MAP_ID	0xabccba
8
9BPF_PROG_ARRAY(jmp_tc, JMP_MAP_ID, PIN_OBJECT_NS, 1);
10
11__section_tail(JMP_MAP_ID, 0)
12int cls_loop(struct __sk_buff *skb)
13{
14	char fmt[] = "cb: %u\n";
15
16	trace_printk(fmt, sizeof(fmt), skb->cb[0]++);
17	tail_call(skb, &jmp_tc, 0);
18
19	skb->tc_classid = TC_H_MAKE(1, 42);
20	return TC_ACT_OK;
21}
22
23__section_cls_entry
24int cls_entry(struct __sk_buff *skb)
25{
26	tail_call(skb, &jmp_tc, 0);
27	return TC_ACT_SHOT;
28}
29
30BPF_LICENSE("GPL");
31