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