| #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 |
| |
| struct bpf_elf_map __section_maps jmp_tc = { |
| .type = BPF_MAP_TYPE_PROG_ARRAY, |
| .id = JMP_MAP_ID, |
| .size_key = sizeof(uint32_t), |
| .size_value = sizeof(uint32_t), |
| .pinning = PIN_OBJECT_NS, |
| .max_elem = 1, |
| }; |
| |
| __section_tail(JMP_MAP_ID, 0) |
| int cls_loop(struct __sk_buff *skb) |
| { |
| printt("cb: %u\n", 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"); |