1 #define BPF_SOCK_ADDR_STORE(field, off, res, err, flgs) \ 2 { \ 3 "wide store to bpf_sock_addr." #field "[" #off "]", \ 4 .insns = { \ 5 BPF_MOV64_IMM(BPF_REG_0, 1), \ 6 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, \ 7 offsetof(struct bpf_sock_addr, field[off])), \ 8 BPF_EXIT_INSN(), \ 9 }, \ 10 .result = res, \ 11 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \ 12 .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \ 13 .errstr = err, \ 14 .flags = flgs, \ 15 } 16 17 /* user_ip6[0] is u64 aligned */ 18 BPF_SOCK_ADDR_STORE(user_ip6, 0, ACCEPT, 19 NULL, 0), 20 BPF_SOCK_ADDR_STORE(user_ip6, 1, REJECT, 21 "invalid bpf_context access off=12 size=8", 22 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 23 BPF_SOCK_ADDR_STORE(user_ip6, 2, ACCEPT, 24 NULL, 0), 25 BPF_SOCK_ADDR_STORE(user_ip6, 3, REJECT, 26 "invalid bpf_context access off=20 size=8", 27 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 28 29 /* msg_src_ip6[0] is _not_ u64 aligned */ 30 BPF_SOCK_ADDR_STORE(msg_src_ip6, 0, REJECT, 31 "invalid bpf_context access off=44 size=8", 32 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 33 BPF_SOCK_ADDR_STORE(msg_src_ip6, 1, ACCEPT, 34 NULL, 0), 35 BPF_SOCK_ADDR_STORE(msg_src_ip6, 2, REJECT, 36 "invalid bpf_context access off=52 size=8", 37 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 38 BPF_SOCK_ADDR_STORE(msg_src_ip6, 3, REJECT, 39 "invalid bpf_context access off=56 size=8", 0), 40 41 #undef BPF_SOCK_ADDR_STORE 42 43 #define BPF_SOCK_ADDR_LOAD(field, off, res, err, flgs) \ 44 { \ 45 "wide load from bpf_sock_addr." #field "[" #off "]", \ 46 .insns = { \ 47 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, \ 48 offsetof(struct bpf_sock_addr, field[off])), \ 49 BPF_MOV64_IMM(BPF_REG_0, 1), \ 50 BPF_EXIT_INSN(), \ 51 }, \ 52 .result = res, \ 53 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \ 54 .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \ 55 .errstr = err, \ 56 .flags = flgs, \ 57 } 58 59 /* user_ip6[0] is u64 aligned */ 60 BPF_SOCK_ADDR_LOAD(user_ip6, 0, ACCEPT, 61 NULL, 0), 62 BPF_SOCK_ADDR_LOAD(user_ip6, 1, REJECT, 63 "invalid bpf_context access off=12 size=8", 64 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 65 BPF_SOCK_ADDR_LOAD(user_ip6, 2, ACCEPT, 66 NULL, 0), 67 BPF_SOCK_ADDR_LOAD(user_ip6, 3, REJECT, 68 "invalid bpf_context access off=20 size=8", 69 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 70 71 /* msg_src_ip6[0] is _not_ u64 aligned */ 72 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 0, REJECT, 73 "invalid bpf_context access off=44 size=8", 74 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 75 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 1, ACCEPT, 76 NULL, 0), 77 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 2, REJECT, 78 "invalid bpf_context access off=52 size=8", 79 F_NEEDS_EFFICIENT_UNALIGNED_ACCESS), 80 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 3, REJECT, 81 "invalid bpf_context access off=56 size=8", 0), 82 83 #undef BPF_SOCK_ADDR_LOAD 84