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