Linux-libre 5.4-rc7-gnu
[librecmc/linux-libre.git] / tools / testing / selftests / bpf / verifier / ctx_sk_msg.c
1 {
2         "valid access family in SK_MSG",
3         .insns = {
4         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
5                     offsetof(struct sk_msg_md, family)),
6         BPF_EXIT_INSN(),
7         },
8         .result = ACCEPT,
9         .prog_type = BPF_PROG_TYPE_SK_MSG,
10 },
11 {
12         "valid access remote_ip4 in SK_MSG",
13         .insns = {
14         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
15                     offsetof(struct sk_msg_md, remote_ip4)),
16         BPF_EXIT_INSN(),
17         },
18         .result = ACCEPT,
19         .prog_type = BPF_PROG_TYPE_SK_MSG,
20 },
21 {
22         "valid access local_ip4 in SK_MSG",
23         .insns = {
24         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
25                     offsetof(struct sk_msg_md, local_ip4)),
26         BPF_EXIT_INSN(),
27         },
28         .result = ACCEPT,
29         .prog_type = BPF_PROG_TYPE_SK_MSG,
30 },
31 {
32         "valid access remote_port in SK_MSG",
33         .insns = {
34         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
35                     offsetof(struct sk_msg_md, remote_port)),
36         BPF_EXIT_INSN(),
37         },
38         .result = ACCEPT,
39         .prog_type = BPF_PROG_TYPE_SK_MSG,
40 },
41 {
42         "valid access local_port in SK_MSG",
43         .insns = {
44         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
45                     offsetof(struct sk_msg_md, local_port)),
46         BPF_EXIT_INSN(),
47         },
48         .result = ACCEPT,
49         .prog_type = BPF_PROG_TYPE_SK_MSG,
50 },
51 {
52         "valid access remote_ip6 in SK_MSG",
53         .insns = {
54         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
55                     offsetof(struct sk_msg_md, remote_ip6[0])),
56         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
57                     offsetof(struct sk_msg_md, remote_ip6[1])),
58         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
59                     offsetof(struct sk_msg_md, remote_ip6[2])),
60         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
61                     offsetof(struct sk_msg_md, remote_ip6[3])),
62         BPF_EXIT_INSN(),
63         },
64         .result = ACCEPT,
65         .prog_type = BPF_PROG_TYPE_SK_SKB,
66 },
67 {
68         "valid access local_ip6 in SK_MSG",
69         .insns = {
70         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
71                     offsetof(struct sk_msg_md, local_ip6[0])),
72         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
73                     offsetof(struct sk_msg_md, local_ip6[1])),
74         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
75                     offsetof(struct sk_msg_md, local_ip6[2])),
76         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
77                     offsetof(struct sk_msg_md, local_ip6[3])),
78         BPF_EXIT_INSN(),
79         },
80         .result = ACCEPT,
81         .prog_type = BPF_PROG_TYPE_SK_SKB,
82 },
83 {
84         "valid access size in SK_MSG",
85         .insns = {
86         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
87                     offsetof(struct sk_msg_md, size)),
88         BPF_EXIT_INSN(),
89         },
90         .result = ACCEPT,
91         .prog_type = BPF_PROG_TYPE_SK_MSG,
92 },
93 {
94         "invalid 64B read of size in SK_MSG",
95         .insns = {
96         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
97                     offsetof(struct sk_msg_md, size)),
98         BPF_EXIT_INSN(),
99         },
100         .errstr = "invalid bpf_context access",
101         .result = REJECT,
102         .prog_type = BPF_PROG_TYPE_SK_MSG,
103         .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
104 },
105 {
106         "invalid read past end of SK_MSG",
107         .insns = {
108         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
109                     offsetof(struct sk_msg_md, size) + 4),
110         BPF_EXIT_INSN(),
111         },
112         .errstr = "invalid bpf_context access",
113         .result = REJECT,
114         .prog_type = BPF_PROG_TYPE_SK_MSG,
115 },
116 {
117         "invalid read offset in SK_MSG",
118         .insns = {
119         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
120                     offsetof(struct sk_msg_md, family) + 1),
121         BPF_EXIT_INSN(),
122         },
123         .errstr = "invalid bpf_context access",
124         .result = REJECT,
125         .prog_type = BPF_PROG_TYPE_SK_MSG,
126         .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
127 },
128 {
129         "direct packet read for SK_MSG",
130         .insns = {
131         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
132                     offsetof(struct sk_msg_md, data)),
133         BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1,
134                     offsetof(struct sk_msg_md, data_end)),
135         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
136         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
137         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
138         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
139         BPF_MOV64_IMM(BPF_REG_0, 0),
140         BPF_EXIT_INSN(),
141         },
142         .result = ACCEPT,
143         .prog_type = BPF_PROG_TYPE_SK_MSG,
144 },
145 {
146         "direct packet write for SK_MSG",
147         .insns = {
148         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
149                     offsetof(struct sk_msg_md, data)),
150         BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1,
151                     offsetof(struct sk_msg_md, data_end)),
152         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
153         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
154         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
155         BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
156         BPF_MOV64_IMM(BPF_REG_0, 0),
157         BPF_EXIT_INSN(),
158         },
159         .result = ACCEPT,
160         .prog_type = BPF_PROG_TYPE_SK_MSG,
161 },
162 {
163         "overlapping checks for direct packet access SK_MSG",
164         .insns = {
165         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1,
166                     offsetof(struct sk_msg_md, data)),
167         BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1,
168                     offsetof(struct sk_msg_md, data_end)),
169         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
170         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
171         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
172         BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
173         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
174         BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
175         BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
176         BPF_MOV64_IMM(BPF_REG_0, 0),
177         BPF_EXIT_INSN(),
178         },
179         .result = ACCEPT,
180         .prog_type = BPF_PROG_TYPE_SK_MSG,
181 },