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