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