Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 1 | #include "../../include/bpf_api.h" |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 2 | |
| 3 | /* Cyclic dependency example to test the kernel's runtime upper |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 4 | * bound on loops. Also demonstrates on how to use direct-actions, |
| 5 | * loaded as: tc filter add [...] bpf da obj [...] |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 6 | */ |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 7 | #define JMP_MAP_ID 0xabccba |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 8 | |
Daniel Borkmann | 4dd3f50 | 2016-04-09 00:32:05 +0200 | [diff] [blame] | 9 | struct 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 | }; |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 17 | |
| 18 | __section_tail(JMP_MAP_ID, 0) |
| 19 | int cls_loop(struct __sk_buff *skb) |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 20 | { |
Daniel Borkmann | 92a3699 | 2016-02-07 02:11:50 +0100 | [diff] [blame] | 21 | printt("cb: %u\n", skb->cb[0]++); |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 22 | tail_call(skb, &jmp_tc, 0); |
| 23 | |
| 24 | skb->tc_classid = TC_H_MAKE(1, 42); |
| 25 | return TC_ACT_OK; |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 26 | } |
| 27 | |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 28 | __section_cls_entry |
| 29 | int cls_entry(struct __sk_buff *skb) |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 30 | { |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 31 | tail_call(skb, &jmp_tc, 0); |
| 32 | return TC_ACT_SHOT; |
Daniel Borkmann | 0b7e3fc | 2015-11-26 15:38:46 +0100 | [diff] [blame] | 33 | } |
| 34 | |
Daniel Borkmann | 41d6e33 | 2015-12-02 00:25:36 +0100 | [diff] [blame] | 35 | BPF_LICENSE("GPL"); |