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
9struct bpf_elf_map __section_maps jmp_tc = {
10	.type		= BPF_MAP_TYPE_PROG_ARRAY,
11	.id		= JMP_MAP_ID,
12	.size_key	= sizeof(uint32_t),
13	.size_value	= sizeof(uint32_t),
14	.pinning	= PIN_OBJECT_NS,
15	.max_elem	= 1,
16};
17
18__section_tail(JMP_MAP_ID, 0)
19int cls_loop(struct __sk_buff *skb)
20{
21	printt("cb: %u\n", skb->cb[0]++);
22	tail_call(skb, &jmp_tc, 0);
23
24	skb->tc_classid = TC_H_MAKE(1, 42);
25	return TC_ACT_OK;
26}
27
28__section_cls_entry
29int cls_entry(struct __sk_buff *skb)
30{
31	tail_call(skb, &jmp_tc, 0);
32	return TC_ACT_SHOT;
33}
34
35BPF_LICENSE("GPL");
36