t_mbuf.c revision 1.1 1 1.1 alnsn /* $NetBSD: t_mbuf.c,v 1.1 2014/07/07 19:40:28 alnsn Exp $ */
2 1.1 alnsn
3 1.1 alnsn /*-
4 1.1 alnsn * Copyright (c) 2014 Alexander Nasonov.
5 1.1 alnsn * All rights reserved.
6 1.1 alnsn *
7 1.1 alnsn * Redistribution and use in source and binary forms, with or without
8 1.1 alnsn * modification, are permitted provided that the following conditions
9 1.1 alnsn * are met:
10 1.1 alnsn * 1. Redistributions of source code must retain the above copyright
11 1.1 alnsn * notice, this list of conditions and the following disclaimer.
12 1.1 alnsn * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 alnsn * notice, this list of conditions and the following disclaimer in the
14 1.1 alnsn * documentation and/or other materials provided with the distribution.
15 1.1 alnsn *
16 1.1 alnsn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17 1.1 alnsn * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 1.1 alnsn * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 1.1 alnsn * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 1.1 alnsn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.1 alnsn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 1.1 alnsn * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.1 alnsn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.1 alnsn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.1 alnsn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.1 alnsn * SUCH DAMAGE.
27 1.1 alnsn */
28 1.1 alnsn
29 1.1 alnsn #include <sys/cdefs.h>
30 1.1 alnsn __RCSID("$NetBSD: t_mbuf.c,v 1.1 2014/07/07 19:40:28 alnsn Exp $");
31 1.1 alnsn
32 1.1 alnsn #include <sys/param.h>
33 1.1 alnsn #include <sys/mbuf.h>
34 1.1 alnsn #include <unistd.h>
35 1.1 alnsn
36 1.1 alnsn #include <net/bpf.h>
37 1.1 alnsn
38 1.1 alnsn #include <stdint.h>
39 1.1 alnsn #include <stdio.h>
40 1.1 alnsn #include <string.h>
41 1.1 alnsn
42 1.1 alnsn #include <rump/rump.h>
43 1.1 alnsn #include <rump/rump_syscalls.h>
44 1.1 alnsn
45 1.1 alnsn #include "../../net/bpf/h_bpf.h"
46 1.1 alnsn
47 1.1 alnsn /* XXX: atf-c.h has collisions with mbuf */
48 1.1 alnsn #undef m_type
49 1.1 alnsn #undef m_data
50 1.1 alnsn #include <atf-c.h>
51 1.1 alnsn
52 1.1 alnsn #include "../../h_macros.h"
53 1.1 alnsn
54 1.1 alnsn static bool
55 1.1 alnsn test_ldb_abs(size_t split)
56 1.1 alnsn {
57 1.1 alnsn /* Return a product of all packet bytes. */
58 1.1 alnsn static struct bpf_insn insns[] = {
59 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
60 1.1 alnsn
61 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 0), /* A <- P[0] */
62 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
63 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
64 1.1 alnsn
65 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 1), /* A <- P[1] */
66 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
67 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
68 1.1 alnsn
69 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 2), /* A <- P[2] */
70 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
71 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
72 1.1 alnsn
73 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* A <- P[3] */
74 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
75 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
76 1.1 alnsn
77 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4), /* A <- P[4] */
78 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
79 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
80 1.1 alnsn };
81 1.1 alnsn
82 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
83 1.1 alnsn const unsigned int res = 120;
84 1.1 alnsn
85 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
86 1.1 alnsn return false;
87 1.1 alnsn
88 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
89 1.1 alnsn }
90 1.1 alnsn
91 1.1 alnsn static bool
92 1.1 alnsn test_ldh_abs(size_t split)
93 1.1 alnsn {
94 1.1 alnsn static struct bpf_insn insns[] = {
95 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 0), /* A <- P[0:2] */
96 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
97 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
98 1.1 alnsn
99 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 1), /* A <- P[1:2] */
100 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
101 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
102 1.1 alnsn
103 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 2), /* A <- P[2:2] */
104 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
105 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
106 1.1 alnsn
107 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 3), /* A <- P[3:2] */
108 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
109 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
110 1.1 alnsn };
111 1.1 alnsn
112 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
113 1.1 alnsn const unsigned int res = 0x0a0e; /* 10 14 */
114 1.1 alnsn
115 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
116 1.1 alnsn return false;
117 1.1 alnsn
118 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
119 1.1 alnsn }
120 1.1 alnsn
121 1.1 alnsn static bool
122 1.1 alnsn test_ldw_abs(size_t split)
123 1.1 alnsn {
124 1.1 alnsn static struct bpf_insn insns[] = {
125 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), /* A <- P[0:4] */
126 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
127 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
128 1.1 alnsn
129 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), /* A <- P[1:4] */
130 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
131 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
132 1.1 alnsn };
133 1.1 alnsn
134 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
135 1.1 alnsn const unsigned int res = 0x03050709;
136 1.1 alnsn
137 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
138 1.1 alnsn return false;
139 1.1 alnsn
140 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
141 1.1 alnsn }
142 1.1 alnsn
143 1.1 alnsn static bool
144 1.1 alnsn test_ldb_ind(size_t split)
145 1.1 alnsn {
146 1.1 alnsn /* Return a sum of all packet bytes. */
147 1.1 alnsn static struct bpf_insn insns[] = {
148 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0), /* A <- P[0+X] */
149 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
150 1.1 alnsn
151 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1), /* A <- P[1+X] */
152 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
153 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
154 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
155 1.1 alnsn
156 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
157 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1), /* A <- P[1+X] */
158 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
159 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
160 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
161 1.1 alnsn
162 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
163 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2), /* A <- P[2+X] */
164 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
165 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
166 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
167 1.1 alnsn
168 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
169 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 3), /* A <- P[3+X] */
170 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
171 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
172 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
173 1.1 alnsn };
174 1.1 alnsn
175 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
176 1.1 alnsn const unsigned int res = 15;
177 1.1 alnsn
178 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
179 1.1 alnsn return false;
180 1.1 alnsn
181 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
182 1.1 alnsn }
183 1.1 alnsn
184 1.1 alnsn static bool
185 1.1 alnsn test_ldw_ind(size_t split)
186 1.1 alnsn {
187 1.1 alnsn static struct bpf_insn insns[] = {
188 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0), /* A <- P[X+0:4] */
189 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
190 1.1 alnsn
191 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
192 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0), /* A <- P[X+0:4] */
193 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
194 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
195 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
196 1.1 alnsn
197 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0), /* X <- 0 */
198 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1), /* A <- P[X+1:4] */
199 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
200 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
201 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
202 1.1 alnsn };
203 1.1 alnsn
204 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
205 1.1 alnsn const unsigned int res = 0x05080b0e;
206 1.1 alnsn
207 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
208 1.1 alnsn return false;
209 1.1 alnsn
210 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
211 1.1 alnsn }
212 1.1 alnsn
213 1.1 alnsn static bool
214 1.1 alnsn test_ldh_ind(size_t split)
215 1.1 alnsn {
216 1.1 alnsn static struct bpf_insn insns[] = {
217 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0), /* A <- P[X+0:2] */
218 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
219 1.1 alnsn
220 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1), /* A <- P[X+1:2] */
221 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
222 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
223 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
224 1.1 alnsn
225 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
226 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1), /* A <- P[X+1:2] */
227 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
228 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
229 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
230 1.1 alnsn
231 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
232 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2), /* A <- P[X+2:2] */
233 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
234 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
235 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
236 1.1 alnsn };
237 1.1 alnsn
238 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
239 1.1 alnsn const unsigned int res = 0x0a0e; /* 10 14 */
240 1.1 alnsn
241 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
242 1.1 alnsn return false;
243 1.1 alnsn
244 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
245 1.1 alnsn }
246 1.1 alnsn
247 1.1 alnsn static bool
248 1.1 alnsn test_msh(size_t split)
249 1.1 alnsn {
250 1.1 alnsn /* Return a product of all packet bytes. */
251 1.1 alnsn static struct bpf_insn insns[] = {
252 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, 1), /* A <- 1 */
253 1.1 alnsn
254 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 0), /* X <- 4*(P[0]&0xf) */
255 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
256 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
257 1.1 alnsn
258 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1), /* X <- 4*(P[1]&0xf) */
259 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
260 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
261 1.1 alnsn
262 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 2), /* X <- 4*(P[2]&0xf) */
263 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
264 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
265 1.1 alnsn
266 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 3), /* X <- 4*(P[3]&0xf) */
267 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
268 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
269 1.1 alnsn
270 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 4), /* X <- 4*(P[4]&0xf) */
271 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
272 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
273 1.1 alnsn
274 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
275 1.1 alnsn };
276 1.1 alnsn
277 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
278 1.1 alnsn const unsigned int res = 120;
279 1.1 alnsn
280 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
281 1.1 alnsn return false;
282 1.1 alnsn
283 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
284 1.1 alnsn }
285 1.1 alnsn
286 1.1 alnsn static bool
287 1.1 alnsn test_ldb_abs_overflow(size_t split)
288 1.1 alnsn {
289 1.1 alnsn static struct bpf_insn insns[] = {
290 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
291 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
292 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
293 1.1 alnsn };
294 1.1 alnsn
295 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
296 1.1 alnsn
297 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
298 1.1 alnsn return false;
299 1.1 alnsn
300 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
301 1.1 alnsn }
302 1.1 alnsn
303 1.1 alnsn static bool
304 1.1 alnsn test_ldh_abs_overflow(size_t split)
305 1.1 alnsn {
306 1.1 alnsn static struct bpf_insn insns[] = {
307 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4),
308 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
309 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
310 1.1 alnsn };
311 1.1 alnsn
312 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
313 1.1 alnsn
314 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
315 1.1 alnsn return false;
316 1.1 alnsn
317 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
318 1.1 alnsn }
319 1.1 alnsn
320 1.1 alnsn static bool
321 1.1 alnsn test_ldw_abs_overflow(size_t split)
322 1.1 alnsn {
323 1.1 alnsn static struct bpf_insn insns[] = {
324 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2),
325 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
326 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
327 1.1 alnsn };
328 1.1 alnsn
329 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
330 1.1 alnsn
331 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
332 1.1 alnsn return false;
333 1.1 alnsn
334 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
335 1.1 alnsn }
336 1.1 alnsn
337 1.1 alnsn static bool
338 1.1 alnsn test_ldb_ind_overflow1(size_t split)
339 1.1 alnsn {
340 1.1 alnsn static struct bpf_insn insns[] = {
341 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 5),
342 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
343 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
344 1.1 alnsn };
345 1.1 alnsn
346 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
347 1.1 alnsn
348 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
349 1.1 alnsn return false;
350 1.1 alnsn
351 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
352 1.1 alnsn }
353 1.1 alnsn
354 1.1 alnsn static bool
355 1.1 alnsn test_ldb_ind_overflow2(size_t split)
356 1.1 alnsn {
357 1.1 alnsn static struct bpf_insn insns[] = {
358 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
359 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1),
360 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
361 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
362 1.1 alnsn };
363 1.1 alnsn
364 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
365 1.1 alnsn
366 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
367 1.1 alnsn return false;
368 1.1 alnsn
369 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
370 1.1 alnsn }
371 1.1 alnsn
372 1.1 alnsn static bool
373 1.1 alnsn test_ldb_ind_overflow3(size_t split)
374 1.1 alnsn {
375 1.1 alnsn static struct bpf_insn insns[] = {
376 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
377 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1),
378 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
379 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
380 1.1 alnsn };
381 1.1 alnsn
382 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
383 1.1 alnsn
384 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
385 1.1 alnsn return false;
386 1.1 alnsn
387 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
388 1.1 alnsn }
389 1.1 alnsn
390 1.1 alnsn static bool
391 1.1 alnsn test_ldh_ind_overflow1(size_t split)
392 1.1 alnsn {
393 1.1 alnsn static struct bpf_insn insns[] = {
394 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 4),
395 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
396 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
397 1.1 alnsn };
398 1.1 alnsn
399 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
400 1.1 alnsn
401 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
402 1.1 alnsn return false;
403 1.1 alnsn
404 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
405 1.1 alnsn }
406 1.1 alnsn
407 1.1 alnsn static bool
408 1.1 alnsn test_ldh_ind_overflow2(size_t split)
409 1.1 alnsn {
410 1.1 alnsn static struct bpf_insn insns[] = {
411 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
412 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1),
413 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
414 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
415 1.1 alnsn };
416 1.1 alnsn
417 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
418 1.1 alnsn
419 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
420 1.1 alnsn return false;
421 1.1 alnsn
422 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
423 1.1 alnsn }
424 1.1 alnsn
425 1.1 alnsn static bool
426 1.1 alnsn test_ldh_ind_overflow3(size_t split)
427 1.1 alnsn {
428 1.1 alnsn static struct bpf_insn insns[] = {
429 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
430 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1),
431 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
432 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
433 1.1 alnsn };
434 1.1 alnsn
435 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
436 1.1 alnsn
437 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
438 1.1 alnsn return false;
439 1.1 alnsn
440 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
441 1.1 alnsn }
442 1.1 alnsn
443 1.1 alnsn static bool
444 1.1 alnsn test_ldw_ind_overflow1(size_t split)
445 1.1 alnsn {
446 1.1 alnsn static struct bpf_insn insns[] = {
447 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
448 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
449 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
450 1.1 alnsn };
451 1.1 alnsn
452 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
453 1.1 alnsn
454 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
455 1.1 alnsn return false;
456 1.1 alnsn
457 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
458 1.1 alnsn }
459 1.1 alnsn
460 1.1 alnsn static bool
461 1.1 alnsn test_ldw_ind_overflow2(size_t split)
462 1.1 alnsn {
463 1.1 alnsn static struct bpf_insn insns[] = {
464 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
465 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1),
466 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
467 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
468 1.1 alnsn };
469 1.1 alnsn
470 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
471 1.1 alnsn
472 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
473 1.1 alnsn return false;
474 1.1 alnsn
475 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
476 1.1 alnsn }
477 1.1 alnsn
478 1.1 alnsn static bool
479 1.1 alnsn test_ldw_ind_overflow3(size_t split)
480 1.1 alnsn {
481 1.1 alnsn static struct bpf_insn insns[] = {
482 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
483 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1),
484 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
485 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
486 1.1 alnsn };
487 1.1 alnsn
488 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
489 1.1 alnsn
490 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
491 1.1 alnsn return false;
492 1.1 alnsn
493 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
494 1.1 alnsn }
495 1.1 alnsn
496 1.1 alnsn static bool
497 1.1 alnsn test_msh_overflow(size_t split)
498 1.1 alnsn {
499 1.1 alnsn static struct bpf_insn insns[] = {
500 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 5),
501 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
502 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
503 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
504 1.1 alnsn };
505 1.1 alnsn
506 1.1 alnsn static char P[] = { 1, 2, 3, 4, 5 };
507 1.1 alnsn
508 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
509 1.1 alnsn return false;
510 1.1 alnsn
511 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
512 1.1 alnsn }
513 1.1 alnsn
514 1.1 alnsn ATF_TC(bpf_mbuf_ldb_abs);
515 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_abs, tc)
516 1.1 alnsn {
517 1.1 alnsn
518 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_ABS "
519 1.1 alnsn "loads bytes from mbuf correctly");
520 1.1 alnsn }
521 1.1 alnsn
522 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_abs, tc)
523 1.1 alnsn {
524 1.1 alnsn
525 1.1 alnsn RZ(rump_init());
526 1.1 alnsn
527 1.1 alnsn ATF_CHECK(test_ldb_abs(0));
528 1.1 alnsn ATF_CHECK(test_ldb_abs(1));
529 1.1 alnsn ATF_CHECK(test_ldb_abs(2));
530 1.1 alnsn ATF_CHECK(test_ldb_abs(3));
531 1.1 alnsn ATF_CHECK(test_ldb_abs(4));
532 1.1 alnsn ATF_CHECK(test_ldb_abs(5));
533 1.1 alnsn }
534 1.1 alnsn
535 1.1 alnsn ATF_TC(bpf_mbuf_ldh_abs);
536 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_abs, tc)
537 1.1 alnsn {
538 1.1 alnsn
539 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_ABS "
540 1.1 alnsn "loads halfwords from mbuf correctly");
541 1.1 alnsn }
542 1.1 alnsn
543 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_abs, tc)
544 1.1 alnsn {
545 1.1 alnsn
546 1.1 alnsn RZ(rump_init());
547 1.1 alnsn
548 1.1 alnsn ATF_CHECK(test_ldh_abs(0));
549 1.1 alnsn ATF_CHECK(test_ldh_abs(1));
550 1.1 alnsn ATF_CHECK(test_ldh_abs(2));
551 1.1 alnsn ATF_CHECK(test_ldh_abs(3));
552 1.1 alnsn ATF_CHECK(test_ldh_abs(4));
553 1.1 alnsn ATF_CHECK(test_ldh_abs(5));
554 1.1 alnsn }
555 1.1 alnsn
556 1.1 alnsn ATF_TC(bpf_mbuf_ldw_abs);
557 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_abs, tc)
558 1.1 alnsn {
559 1.1 alnsn
560 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_ABS "
561 1.1 alnsn "loads words from mbuf correctly");
562 1.1 alnsn }
563 1.1 alnsn
564 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_abs, tc)
565 1.1 alnsn {
566 1.1 alnsn
567 1.1 alnsn RZ(rump_init());
568 1.1 alnsn
569 1.1 alnsn ATF_CHECK(test_ldw_abs(0));
570 1.1 alnsn ATF_CHECK(test_ldw_abs(1));
571 1.1 alnsn ATF_CHECK(test_ldw_abs(2));
572 1.1 alnsn ATF_CHECK(test_ldw_abs(3));
573 1.1 alnsn ATF_CHECK(test_ldw_abs(4));
574 1.1 alnsn ATF_CHECK(test_ldw_abs(5));
575 1.1 alnsn }
576 1.1 alnsn
577 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind);
578 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind, tc)
579 1.1 alnsn {
580 1.1 alnsn
581 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
582 1.1 alnsn "loads bytes from mbuf correctly");
583 1.1 alnsn }
584 1.1 alnsn
585 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_ind, tc)
586 1.1 alnsn {
587 1.1 alnsn
588 1.1 alnsn RZ(rump_init());
589 1.1 alnsn
590 1.1 alnsn ATF_CHECK(test_ldb_ind(0));
591 1.1 alnsn ATF_CHECK(test_ldb_ind(1));
592 1.1 alnsn ATF_CHECK(test_ldb_ind(2));
593 1.1 alnsn ATF_CHECK(test_ldb_ind(3));
594 1.1 alnsn ATF_CHECK(test_ldb_ind(4));
595 1.1 alnsn ATF_CHECK(test_ldb_ind(5));
596 1.1 alnsn }
597 1.1 alnsn
598 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind);
599 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind, tc)
600 1.1 alnsn {
601 1.1 alnsn
602 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
603 1.1 alnsn "loads halfwords from mbuf correctly");
604 1.1 alnsn }
605 1.1 alnsn
606 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_ind, tc)
607 1.1 alnsn {
608 1.1 alnsn
609 1.1 alnsn RZ(rump_init());
610 1.1 alnsn
611 1.1 alnsn ATF_CHECK(test_ldh_ind(0));
612 1.1 alnsn ATF_CHECK(test_ldh_ind(1));
613 1.1 alnsn ATF_CHECK(test_ldh_ind(2));
614 1.1 alnsn ATF_CHECK(test_ldh_ind(3));
615 1.1 alnsn ATF_CHECK(test_ldh_ind(4));
616 1.1 alnsn ATF_CHECK(test_ldh_ind(5));
617 1.1 alnsn }
618 1.1 alnsn
619 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind);
620 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind, tc)
621 1.1 alnsn {
622 1.1 alnsn
623 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
624 1.1 alnsn "loads words from mbuf correctly");
625 1.1 alnsn }
626 1.1 alnsn
627 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_ind, tc)
628 1.1 alnsn {
629 1.1 alnsn
630 1.1 alnsn RZ(rump_init());
631 1.1 alnsn
632 1.1 alnsn ATF_CHECK(test_ldw_ind(0));
633 1.1 alnsn ATF_CHECK(test_ldw_ind(1));
634 1.1 alnsn ATF_CHECK(test_ldw_ind(2));
635 1.1 alnsn ATF_CHECK(test_ldw_ind(3));
636 1.1 alnsn ATF_CHECK(test_ldw_ind(4));
637 1.1 alnsn ATF_CHECK(test_ldw_ind(5));
638 1.1 alnsn }
639 1.1 alnsn
640 1.1 alnsn ATF_TC(bpf_mbuf_msh);
641 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_msh, tc)
642 1.1 alnsn {
643 1.1 alnsn
644 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LDX+BPF_B+BPF_MSH "
645 1.1 alnsn "loads bytes from mbuf correctly");
646 1.1 alnsn }
647 1.1 alnsn
648 1.1 alnsn ATF_TC_BODY(bpf_mbuf_msh, tc)
649 1.1 alnsn {
650 1.1 alnsn
651 1.1 alnsn RZ(rump_init());
652 1.1 alnsn
653 1.1 alnsn ATF_CHECK(test_msh(0));
654 1.1 alnsn ATF_CHECK(test_msh(1));
655 1.1 alnsn ATF_CHECK(test_msh(2));
656 1.1 alnsn ATF_CHECK(test_msh(3));
657 1.1 alnsn ATF_CHECK(test_msh(4));
658 1.1 alnsn ATF_CHECK(test_msh(5));
659 1.1 alnsn }
660 1.1 alnsn
661 1.1 alnsn ATF_TC(bpf_mbuf_ldb_abs_overflow);
662 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_abs_overflow, tc)
663 1.1 alnsn {
664 1.1 alnsn
665 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_ABS "
666 1.1 alnsn "with out-of-bounds index aborts a filter program");
667 1.1 alnsn }
668 1.1 alnsn
669 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_abs_overflow, tc)
670 1.1 alnsn {
671 1.1 alnsn
672 1.1 alnsn RZ(rump_init());
673 1.1 alnsn
674 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(0));
675 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(1));
676 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(2));
677 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(3));
678 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(4));
679 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(5));
680 1.1 alnsn }
681 1.1 alnsn
682 1.1 alnsn ATF_TC(bpf_mbuf_ldh_abs_overflow);
683 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_abs_overflow, tc)
684 1.1 alnsn {
685 1.1 alnsn
686 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_ABS "
687 1.1 alnsn "with out-of-bounds index aborts a filter program");
688 1.1 alnsn }
689 1.1 alnsn
690 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_abs_overflow, tc)
691 1.1 alnsn {
692 1.1 alnsn
693 1.1 alnsn RZ(rump_init());
694 1.1 alnsn
695 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(0));
696 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(1));
697 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(2));
698 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(3));
699 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(4));
700 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(5));
701 1.1 alnsn }
702 1.1 alnsn
703 1.1 alnsn ATF_TC(bpf_mbuf_ldw_abs_overflow);
704 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_abs_overflow, tc)
705 1.1 alnsn {
706 1.1 alnsn
707 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_ABS "
708 1.1 alnsn "with out-of-bounds index aborts a filter program");
709 1.1 alnsn }
710 1.1 alnsn
711 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_abs_overflow, tc)
712 1.1 alnsn {
713 1.1 alnsn
714 1.1 alnsn RZ(rump_init());
715 1.1 alnsn
716 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(0));
717 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(1));
718 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(2));
719 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(3));
720 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(4));
721 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(5));
722 1.1 alnsn }
723 1.1 alnsn
724 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind_overflow1);
725 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind_overflow1, tc)
726 1.1 alnsn {
727 1.1 alnsn
728 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
729 1.1 alnsn "with out-of-bounds index aborts a filter program");
730 1.1 alnsn }
731 1.1 alnsn
732 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_ind_overflow1, tc)
733 1.1 alnsn {
734 1.1 alnsn
735 1.1 alnsn RZ(rump_init());
736 1.1 alnsn
737 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(0));
738 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(1));
739 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(2));
740 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(3));
741 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(4));
742 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(5));
743 1.1 alnsn }
744 1.1 alnsn
745 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind_overflow2);
746 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind_overflow2, tc)
747 1.1 alnsn {
748 1.1 alnsn
749 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
750 1.1 alnsn "with out-of-bounds index aborts a filter program");
751 1.1 alnsn }
752 1.1 alnsn
753 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_ind_overflow2, tc)
754 1.1 alnsn {
755 1.1 alnsn
756 1.1 alnsn RZ(rump_init());
757 1.1 alnsn
758 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(0));
759 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(1));
760 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(2));
761 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(3));
762 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(4));
763 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(5));
764 1.1 alnsn }
765 1.1 alnsn
766 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind_overflow3);
767 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind_overflow3, tc)
768 1.1 alnsn {
769 1.1 alnsn
770 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
771 1.1 alnsn "with out-of-bounds index aborts a filter program");
772 1.1 alnsn }
773 1.1 alnsn
774 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_ind_overflow3, tc)
775 1.1 alnsn {
776 1.1 alnsn
777 1.1 alnsn RZ(rump_init());
778 1.1 alnsn
779 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(0));
780 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(1));
781 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(2));
782 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(3));
783 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(4));
784 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(5));
785 1.1 alnsn }
786 1.1 alnsn
787 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind_overflow1);
788 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind_overflow1, tc)
789 1.1 alnsn {
790 1.1 alnsn
791 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
792 1.1 alnsn "with out-of-bounds index aborts a filter program");
793 1.1 alnsn }
794 1.1 alnsn
795 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_ind_overflow1, tc)
796 1.1 alnsn {
797 1.1 alnsn
798 1.1 alnsn RZ(rump_init());
799 1.1 alnsn
800 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(0));
801 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(1));
802 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(2));
803 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(3));
804 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(4));
805 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(5));
806 1.1 alnsn }
807 1.1 alnsn
808 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind_overflow2);
809 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind_overflow2, tc)
810 1.1 alnsn {
811 1.1 alnsn
812 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
813 1.1 alnsn "with out-of-bounds index aborts a filter program");
814 1.1 alnsn }
815 1.1 alnsn
816 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_ind_overflow2, tc)
817 1.1 alnsn {
818 1.1 alnsn
819 1.1 alnsn RZ(rump_init());
820 1.1 alnsn
821 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(0));
822 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(1));
823 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(2));
824 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(3));
825 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(4));
826 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(5));
827 1.1 alnsn }
828 1.1 alnsn
829 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind_overflow3);
830 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind_overflow3, tc)
831 1.1 alnsn {
832 1.1 alnsn
833 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
834 1.1 alnsn "with out-of-bounds index aborts a filter program");
835 1.1 alnsn }
836 1.1 alnsn
837 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_ind_overflow3, tc)
838 1.1 alnsn {
839 1.1 alnsn
840 1.1 alnsn RZ(rump_init());
841 1.1 alnsn
842 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(0));
843 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(1));
844 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(2));
845 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(3));
846 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(4));
847 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(5));
848 1.1 alnsn }
849 1.1 alnsn
850 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind_overflow1);
851 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind_overflow1, tc)
852 1.1 alnsn {
853 1.1 alnsn
854 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
855 1.1 alnsn "with out-of-bounds index aborts a filter program");
856 1.1 alnsn }
857 1.1 alnsn
858 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_ind_overflow1, tc)
859 1.1 alnsn {
860 1.1 alnsn
861 1.1 alnsn RZ(rump_init());
862 1.1 alnsn
863 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(0));
864 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(1));
865 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(2));
866 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(3));
867 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(4));
868 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(5));
869 1.1 alnsn }
870 1.1 alnsn
871 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind_overflow2);
872 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind_overflow2, tc)
873 1.1 alnsn {
874 1.1 alnsn
875 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
876 1.1 alnsn "with out-of-bounds index aborts a filter program");
877 1.1 alnsn }
878 1.1 alnsn
879 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_ind_overflow2, tc)
880 1.1 alnsn {
881 1.1 alnsn
882 1.1 alnsn RZ(rump_init());
883 1.1 alnsn
884 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(0));
885 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(1));
886 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(2));
887 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(3));
888 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(4));
889 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(5));
890 1.1 alnsn }
891 1.1 alnsn
892 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind_overflow3);
893 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind_overflow3, tc)
894 1.1 alnsn {
895 1.1 alnsn
896 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
897 1.1 alnsn "with out-of-bounds index aborts a filter program");
898 1.1 alnsn }
899 1.1 alnsn
900 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_ind_overflow3, tc)
901 1.1 alnsn {
902 1.1 alnsn
903 1.1 alnsn RZ(rump_init());
904 1.1 alnsn
905 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(0));
906 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(1));
907 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(2));
908 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(3));
909 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(4));
910 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(5));
911 1.1 alnsn }
912 1.1 alnsn
913 1.1 alnsn ATF_TC(bpf_mbuf_msh_overflow);
914 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_msh_overflow, tc)
915 1.1 alnsn {
916 1.1 alnsn
917 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LDX+BPF_B+BPF_MSH "
918 1.1 alnsn "with out-of-bounds index aborts a filter program");
919 1.1 alnsn }
920 1.1 alnsn
921 1.1 alnsn ATF_TC_BODY(bpf_mbuf_msh_overflow, tc)
922 1.1 alnsn {
923 1.1 alnsn
924 1.1 alnsn RZ(rump_init());
925 1.1 alnsn
926 1.1 alnsn ATF_CHECK(test_msh_overflow(0));
927 1.1 alnsn ATF_CHECK(test_msh_overflow(1));
928 1.1 alnsn ATF_CHECK(test_msh_overflow(2));
929 1.1 alnsn ATF_CHECK(test_msh_overflow(3));
930 1.1 alnsn ATF_CHECK(test_msh_overflow(4));
931 1.1 alnsn ATF_CHECK(test_msh_overflow(5));
932 1.1 alnsn }
933 1.1 alnsn
934 1.1 alnsn ATF_TP_ADD_TCS(tp)
935 1.1 alnsn {
936 1.1 alnsn
937 1.1 alnsn /*
938 1.1 alnsn * For every new test please also add a similar test
939 1.1 alnsn * to ../../net/bpfjit/t_mbuf.c
940 1.1 alnsn */
941 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_abs);
942 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_abs);
943 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_abs);
944 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind);
945 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind);
946 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind);
947 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_msh);
948 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_abs_overflow);
949 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_abs_overflow);
950 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_abs_overflow);
951 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind_overflow1);
952 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind_overflow2);
953 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind_overflow3);
954 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind_overflow1);
955 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind_overflow2);
956 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind_overflow3);
957 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind_overflow1);
958 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind_overflow2);
959 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind_overflow3);
960 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_msh_overflow);
961 1.1 alnsn
962 1.1 alnsn return atf_no_error();
963 1.1 alnsn }
964