]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - tools/testing/selftests/bpf/verifier/direct_packet_access.c
bpf: Rename BPF_XADD and prepare to encode other atomics in .imm
[mirror_ubuntu-jammy-kernel.git] / tools / testing / selftests / bpf / verifier / direct_packet_access.c
CommitLineData
48729226
JK
1{
2 "pkt_end - pkt_start is allowed",
3 .insns = {
4 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
5 offsetof(struct __sk_buff, data_end)),
6 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
7 offsetof(struct __sk_buff, data)),
8 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2),
9 BPF_EXIT_INSN(),
10 },
11 .result = ACCEPT,
12 .retval = TEST_DATA_LEN,
13 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
14},
40f2fbd5
JK
15{
16 "direct packet access: test1",
17 .insns = {
18 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
19 offsetof(struct __sk_buff, data)),
20 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
21 offsetof(struct __sk_buff, data_end)),
22 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
23 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
24 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
25 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
26 BPF_MOV64_IMM(BPF_REG_0, 0),
27 BPF_EXIT_INSN(),
28 },
29 .result = ACCEPT,
30 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
31},
32{
33 "direct packet access: test2",
34 .insns = {
35 BPF_MOV64_IMM(BPF_REG_0, 1),
36 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
37 offsetof(struct __sk_buff, data_end)),
38 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
39 offsetof(struct __sk_buff, data)),
40 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
41 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14),
42 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15),
43 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7),
44 BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12),
45 BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14),
46 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
47 offsetof(struct __sk_buff, data)),
48 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4),
49 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
50 offsetof(struct __sk_buff, len)),
51 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49),
52 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49),
53 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
54 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3),
55 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
56 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
57 offsetof(struct __sk_buff, data_end)),
58 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
59 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4),
60 BPF_MOV64_IMM(BPF_REG_0, 0),
61 BPF_EXIT_INSN(),
62 },
63 .result = ACCEPT,
64 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
65},
66{
67 "direct packet access: test3",
68 .insns = {
69 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
70 offsetof(struct __sk_buff, data)),
71 BPF_MOV64_IMM(BPF_REG_0, 0),
72 BPF_EXIT_INSN(),
73 },
74 .errstr = "invalid bpf_context access off=76",
75 .result = REJECT,
76 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
77},
78{
79 "direct packet access: test4 (write)",
80 .insns = {
81 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
82 offsetof(struct __sk_buff, data)),
83 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
84 offsetof(struct __sk_buff, data_end)),
85 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
86 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
87 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
88 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
89 BPF_MOV64_IMM(BPF_REG_0, 0),
90 BPF_EXIT_INSN(),
91 },
92 .result = ACCEPT,
93 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
94},
95{
96 "direct packet access: test5 (pkt_end >= reg, good access)",
97 .insns = {
98 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
99 offsetof(struct __sk_buff, data)),
100 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
101 offsetof(struct __sk_buff, data_end)),
102 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
103 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
104 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2),
105 BPF_MOV64_IMM(BPF_REG_0, 1),
106 BPF_EXIT_INSN(),
107 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
108 BPF_MOV64_IMM(BPF_REG_0, 0),
109 BPF_EXIT_INSN(),
110 },
111 .result = ACCEPT,
112 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
113},
114{
115 "direct packet access: test6 (pkt_end >= reg, bad access)",
116 .insns = {
117 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
118 offsetof(struct __sk_buff, data)),
119 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
120 offsetof(struct __sk_buff, data_end)),
121 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
122 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
123 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3),
124 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
125 BPF_MOV64_IMM(BPF_REG_0, 1),
126 BPF_EXIT_INSN(),
127 BPF_MOV64_IMM(BPF_REG_0, 0),
128 BPF_EXIT_INSN(),
129 },
130 .errstr = "invalid access to packet",
131 .result = REJECT,
132 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
133},
134{
135 "direct packet access: test7 (pkt_end >= reg, both accesses)",
136 .insns = {
137 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
138 offsetof(struct __sk_buff, data)),
139 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
140 offsetof(struct __sk_buff, data_end)),
141 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
142 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
143 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3),
144 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
145 BPF_MOV64_IMM(BPF_REG_0, 1),
146 BPF_EXIT_INSN(),
147 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
148 BPF_MOV64_IMM(BPF_REG_0, 0),
149 BPF_EXIT_INSN(),
150 },
151 .errstr = "invalid access to packet",
152 .result = REJECT,
153 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
154},
155{
156 "direct packet access: test8 (double test, variant 1)",
157 .insns = {
158 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
159 offsetof(struct __sk_buff, data)),
160 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
161 offsetof(struct __sk_buff, data_end)),
162 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
163 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
164 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4),
165 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
166 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
167 BPF_MOV64_IMM(BPF_REG_0, 1),
168 BPF_EXIT_INSN(),
169 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
170 BPF_MOV64_IMM(BPF_REG_0, 0),
171 BPF_EXIT_INSN(),
172 },
173 .result = ACCEPT,
174 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
175},
176{
177 "direct packet access: test9 (double test, variant 2)",
178 .insns = {
179 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
180 offsetof(struct __sk_buff, data)),
181 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
182 offsetof(struct __sk_buff, data_end)),
183 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
184 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
185 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2),
186 BPF_MOV64_IMM(BPF_REG_0, 1),
187 BPF_EXIT_INSN(),
188 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
189 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
190 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
191 BPF_MOV64_IMM(BPF_REG_0, 0),
192 BPF_EXIT_INSN(),
193 },
194 .result = ACCEPT,
195 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
196},
197{
198 "direct packet access: test10 (write invalid)",
199 .insns = {
200 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
201 offsetof(struct __sk_buff, data)),
202 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
203 offsetof(struct __sk_buff, data_end)),
204 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
205 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
206 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
207 BPF_MOV64_IMM(BPF_REG_0, 0),
208 BPF_EXIT_INSN(),
209 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
210 BPF_MOV64_IMM(BPF_REG_0, 0),
211 BPF_EXIT_INSN(),
212 },
213 .errstr = "invalid access to packet",
214 .result = REJECT,
215 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
216},
217{
218 "direct packet access: test11 (shift, good access)",
219 .insns = {
220 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
221 offsetof(struct __sk_buff, data)),
222 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
223 offsetof(struct __sk_buff, data_end)),
224 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
225 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
226 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
227 BPF_MOV64_IMM(BPF_REG_3, 144),
228 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
229 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
230 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3),
231 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
232 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
233 BPF_MOV64_IMM(BPF_REG_0, 1),
234 BPF_EXIT_INSN(),
235 BPF_MOV64_IMM(BPF_REG_0, 0),
236 BPF_EXIT_INSN(),
237 },
238 .result = ACCEPT,
239 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
240 .retval = 1,
241},
242{
243 "direct packet access: test12 (and, good access)",
244 .insns = {
245 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
246 offsetof(struct __sk_buff, data)),
247 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
248 offsetof(struct __sk_buff, data_end)),
249 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
250 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
251 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
252 BPF_MOV64_IMM(BPF_REG_3, 144),
253 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
254 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
255 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15),
256 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
257 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
258 BPF_MOV64_IMM(BPF_REG_0, 1),
259 BPF_EXIT_INSN(),
260 BPF_MOV64_IMM(BPF_REG_0, 0),
261 BPF_EXIT_INSN(),
262 },
263 .result = ACCEPT,
264 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
265 .retval = 1,
266},
267{
268 "direct packet access: test13 (branches, good access)",
269 .insns = {
270 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
271 offsetof(struct __sk_buff, data)),
272 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
273 offsetof(struct __sk_buff, data_end)),
274 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
275 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
276 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13),
277 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
278 offsetof(struct __sk_buff, mark)),
279 BPF_MOV64_IMM(BPF_REG_4, 1),
280 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2),
281 BPF_MOV64_IMM(BPF_REG_3, 14),
282 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
283 BPF_MOV64_IMM(BPF_REG_3, 24),
284 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
285 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23),
286 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15),
287 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
288 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
289 BPF_MOV64_IMM(BPF_REG_0, 1),
290 BPF_EXIT_INSN(),
291 BPF_MOV64_IMM(BPF_REG_0, 0),
292 BPF_EXIT_INSN(),
293 },
294 .result = ACCEPT,
295 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
296 .retval = 1,
297},
298{
299 "direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)",
300 .insns = {
301 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
302 offsetof(struct __sk_buff, data)),
303 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
304 offsetof(struct __sk_buff, data_end)),
305 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
306 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22),
307 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7),
308 BPF_MOV64_IMM(BPF_REG_5, 12),
309 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4),
310 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
311 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5),
312 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
313 BPF_MOV64_IMM(BPF_REG_0, 1),
314 BPF_EXIT_INSN(),
315 BPF_MOV64_IMM(BPF_REG_0, 0),
316 BPF_EXIT_INSN(),
317 },
318 .result = ACCEPT,
319 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
320 .retval = 1,
321},
322{
323 "direct packet access: test15 (spill with xadd)",
324 .insns = {
325 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
326 offsetof(struct __sk_buff, data)),
327 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
328 offsetof(struct __sk_buff, data_end)),
329 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
330 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
331 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8),
332 BPF_MOV64_IMM(BPF_REG_5, 4096),
333 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
334 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
335 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
91c960b0 336 BPF_ATOMIC_OP(BPF_DW, BPF_ADD, BPF_REG_4, BPF_REG_5, 0),
40f2fbd5
JK
337 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
338 BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0),
339 BPF_MOV64_IMM(BPF_REG_0, 0),
340 BPF_EXIT_INSN(),
341 },
342 .errstr = "R2 invalid mem access 'inv'",
343 .result = REJECT,
344 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
345 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
346},
347{
348 "direct packet access: test16 (arith on data_end)",
349 .insns = {
350 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
351 offsetof(struct __sk_buff, data)),
352 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
353 offsetof(struct __sk_buff, data_end)),
354 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
356 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16),
357 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
358 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
359 BPF_MOV64_IMM(BPF_REG_0, 0),
360 BPF_EXIT_INSN(),
361 },
362 .errstr = "R3 pointer arithmetic on pkt_end",
363 .result = REJECT,
364 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
365},
366{
367 "direct packet access: test17 (pruning, alignment)",
368 .insns = {
369 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
370 offsetof(struct __sk_buff, data)),
371 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
372 offsetof(struct __sk_buff, data_end)),
373 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
374 offsetof(struct __sk_buff, mark)),
375 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
376 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 14),
377 BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 1, 4),
378 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
379 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, -4),
380 BPF_MOV64_IMM(BPF_REG_0, 0),
381 BPF_EXIT_INSN(),
382 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
383 BPF_JMP_A(-6),
384 },
385 .errstr = "misaligned packet access off 2+(0x0; 0x0)+15+-4 size 4",
386 .result = REJECT,
387 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
388 .flags = F_LOAD_WITH_STRICT_ALIGNMENT,
389},
390{
391 "direct packet access: test18 (imm += pkt_ptr, 1)",
392 .insns = {
393 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
394 offsetof(struct __sk_buff, data)),
395 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
396 offsetof(struct __sk_buff, data_end)),
397 BPF_MOV64_IMM(BPF_REG_0, 8),
398 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
399 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
400 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
401 BPF_MOV64_IMM(BPF_REG_0, 0),
402 BPF_EXIT_INSN(),
403 },
404 .result = ACCEPT,
405 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
406},
407{
408 "direct packet access: test19 (imm += pkt_ptr, 2)",
409 .insns = {
410 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
411 offsetof(struct __sk_buff, data)),
412 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
413 offsetof(struct __sk_buff, data_end)),
414 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
415 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
416 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
417 BPF_MOV64_IMM(BPF_REG_4, 4),
418 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
419 BPF_STX_MEM(BPF_B, BPF_REG_4, BPF_REG_4, 0),
420 BPF_MOV64_IMM(BPF_REG_0, 0),
421 BPF_EXIT_INSN(),
422 },
423 .result = ACCEPT,
424 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
425},
426{
427 "direct packet access: test20 (x += pkt_ptr, 1)",
428 .insns = {
429 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
430 offsetof(struct __sk_buff, data)),
431 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
432 offsetof(struct __sk_buff, data_end)),
433 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
434 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
435 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
436 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0x7fff),
437 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
438 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
439 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
440 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1),
441 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
442 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0),
443 BPF_MOV64_IMM(BPF_REG_0, 0),
444 BPF_EXIT_INSN(),
445 },
446 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
447 .result = ACCEPT,
448 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
449},
450{
451 "direct packet access: test21 (x += pkt_ptr, 2)",
452 .insns = {
453 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
454 offsetof(struct __sk_buff, data)),
455 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
456 offsetof(struct __sk_buff, data_end)),
457 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
458 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
459 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9),
460 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff),
461 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -8),
462 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
463 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 0x7fff),
464 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
465 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4),
466 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1),
467 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
468 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0),
469 BPF_MOV64_IMM(BPF_REG_0, 0),
470 BPF_EXIT_INSN(),
471 },
472 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
473 .result = ACCEPT,
474 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
475},
476{
477 "direct packet access: test22 (x += pkt_ptr, 3)",
478 .insns = {
479 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
480 offsetof(struct __sk_buff, data)),
481 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
482 offsetof(struct __sk_buff, data_end)),
483 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
484 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
485 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
486 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_3, -16),
487 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -16),
488 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 11),
489 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8),
490 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff),
91c960b0 491 BPF_ATOMIC_OP(BPF_DW, BPF_ADD, BPF_REG_10, BPF_REG_4, -8),
40f2fbd5
JK
492 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
493 BPF_ALU64_IMM(BPF_RSH, BPF_REG_4, 49),
494 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2),
495 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
496 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
497 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
498 BPF_MOV64_IMM(BPF_REG_2, 1),
499 BPF_STX_MEM(BPF_H, BPF_REG_4, BPF_REG_2, 0),
500 BPF_MOV64_IMM(BPF_REG_0, 0),
501 BPF_EXIT_INSN(),
502 },
503 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
504 .result = ACCEPT,
505 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
506},
507{
508 "direct packet access: test23 (x += pkt_ptr, 4)",
509 .insns = {
510 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
511 offsetof(struct __sk_buff, data)),
512 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
513 offsetof(struct __sk_buff, data_end)),
fc559a70
AS
514 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
515 offsetof(struct __sk_buff, mark)),
40f2fbd5
JK
516 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
517 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
518 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff),
519 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
520 BPF_MOV64_IMM(BPF_REG_0, 31),
521 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4),
522 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
523 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0),
524 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0xffff - 1),
525 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
526 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0),
527 BPF_MOV64_IMM(BPF_REG_0, 0),
528 BPF_EXIT_INSN(),
529 },
530 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
531 .result = REJECT,
75748837 532 .errstr = "invalid access to packet, off=0 size=8, R5(id=2,off=0,r=0)",
40f2fbd5
JK
533 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
534},
535{
536 "direct packet access: test24 (x += pkt_ptr, 5)",
537 .insns = {
538 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
539 offsetof(struct __sk_buff, data)),
540 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
541 offsetof(struct __sk_buff, data_end)),
542 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
543 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
544 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
545 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xff),
546 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
547 BPF_MOV64_IMM(BPF_REG_0, 64),
548 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4),
549 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
550 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0),
551 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7fff - 1),
552 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
553 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0),
554 BPF_MOV64_IMM(BPF_REG_0, 0),
555 BPF_EXIT_INSN(),
556 },
557 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
558 .result = ACCEPT,
559 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
560},
561{
562 "direct packet access: test25 (marking on <, good access)",
563 .insns = {
564 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
565 offsetof(struct __sk_buff, data)),
566 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
567 offsetof(struct __sk_buff, data_end)),
568 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
569 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
570 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 2),
571 BPF_MOV64_IMM(BPF_REG_0, 0),
572 BPF_EXIT_INSN(),
573 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
574 BPF_JMP_IMM(BPF_JA, 0, 0, -4),
575 },
576 .result = ACCEPT,
577 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
578},
579{
580 "direct packet access: test26 (marking on <, bad access)",
581 .insns = {
582 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
583 offsetof(struct __sk_buff, data)),
584 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
585 offsetof(struct __sk_buff, data_end)),
586 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
587 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
588 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 3),
589 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
590 BPF_MOV64_IMM(BPF_REG_0, 0),
591 BPF_EXIT_INSN(),
592 BPF_JMP_IMM(BPF_JA, 0, 0, -3),
593 },
594 .result = REJECT,
595 .errstr = "invalid access to packet",
596 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
597},
598{
599 "direct packet access: test27 (marking on <=, good access)",
600 .insns = {
601 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
602 offsetof(struct __sk_buff, data)),
603 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
604 offsetof(struct __sk_buff, data_end)),
605 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
606 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
607 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 1),
608 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
609 BPF_MOV64_IMM(BPF_REG_0, 1),
610 BPF_EXIT_INSN(),
611 },
612 .result = ACCEPT,
613 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
614 .retval = 1,
615},
616{
617 "direct packet access: test28 (marking on <=, bad access)",
618 .insns = {
619 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
620 offsetof(struct __sk_buff, data)),
621 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
622 offsetof(struct __sk_buff, data_end)),
623 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
624 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
625 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 2),
626 BPF_MOV64_IMM(BPF_REG_0, 1),
627 BPF_EXIT_INSN(),
628 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
629 BPF_JMP_IMM(BPF_JA, 0, 0, -4),
630 },
631 .result = REJECT,
632 .errstr = "invalid access to packet",
633 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
634},
6dd7f140
PC
635{
636 "direct packet access: test29 (reg > pkt_end in subprog)",
637 .insns = {
638 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
639 offsetof(struct __sk_buff, data)),
640 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
641 offsetof(struct __sk_buff, data_end)),
642 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6),
643 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8),
644 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
645 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
646 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
647 BPF_MOV64_IMM(BPF_REG_0, 0),
648 BPF_EXIT_INSN(),
649 BPF_MOV64_IMM(BPF_REG_0, 0),
650 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_2, 1),
651 BPF_MOV64_IMM(BPF_REG_0, 1),
652 BPF_EXIT_INSN(),
653 },
654 .result = ACCEPT,
655 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
656},