1{
2	"valid 1,2,4,8-byte reads from bpf_sk_lookup",
3	.insns = {
4		/* 1-byte read from family field */
5		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
6			    offsetof(struct bpf_sk_lookup, family)),
7		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
8			    offsetof(struct bpf_sk_lookup, family) + 1),
9		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
10			    offsetof(struct bpf_sk_lookup, family) + 2),
11		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
12			    offsetof(struct bpf_sk_lookup, family) + 3),
13		/* 2-byte read from family field */
14		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
15			    offsetof(struct bpf_sk_lookup, family)),
16		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
17			    offsetof(struct bpf_sk_lookup, family) + 2),
18		/* 4-byte read from family field */
19		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
20			    offsetof(struct bpf_sk_lookup, family)),
21
22		/* 1-byte read from protocol field */
23		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
24			    offsetof(struct bpf_sk_lookup, protocol)),
25		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
26			    offsetof(struct bpf_sk_lookup, protocol) + 1),
27		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
28			    offsetof(struct bpf_sk_lookup, protocol) + 2),
29		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
30			    offsetof(struct bpf_sk_lookup, protocol) + 3),
31		/* 2-byte read from protocol field */
32		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
33			    offsetof(struct bpf_sk_lookup, protocol)),
34		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
35			    offsetof(struct bpf_sk_lookup, protocol) + 2),
36		/* 4-byte read from protocol field */
37		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
38			    offsetof(struct bpf_sk_lookup, protocol)),
39
40		/* 1-byte read from remote_ip4 field */
41		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
42			    offsetof(struct bpf_sk_lookup, remote_ip4)),
43		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
44			    offsetof(struct bpf_sk_lookup, remote_ip4) + 1),
45		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
46			    offsetof(struct bpf_sk_lookup, remote_ip4) + 2),
47		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
48			    offsetof(struct bpf_sk_lookup, remote_ip4) + 3),
49		/* 2-byte read from remote_ip4 field */
50		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
51			    offsetof(struct bpf_sk_lookup, remote_ip4)),
52		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
53			    offsetof(struct bpf_sk_lookup, remote_ip4) + 2),
54		/* 4-byte read from remote_ip4 field */
55		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
56			    offsetof(struct bpf_sk_lookup, remote_ip4)),
57
58		/* 1-byte read from remote_ip6 field */
59		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
60			    offsetof(struct bpf_sk_lookup, remote_ip6)),
61		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
62			    offsetof(struct bpf_sk_lookup, remote_ip6) + 1),
63		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
64			    offsetof(struct bpf_sk_lookup, remote_ip6) + 2),
65		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
66			    offsetof(struct bpf_sk_lookup, remote_ip6) + 3),
67		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
68			    offsetof(struct bpf_sk_lookup, remote_ip6) + 4),
69		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
70			    offsetof(struct bpf_sk_lookup, remote_ip6) + 5),
71		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
72			    offsetof(struct bpf_sk_lookup, remote_ip6) + 6),
73		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
74			    offsetof(struct bpf_sk_lookup, remote_ip6) + 7),
75		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
76			    offsetof(struct bpf_sk_lookup, remote_ip6) + 8),
77		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
78			    offsetof(struct bpf_sk_lookup, remote_ip6) + 9),
79		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
80			    offsetof(struct bpf_sk_lookup, remote_ip6) + 10),
81		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
82			    offsetof(struct bpf_sk_lookup, remote_ip6) + 11),
83		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
84			    offsetof(struct bpf_sk_lookup, remote_ip6) + 12),
85		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
86			    offsetof(struct bpf_sk_lookup, remote_ip6) + 13),
87		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
88			    offsetof(struct bpf_sk_lookup, remote_ip6) + 14),
89		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
90			    offsetof(struct bpf_sk_lookup, remote_ip6) + 15),
91		/* 2-byte read from remote_ip6 field */
92		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
93			    offsetof(struct bpf_sk_lookup, remote_ip6)),
94		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
95			    offsetof(struct bpf_sk_lookup, remote_ip6) + 2),
96		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
97			    offsetof(struct bpf_sk_lookup, remote_ip6) + 4),
98		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
99			    offsetof(struct bpf_sk_lookup, remote_ip6) + 6),
100		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
101			    offsetof(struct bpf_sk_lookup, remote_ip6) + 8),
102		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
103			    offsetof(struct bpf_sk_lookup, remote_ip6) + 10),
104		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
105			    offsetof(struct bpf_sk_lookup, remote_ip6) + 12),
106		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
107			    offsetof(struct bpf_sk_lookup, remote_ip6) + 14),
108		/* 4-byte read from remote_ip6 field */
109		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
110			    offsetof(struct bpf_sk_lookup, remote_ip6)),
111		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
112			    offsetof(struct bpf_sk_lookup, remote_ip6) + 4),
113		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
114			    offsetof(struct bpf_sk_lookup, remote_ip6) + 8),
115		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
116			    offsetof(struct bpf_sk_lookup, remote_ip6) + 12),
117
118		/* 1-byte read from remote_port field */
119		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
120			    offsetof(struct bpf_sk_lookup, remote_port)),
121		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
122			    offsetof(struct bpf_sk_lookup, remote_port) + 1),
123		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
124			    offsetof(struct bpf_sk_lookup, remote_port) + 2),
125		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
126			    offsetof(struct bpf_sk_lookup, remote_port) + 3),
127		/* 2-byte read from remote_port field */
128		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
129			    offsetof(struct bpf_sk_lookup, remote_port)),
130		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
131			    offsetof(struct bpf_sk_lookup, remote_port) + 2),
132		/* 4-byte read from remote_port field */
133		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
134			    offsetof(struct bpf_sk_lookup, remote_port)),
135
136		/* 1-byte read from local_ip4 field */
137		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
138			    offsetof(struct bpf_sk_lookup, local_ip4)),
139		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
140			    offsetof(struct bpf_sk_lookup, local_ip4) + 1),
141		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
142			    offsetof(struct bpf_sk_lookup, local_ip4) + 2),
143		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
144			    offsetof(struct bpf_sk_lookup, local_ip4) + 3),
145		/* 2-byte read from local_ip4 field */
146		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
147			    offsetof(struct bpf_sk_lookup, local_ip4)),
148		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
149			    offsetof(struct bpf_sk_lookup, local_ip4) + 2),
150		/* 4-byte read from local_ip4 field */
151		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
152			    offsetof(struct bpf_sk_lookup, local_ip4)),
153
154		/* 1-byte read from local_ip6 field */
155		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
156			    offsetof(struct bpf_sk_lookup, local_ip6)),
157		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
158			    offsetof(struct bpf_sk_lookup, local_ip6) + 1),
159		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
160			    offsetof(struct bpf_sk_lookup, local_ip6) + 2),
161		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
162			    offsetof(struct bpf_sk_lookup, local_ip6) + 3),
163		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
164			    offsetof(struct bpf_sk_lookup, local_ip6) + 4),
165		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
166			    offsetof(struct bpf_sk_lookup, local_ip6) + 5),
167		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
168			    offsetof(struct bpf_sk_lookup, local_ip6) + 6),
169		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
170			    offsetof(struct bpf_sk_lookup, local_ip6) + 7),
171		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
172			    offsetof(struct bpf_sk_lookup, local_ip6) + 8),
173		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
174			    offsetof(struct bpf_sk_lookup, local_ip6) + 9),
175		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
176			    offsetof(struct bpf_sk_lookup, local_ip6) + 10),
177		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
178			    offsetof(struct bpf_sk_lookup, local_ip6) + 11),
179		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
180			    offsetof(struct bpf_sk_lookup, local_ip6) + 12),
181		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
182			    offsetof(struct bpf_sk_lookup, local_ip6) + 13),
183		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
184			    offsetof(struct bpf_sk_lookup, local_ip6) + 14),
185		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
186			    offsetof(struct bpf_sk_lookup, local_ip6) + 15),
187		/* 2-byte read from local_ip6 field */
188		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
189			    offsetof(struct bpf_sk_lookup, local_ip6)),
190		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
191			    offsetof(struct bpf_sk_lookup, local_ip6) + 2),
192		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
193			    offsetof(struct bpf_sk_lookup, local_ip6) + 4),
194		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
195			    offsetof(struct bpf_sk_lookup, local_ip6) + 6),
196		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
197			    offsetof(struct bpf_sk_lookup, local_ip6) + 8),
198		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
199			    offsetof(struct bpf_sk_lookup, local_ip6) + 10),
200		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
201			    offsetof(struct bpf_sk_lookup, local_ip6) + 12),
202		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
203			    offsetof(struct bpf_sk_lookup, local_ip6) + 14),
204		/* 4-byte read from local_ip6 field */
205		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
206			    offsetof(struct bpf_sk_lookup, local_ip6)),
207		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
208			    offsetof(struct bpf_sk_lookup, local_ip6) + 4),
209		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
210			    offsetof(struct bpf_sk_lookup, local_ip6) + 8),
211		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
212			    offsetof(struct bpf_sk_lookup, local_ip6) + 12),
213
214		/* 1-byte read from local_port field */
215		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
216			    offsetof(struct bpf_sk_lookup, local_port)),
217		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
218			    offsetof(struct bpf_sk_lookup, local_port) + 1),
219		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
220			    offsetof(struct bpf_sk_lookup, local_port) + 2),
221		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
222			    offsetof(struct bpf_sk_lookup, local_port) + 3),
223		/* 2-byte read from local_port field */
224		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
225			    offsetof(struct bpf_sk_lookup, local_port)),
226		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
227			    offsetof(struct bpf_sk_lookup, local_port) + 2),
228		/* 4-byte read from local_port field */
229		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
230			    offsetof(struct bpf_sk_lookup, local_port)),
231
232		/* 1-byte read from ingress_ifindex field */
233		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
234			    offsetof(struct bpf_sk_lookup, ingress_ifindex)),
235		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
236			    offsetof(struct bpf_sk_lookup, ingress_ifindex) + 1),
237		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
238			    offsetof(struct bpf_sk_lookup, ingress_ifindex) + 2),
239		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
240			    offsetof(struct bpf_sk_lookup, ingress_ifindex) + 3),
241		/* 2-byte read from ingress_ifindex field */
242		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
243			    offsetof(struct bpf_sk_lookup, ingress_ifindex)),
244		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
245			    offsetof(struct bpf_sk_lookup, ingress_ifindex) + 2),
246		/* 4-byte read from ingress_ifindex field */
247		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
248			    offsetof(struct bpf_sk_lookup, ingress_ifindex)),
249
250		/* 8-byte read from sk field */
251		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
252			    offsetof(struct bpf_sk_lookup, sk)),
253
254		BPF_MOV32_IMM(BPF_REG_0, 0),
255		BPF_EXIT_INSN(),
256	},
257	.result = ACCEPT,
258	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
259	.expected_attach_type = BPF_SK_LOOKUP,
260	.runs = -1,
261},
262/* invalid 8-byte reads from a 4-byte fields in bpf_sk_lookup */
263{
264	"invalid 8-byte read from bpf_sk_lookup family field",
265	.insns = {
266		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
267			    offsetof(struct bpf_sk_lookup, family)),
268		BPF_MOV32_IMM(BPF_REG_0, 0),
269		BPF_EXIT_INSN(),
270	},
271	.errstr = "invalid bpf_context access",
272	.result = REJECT,
273	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
274	.expected_attach_type = BPF_SK_LOOKUP,
275},
276{
277	"invalid 8-byte read from bpf_sk_lookup protocol field",
278	.insns = {
279		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
280			    offsetof(struct bpf_sk_lookup, protocol)),
281		BPF_MOV32_IMM(BPF_REG_0, 0),
282		BPF_EXIT_INSN(),
283	},
284	.errstr = "invalid bpf_context access",
285	.result = REJECT,
286	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
287	.expected_attach_type = BPF_SK_LOOKUP,
288	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
289},
290{
291	"invalid 8-byte read from bpf_sk_lookup remote_ip4 field",
292	.insns = {
293		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
294			    offsetof(struct bpf_sk_lookup, remote_ip4)),
295		BPF_MOV32_IMM(BPF_REG_0, 0),
296		BPF_EXIT_INSN(),
297	},
298	.errstr = "invalid bpf_context access",
299	.result = REJECT,
300	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
301	.expected_attach_type = BPF_SK_LOOKUP,
302},
303{
304	"invalid 8-byte read from bpf_sk_lookup remote_ip6 field",
305	.insns = {
306		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
307			    offsetof(struct bpf_sk_lookup, remote_ip6)),
308		BPF_MOV32_IMM(BPF_REG_0, 0),
309		BPF_EXIT_INSN(),
310	},
311	.errstr = "invalid bpf_context access",
312	.result = REJECT,
313	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
314	.expected_attach_type = BPF_SK_LOOKUP,
315	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
316},
317{
318	"invalid 8-byte read from bpf_sk_lookup remote_port field",
319	.insns = {
320		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
321			    offsetof(struct bpf_sk_lookup, remote_port)),
322		BPF_MOV32_IMM(BPF_REG_0, 0),
323		BPF_EXIT_INSN(),
324	},
325	.errstr = "invalid bpf_context access",
326	.result = REJECT,
327	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
328	.expected_attach_type = BPF_SK_LOOKUP,
329	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
330},
331{
332	"invalid 8-byte read from bpf_sk_lookup local_ip4 field",
333	.insns = {
334		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
335			    offsetof(struct bpf_sk_lookup, local_ip4)),
336		BPF_MOV32_IMM(BPF_REG_0, 0),
337		BPF_EXIT_INSN(),
338	},
339	.errstr = "invalid bpf_context access",
340	.result = REJECT,
341	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
342	.expected_attach_type = BPF_SK_LOOKUP,
343},
344{
345	"invalid 8-byte read from bpf_sk_lookup local_ip6 field",
346	.insns = {
347		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
348			    offsetof(struct bpf_sk_lookup, local_ip6)),
349		BPF_MOV32_IMM(BPF_REG_0, 0),
350		BPF_EXIT_INSN(),
351	},
352	.errstr = "invalid bpf_context access",
353	.result = REJECT,
354	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
355	.expected_attach_type = BPF_SK_LOOKUP,
356	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
357},
358{
359	"invalid 8-byte read from bpf_sk_lookup local_port field",
360	.insns = {
361		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
362			    offsetof(struct bpf_sk_lookup, local_port)),
363		BPF_MOV32_IMM(BPF_REG_0, 0),
364		BPF_EXIT_INSN(),
365	},
366	.errstr = "invalid bpf_context access",
367	.result = REJECT,
368	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
369	.expected_attach_type = BPF_SK_LOOKUP,
370	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
371},
372{
373	"invalid 8-byte read from bpf_sk_lookup ingress_ifindex field",
374	.insns = {
375		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
376			    offsetof(struct bpf_sk_lookup, ingress_ifindex)),
377		BPF_MOV32_IMM(BPF_REG_0, 0),
378		BPF_EXIT_INSN(),
379	},
380	.errstr = "invalid bpf_context access",
381	.result = REJECT,
382	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
383	.expected_attach_type = BPF_SK_LOOKUP,
384	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
385},
386/* invalid 1,2,4-byte reads from 8-byte fields in bpf_sk_lookup */
387{
388	"invalid 4-byte read from bpf_sk_lookup sk field",
389	.insns = {
390		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
391			    offsetof(struct bpf_sk_lookup, sk)),
392		BPF_MOV32_IMM(BPF_REG_0, 0),
393		BPF_EXIT_INSN(),
394	},
395	.errstr = "invalid bpf_context access",
396	.result = REJECT,
397	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
398	.expected_attach_type = BPF_SK_LOOKUP,
399},
400{
401	"invalid 2-byte read from bpf_sk_lookup sk field",
402	.insns = {
403		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
404			    offsetof(struct bpf_sk_lookup, sk)),
405		BPF_MOV32_IMM(BPF_REG_0, 0),
406		BPF_EXIT_INSN(),
407	},
408	.errstr = "invalid bpf_context access",
409	.result = REJECT,
410	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
411	.expected_attach_type = BPF_SK_LOOKUP,
412},
413{
414	"invalid 1-byte read from bpf_sk_lookup sk field",
415	.insns = {
416		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
417			    offsetof(struct bpf_sk_lookup, sk)),
418		BPF_MOV32_IMM(BPF_REG_0, 0),
419		BPF_EXIT_INSN(),
420	},
421	.errstr = "invalid bpf_context access",
422	.result = REJECT,
423	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
424	.expected_attach_type = BPF_SK_LOOKUP,
425},
426/* out of bounds and unaligned reads from bpf_sk_lookup */
427{
428	"invalid 4-byte read past end of bpf_sk_lookup",
429	.insns = {
430		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
431			    sizeof(struct bpf_sk_lookup)),
432		BPF_MOV32_IMM(BPF_REG_0, 0),
433		BPF_EXIT_INSN(),
434	},
435	.errstr = "invalid bpf_context access",
436	.result = REJECT,
437	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
438	.expected_attach_type = BPF_SK_LOOKUP,
439},
440{
441	"invalid 4-byte unaligned read from bpf_sk_lookup at odd offset",
442	.insns = {
443		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1),
444		BPF_MOV32_IMM(BPF_REG_0, 0),
445		BPF_EXIT_INSN(),
446	},
447	.errstr = "invalid bpf_context access",
448	.result = REJECT,
449	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
450	.expected_attach_type = BPF_SK_LOOKUP,
451	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
452},
453{
454	"invalid 4-byte unaligned read from bpf_sk_lookup at even offset",
455	.insns = {
456		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2),
457		BPF_MOV32_IMM(BPF_REG_0, 0),
458		BPF_EXIT_INSN(),
459	},
460	.errstr = "invalid bpf_context access",
461	.result = REJECT,
462	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
463	.expected_attach_type = BPF_SK_LOOKUP,
464	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
465},
466/* in-bound and out-of-bound writes to bpf_sk_lookup */
467{
468	"invalid 8-byte write to bpf_sk_lookup",
469	.insns = {
470		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
471		BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
472		BPF_MOV32_IMM(BPF_REG_0, 0),
473		BPF_EXIT_INSN(),
474	},
475	.errstr = "invalid bpf_context access",
476	.result = REJECT,
477	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
478	.expected_attach_type = BPF_SK_LOOKUP,
479},
480{
481	"invalid 4-byte write to bpf_sk_lookup",
482	.insns = {
483		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
484		BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
485		BPF_MOV32_IMM(BPF_REG_0, 0),
486		BPF_EXIT_INSN(),
487	},
488	.errstr = "invalid bpf_context access",
489	.result = REJECT,
490	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
491	.expected_attach_type = BPF_SK_LOOKUP,
492},
493{
494	"invalid 2-byte write to bpf_sk_lookup",
495	.insns = {
496		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
497		BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 0),
498		BPF_MOV32_IMM(BPF_REG_0, 0),
499		BPF_EXIT_INSN(),
500	},
501	.errstr = "invalid bpf_context access",
502	.result = REJECT,
503	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
504	.expected_attach_type = BPF_SK_LOOKUP,
505},
506{
507	"invalid 1-byte write to bpf_sk_lookup",
508	.insns = {
509		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
510		BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
511		BPF_MOV32_IMM(BPF_REG_0, 0),
512		BPF_EXIT_INSN(),
513	},
514	.errstr = "invalid bpf_context access",
515	.result = REJECT,
516	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
517	.expected_attach_type = BPF_SK_LOOKUP,
518},
519{
520	"invalid 4-byte write past end of bpf_sk_lookup",
521	.insns = {
522		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
523		BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
524			    sizeof(struct bpf_sk_lookup)),
525		BPF_MOV32_IMM(BPF_REG_0, 0),
526		BPF_EXIT_INSN(),
527	},
528	.errstr = "invalid bpf_context access",
529	.result = REJECT,
530	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
531	.expected_attach_type = BPF_SK_LOOKUP,
532},
533