Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  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},
 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),
336	BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0),
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),
491	BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_4, -8),
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)),
514	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
515		    offsetof(struct __sk_buff, mark)),
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,
532	.errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)",
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},
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},