| /* instructions used to output a skb based software event, produced |
| * from code snippet: |
| * struct TMP { |
| * uint64_t tmp; |
| * } tt; |
| * tt.tmp = 5; |
| * bpf_perf_event_output(skb, &connection_tracking_event_map, 0, |
| * &tt, sizeof(tt)); |
| * return 1; |
| * |
| * the bpf assembly from llvm is: |
| * 0: b7 02 00 00 05 00 00 00 r2 = 5 |
| * 1: 7b 2a f8 ff 00 00 00 00 *(u64 *)(r10 - 8) = r2 |
| * 2: bf a4 00 00 00 00 00 00 r4 = r10 |
| * 3: 07 04 00 00 f8 ff ff ff r4 += -8 |
| * 4: 18 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r2 = 0ll |
| * 6: b7 03 00 00 00 00 00 00 r3 = 0 |
| * 7: b7 05 00 00 08 00 00 00 r5 = 8 |
| * 8: 85 00 00 00 19 00 00 00 call 25 |
| * 9: b7 00 00 00 01 00 00 00 r0 = 1 |
| * 10: 95 00 00 00 00 00 00 00 exit |
| * |
| * The reason I put the code here instead of fill_helpers is that map fixup |
| * is against the insns, instead of filled prog. |
| */ |
| |
| #define __PERF_EVENT_INSNS__ \ |
| BPF_MOV64_IMM(BPF_REG_2, 5), \ |
| BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8), \ |
| BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), \ |
| BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), \ |
| BPF_LD_MAP_FD(BPF_REG_2, 0), \ |
| BPF_MOV64_IMM(BPF_REG_3, 0), \ |
| BPF_MOV64_IMM(BPF_REG_5, 8), \ |
| BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, \ |
| BPF_FUNC_perf_event_output), \ |
| BPF_MOV64_IMM(BPF_REG_0, 1), \ |
| BPF_EXIT_INSN(), |
| { |
| "perfevent for sockops", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_SOCK_OPS, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for tc", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_SCHED_CLS, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for lwt out", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_LWT_OUT, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for xdp", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_XDP, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for socket filter", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for sk_skb", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_SK_SKB, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for cgroup skb", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_CGROUP_SKB, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for cgroup dev", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_CGROUP_DEVICE, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for cgroup sysctl", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |
| { |
| "perfevent for cgroup sockopt", |
| .insns = { __PERF_EVENT_INSNS__ }, |
| .prog_type = BPF_PROG_TYPE_CGROUP_SOCKOPT, |
| .expected_attach_type = BPF_CGROUP_SETSOCKOPT, |
| .fixup_map_event_output = { 4 }, |
| .result = ACCEPT, |
| .retval = 1, |
| }, |