Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1{
  2	"XDP pkt read, pkt_end mangling, bad access 1",
  3	.insns = {
  4	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
  5	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  6		    offsetof(struct xdp_md, data_end)),
  7	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
  8	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
  9	BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8),
 10	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
 11	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
 12	BPF_MOV64_IMM(BPF_REG_0, 0),
 13	BPF_EXIT_INSN(),
 14	},
 15	.errstr = "R3 pointer arithmetic on pkt_end",
 16	.result = REJECT,
 17	.prog_type = BPF_PROG_TYPE_XDP,
 18},
 19{
 20	"XDP pkt read, pkt_end mangling, bad access 2",
 21	.insns = {
 22	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
 23	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 24		    offsetof(struct xdp_md, data_end)),
 25	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
 26	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
 27	BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8),
 28	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
 29	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
 30	BPF_MOV64_IMM(BPF_REG_0, 0),
 31	BPF_EXIT_INSN(),
 32	},
 33	.errstr = "R3 pointer arithmetic on pkt_end",
 34	.result = REJECT,
 35	.prog_type = BPF_PROG_TYPE_XDP,
 36},
 37{
 38	"XDP pkt read, pkt_data' > pkt_end, good access",
 39	.insns = {
 40	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
 41	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 42		    offsetof(struct xdp_md, data_end)),
 43	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
 44	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
 45	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
 46	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
 47	BPF_MOV64_IMM(BPF_REG_0, 0),
 48	BPF_EXIT_INSN(),
 49	},
 50	.result = ACCEPT,
 51	.prog_type = BPF_PROG_TYPE_XDP,
 52	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 53},
 54{
 55	"XDP pkt read, pkt_data' > pkt_end, bad access 1",
 56	.insns = {
 57	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
 58	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 59		    offsetof(struct xdp_md, data_end)),
 60	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
 61	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
 62	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
 63	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
 64	BPF_MOV64_IMM(BPF_REG_0, 0),
 65	BPF_EXIT_INSN(),
 66	},
 67	.errstr = "R1 offset is outside of the packet",
 68	.result = REJECT,
 69	.prog_type = BPF_PROG_TYPE_XDP,
 70	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 71},
 72{
 73	"XDP pkt read, pkt_data' > pkt_end, bad access 2",
 74	.insns = {
 75	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
 76	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 77		    offsetof(struct xdp_md, data_end)),
 78	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
 79	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
 80	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0),
 81	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
 82	BPF_MOV64_IMM(BPF_REG_0, 0),
 83	BPF_EXIT_INSN(),
 84	},
 85	.errstr = "R1 offset is outside of the packet",
 86	.result = REJECT,
 87	.prog_type = BPF_PROG_TYPE_XDP,
 88	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 89},
 90{
 91	"XDP pkt read, pkt_end > pkt_data', good access",
 92	.insns = {
 93	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
 94	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 95		    offsetof(struct xdp_md, data_end)),
 96	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
 97	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
 98	BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
 99	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
100	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
101	BPF_MOV64_IMM(BPF_REG_0, 0),
102	BPF_EXIT_INSN(),
103	},
104	.result = ACCEPT,
105	.prog_type = BPF_PROG_TYPE_XDP,
106	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
107},
108{
109	"XDP pkt read, pkt_end > pkt_data', bad access 1",
110	.insns = {
111	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
112	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
113		    offsetof(struct xdp_md, data_end)),
114	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
115	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
116	BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
117	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
118	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
119	BPF_MOV64_IMM(BPF_REG_0, 0),
120	BPF_EXIT_INSN(),
121	},
122	.errstr = "R1 offset is outside of the packet",
123	.result = REJECT,
124	.prog_type = BPF_PROG_TYPE_XDP,
125	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
126},
127{
128	"XDP pkt read, pkt_end > pkt_data', bad access 2",
129	.insns = {
130	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
131	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
132		    offsetof(struct xdp_md, data_end)),
133	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
134	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
135	BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
136	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
137	BPF_MOV64_IMM(BPF_REG_0, 0),
138	BPF_EXIT_INSN(),
139	},
140	.errstr = "R1 offset is outside of the packet",
141	.result = REJECT,
142	.prog_type = BPF_PROG_TYPE_XDP,
143	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
144},
145{
146	"XDP pkt read, pkt_data' < pkt_end, good access",
147	.insns = {
148	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
149	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
150		    offsetof(struct xdp_md, data_end)),
151	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
152	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
153	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
154	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
155	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
156	BPF_MOV64_IMM(BPF_REG_0, 0),
157	BPF_EXIT_INSN(),
158	},
159	.result = ACCEPT,
160	.prog_type = BPF_PROG_TYPE_XDP,
161	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
162},
163{
164	"XDP pkt read, pkt_data' < pkt_end, bad access 1",
165	.insns = {
166	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
167	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
168		    offsetof(struct xdp_md, data_end)),
169	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
170	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
171	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
172	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
173	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
174	BPF_MOV64_IMM(BPF_REG_0, 0),
175	BPF_EXIT_INSN(),
176	},
177	.errstr = "R1 offset is outside of the packet",
178	.result = REJECT,
179	.prog_type = BPF_PROG_TYPE_XDP,
180	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
181},
182{
183	"XDP pkt read, pkt_data' < pkt_end, bad access 2",
184	.insns = {
185	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
186	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
187		    offsetof(struct xdp_md, data_end)),
188	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
189	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
190	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
191	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
192	BPF_MOV64_IMM(BPF_REG_0, 0),
193	BPF_EXIT_INSN(),
194	},
195	.errstr = "R1 offset is outside of the packet",
196	.result = REJECT,
197	.prog_type = BPF_PROG_TYPE_XDP,
198	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
199},
200{
201	"XDP pkt read, pkt_end < pkt_data', good access",
202	.insns = {
203	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
204	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
205		    offsetof(struct xdp_md, data_end)),
206	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
207	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
208	BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
209	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
210	BPF_MOV64_IMM(BPF_REG_0, 0),
211	BPF_EXIT_INSN(),
212	},
213	.result = ACCEPT,
214	.prog_type = BPF_PROG_TYPE_XDP,
215	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
216},
217{
218	"XDP pkt read, pkt_end < pkt_data', bad access 1",
219	.insns = {
220	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
221	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
222		    offsetof(struct xdp_md, data_end)),
223	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
224	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
225	BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
226	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
227	BPF_MOV64_IMM(BPF_REG_0, 0),
228	BPF_EXIT_INSN(),
229	},
230	.errstr = "R1 offset is outside of the packet",
231	.result = REJECT,
232	.prog_type = BPF_PROG_TYPE_XDP,
233	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
234},
235{
236	"XDP pkt read, pkt_end < pkt_data', bad access 2",
237	.insns = {
238	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
239	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
240		    offsetof(struct xdp_md, data_end)),
241	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
242	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
243	BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0),
244	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
245	BPF_MOV64_IMM(BPF_REG_0, 0),
246	BPF_EXIT_INSN(),
247	},
248	.errstr = "R1 offset is outside of the packet",
249	.result = REJECT,
250	.prog_type = BPF_PROG_TYPE_XDP,
251	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
252},
253{
254	"XDP pkt read, pkt_data' >= pkt_end, good access",
255	.insns = {
256	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
257	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
258		    offsetof(struct xdp_md, data_end)),
259	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
260	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
261	BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
262	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
263	BPF_MOV64_IMM(BPF_REG_0, 0),
264	BPF_EXIT_INSN(),
265	},
266	.result = ACCEPT,
267	.prog_type = BPF_PROG_TYPE_XDP,
268	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
269},
270{
271	"XDP pkt read, pkt_data' >= pkt_end, bad access 1",
272	.insns = {
273	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
274	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
275		    offsetof(struct xdp_md, data_end)),
276	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
277	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
278	BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
279	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
280	BPF_MOV64_IMM(BPF_REG_0, 0),
281	BPF_EXIT_INSN(),
282	},
283	.errstr = "R1 offset is outside of the packet",
284	.result = REJECT,
285	.prog_type = BPF_PROG_TYPE_XDP,
286	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
287},
288{
289	"XDP pkt read, pkt_data' >= pkt_end, bad access 2",
290	.insns = {
291	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
292	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
293		    offsetof(struct xdp_md, data_end)),
294	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
295	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
296	BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0),
297	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
298	BPF_MOV64_IMM(BPF_REG_0, 0),
299	BPF_EXIT_INSN(),
300	},
301	.errstr = "R1 offset is outside of the packet",
302	.result = REJECT,
303	.prog_type = BPF_PROG_TYPE_XDP,
304	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
305},
306{
307	"XDP pkt read, pkt_end >= pkt_data', good access",
308	.insns = {
309	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
310	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
311		    offsetof(struct xdp_md, data_end)),
312	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
313	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
314	BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
315	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
316	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
317	BPF_MOV64_IMM(BPF_REG_0, 0),
318	BPF_EXIT_INSN(),
319	},
320	.result = ACCEPT,
321	.prog_type = BPF_PROG_TYPE_XDP,
322	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
323},
324{
325	"XDP pkt read, pkt_end >= pkt_data', bad access 1",
326	.insns = {
327	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
328	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
329		    offsetof(struct xdp_md, data_end)),
330	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
331	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
332	BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
333	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
334	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
335	BPF_MOV64_IMM(BPF_REG_0, 0),
336	BPF_EXIT_INSN(),
337	},
338	.errstr = "R1 offset is outside of the packet",
339	.result = REJECT,
340	.prog_type = BPF_PROG_TYPE_XDP,
341	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
342},
343{
344	"XDP pkt read, pkt_end >= pkt_data', bad access 2",
345	.insns = {
346	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
347	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
348		    offsetof(struct xdp_md, data_end)),
349	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
350	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
351	BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
352	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
353	BPF_MOV64_IMM(BPF_REG_0, 0),
354	BPF_EXIT_INSN(),
355	},
356	.errstr = "R1 offset is outside of the packet",
357	.result = REJECT,
358	.prog_type = BPF_PROG_TYPE_XDP,
359	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
360},
361{
362	"XDP pkt read, pkt_data' <= pkt_end, good access",
363	.insns = {
364	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
365	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
366		    offsetof(struct xdp_md, data_end)),
367	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
368	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
369	BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
370	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
371	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
372	BPF_MOV64_IMM(BPF_REG_0, 0),
373	BPF_EXIT_INSN(),
374	},
375	.result = ACCEPT,
376	.prog_type = BPF_PROG_TYPE_XDP,
377	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
378},
379{
380	"XDP pkt read, pkt_data' <= pkt_end, bad access 1",
381	.insns = {
382	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
383	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
384		    offsetof(struct xdp_md, data_end)),
385	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
386	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
387	BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
388	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
389	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
390	BPF_MOV64_IMM(BPF_REG_0, 0),
391	BPF_EXIT_INSN(),
392	},
393	.errstr = "R1 offset is outside of the packet",
394	.result = REJECT,
395	.prog_type = BPF_PROG_TYPE_XDP,
396	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
397},
398{
399	"XDP pkt read, pkt_data' <= pkt_end, bad access 2",
400	.insns = {
401	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
402	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
403		    offsetof(struct xdp_md, data_end)),
404	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
405	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
406	BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
407	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
408	BPF_MOV64_IMM(BPF_REG_0, 0),
409	BPF_EXIT_INSN(),
410	},
411	.errstr = "R1 offset is outside of the packet",
412	.result = REJECT,
413	.prog_type = BPF_PROG_TYPE_XDP,
414	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
415},
416{
417	"XDP pkt read, pkt_end <= pkt_data', good access",
418	.insns = {
419	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
420	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
421		    offsetof(struct xdp_md, data_end)),
422	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
423	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
424	BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
425	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
426	BPF_MOV64_IMM(BPF_REG_0, 0),
427	BPF_EXIT_INSN(),
428	},
429	.result = ACCEPT,
430	.prog_type = BPF_PROG_TYPE_XDP,
431	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
432},
433{
434	"XDP pkt read, pkt_end <= pkt_data', bad access 1",
435	.insns = {
436	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
437	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
438		    offsetof(struct xdp_md, data_end)),
439	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
440	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
441	BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
442	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
443	BPF_MOV64_IMM(BPF_REG_0, 0),
444	BPF_EXIT_INSN(),
445	},
446	.errstr = "R1 offset is outside of the packet",
447	.result = REJECT,
448	.prog_type = BPF_PROG_TYPE_XDP,
449	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
450},
451{
452	"XDP pkt read, pkt_end <= pkt_data', bad access 2",
453	.insns = {
454	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
455	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
456		    offsetof(struct xdp_md, data_end)),
457	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
458	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
459	BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0),
460	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
461	BPF_MOV64_IMM(BPF_REG_0, 0),
462	BPF_EXIT_INSN(),
463	},
464	.errstr = "R1 offset is outside of the packet",
465	.result = REJECT,
466	.prog_type = BPF_PROG_TYPE_XDP,
467	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
468},
469{
470	"XDP pkt read, pkt_meta' > pkt_data, good access",
471	.insns = {
472	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
473		    offsetof(struct xdp_md, data_meta)),
474	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
475	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
476	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
477	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
478	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
479	BPF_MOV64_IMM(BPF_REG_0, 0),
480	BPF_EXIT_INSN(),
481	},
482	.result = ACCEPT,
483	.prog_type = BPF_PROG_TYPE_XDP,
484	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
485},
486{
487	"XDP pkt read, pkt_meta' > pkt_data, bad access 1",
488	.insns = {
489	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
490		    offsetof(struct xdp_md, data_meta)),
491	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
492	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
493	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
494	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
495	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
496	BPF_MOV64_IMM(BPF_REG_0, 0),
497	BPF_EXIT_INSN(),
498	},
499	.errstr = "R1 offset is outside of the packet",
500	.result = REJECT,
501	.prog_type = BPF_PROG_TYPE_XDP,
502	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
503},
504{
505	"XDP pkt read, pkt_meta' > pkt_data, bad access 2",
506	.insns = {
507	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
508		    offsetof(struct xdp_md, data_meta)),
509	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
510	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
511	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
512	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0),
513	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
514	BPF_MOV64_IMM(BPF_REG_0, 0),
515	BPF_EXIT_INSN(),
516	},
517	.errstr = "R1 offset is outside of the packet",
518	.result = REJECT,
519	.prog_type = BPF_PROG_TYPE_XDP,
520	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
521},
522{
523	"XDP pkt read, pkt_data > pkt_meta', good access",
524	.insns = {
525	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
526		    offsetof(struct xdp_md, data_meta)),
527	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
528	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
529	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
530	BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
531	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
532	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
533	BPF_MOV64_IMM(BPF_REG_0, 0),
534	BPF_EXIT_INSN(),
535	},
536	.result = ACCEPT,
537	.prog_type = BPF_PROG_TYPE_XDP,
538	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
539},
540{
541	"XDP pkt read, pkt_data > pkt_meta', bad access 1",
542	.insns = {
543	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
544		    offsetof(struct xdp_md, data_meta)),
545	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
546	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
547	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
548	BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
549	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
550	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
551	BPF_MOV64_IMM(BPF_REG_0, 0),
552	BPF_EXIT_INSN(),
553	},
554	.errstr = "R1 offset is outside of the packet",
555	.result = REJECT,
556	.prog_type = BPF_PROG_TYPE_XDP,
557	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
558},
559{
560	"XDP pkt read, pkt_data > pkt_meta', bad access 2",
561	.insns = {
562	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
563		    offsetof(struct xdp_md, data_meta)),
564	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
565	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
566	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
567	BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
568	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
569	BPF_MOV64_IMM(BPF_REG_0, 0),
570	BPF_EXIT_INSN(),
571	},
572	.errstr = "R1 offset is outside of the packet",
573	.result = REJECT,
574	.prog_type = BPF_PROG_TYPE_XDP,
575	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
576},
577{
578	"XDP pkt read, pkt_meta' < pkt_data, good access",
579	.insns = {
580	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
581		    offsetof(struct xdp_md, data_meta)),
582	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
583	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
584	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
585	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
586	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
587	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
588	BPF_MOV64_IMM(BPF_REG_0, 0),
589	BPF_EXIT_INSN(),
590	},
591	.result = ACCEPT,
592	.prog_type = BPF_PROG_TYPE_XDP,
593	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
594},
595{
596	"XDP pkt read, pkt_meta' < pkt_data, bad access 1",
597	.insns = {
598	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
599		    offsetof(struct xdp_md, data_meta)),
600	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
601	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
602	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
603	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
604	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
605	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
606	BPF_MOV64_IMM(BPF_REG_0, 0),
607	BPF_EXIT_INSN(),
608	},
609	.errstr = "R1 offset is outside of the packet",
610	.result = REJECT,
611	.prog_type = BPF_PROG_TYPE_XDP,
612	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
613},
614{
615	"XDP pkt read, pkt_meta' < pkt_data, bad access 2",
616	.insns = {
617	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
618		    offsetof(struct xdp_md, data_meta)),
619	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
620	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
621	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
622	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
623	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
624	BPF_MOV64_IMM(BPF_REG_0, 0),
625	BPF_EXIT_INSN(),
626	},
627	.errstr = "R1 offset is outside of the packet",
628	.result = REJECT,
629	.prog_type = BPF_PROG_TYPE_XDP,
630	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
631},
632{
633	"XDP pkt read, pkt_data < pkt_meta', good access",
634	.insns = {
635	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
636		    offsetof(struct xdp_md, data_meta)),
637	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
638	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
639	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
640	BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
641	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
642	BPF_MOV64_IMM(BPF_REG_0, 0),
643	BPF_EXIT_INSN(),
644	},
645	.result = ACCEPT,
646	.prog_type = BPF_PROG_TYPE_XDP,
647	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
648},
649{
650	"XDP pkt read, pkt_data < pkt_meta', bad access 1",
651	.insns = {
652	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
653		    offsetof(struct xdp_md, data_meta)),
654	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
655	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
656	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
657	BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
658	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
659	BPF_MOV64_IMM(BPF_REG_0, 0),
660	BPF_EXIT_INSN(),
661	},
662	.errstr = "R1 offset is outside of the packet",
663	.result = REJECT,
664	.prog_type = BPF_PROG_TYPE_XDP,
665	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
666},
667{
668	"XDP pkt read, pkt_data < pkt_meta', bad access 2",
669	.insns = {
670	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
671		    offsetof(struct xdp_md, data_meta)),
672	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
673	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
674	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
675	BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0),
676	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
677	BPF_MOV64_IMM(BPF_REG_0, 0),
678	BPF_EXIT_INSN(),
679	},
680	.errstr = "R1 offset is outside of the packet",
681	.result = REJECT,
682	.prog_type = BPF_PROG_TYPE_XDP,
683	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
684},
685{
686	"XDP pkt read, pkt_meta' >= pkt_data, good access",
687	.insns = {
688	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
689		    offsetof(struct xdp_md, data_meta)),
690	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
691	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
692	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
693	BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
694	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
695	BPF_MOV64_IMM(BPF_REG_0, 0),
696	BPF_EXIT_INSN(),
697	},
698	.result = ACCEPT,
699	.prog_type = BPF_PROG_TYPE_XDP,
700	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
701},
702{
703	"XDP pkt read, pkt_meta' >= pkt_data, bad access 1",
704	.insns = {
705	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
706		    offsetof(struct xdp_md, data_meta)),
707	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
708	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
709	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
710	BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
711	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
712	BPF_MOV64_IMM(BPF_REG_0, 0),
713	BPF_EXIT_INSN(),
714	},
715	.errstr = "R1 offset is outside of the packet",
716	.result = REJECT,
717	.prog_type = BPF_PROG_TYPE_XDP,
718	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
719},
720{
721	"XDP pkt read, pkt_meta' >= pkt_data, bad access 2",
722	.insns = {
723	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
724		    offsetof(struct xdp_md, data_meta)),
725	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
726	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
727	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
728	BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0),
729	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
730	BPF_MOV64_IMM(BPF_REG_0, 0),
731	BPF_EXIT_INSN(),
732	},
733	.errstr = "R1 offset is outside of the packet",
734	.result = REJECT,
735	.prog_type = BPF_PROG_TYPE_XDP,
736	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
737},
738{
739	"XDP pkt read, pkt_data >= pkt_meta', good access",
740	.insns = {
741	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
742		    offsetof(struct xdp_md, data_meta)),
743	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
744	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
745	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
746	BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
747	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
748	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
749	BPF_MOV64_IMM(BPF_REG_0, 0),
750	BPF_EXIT_INSN(),
751	},
752	.result = ACCEPT,
753	.prog_type = BPF_PROG_TYPE_XDP,
754	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
755},
756{
757	"XDP pkt read, pkt_data >= pkt_meta', bad access 1",
758	.insns = {
759	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
760		    offsetof(struct xdp_md, data_meta)),
761	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
762	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
763	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
764	BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
765	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
766	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
767	BPF_MOV64_IMM(BPF_REG_0, 0),
768	BPF_EXIT_INSN(),
769	},
770	.errstr = "R1 offset is outside of the packet",
771	.result = REJECT,
772	.prog_type = BPF_PROG_TYPE_XDP,
773	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
774},
775{
776	"XDP pkt read, pkt_data >= pkt_meta', bad access 2",
777	.insns = {
778	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
779		    offsetof(struct xdp_md, data_meta)),
780	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
781	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
782	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
783	BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
784	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
785	BPF_MOV64_IMM(BPF_REG_0, 0),
786	BPF_EXIT_INSN(),
787	},
788	.errstr = "R1 offset is outside of the packet",
789	.result = REJECT,
790	.prog_type = BPF_PROG_TYPE_XDP,
791	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
792},
793{
794	"XDP pkt read, pkt_meta' <= pkt_data, good access",
795	.insns = {
796	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
797		    offsetof(struct xdp_md, data_meta)),
798	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
799	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
800	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
801	BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
802	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
803	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
804	BPF_MOV64_IMM(BPF_REG_0, 0),
805	BPF_EXIT_INSN(),
806	},
807	.result = ACCEPT,
808	.prog_type = BPF_PROG_TYPE_XDP,
809	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
810},
811{
812	"XDP pkt read, pkt_meta' <= pkt_data, bad access 1",
813	.insns = {
814	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
815		    offsetof(struct xdp_md, data_meta)),
816	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
817	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
818	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
819	BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
820	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
821	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
822	BPF_MOV64_IMM(BPF_REG_0, 0),
823	BPF_EXIT_INSN(),
824	},
825	.errstr = "R1 offset is outside of the packet",
826	.result = REJECT,
827	.prog_type = BPF_PROG_TYPE_XDP,
828	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
829},
830{
831	"XDP pkt read, pkt_meta' <= pkt_data, bad access 2",
832	.insns = {
833	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
834		    offsetof(struct xdp_md, data_meta)),
835	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
836	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
837	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
838	BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
839	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
840	BPF_MOV64_IMM(BPF_REG_0, 0),
841	BPF_EXIT_INSN(),
842	},
843	.errstr = "R1 offset is outside of the packet",
844	.result = REJECT,
845	.prog_type = BPF_PROG_TYPE_XDP,
846	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
847},
848{
849	"XDP pkt read, pkt_data <= pkt_meta', good access",
850	.insns = {
851	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
852		    offsetof(struct xdp_md, data_meta)),
853	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
854	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
855	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
856	BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
857	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
858	BPF_MOV64_IMM(BPF_REG_0, 0),
859	BPF_EXIT_INSN(),
860	},
861	.result = ACCEPT,
862	.prog_type = BPF_PROG_TYPE_XDP,
863	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
864},
865{
866	"XDP pkt read, pkt_data <= pkt_meta', bad access 1",
867	.insns = {
868	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
869		    offsetof(struct xdp_md, data_meta)),
870	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
871	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
872	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
873	BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
874	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
875	BPF_MOV64_IMM(BPF_REG_0, 0),
876	BPF_EXIT_INSN(),
877	},
878	.errstr = "R1 offset is outside of the packet",
879	.result = REJECT,
880	.prog_type = BPF_PROG_TYPE_XDP,
881	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
882},
883{
884	"XDP pkt read, pkt_data <= pkt_meta', bad access 2",
885	.insns = {
886	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
887		    offsetof(struct xdp_md, data_meta)),
888	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
889	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
890	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
891	BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0),
892	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
893	BPF_MOV64_IMM(BPF_REG_0, 0),
894	BPF_EXIT_INSN(),
895	},
896	.errstr = "R1 offset is outside of the packet",
897	.result = REJECT,
898	.prog_type = BPF_PROG_TYPE_XDP,
899	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
900},