1 /* $NetBSD: t_bpfjit.c,v 1.6 2014/07/08 21:07:52 alnsn Exp $ */
4 * Copyright (c) 2011-2012, 2014 Alexander Nasonov.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
33 __RCSID("$NetBSD: t_bpfjit.c,v 1.6 2014/07/08 21:07:52 alnsn Exp $");
40 #include <net/bpfjit.h>
42 static uint8_t deadbeef_at_5[16] = {
43 0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
47 unsigned int jitcall(bpfjit_func_t fn,
48 const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
53 args.wirelen = wirelen;
56 return fn(NULL, &args);
59 ATF_TC(libbpfjit_empty);
60 ATF_TC_HEAD(libbpfjit_empty, tc)
62 atf_tc_set_md_var(tc, "descr",
63 "Test that JIT compilation of an empty bpf program fails");
66 ATF_TC_BODY(libbpfjit_empty, tc)
68 struct bpf_insn dummy;
70 ATF_CHECK(bpfjit_generate_code(NULL, &dummy, 0) == NULL);
73 ATF_TC(libbpfjit_alu_add_k);
74 ATF_TC_HEAD(libbpfjit_alu_add_k, tc)
76 atf_tc_set_md_var(tc, "descr",
77 "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
80 ATF_TC_BODY(libbpfjit_alu_add_k, tc)
82 static struct bpf_insn insns[] = {
83 BPF_STMT(BPF_LD+BPF_IMM, 3),
84 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
85 BPF_STMT(BPF_RET+BPF_A, 0)
89 uint8_t pkt[1]; /* the program doesn't read any data */
91 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
93 ATF_CHECK(bpf_validate(insns, insn_count));
95 code = bpfjit_generate_code(NULL, insns, insn_count);
96 ATF_REQUIRE(code != NULL);
98 ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
100 bpfjit_free_code(code);
103 ATF_TC(libbpfjit_alu_sub_k);
104 ATF_TC_HEAD(libbpfjit_alu_sub_k, tc)
106 atf_tc_set_md_var(tc, "descr",
107 "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
110 ATF_TC_BODY(libbpfjit_alu_sub_k, tc)
112 static struct bpf_insn insns[] = {
113 BPF_STMT(BPF_LD+BPF_IMM, 1),
114 BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
115 BPF_STMT(BPF_RET+BPF_A, 0)
119 uint8_t pkt[1]; /* the program doesn't read any data */
121 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
123 ATF_CHECK(bpf_validate(insns, insn_count));
125 code = bpfjit_generate_code(NULL, insns, insn_count);
126 ATF_REQUIRE(code != NULL);
128 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
130 bpfjit_free_code(code);
133 ATF_TC(libbpfjit_alu_mul_k);
134 ATF_TC_HEAD(libbpfjit_alu_mul_k, tc)
136 atf_tc_set_md_var(tc, "descr",
137 "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
140 ATF_TC_BODY(libbpfjit_alu_mul_k, tc)
142 static struct bpf_insn insns[] = {
143 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
144 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
145 BPF_STMT(BPF_RET+BPF_A, 0)
149 uint8_t pkt[1]; /* the program doesn't read any data */
151 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
153 ATF_CHECK(bpf_validate(insns, insn_count));
155 code = bpfjit_generate_code(NULL, insns, insn_count);
156 ATF_REQUIRE(code != NULL);
158 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
160 bpfjit_free_code(code);
163 ATF_TC(libbpfjit_alu_div0_k);
164 ATF_TC_HEAD(libbpfjit_alu_div0_k, tc)
166 atf_tc_set_md_var(tc, "descr",
167 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
170 ATF_TC_BODY(libbpfjit_alu_div0_k, tc)
172 static struct bpf_insn insns[] = {
173 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
174 BPF_STMT(BPF_RET+BPF_A, 0)
178 uint8_t pkt[1]; /* the program doesn't read any data */
180 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
182 //ATF_CHECK(bpf_validate(insns, insn_count));
184 code = bpfjit_generate_code(NULL, insns, insn_count);
185 ATF_REQUIRE(code != NULL);
187 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
189 bpfjit_free_code(code);
192 ATF_TC(libbpfjit_alu_div1_k);
193 ATF_TC_HEAD(libbpfjit_alu_div1_k, tc)
195 atf_tc_set_md_var(tc, "descr",
196 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
199 ATF_TC_BODY(libbpfjit_alu_div1_k, tc)
201 static struct bpf_insn insns[] = {
202 BPF_STMT(BPF_LD+BPF_IMM, 7),
203 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
204 BPF_STMT(BPF_RET+BPF_A, 0)
208 uint8_t pkt[1]; /* the program doesn't read any data */
210 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
212 ATF_CHECK(bpf_validate(insns, insn_count));
214 code = bpfjit_generate_code(NULL, insns, insn_count);
215 ATF_REQUIRE(code != NULL);
217 ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
219 bpfjit_free_code(code);
222 ATF_TC(libbpfjit_alu_div2_k);
223 ATF_TC_HEAD(libbpfjit_alu_div2_k, tc)
225 atf_tc_set_md_var(tc, "descr",
226 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
229 ATF_TC_BODY(libbpfjit_alu_div2_k, tc)
231 static struct bpf_insn insns[] = {
232 BPF_STMT(BPF_LD+BPF_IMM, 7),
233 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
234 BPF_STMT(BPF_RET+BPF_A, 0)
238 uint8_t pkt[1]; /* the program doesn't read any data */
240 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
242 ATF_CHECK(bpf_validate(insns, insn_count));
244 code = bpfjit_generate_code(NULL, insns, insn_count);
245 ATF_REQUIRE(code != NULL);
247 ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
249 bpfjit_free_code(code);
252 ATF_TC(libbpfjit_alu_div4_k);
253 ATF_TC_HEAD(libbpfjit_alu_div4_k, tc)
255 atf_tc_set_md_var(tc, "descr",
256 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
259 ATF_TC_BODY(libbpfjit_alu_div4_k, tc)
261 static struct bpf_insn insns[] = {
262 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
263 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
264 BPF_STMT(BPF_RET+BPF_A, 0)
268 uint8_t pkt[1]; /* the program doesn't read any data */
270 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
272 ATF_CHECK(bpf_validate(insns, insn_count));
274 code = bpfjit_generate_code(NULL, insns, insn_count);
275 ATF_REQUIRE(code != NULL);
277 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
279 bpfjit_free_code(code);
282 ATF_TC(libbpfjit_alu_div10_k);
283 ATF_TC_HEAD(libbpfjit_alu_div10_k, tc)
285 atf_tc_set_md_var(tc, "descr",
286 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
289 ATF_TC_BODY(libbpfjit_alu_div10_k, tc)
291 static struct bpf_insn insns[] = {
292 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
293 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
294 BPF_STMT(BPF_RET+BPF_A, 0)
298 uint8_t pkt[1]; /* the program doesn't read any data */
300 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
302 ATF_CHECK(bpf_validate(insns, insn_count));
304 code = bpfjit_generate_code(NULL, insns, insn_count);
305 ATF_REQUIRE(code != NULL);
307 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
309 bpfjit_free_code(code);
312 ATF_TC(libbpfjit_alu_div10000_k);
313 ATF_TC_HEAD(libbpfjit_alu_div10000_k, tc)
315 atf_tc_set_md_var(tc, "descr",
316 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
319 ATF_TC_BODY(libbpfjit_alu_div10000_k, tc)
321 static struct bpf_insn insns[] = {
322 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
323 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
324 BPF_STMT(BPF_RET+BPF_A, 0)
328 uint8_t pkt[1]; /* the program doesn't read any data */
330 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
332 ATF_CHECK(bpf_validate(insns, insn_count));
334 code = bpfjit_generate_code(NULL, insns, insn_count);
335 ATF_REQUIRE(code != NULL);
337 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
339 bpfjit_free_code(code);
342 ATF_TC(libbpfjit_alu_div7609801_k);
343 ATF_TC_HEAD(libbpfjit_alu_div7609801_k, tc)
345 atf_tc_set_md_var(tc, "descr",
346 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
349 ATF_TC_BODY(libbpfjit_alu_div7609801_k, tc)
351 static struct bpf_insn insns[] = {
352 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
353 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
354 BPF_STMT(BPF_RET+BPF_A, 0)
358 uint8_t pkt[1]; /* the program doesn't read any data */
360 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
362 ATF_CHECK(bpf_validate(insns, insn_count));
364 code = bpfjit_generate_code(NULL, insns, insn_count);
365 ATF_REQUIRE(code != NULL);
367 ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
369 bpfjit_free_code(code);
372 ATF_TC(libbpfjit_alu_div80000000_k);
373 ATF_TC_HEAD(libbpfjit_alu_div80000000_k, tc)
375 atf_tc_set_md_var(tc, "descr",
376 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
379 ATF_TC_BODY(libbpfjit_alu_div80000000_k, tc)
381 static struct bpf_insn insns[] = {
382 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
383 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
384 BPF_STMT(BPF_RET+BPF_A, 0)
388 uint8_t pkt[1]; /* the program doesn't read any data */
390 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
392 ATF_CHECK(bpf_validate(insns, insn_count));
394 code = bpfjit_generate_code(NULL, insns, insn_count);
395 ATF_REQUIRE(code != NULL);
397 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
399 bpfjit_free_code(code);
402 ATF_TC(libbpfjit_alu_and_k);
403 ATF_TC_HEAD(libbpfjit_alu_and_k, tc)
405 atf_tc_set_md_var(tc, "descr",
406 "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
409 ATF_TC_BODY(libbpfjit_alu_and_k, tc)
411 static struct bpf_insn insns[] = {
412 BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
413 BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
414 BPF_STMT(BPF_RET+BPF_A, 0)
418 uint8_t pkt[1]; /* the program doesn't read any data */
420 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
422 ATF_CHECK(bpf_validate(insns, insn_count));
424 code = bpfjit_generate_code(NULL, insns, insn_count);
425 ATF_REQUIRE(code != NULL);
427 ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
429 bpfjit_free_code(code);
432 ATF_TC(libbpfjit_alu_or_k);
433 ATF_TC_HEAD(libbpfjit_alu_or_k, tc)
435 atf_tc_set_md_var(tc, "descr",
436 "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
439 ATF_TC_BODY(libbpfjit_alu_or_k, tc)
441 static struct bpf_insn insns[] = {
442 BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
443 BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
444 BPF_STMT(BPF_RET+BPF_A, 0)
448 uint8_t pkt[1]; /* the program doesn't read any data */
450 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
452 ATF_CHECK(bpf_validate(insns, insn_count));
454 code = bpfjit_generate_code(NULL, insns, insn_count);
455 ATF_REQUIRE(code != NULL);
457 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
459 bpfjit_free_code(code);
462 ATF_TC(libbpfjit_alu_lsh_k);
463 ATF_TC_HEAD(libbpfjit_alu_lsh_k, tc)
465 atf_tc_set_md_var(tc, "descr",
466 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
469 ATF_TC_BODY(libbpfjit_alu_lsh_k, tc)
471 static struct bpf_insn insns[] = {
472 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
473 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
474 BPF_STMT(BPF_RET+BPF_A, 0)
478 uint8_t pkt[1]; /* the program doesn't read any data */
480 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
482 ATF_CHECK(bpf_validate(insns, insn_count));
484 code = bpfjit_generate_code(NULL, insns, insn_count);
485 ATF_REQUIRE(code != NULL);
487 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
489 bpfjit_free_code(code);
492 ATF_TC(libbpfjit_alu_lsh0_k);
493 ATF_TC_HEAD(libbpfjit_alu_lsh0_k, tc)
495 atf_tc_set_md_var(tc, "descr",
496 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
499 ATF_TC_BODY(libbpfjit_alu_lsh0_k, tc)
501 static struct bpf_insn insns[] = {
502 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
503 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
504 BPF_STMT(BPF_RET+BPF_A, 0)
508 uint8_t pkt[1]; /* the program doesn't read any data */
510 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
512 ATF_CHECK(bpf_validate(insns, insn_count));
514 code = bpfjit_generate_code(NULL, insns, insn_count);
515 ATF_REQUIRE(code != NULL);
517 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
519 bpfjit_free_code(code);
522 ATF_TC(libbpfjit_alu_rsh_k);
523 ATF_TC_HEAD(libbpfjit_alu_rsh_k, tc)
525 atf_tc_set_md_var(tc, "descr",
526 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
529 ATF_TC_BODY(libbpfjit_alu_rsh_k, tc)
531 static struct bpf_insn insns[] = {
532 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
533 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
534 BPF_STMT(BPF_RET+BPF_A, 0)
538 uint8_t pkt[1]; /* the program doesn't read any data */
540 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
542 ATF_CHECK(bpf_validate(insns, insn_count));
544 code = bpfjit_generate_code(NULL, insns, insn_count);
545 ATF_REQUIRE(code != NULL);
547 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
549 bpfjit_free_code(code);
552 ATF_TC(libbpfjit_alu_rsh0_k);
553 ATF_TC_HEAD(libbpfjit_alu_rsh0_k, tc)
555 atf_tc_set_md_var(tc, "descr",
556 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
559 ATF_TC_BODY(libbpfjit_alu_rsh0_k, tc)
561 static struct bpf_insn insns[] = {
562 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
563 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
564 BPF_STMT(BPF_RET+BPF_A, 0)
568 uint8_t pkt[1]; /* the program doesn't read any data */
570 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
572 ATF_CHECK(bpf_validate(insns, insn_count));
574 code = bpfjit_generate_code(NULL, insns, insn_count);
575 ATF_REQUIRE(code != NULL);
577 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
579 bpfjit_free_code(code);
582 ATF_TC(libbpfjit_alu_modulo_k);
583 ATF_TC_HEAD(libbpfjit_alu_modulo_k, tc)
585 atf_tc_set_md_var(tc, "descr",
586 "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
589 ATF_TC_BODY(libbpfjit_alu_modulo_k, tc)
591 static struct bpf_insn insns[] = {
592 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
594 /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
595 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
597 /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
598 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
600 /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
601 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
603 /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
604 BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
606 /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
607 BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
609 /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
610 BPF_STMT(BPF_ALU+BPF_NEG, 0),
612 /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
613 BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
615 /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
616 /* 00000000,42218C74 >> 3 = 00000000,08443180 */
617 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
619 /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
620 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
622 /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
623 /* 00000000,93818280 / DEAD = 00000000,0000A994 */
624 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
626 BPF_STMT(BPF_RET+BPF_A, 0)
630 uint8_t pkt[1]; /* the program doesn't read any data */
632 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
634 ATF_CHECK(bpf_validate(insns, insn_count));
636 code = bpfjit_generate_code(NULL, insns, insn_count);
637 ATF_REQUIRE(code != NULL);
639 ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
640 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
643 bpfjit_free_code(code);
646 ATF_TC(libbpfjit_alu_add_x);
647 ATF_TC_HEAD(libbpfjit_alu_add_x, tc)
649 atf_tc_set_md_var(tc, "descr",
650 "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
653 ATF_TC_BODY(libbpfjit_alu_add_x, tc)
655 static struct bpf_insn insns[] = {
656 BPF_STMT(BPF_LD+BPF_IMM, 3),
657 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
658 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
659 BPF_STMT(BPF_RET+BPF_A, 0)
663 uint8_t pkt[1]; /* the program doesn't read any data */
665 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
667 ATF_CHECK(bpf_validate(insns, insn_count));
669 code = bpfjit_generate_code(NULL, insns, insn_count);
670 ATF_REQUIRE(code != NULL);
672 ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
674 bpfjit_free_code(code);
677 ATF_TC(libbpfjit_alu_sub_x);
678 ATF_TC_HEAD(libbpfjit_alu_sub_x, tc)
680 atf_tc_set_md_var(tc, "descr",
681 "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
684 ATF_TC_BODY(libbpfjit_alu_sub_x, tc)
686 static struct bpf_insn insns[] = {
687 BPF_STMT(BPF_LD+BPF_IMM, 1),
688 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
689 BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
690 BPF_STMT(BPF_RET+BPF_A, 0)
694 uint8_t pkt[1]; /* the program doesn't read any data */
696 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
698 ATF_CHECK(bpf_validate(insns, insn_count));
700 code = bpfjit_generate_code(NULL, insns, insn_count);
701 ATF_REQUIRE(code != NULL);
703 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
705 bpfjit_free_code(code);
708 ATF_TC(libbpfjit_alu_mul_x);
709 ATF_TC_HEAD(libbpfjit_alu_mul_x, tc)
711 atf_tc_set_md_var(tc, "descr",
712 "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
715 ATF_TC_BODY(libbpfjit_alu_mul_x, tc)
717 static struct bpf_insn insns[] = {
718 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
719 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
720 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
721 BPF_STMT(BPF_RET+BPF_A, 0)
725 uint8_t pkt[1]; /* the program doesn't read any data */
727 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
729 ATF_CHECK(bpf_validate(insns, insn_count));
731 code = bpfjit_generate_code(NULL, insns, insn_count);
732 ATF_REQUIRE(code != NULL);
734 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
736 bpfjit_free_code(code);
739 ATF_TC(libbpfjit_alu_div0_x);
740 ATF_TC_HEAD(libbpfjit_alu_div0_x, tc)
742 atf_tc_set_md_var(tc, "descr",
743 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
746 ATF_TC_BODY(libbpfjit_alu_div0_x, tc)
748 static struct bpf_insn insns[] = {
749 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
750 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
751 BPF_STMT(BPF_RET+BPF_A, 0)
755 uint8_t pkt[1]; /* the program doesn't read any data */
757 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
759 ATF_CHECK(bpf_validate(insns, insn_count));
761 code = bpfjit_generate_code(NULL, insns, insn_count);
762 ATF_REQUIRE(code != NULL);
764 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
766 bpfjit_free_code(code);
769 ATF_TC(libbpfjit_alu_div1_x);
770 ATF_TC_HEAD(libbpfjit_alu_div1_x, tc)
772 atf_tc_set_md_var(tc, "descr",
773 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
776 ATF_TC_BODY(libbpfjit_alu_div1_x, tc)
778 static struct bpf_insn insns[] = {
779 BPF_STMT(BPF_LD+BPF_IMM, 7),
780 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
781 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
782 BPF_STMT(BPF_RET+BPF_A, 0)
786 uint8_t pkt[1]; /* the program doesn't read any data */
788 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
790 ATF_CHECK(bpf_validate(insns, insn_count));
792 code = bpfjit_generate_code(NULL, insns, insn_count);
793 ATF_REQUIRE(code != NULL);
795 ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
797 bpfjit_free_code(code);
800 ATF_TC(libbpfjit_alu_div2_x);
801 ATF_TC_HEAD(libbpfjit_alu_div2_x, tc)
803 atf_tc_set_md_var(tc, "descr",
804 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
807 ATF_TC_BODY(libbpfjit_alu_div2_x, tc)
809 static struct bpf_insn insns[] = {
810 BPF_STMT(BPF_LD+BPF_IMM, 7),
811 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
812 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
813 BPF_STMT(BPF_RET+BPF_A, 0)
817 uint8_t pkt[1]; /* the program doesn't read any data */
819 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
821 ATF_CHECK(bpf_validate(insns, insn_count));
823 code = bpfjit_generate_code(NULL, insns, insn_count);
824 ATF_REQUIRE(code != NULL);
826 ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
828 bpfjit_free_code(code);
831 ATF_TC(libbpfjit_alu_div4_x);
832 ATF_TC_HEAD(libbpfjit_alu_div4_x, tc)
834 atf_tc_set_md_var(tc, "descr",
835 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
838 ATF_TC_BODY(libbpfjit_alu_div4_x, tc)
840 static struct bpf_insn insns[] = {
841 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
842 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
843 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
844 BPF_STMT(BPF_RET+BPF_A, 0)
848 uint8_t pkt[1]; /* the program doesn't read any data */
850 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
852 ATF_CHECK(bpf_validate(insns, insn_count));
854 code = bpfjit_generate_code(NULL, insns, insn_count);
855 ATF_REQUIRE(code != NULL);
857 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
859 bpfjit_free_code(code);
862 ATF_TC(libbpfjit_alu_div10_x);
863 ATF_TC_HEAD(libbpfjit_alu_div10_x, tc)
865 atf_tc_set_md_var(tc, "descr",
866 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
869 ATF_TC_BODY(libbpfjit_alu_div10_x, tc)
871 static struct bpf_insn insns[] = {
872 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
873 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
874 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
875 BPF_STMT(BPF_RET+BPF_A, 0)
879 uint8_t pkt[1]; /* the program doesn't read any data */
881 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
883 ATF_CHECK(bpf_validate(insns, insn_count));
885 code = bpfjit_generate_code(NULL, insns, insn_count);
886 ATF_REQUIRE(code != NULL);
888 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
890 bpfjit_free_code(code);
893 ATF_TC(libbpfjit_alu_div10000_x);
894 ATF_TC_HEAD(libbpfjit_alu_div10000_x, tc)
896 atf_tc_set_md_var(tc, "descr",
897 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
900 ATF_TC_BODY(libbpfjit_alu_div10000_x, tc)
902 static struct bpf_insn insns[] = {
903 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
904 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
905 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
906 BPF_STMT(BPF_RET+BPF_A, 0)
910 uint8_t pkt[1]; /* the program doesn't read any data */
912 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
914 ATF_CHECK(bpf_validate(insns, insn_count));
916 code = bpfjit_generate_code(NULL, insns, insn_count);
917 ATF_REQUIRE(code != NULL);
919 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
921 bpfjit_free_code(code);
924 ATF_TC(libbpfjit_alu_div7609801_x);
925 ATF_TC_HEAD(libbpfjit_alu_div7609801_x, tc)
927 atf_tc_set_md_var(tc, "descr",
928 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
931 ATF_TC_BODY(libbpfjit_alu_div7609801_x, tc)
933 static struct bpf_insn insns[] = {
934 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
935 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
936 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
937 BPF_STMT(BPF_RET+BPF_A, 0)
941 uint8_t pkt[1]; /* the program doesn't read any data */
943 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
945 ATF_CHECK(bpf_validate(insns, insn_count));
947 code = bpfjit_generate_code(NULL, insns, insn_count);
948 ATF_REQUIRE(code != NULL);
950 ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
952 bpfjit_free_code(code);
955 ATF_TC(libbpfjit_alu_div80000000_x);
956 ATF_TC_HEAD(libbpfjit_alu_div80000000_x, tc)
958 atf_tc_set_md_var(tc, "descr",
959 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
962 ATF_TC_BODY(libbpfjit_alu_div80000000_x, tc)
964 static struct bpf_insn insns[] = {
965 BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX - 33),
966 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
967 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
968 BPF_STMT(BPF_RET+BPF_A, 0)
972 uint8_t pkt[1]; /* the program doesn't read any data */
974 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
976 ATF_CHECK(bpf_validate(insns, insn_count));
978 code = bpfjit_generate_code(NULL, insns, insn_count);
979 ATF_REQUIRE(code != NULL);
981 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
983 bpfjit_free_code(code);
986 ATF_TC(libbpfjit_alu_and_x);
987 ATF_TC_HEAD(libbpfjit_alu_and_x, tc)
989 atf_tc_set_md_var(tc, "descr",
990 "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
993 ATF_TC_BODY(libbpfjit_alu_and_x, tc)
995 static struct bpf_insn insns[] = {
996 BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
997 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
998 BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
999 BPF_STMT(BPF_RET+BPF_A, 0)
1003 uint8_t pkt[1]; /* the program doesn't read any data */
1005 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1007 ATF_CHECK(bpf_validate(insns, insn_count));
1009 code = bpfjit_generate_code(NULL, insns, insn_count);
1010 ATF_REQUIRE(code != NULL);
1012 ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
1014 bpfjit_free_code(code);
1017 ATF_TC(libbpfjit_alu_or_x);
1018 ATF_TC_HEAD(libbpfjit_alu_or_x, tc)
1020 atf_tc_set_md_var(tc, "descr",
1021 "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1024 ATF_TC_BODY(libbpfjit_alu_or_x, tc)
1026 static struct bpf_insn insns[] = {
1027 BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1028 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1029 BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1030 BPF_STMT(BPF_RET+BPF_A, 0)
1034 uint8_t pkt[1]; /* the program doesn't read any data */
1036 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1038 ATF_CHECK(bpf_validate(insns, insn_count));
1040 code = bpfjit_generate_code(NULL, insns, insn_count);
1041 ATF_REQUIRE(code != NULL);
1043 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1045 bpfjit_free_code(code);
1048 ATF_TC(libbpfjit_alu_lsh_x);
1049 ATF_TC_HEAD(libbpfjit_alu_lsh_x, tc)
1051 atf_tc_set_md_var(tc, "descr",
1052 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1055 ATF_TC_BODY(libbpfjit_alu_lsh_x, tc)
1057 static struct bpf_insn insns[] = {
1058 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1059 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1060 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1061 BPF_STMT(BPF_RET+BPF_A, 0)
1065 uint8_t pkt[1]; /* the program doesn't read any data */
1067 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1069 ATF_CHECK(bpf_validate(insns, insn_count));
1071 code = bpfjit_generate_code(NULL, insns, insn_count);
1072 ATF_REQUIRE(code != NULL);
1074 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
1076 bpfjit_free_code(code);
1079 ATF_TC(libbpfjit_alu_lsh0_x);
1080 ATF_TC_HEAD(libbpfjit_alu_lsh0_x, tc)
1082 atf_tc_set_md_var(tc, "descr",
1083 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1086 ATF_TC_BODY(libbpfjit_alu_lsh0_x, tc)
1088 static struct bpf_insn insns[] = {
1089 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1090 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1091 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1092 BPF_STMT(BPF_RET+BPF_A, 0)
1096 uint8_t pkt[1]; /* the program doesn't read any data */
1098 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1100 ATF_CHECK(bpf_validate(insns, insn_count));
1102 code = bpfjit_generate_code(NULL, insns, insn_count);
1103 ATF_REQUIRE(code != NULL);
1105 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1107 bpfjit_free_code(code);
1110 ATF_TC(libbpfjit_alu_rsh_x);
1111 ATF_TC_HEAD(libbpfjit_alu_rsh_x, tc)
1113 atf_tc_set_md_var(tc, "descr",
1114 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1117 ATF_TC_BODY(libbpfjit_alu_rsh_x, tc)
1119 static struct bpf_insn insns[] = {
1120 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1121 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1122 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1123 BPF_STMT(BPF_RET+BPF_A, 0)
1127 uint8_t pkt[1]; /* the program doesn't read any data */
1129 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1131 ATF_CHECK(bpf_validate(insns, insn_count));
1133 code = bpfjit_generate_code(NULL, insns, insn_count);
1134 ATF_REQUIRE(code != NULL);
1136 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
1138 bpfjit_free_code(code);
1141 ATF_TC(libbpfjit_alu_rsh0_x);
1142 ATF_TC_HEAD(libbpfjit_alu_rsh0_x, tc)
1144 atf_tc_set_md_var(tc, "descr",
1145 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1148 ATF_TC_BODY(libbpfjit_alu_rsh0_x, tc)
1150 static struct bpf_insn insns[] = {
1151 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1152 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1153 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1154 BPF_STMT(BPF_RET+BPF_A, 0)
1158 uint8_t pkt[1]; /* the program doesn't read any data */
1160 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1162 ATF_CHECK(bpf_validate(insns, insn_count));
1164 code = bpfjit_generate_code(NULL, insns, insn_count);
1165 ATF_REQUIRE(code != NULL);
1167 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1169 bpfjit_free_code(code);
1172 ATF_TC(libbpfjit_alu_modulo_x);
1173 ATF_TC_HEAD(libbpfjit_alu_modulo_x, tc)
1175 atf_tc_set_md_var(tc, "descr",
1176 "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1179 ATF_TC_BODY(libbpfjit_alu_modulo_x, tc)
1181 static struct bpf_insn insns[] = {
1182 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1184 /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1185 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1186 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1188 /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1189 BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1190 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1192 /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1193 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1194 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1196 /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1197 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1198 BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1200 /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1201 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1202 BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1204 /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1205 BPF_STMT(BPF_ALU+BPF_NEG, 0),
1207 /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1208 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1209 BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1211 /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1212 /* 00000000,42218C74 >> 3 = 00000000,08443180 */
1213 BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1214 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1216 /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1217 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1218 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1220 /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1221 /* 00000000,93818280 / DEAD = 00000000,0000A994 */
1222 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1223 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1225 BPF_STMT(BPF_RET+BPF_A, 0)
1229 uint8_t pkt[1]; /* the program doesn't read any data */
1231 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1233 ATF_CHECK(bpf_validate(insns, insn_count));
1235 code = bpfjit_generate_code(NULL, insns, insn_count);
1236 ATF_REQUIRE(code != NULL);
1238 ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1239 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
1242 bpfjit_free_code(code);
1245 ATF_TC(libbpfjit_alu_neg);
1246 ATF_TC_HEAD(libbpfjit_alu_neg, tc)
1248 atf_tc_set_md_var(tc, "descr",
1249 "Test JIT compilation of BPF_ALU+BPF_NEG");
1252 ATF_TC_BODY(libbpfjit_alu_neg, tc)
1254 static struct bpf_insn insns[] = {
1255 BPF_STMT(BPF_LD+BPF_IMM, 777),
1256 BPF_STMT(BPF_ALU+BPF_NEG, 0),
1257 BPF_STMT(BPF_RET+BPF_A, 0)
1261 uint8_t pkt[1]; /* the program doesn't read any data */
1263 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1265 ATF_CHECK(bpf_validate(insns, insn_count));
1267 code = bpfjit_generate_code(NULL, insns, insn_count);
1268 ATF_REQUIRE(code != NULL);
1270 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0u-777u);
1272 bpfjit_free_code(code);
1275 ATF_TC(libbpfjit_jmp_ja);
1276 ATF_TC_HEAD(libbpfjit_jmp_ja, tc)
1278 atf_tc_set_md_var(tc, "descr",
1279 "Test JIT compilation of BPF_JMP+BPF_JA");
1282 ATF_TC_BODY(libbpfjit_jmp_ja, tc)
1284 static struct bpf_insn insns[] = {
1285 BPF_STMT(BPF_JMP+BPF_JA, 1),
1286 BPF_STMT(BPF_RET+BPF_K, 0),
1287 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1288 BPF_STMT(BPF_RET+BPF_K, 1),
1289 BPF_STMT(BPF_RET+BPF_K, 2),
1290 BPF_STMT(BPF_RET+BPF_K, 3),
1294 uint8_t pkt[1]; /* the program doesn't read any data */
1296 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1298 ATF_CHECK(bpf_validate(insns, insn_count));
1300 code = bpfjit_generate_code(NULL, insns, insn_count);
1301 ATF_REQUIRE(code != NULL);
1303 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1305 bpfjit_free_code(code);
1308 ATF_TC(libbpfjit_jmp_jgt_k);
1309 ATF_TC_HEAD(libbpfjit_jmp_jgt_k, tc)
1311 atf_tc_set_md_var(tc, "descr",
1312 "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1315 ATF_TC_BODY(libbpfjit_jmp_jgt_k, tc)
1317 static struct bpf_insn insns[] = {
1318 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1319 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1320 BPF_STMT(BPF_RET+BPF_K, 0),
1321 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1322 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1323 BPF_STMT(BPF_RET+BPF_K, 1),
1324 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1325 BPF_STMT(BPF_RET+BPF_K, 2),
1326 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1327 BPF_STMT(BPF_RET+BPF_K, 3),
1328 BPF_STMT(BPF_RET+BPF_K, 4),
1329 BPF_STMT(BPF_RET+BPF_K, 5),
1330 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1331 BPF_STMT(BPF_RET+BPF_K, 6),
1332 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1333 BPF_STMT(BPF_RET+BPF_K, 7),
1334 BPF_STMT(BPF_RET+BPF_K, 8)
1338 uint8_t pkt[8]; /* the program doesn't read any data */
1340 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1342 ATF_CHECK(bpf_validate(insns, insn_count));
1344 code = bpfjit_generate_code(NULL, insns, insn_count);
1345 ATF_REQUIRE(code != NULL);
1347 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1348 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1349 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1350 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1351 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1352 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1353 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1354 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1356 bpfjit_free_code(code);
1359 ATF_TC(libbpfjit_jmp_jge_k);
1360 ATF_TC_HEAD(libbpfjit_jmp_jge_k, tc)
1362 atf_tc_set_md_var(tc, "descr",
1363 "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1366 ATF_TC_BODY(libbpfjit_jmp_jge_k, tc)
1368 static struct bpf_insn insns[] = {
1369 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1370 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1371 BPF_STMT(BPF_RET+BPF_K, 0),
1372 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1373 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1374 BPF_STMT(BPF_RET+BPF_K, 1),
1375 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1376 BPF_STMT(BPF_RET+BPF_K, 2),
1377 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1378 BPF_STMT(BPF_RET+BPF_K, 3),
1379 BPF_STMT(BPF_RET+BPF_K, 4),
1380 BPF_STMT(BPF_RET+BPF_K, 5),
1381 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1382 BPF_STMT(BPF_RET+BPF_K, 6),
1383 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1384 BPF_STMT(BPF_RET+BPF_K, 7),
1385 BPF_STMT(BPF_RET+BPF_K, 8)
1389 uint8_t pkt[8]; /* the program doesn't read any data */
1391 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1393 ATF_CHECK(bpf_validate(insns, insn_count));
1395 code = bpfjit_generate_code(NULL, insns, insn_count);
1396 ATF_REQUIRE(code != NULL);
1398 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1399 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1400 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1401 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1402 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1403 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1404 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1405 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1407 bpfjit_free_code(code);
1410 ATF_TC(libbpfjit_jmp_jeq_k);
1411 ATF_TC_HEAD(libbpfjit_jmp_jeq_k, tc)
1413 atf_tc_set_md_var(tc, "descr",
1414 "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1417 ATF_TC_BODY(libbpfjit_jmp_jeq_k, tc)
1419 static struct bpf_insn insns[] = {
1420 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1421 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1422 BPF_STMT(BPF_RET+BPF_K, 0),
1423 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1424 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1425 BPF_STMT(BPF_RET+BPF_K, 1),
1426 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1427 BPF_STMT(BPF_RET+BPF_K, 2),
1428 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1429 BPF_STMT(BPF_RET+BPF_K, 3),
1430 BPF_STMT(BPF_RET+BPF_K, 4),
1431 BPF_STMT(BPF_RET+BPF_K, 5),
1432 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1433 BPF_STMT(BPF_RET+BPF_K, 6),
1434 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1435 BPF_STMT(BPF_RET+BPF_K, 7),
1436 BPF_STMT(BPF_RET+BPF_K, 8)
1440 uint8_t pkt[8]; /* the program doesn't read any data */
1442 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1444 ATF_CHECK(bpf_validate(insns, insn_count));
1446 code = bpfjit_generate_code(NULL, insns, insn_count);
1447 ATF_REQUIRE(code != NULL);
1449 ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1450 ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1451 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1452 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1453 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1454 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1455 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1456 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1458 bpfjit_free_code(code);
1461 ATF_TC(libbpfjit_jmp_jset_k);
1462 ATF_TC_HEAD(libbpfjit_jmp_jset_k, tc)
1464 atf_tc_set_md_var(tc, "descr",
1465 "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1468 ATF_TC_BODY(libbpfjit_jmp_jset_k, tc)
1470 static struct bpf_insn insns[] = {
1471 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1472 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1473 BPF_STMT(BPF_RET+BPF_K, 0),
1474 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1475 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1476 BPF_STMT(BPF_RET+BPF_K, 1),
1477 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1478 BPF_STMT(BPF_RET+BPF_K, 2),
1479 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1480 BPF_STMT(BPF_RET+BPF_K, 3),
1481 BPF_STMT(BPF_RET+BPF_K, 4),
1482 BPF_STMT(BPF_RET+BPF_K, 5),
1483 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1484 BPF_STMT(BPF_RET+BPF_K, 6),
1485 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1486 BPF_STMT(BPF_RET+BPF_K, 7),
1487 BPF_STMT(BPF_RET+BPF_K, 8)
1491 uint8_t pkt[8]; /* the program doesn't read any data */
1493 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1495 ATF_CHECK(bpf_validate(insns, insn_count));
1497 code = bpfjit_generate_code(NULL, insns, insn_count);
1498 ATF_REQUIRE(code != NULL);
1500 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1501 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1502 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1503 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1504 ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1505 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1506 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1507 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1509 bpfjit_free_code(code);
1512 ATF_TC(libbpfjit_jmp_modulo_k);
1513 ATF_TC_HEAD(libbpfjit_jmp_modulo_k, tc)
1515 atf_tc_set_md_var(tc, "descr",
1516 "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1519 ATF_TC_BODY(libbpfjit_jmp_modulo_k, tc)
1521 static struct bpf_insn insns[] = {
1522 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1523 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1524 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1525 BPF_STMT(BPF_RET+BPF_K, 0),
1526 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1527 BPF_STMT(BPF_RET+BPF_K, 1),
1528 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1529 BPF_STMT(BPF_RET+BPF_K, 2),
1530 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1531 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1532 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1533 BPF_STMT(BPF_JMP+BPF_JA, 1),
1534 BPF_STMT(BPF_RET+BPF_K, 3),
1536 /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1537 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1539 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1540 BPF_STMT(BPF_RET+BPF_K, 4),
1541 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1542 BPF_STMT(BPF_RET+BPF_K, 5),
1543 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1544 BPF_STMT(BPF_RET+BPF_K, 6),
1545 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1546 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1547 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1548 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1549 BPF_STMT(BPF_RET+BPF_K, 7)
1553 uint8_t pkt[1]; /* the program doesn't read any data */
1555 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1557 ATF_CHECK(bpf_validate(insns, insn_count));
1559 code = bpfjit_generate_code(NULL, insns, insn_count);
1560 ATF_REQUIRE(code != NULL);
1562 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1564 bpfjit_free_code(code);
1567 ATF_TC(libbpfjit_jmp_jgt_x);
1568 ATF_TC_HEAD(libbpfjit_jmp_jgt_x, tc)
1570 atf_tc_set_md_var(tc, "descr",
1571 "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
1574 ATF_TC_BODY(libbpfjit_jmp_jgt_x, tc)
1576 static struct bpf_insn insns[] = {
1577 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1578 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1579 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1580 BPF_STMT(BPF_RET+BPF_K, 0),
1581 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1582 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1583 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1584 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1585 BPF_STMT(BPF_RET+BPF_K, 1),
1586 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1587 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
1588 BPF_STMT(BPF_RET+BPF_K, 2),
1589 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1590 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
1591 BPF_STMT(BPF_RET+BPF_K, 3),
1592 BPF_STMT(BPF_RET+BPF_K, 4),
1593 BPF_STMT(BPF_RET+BPF_K, 5),
1594 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1595 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
1596 BPF_STMT(BPF_RET+BPF_K, 6),
1597 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1598 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1599 BPF_STMT(BPF_RET+BPF_K, 7),
1600 BPF_STMT(BPF_RET+BPF_K, 8)
1604 uint8_t pkt[8]; /* the program doesn't read any data */
1606 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1608 ATF_CHECK(bpf_validate(insns, insn_count));
1610 code = bpfjit_generate_code(NULL, insns, insn_count);
1611 ATF_REQUIRE(code != NULL);
1613 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1614 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1615 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1616 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1617 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1618 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1619 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1620 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1622 bpfjit_free_code(code);
1625 ATF_TC(libbpfjit_jmp_jge_x);
1626 ATF_TC_HEAD(libbpfjit_jmp_jge_x, tc)
1628 atf_tc_set_md_var(tc, "descr",
1629 "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
1632 ATF_TC_BODY(libbpfjit_jmp_jge_x, tc)
1634 static struct bpf_insn insns[] = {
1635 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1636 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1637 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1638 BPF_STMT(BPF_RET+BPF_K, 0),
1639 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1640 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
1641 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1642 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1643 BPF_STMT(BPF_RET+BPF_K, 1),
1644 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1645 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
1646 BPF_STMT(BPF_RET+BPF_K, 2),
1647 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1648 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
1649 BPF_STMT(BPF_RET+BPF_K, 3),
1650 BPF_STMT(BPF_RET+BPF_K, 4),
1651 BPF_STMT(BPF_RET+BPF_K, 5),
1652 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1653 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
1654 BPF_STMT(BPF_RET+BPF_K, 6),
1655 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1656 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1657 BPF_STMT(BPF_RET+BPF_K, 7),
1658 BPF_STMT(BPF_RET+BPF_K, 8)
1662 uint8_t pkt[8]; /* the program doesn't read any data */
1664 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1666 ATF_CHECK(bpf_validate(insns, insn_count));
1668 code = bpfjit_generate_code(NULL, insns, insn_count);
1669 ATF_REQUIRE(code != NULL);
1671 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1672 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1673 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1674 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1675 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1676 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1677 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1678 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1680 bpfjit_free_code(code);
1683 ATF_TC(libbpfjit_jmp_jeq_x);
1684 ATF_TC_HEAD(libbpfjit_jmp_jeq_x, tc)
1686 atf_tc_set_md_var(tc, "descr",
1687 "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
1690 ATF_TC_BODY(libbpfjit_jmp_jeq_x, tc)
1692 static struct bpf_insn insns[] = {
1693 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1694 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1695 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
1696 BPF_STMT(BPF_RET+BPF_K, 0),
1697 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1698 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
1699 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1700 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1701 BPF_STMT(BPF_RET+BPF_K, 1),
1702 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1703 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1704 BPF_STMT(BPF_RET+BPF_K, 2),
1705 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1706 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
1707 BPF_STMT(BPF_RET+BPF_K, 3),
1708 BPF_STMT(BPF_RET+BPF_K, 4),
1709 BPF_STMT(BPF_RET+BPF_K, 5),
1710 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1711 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
1712 BPF_STMT(BPF_RET+BPF_K, 6),
1713 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
1714 BPF_STMT(BPF_RET+BPF_K, 7),
1715 BPF_STMT(BPF_RET+BPF_K, 8)
1719 uint8_t pkt[8]; /* the program doesn't read any data */
1721 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1723 ATF_CHECK(bpf_validate(insns, insn_count));
1725 code = bpfjit_generate_code(NULL, insns, insn_count);
1726 ATF_REQUIRE(code != NULL);
1728 ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1729 ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1730 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1731 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1732 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1733 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1734 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1735 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1737 bpfjit_free_code(code);
1740 ATF_TC(libbpfjit_jmp_jset_x);
1741 ATF_TC_HEAD(libbpfjit_jmp_jset_x, tc)
1743 atf_tc_set_md_var(tc, "descr",
1744 "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
1747 ATF_TC_BODY(libbpfjit_jmp_jset_x, tc)
1749 static struct bpf_insn insns[] = {
1750 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1751 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1752 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
1753 BPF_STMT(BPF_RET+BPF_K, 0),
1754 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1755 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
1756 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
1757 BPF_STMT(BPF_RET+BPF_K, 1),
1758 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1759 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
1760 BPF_STMT(BPF_RET+BPF_K, 2),
1761 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1762 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
1763 BPF_STMT(BPF_RET+BPF_K, 3),
1764 BPF_STMT(BPF_RET+BPF_K, 4),
1765 BPF_STMT(BPF_RET+BPF_K, 5),
1766 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1767 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
1768 BPF_STMT(BPF_RET+BPF_K, 6),
1769 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1770 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
1771 BPF_STMT(BPF_RET+BPF_K, 7),
1772 BPF_STMT(BPF_RET+BPF_K, 8)
1776 uint8_t pkt[8]; /* the program doesn't read any data */
1778 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1780 ATF_CHECK(bpf_validate(insns, insn_count));
1782 code = bpfjit_generate_code(NULL, insns, insn_count);
1783 ATF_REQUIRE(code != NULL);
1785 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1786 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1787 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1788 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1789 ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1790 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1791 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1792 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1794 bpfjit_free_code(code);
1797 ATF_TC(libbpfjit_jmp_modulo_x);
1798 ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
1800 atf_tc_set_md_var(tc, "descr",
1801 "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
1804 ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
1806 static struct bpf_insn insns[] = {
1807 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1808 /* FFFFF770 << 4 = FFFFF770 */
1809 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1811 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1812 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1813 BPF_STMT(BPF_RET+BPF_K, 0),
1814 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1815 BPF_STMT(BPF_RET+BPF_K, 1),
1816 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1817 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1818 BPF_STMT(BPF_RET+BPF_K, 2),
1819 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1820 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1821 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1822 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1823 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1824 BPF_STMT(BPF_JMP+BPF_JA, 1),
1825 BPF_STMT(BPF_RET+BPF_K, 3),
1827 /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1828 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1830 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1831 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1832 BPF_STMT(BPF_RET+BPF_K, 4),
1833 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1834 BPF_STMT(BPF_RET+BPF_K, 5),
1835 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1836 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1837 BPF_STMT(BPF_RET+BPF_K, 6),
1838 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1839 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1840 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1841 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1842 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1843 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1844 BPF_STMT(BPF_RET+BPF_K, 7)
1848 uint8_t pkt[1]; /* the program doesn't read any data */
1850 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1852 ATF_CHECK(bpf_validate(insns, insn_count));
1854 code = bpfjit_generate_code(NULL, insns, insn_count);
1855 ATF_REQUIRE(code != NULL);
1857 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1859 bpfjit_free_code(code);
1862 ATF_TC(libbpfjit_ld_abs);
1863 ATF_TC_HEAD(libbpfjit_ld_abs, tc)
1865 atf_tc_set_md_var(tc, "descr",
1866 "Test JIT compilation of BPF_LD+BPF_ABS");
1869 ATF_TC_BODY(libbpfjit_ld_abs, tc)
1871 static struct bpf_insn insns[3][2] = {
1873 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
1874 BPF_STMT(BPF_RET+BPF_A, 0)
1877 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
1878 BPF_STMT(BPF_RET+BPF_A, 0)
1881 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
1882 BPF_STMT(BPF_RET+BPF_A, 0)
1886 static size_t lengths[3] = { 1, 2, 4 };
1887 static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
1890 uint8_t *pkt = deadbeef_at_5;
1891 size_t pktsize = sizeof(deadbeef_at_5);
1893 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1895 for (i = 0; i < 3; i++) {
1898 ATF_CHECK(bpf_validate(insns[i], insn_count));
1900 code = bpfjit_generate_code(NULL, insns[i], insn_count);
1901 ATF_REQUIRE(code != NULL);
1903 for (l = 1; l < 5 + lengths[i]; l++) {
1904 ATF_CHECK(jitcall(code, pkt, l, l) == 0);
1905 ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
1909 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1910 ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
1913 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1915 bpfjit_free_code(code);
1919 ATF_TC(libbpfjit_ld_abs_k_overflow);
1920 ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
1922 atf_tc_set_md_var(tc, "descr",
1923 "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
1926 ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
1928 static struct bpf_insn insns[12][3] = {
1930 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1931 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1932 BPF_STMT(BPF_RET+BPF_K, 1)
1935 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1936 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1937 BPF_STMT(BPF_RET+BPF_K, 1)
1940 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1941 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1942 BPF_STMT(BPF_RET+BPF_K, 1)
1945 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1946 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1947 BPF_STMT(BPF_RET+BPF_K, 1)
1950 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1951 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1952 BPF_STMT(BPF_RET+BPF_K, 1)
1955 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1956 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1957 BPF_STMT(BPF_RET+BPF_K, 1)
1960 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1961 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1962 BPF_STMT(BPF_RET+BPF_K, 1)
1965 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1966 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1967 BPF_STMT(BPF_RET+BPF_K, 1)
1970 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1971 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1972 BPF_STMT(BPF_RET+BPF_K, 1)
1975 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1976 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1977 BPF_STMT(BPF_RET+BPF_K, 1)
1980 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1981 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1982 BPF_STMT(BPF_RET+BPF_K, 1)
1985 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1986 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1987 BPF_STMT(BPF_RET+BPF_K, 1)
1992 uint8_t pkt[8] = { 0 };
1994 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1996 for (i = 0; i < 3; i++) {
1999 ATF_CHECK(bpf_validate(insns[i], insn_count));
2001 code = bpfjit_generate_code(NULL, insns[i], insn_count);
2002 ATF_REQUIRE(code != NULL);
2004 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2006 bpfjit_free_code(code);
2010 ATF_TC(libbpfjit_ld_ind);
2011 ATF_TC_HEAD(libbpfjit_ld_ind, tc)
2013 atf_tc_set_md_var(tc, "descr",
2014 "Test JIT compilation of BPF_LD+BPF_IND");
2017 ATF_TC_BODY(libbpfjit_ld_ind, tc)
2019 static struct bpf_insn insns[6][3] = {
2021 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2022 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2023 BPF_STMT(BPF_RET+BPF_A, 0)
2026 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2027 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2028 BPF_STMT(BPF_RET+BPF_A, 0)
2031 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2032 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2033 BPF_STMT(BPF_RET+BPF_A, 0)
2036 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2037 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2038 BPF_STMT(BPF_RET+BPF_A, 0)
2041 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2042 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2043 BPF_STMT(BPF_RET+BPF_A, 0)
2046 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2047 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2048 BPF_STMT(BPF_RET+BPF_A, 0)
2052 static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2054 static unsigned int expected[6] = {
2055 0xde, 0xdead, 0xdeadbeef,
2056 0xde, 0xdead, 0xdeadbeef
2060 uint8_t *pkt = deadbeef_at_5;
2061 size_t pktsize = sizeof(deadbeef_at_5);
2063 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2065 for (i = 0; i < 3; i++) {
2068 ATF_CHECK(bpf_validate(insns[i], insn_count));
2070 code = bpfjit_generate_code(NULL, insns[i], insn_count);
2071 ATF_REQUIRE(code != NULL);
2073 for (l = 1; l < 5 + lengths[i]; l++) {
2074 ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2075 ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2079 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2080 ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2083 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2085 bpfjit_free_code(code);
2089 ATF_TC(libbpfjit_ld_ind_k_overflow);
2090 ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
2092 atf_tc_set_md_var(tc, "descr",
2093 "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2096 ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
2098 static struct bpf_insn insns[12][3] = {
2100 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2101 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2102 BPF_STMT(BPF_RET+BPF_K, 1)
2105 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2106 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2107 BPF_STMT(BPF_RET+BPF_K, 1)
2110 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2111 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2112 BPF_STMT(BPF_RET+BPF_K, 1)
2115 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2116 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2117 BPF_STMT(BPF_RET+BPF_K, 1)
2120 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2121 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2122 BPF_STMT(BPF_RET+BPF_K, 1)
2125 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2126 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2127 BPF_STMT(BPF_RET+BPF_K, 1)
2130 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2131 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2132 BPF_STMT(BPF_RET+BPF_K, 1)
2135 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2136 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2137 BPF_STMT(BPF_RET+BPF_K, 1)
2140 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2141 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2142 BPF_STMT(BPF_RET+BPF_K, 1)
2145 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2146 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2147 BPF_STMT(BPF_RET+BPF_K, 1)
2150 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2151 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2152 BPF_STMT(BPF_RET+BPF_K, 1)
2155 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2156 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2157 BPF_STMT(BPF_RET+BPF_K, 1)
2162 uint8_t pkt[8] = { 0 };
2164 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2166 for (i = 0; i < 3; i++) {
2169 ATF_CHECK(bpf_validate(insns[i], insn_count));
2171 code = bpfjit_generate_code(NULL, insns[i], insn_count);
2172 ATF_REQUIRE(code != NULL);
2174 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2176 bpfjit_free_code(code);
2180 ATF_TC(libbpfjit_ld_ind_x_overflow1);
2181 ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
2183 atf_tc_set_md_var(tc, "descr",
2184 "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2187 ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
2189 static struct bpf_insn insns[] = {
2190 BPF_STMT(BPF_LD+BPF_LEN, 0),
2191 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2192 BPF_STMT(BPF_MISC+BPF_TAX, 0),
2193 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2194 BPF_STMT(BPF_RET+BPF_A, 0)
2199 uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2201 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2203 ATF_CHECK(bpf_validate(insns, insn_count));
2205 code = bpfjit_generate_code(NULL, insns, insn_count);
2206 ATF_REQUIRE(code != NULL);
2208 for (i = 1; i <= sizeof(pkt); i++) {
2209 ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2210 ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2213 bpfjit_free_code(code);
2216 ATF_TC(libbpfjit_ld_ind_x_overflow2);
2217 ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
2219 atf_tc_set_md_var(tc, "descr",
2220 "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2223 ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
2225 static struct bpf_insn insns[] = {
2226 BPF_STMT(BPF_LD+BPF_LEN, 0),
2227 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2228 BPF_STMT(BPF_ST, 3),
2229 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2230 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2231 BPF_STMT(BPF_RET+BPF_A, 0)
2236 uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2238 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2240 ATF_CHECK(bpf_validate(insns, insn_count));
2242 code = bpfjit_generate_code(NULL, insns, insn_count);
2243 ATF_REQUIRE(code != NULL);
2245 for (i = 1; i <= sizeof(pkt); i++) {
2246 ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2247 ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2250 bpfjit_free_code(code);
2253 ATF_TC(libbpfjit_ld_len);
2254 ATF_TC_HEAD(libbpfjit_ld_len, tc)
2256 atf_tc_set_md_var(tc, "descr",
2257 "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2260 ATF_TC_BODY(libbpfjit_ld_len, tc)
2262 static struct bpf_insn insns[] = {
2263 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2264 BPF_STMT(BPF_RET+BPF_A, 0)
2269 uint8_t pkt[32]; /* the program doesn't read any data */
2271 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2273 ATF_CHECK(bpf_validate(insns, insn_count));
2275 code = bpfjit_generate_code(NULL, insns, insn_count);
2276 ATF_REQUIRE(code != NULL);
2278 for (i = 0; i < sizeof(pkt); i++)
2279 ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2281 bpfjit_free_code(code);
2284 ATF_TC(libbpfjit_ld_imm);
2285 ATF_TC_HEAD(libbpfjit_ld_imm, tc)
2287 atf_tc_set_md_var(tc, "descr",
2288 "Test JIT compilation of BPF_LD+BPF_IMM");
2291 ATF_TC_BODY(libbpfjit_ld_imm, tc)
2293 static struct bpf_insn insns[] = {
2294 BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2295 BPF_STMT(BPF_RET+BPF_A, 0)
2299 uint8_t pkt[1]; /* the program doesn't read any data */
2301 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2303 ATF_CHECK(bpf_validate(insns, insn_count));
2305 code = bpfjit_generate_code(NULL, insns, insn_count);
2306 ATF_REQUIRE(code != NULL);
2308 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2310 bpfjit_free_code(code);
2313 ATF_TC(libbpfjit_ldx_imm1);
2314 ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
2316 atf_tc_set_md_var(tc, "descr",
2317 "Test JIT compilation of BPF_LDX+BPF_IMM");
2320 ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
2322 static struct bpf_insn insns[] = {
2323 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2324 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2325 BPF_STMT(BPF_RET+BPF_A, 0)
2329 uint8_t pkt[1]; /* the program doesn't read any data */
2331 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2333 ATF_CHECK(bpf_validate(insns, insn_count));
2335 code = bpfjit_generate_code(NULL, insns, insn_count);
2336 ATF_REQUIRE(code != NULL);
2338 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
2340 bpfjit_free_code(code);
2343 ATF_TC(libbpfjit_ldx_imm2);
2344 ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
2346 atf_tc_set_md_var(tc, "descr",
2347 "Test JIT compilation of BPF_LDX+BPF_IMM");
2350 ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
2352 static struct bpf_insn insns[] = {
2353 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2354 BPF_STMT(BPF_LD+BPF_IMM, 5),
2355 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2356 BPF_STMT(BPF_RET+BPF_K, 7),
2357 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2361 uint8_t pkt[1]; /* the program doesn't read any data */
2363 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2365 ATF_CHECK(bpf_validate(insns, insn_count));
2367 code = bpfjit_generate_code(NULL, insns, insn_count);
2368 ATF_REQUIRE(code != NULL);
2370 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2372 bpfjit_free_code(code);
2375 ATF_TC(libbpfjit_ldx_len1);
2376 ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
2378 atf_tc_set_md_var(tc, "descr",
2379 "Test JIT compilation of BPF_LDX+BPF_LEN");
2382 ATF_TC_BODY(libbpfjit_ldx_len1, tc)
2384 static struct bpf_insn insns[] = {
2385 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2386 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2387 BPF_STMT(BPF_RET+BPF_A, 0)
2392 uint8_t pkt[5]; /* the program doesn't read any data */
2394 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2396 ATF_CHECK(bpf_validate(insns, insn_count));
2398 code = bpfjit_generate_code(NULL, insns, insn_count);
2399 ATF_REQUIRE(code != NULL);
2401 for (i = 1; i < sizeof(pkt); i++) {
2402 ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2403 ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
2406 bpfjit_free_code(code);
2409 ATF_TC(libbpfjit_ldx_len2);
2410 ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
2412 atf_tc_set_md_var(tc, "descr",
2413 "Test JIT compilation of BPF_LDX+BPF_LEN");
2416 ATF_TC_BODY(libbpfjit_ldx_len2, tc)
2418 static struct bpf_insn insns[] = {
2419 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2420 BPF_STMT(BPF_LD+BPF_IMM, 5),
2421 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2422 BPF_STMT(BPF_RET+BPF_K, 7),
2423 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2427 uint8_t pkt[5]; /* the program doesn't read any data */
2429 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2431 ATF_CHECK(bpf_validate(insns, insn_count));
2433 code = bpfjit_generate_code(NULL, insns, insn_count);
2434 ATF_REQUIRE(code != NULL);
2436 ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
2437 ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
2439 bpfjit_free_code(code);
2442 ATF_TC(libbpfjit_ldx_msh);
2443 ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
2445 atf_tc_set_md_var(tc, "descr",
2446 "Test JIT compilation of BPF_LDX+BPF_MSH");
2449 ATF_TC_BODY(libbpfjit_ldx_msh, tc)
2451 static struct bpf_insn insns[] = {
2452 BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2453 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2454 BPF_STMT(BPF_RET+BPF_A, 0)
2458 uint8_t pkt[2] = { 0, 0x7a };
2460 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2462 ATF_CHECK(bpf_validate(insns, insn_count));
2464 code = bpfjit_generate_code(NULL, insns, insn_count);
2465 ATF_REQUIRE(code != NULL);
2467 ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
2469 bpfjit_free_code(code);
2472 ATF_TC(libbpfjit_misc_tax);
2473 ATF_TC_HEAD(libbpfjit_misc_tax, tc)
2475 atf_tc_set_md_var(tc, "descr",
2476 "Test JIT compilation of BPF_MISC+BPF_TAX");
2479 ATF_TC_BODY(libbpfjit_misc_tax, tc)
2481 static struct bpf_insn insns[] = {
2482 BPF_STMT(BPF_LD+BPF_IMM, 3),
2483 BPF_STMT(BPF_MISC+BPF_TAX, 0),
2484 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2485 BPF_STMT(BPF_RET+BPF_A, 0)
2489 uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
2491 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2493 ATF_CHECK(bpf_validate(insns, insn_count));
2495 code = bpfjit_generate_code(NULL, insns, insn_count);
2496 ATF_REQUIRE(code != NULL);
2498 ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
2500 bpfjit_free_code(code);
2503 ATF_TC(libbpfjit_misc_txa);
2504 ATF_TC_HEAD(libbpfjit_misc_txa, tc)
2506 atf_tc_set_md_var(tc, "descr",
2507 "Test JIT compilation of BPF_MISC+BPF_TXA");
2510 ATF_TC_BODY(libbpfjit_misc_txa, tc)
2512 static struct bpf_insn insns[] = {
2513 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
2514 BPF_STMT(BPF_MISC+BPF_TXA, 0),
2515 BPF_STMT(BPF_RET+BPF_A, 0)
2519 uint8_t pkt[1]; /* the program doesn't read any data */
2521 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2523 ATF_CHECK(bpf_validate(insns, insn_count));
2525 code = bpfjit_generate_code(NULL, insns, insn_count);
2526 ATF_REQUIRE(code != NULL);
2528 ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
2530 bpfjit_free_code(code);
2533 ATF_TC(libbpfjit_st1);
2534 ATF_TC_HEAD(libbpfjit_st1, tc)
2536 atf_tc_set_md_var(tc, "descr",
2537 "Test JIT compilation of BPF_ST");
2540 ATF_TC_BODY(libbpfjit_st1, tc)
2542 static struct bpf_insn insns[] = {
2543 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2544 BPF_STMT(BPF_ST, 0),
2545 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
2546 BPF_STMT(BPF_LD+BPF_MEM, 0),
2547 BPF_STMT(BPF_RET+BPF_A, 0)
2552 uint8_t pkt[16]; /* the program doesn't read any data */
2554 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2556 ATF_CHECK(bpf_validate(insns, insn_count));
2558 code = bpfjit_generate_code(NULL, insns, insn_count);
2559 ATF_REQUIRE(code != NULL);
2561 for (i = 1; i <= sizeof(pkt); i++)
2562 ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
2564 bpfjit_free_code(code);
2567 ATF_TC(libbpfjit_st2);
2568 ATF_TC_HEAD(libbpfjit_st2, tc)
2570 atf_tc_set_md_var(tc, "descr",
2571 "Test JIT compilation of BPF_ST");
2574 ATF_TC_BODY(libbpfjit_st2, tc)
2576 static struct bpf_insn insns[] = {
2577 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2578 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2579 BPF_STMT(BPF_LD+BPF_MEM, 0),
2580 BPF_STMT(BPF_RET+BPF_A, 0)
2584 uint8_t pkt[1]; /* the program doesn't read any data */
2586 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2588 ATF_CHECK(bpf_validate(insns, insn_count));
2590 code = bpfjit_generate_code(NULL, insns, insn_count);
2591 ATF_REQUIRE(code != NULL);
2593 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
2595 bpfjit_free_code(code);
2598 ATF_TC(libbpfjit_st3);
2599 ATF_TC_HEAD(libbpfjit_st3, tc)
2601 atf_tc_set_md_var(tc, "descr",
2602 "Test JIT compilation of BPF_ST");
2605 ATF_TC_BODY(libbpfjit_st3, tc)
2607 static struct bpf_insn insns[] = {
2608 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2609 BPF_STMT(BPF_ST, 0),
2610 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2611 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2612 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2613 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2614 BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2615 BPF_STMT(BPF_RET+BPF_A, 0),
2616 BPF_STMT(BPF_LD+BPF_MEM, 0),
2617 BPF_STMT(BPF_RET+BPF_A, 0)
2621 uint8_t pkt[2]; /* the program doesn't read any data */
2623 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2625 ATF_REQUIRE(BPF_MEMWORDS > 1);
2627 ATF_CHECK(bpf_validate(insns, insn_count));
2629 code = bpfjit_generate_code(NULL, insns, insn_count);
2630 ATF_REQUIRE(code != NULL);
2632 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2633 ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
2635 bpfjit_free_code(code);
2638 ATF_TC(libbpfjit_st4);
2639 ATF_TC_HEAD(libbpfjit_st4, tc)
2641 atf_tc_set_md_var(tc, "descr",
2642 "Test JIT compilation of BPF_ST");
2645 ATF_TC_BODY(libbpfjit_st4, tc)
2647 static struct bpf_insn insns[] = {
2648 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2649 BPF_STMT(BPF_ST, 5),
2650 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2651 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2652 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2653 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2654 BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2655 BPF_STMT(BPF_RET+BPF_A, 0),
2656 BPF_STMT(BPF_LD+BPF_MEM, 5),
2657 BPF_STMT(BPF_RET+BPF_A, 0)
2661 uint8_t pkt[2]; /* the program doesn't read any data */
2663 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2665 ATF_REQUIRE(BPF_MEMWORDS > 6);
2667 ATF_CHECK(bpf_validate(insns, insn_count));
2669 code = bpfjit_generate_code(NULL, insns, insn_count);
2670 ATF_REQUIRE(code != NULL);
2672 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2673 ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
2675 bpfjit_free_code(code);
2678 ATF_TC(libbpfjit_st5);
2679 ATF_TC_HEAD(libbpfjit_st5, tc)
2681 atf_tc_set_md_var(tc, "descr",
2682 "Test JIT compilation of BPF_ST");
2685 ATF_TC_BODY(libbpfjit_st5, tc)
2687 struct bpf_insn insns[5*BPF_MEMWORDS+2];
2688 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2692 uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2694 memset(insns, 0, sizeof(insns));
2696 /* for each k do M[k] = k */
2697 for (k = 0; k < BPF_MEMWORDS; k++) {
2698 insns[2*k].code = BPF_LD+BPF_IMM;
2700 insns[2*k+1].code = BPF_ST;
2704 /* load wirelen into A */
2705 insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2707 /* for each k, if (A == k + 1) return M[k] */
2708 for (k = 0; k < BPF_MEMWORDS; k++) {
2709 insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2710 insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2711 insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2712 insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2713 insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2714 insns[2*BPF_MEMWORDS+3*k+2].k = k;
2715 insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2716 insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2719 insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2720 insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2722 ATF_CHECK(bpf_validate(insns, insn_count));
2724 code = bpfjit_generate_code(NULL, insns, insn_count);
2725 ATF_REQUIRE(code != NULL);
2727 for (k = 1; k <= sizeof(pkt); k++)
2728 ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
2730 bpfjit_free_code(code);
2733 ATF_TC(libbpfjit_stx1);
2734 ATF_TC_HEAD(libbpfjit_stx1, tc)
2736 atf_tc_set_md_var(tc, "descr",
2737 "Test JIT compilation of BPF_STX");
2740 ATF_TC_BODY(libbpfjit_stx1, tc)
2742 static struct bpf_insn insns[] = {
2743 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2744 BPF_STMT(BPF_STX, 0),
2745 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2746 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2747 BPF_STMT(BPF_RET+BPF_A, 0)
2752 uint8_t pkt[16]; /* the program doesn't read any data */
2754 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2756 ATF_CHECK(bpf_validate(insns, insn_count));
2758 code = bpfjit_generate_code(NULL, insns, insn_count);
2759 ATF_REQUIRE(code != NULL);
2761 for (i = 1; i <= sizeof(pkt); i++)
2762 ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
2764 bpfjit_free_code(code);
2767 ATF_TC(libbpfjit_stx2);
2768 ATF_TC_HEAD(libbpfjit_stx2, tc)
2770 atf_tc_set_md_var(tc, "descr",
2771 "Test JIT compilation of BPF_STX");
2774 ATF_TC_BODY(libbpfjit_stx2, tc)
2776 static struct bpf_insn insns[] = {
2777 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2778 BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
2779 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2780 BPF_STMT(BPF_MISC+BPF_TXA, 0),
2781 BPF_STMT(BPF_RET+BPF_A, 0)
2785 uint8_t pkt[1]; /* the program doesn't read any data */
2787 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2789 ATF_CHECK(bpf_validate(insns, insn_count));
2791 code = bpfjit_generate_code(NULL, insns, insn_count);
2792 ATF_REQUIRE(code != NULL);
2794 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
2796 bpfjit_free_code(code);
2799 ATF_TC(libbpfjit_stx3);
2800 ATF_TC_HEAD(libbpfjit_stx3, tc)
2802 atf_tc_set_md_var(tc, "descr",
2803 "Test JIT compilation of BPF_STX");
2806 ATF_TC_BODY(libbpfjit_stx3, tc)
2808 static struct bpf_insn insns[] = {
2809 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2810 BPF_STMT(BPF_STX, 5),
2811 BPF_STMT(BPF_STX, 2),
2812 BPF_STMT(BPF_STX, 3),
2813 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
2814 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2815 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
2816 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2817 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2818 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2819 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
2820 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2821 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
2822 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2823 BPF_STMT(BPF_RET+BPF_A, 0)
2828 uint8_t pkt[16]; /* the program doesn't read any data */
2830 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2832 ATF_CHECK(bpf_validate(insns, insn_count));
2834 code = bpfjit_generate_code(NULL, insns, insn_count);
2835 ATF_REQUIRE(code != NULL);
2837 for (i = 1; i <= sizeof(pkt); i++)
2838 ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
2840 bpfjit_free_code(code);
2843 ATF_TC(libbpfjit_stx4);
2844 ATF_TC_HEAD(libbpfjit_stx4, tc)
2846 atf_tc_set_md_var(tc, "descr",
2847 "Test JIT compilation of BPF_STX");
2850 ATF_TC_BODY(libbpfjit_stx4, tc)
2852 struct bpf_insn insns[5*BPF_MEMWORDS+2];
2853 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2857 uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2859 memset(insns, 0, sizeof(insns));
2861 /* for each k do M[k] = k */
2862 for (k = 0; k < BPF_MEMWORDS; k++) {
2863 insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
2865 insns[2*k+1].code = BPF_STX;
2869 /* load wirelen into A */
2870 insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2872 /* for each k, if (A == k + 1) return M[k] */
2873 for (k = 0; k < BPF_MEMWORDS; k++) {
2874 insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2875 insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2876 insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2877 insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2878 insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2879 insns[2*BPF_MEMWORDS+3*k+2].k = k;
2880 insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2881 insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2884 insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2885 insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2887 ATF_CHECK(bpf_validate(insns, insn_count));
2889 code = bpfjit_generate_code(NULL, insns, insn_count);
2890 ATF_REQUIRE(code != NULL);
2892 for (k = 1; k <= sizeof(pkt); k++)
2893 ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
2895 bpfjit_free_code(code);
2898 ATF_TC(libbpfjit_opt_ld_abs_1);
2899 ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
2901 atf_tc_set_md_var(tc, "descr",
2902 "Test JIT compilation with length optimization "
2903 "applied to BPF_LD+BPF_ABS");
2906 ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
2908 static struct bpf_insn insns[] = {
2909 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2910 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
2911 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2912 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2913 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2914 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
2915 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2916 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2917 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
2918 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2919 BPF_STMT(BPF_RET+BPF_K, 0),
2924 uint8_t pkt[2][34] = {
2926 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2927 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2928 0x80, 0x03, 0x70, 0x0f,
2929 0x80, 0x03, 0x70, 0x23
2932 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2933 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2934 0x80, 0x03, 0x70, 0x23,
2935 0x80, 0x03, 0x70, 0x0f
2939 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2941 ATF_CHECK(bpf_validate(insns, insn_count));
2943 code = bpfjit_generate_code(NULL, insns, insn_count);
2944 ATF_REQUIRE(code != NULL);
2946 for (i = 0; i < 2; i++) {
2947 for (j = 1; j < sizeof(pkt[i]); j++)
2948 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
2949 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
2952 bpfjit_free_code(code);
2955 ATF_TC(libbpfjit_opt_ld_abs_2);
2956 ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
2958 atf_tc_set_md_var(tc, "descr",
2959 "Test JIT compilation with length optimization "
2960 "applied to BPF_LD+BPF_ABS");
2963 ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
2965 static struct bpf_insn insns[] = {
2966 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2967 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2968 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2969 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
2970 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
2971 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2972 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
2973 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2974 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2975 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2976 BPF_STMT(BPF_RET+BPF_K, 0),
2981 uint8_t pkt[2][34] = {
2983 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2984 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2985 0x80, 0x03, 0x70, 0x0f,
2986 0x80, 0x03, 0x70, 0x23
2989 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2990 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2991 0x80, 0x03, 0x70, 0x23,
2992 0x80, 0x03, 0x70, 0x0f
2996 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2998 ATF_CHECK(bpf_validate(insns, insn_count));
3000 code = bpfjit_generate_code(NULL, insns, insn_count);
3001 ATF_REQUIRE(code != NULL);
3003 for (i = 0; i < 2; i++) {
3004 for (j = 1; j < sizeof(pkt[i]); j++)
3005 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3006 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3009 bpfjit_free_code(code);
3012 ATF_TC(libbpfjit_opt_ld_abs_3);
3013 ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
3015 atf_tc_set_md_var(tc, "descr",
3016 "Test JIT compilation with length optimization "
3017 "applied to BPF_LD+BPF_ABS");
3020 ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
3022 static struct bpf_insn insns[] = {
3023 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3024 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3025 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3026 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3027 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3028 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3029 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3030 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3031 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3032 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3033 BPF_STMT(BPF_RET+BPF_K, 0),
3038 uint8_t pkt[2][34] = {
3040 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3041 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3042 0x80, 0x03, 0x70, 0x0f,
3043 0x80, 0x03, 0x70, 0x23
3046 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3047 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3048 0x80, 0x03, 0x70, 0x23,
3049 0x80, 0x03, 0x70, 0x0f
3053 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3055 ATF_CHECK(bpf_validate(insns, insn_count));
3057 code = bpfjit_generate_code(NULL, insns, insn_count);
3058 ATF_REQUIRE(code != NULL);
3060 for (i = 0; i < 2; i++) {
3061 for (j = 1; j < sizeof(pkt[i]); j++)
3062 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3063 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3066 bpfjit_free_code(code);
3069 ATF_TC(libbpfjit_opt_ld_ind_1);
3070 ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
3072 atf_tc_set_md_var(tc, "descr",
3073 "Test JIT compilation with length optimization "
3074 "applied to BPF_LD+BPF_IND");
3077 ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
3079 static struct bpf_insn insns[] = {
3080 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3081 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3082 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3083 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3084 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3085 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3086 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3087 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3088 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3089 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3090 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3091 BPF_STMT(BPF_RET+BPF_K, 0),
3096 uint8_t pkt[2][34] = {
3098 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3099 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3100 0x80, 0x03, 0x70, 0x0f,
3101 0x80, 0x03, 0x70, 0x23
3104 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3105 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3106 0x80, 0x03, 0x70, 0x23,
3107 0x80, 0x03, 0x70, 0x0f
3111 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3113 ATF_CHECK(bpf_validate(insns, insn_count));
3115 code = bpfjit_generate_code(NULL, insns, insn_count);
3116 ATF_REQUIRE(code != NULL);
3118 for (i = 0; i < 2; i++) {
3119 for (j = 1; j < sizeof(pkt[i]); j++)
3120 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3121 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3124 bpfjit_free_code(code);
3127 ATF_TC(libbpfjit_opt_ld_ind_2);
3128 ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
3130 atf_tc_set_md_var(tc, "descr",
3131 "Test JIT compilation with length optimization "
3132 "applied to BPF_LD+BPF_IND");
3135 ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
3137 static struct bpf_insn insns[] = {
3138 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3139 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3140 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3141 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3142 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3143 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3144 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3145 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3146 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3147 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3148 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3149 BPF_STMT(BPF_RET+BPF_K, 0),
3154 uint8_t pkt[2][34] = {
3156 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3157 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3158 0x80, 0x03, 0x70, 0x0f,
3159 0x80, 0x03, 0x70, 0x23
3162 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3163 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3164 0x80, 0x03, 0x70, 0x23,
3165 0x80, 0x03, 0x70, 0x0f
3169 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3171 ATF_CHECK(bpf_validate(insns, insn_count));
3173 code = bpfjit_generate_code(NULL, insns, insn_count);
3174 ATF_REQUIRE(code != NULL);
3176 for (i = 0; i < 2; i++) {
3177 for (j = 1; j < sizeof(pkt[i]); j++)
3178 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3179 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3182 bpfjit_free_code(code);
3185 ATF_TC(libbpfjit_opt_ld_ind_3);
3186 ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
3188 atf_tc_set_md_var(tc, "descr",
3189 "Test JIT compilation with length optimization "
3190 "applied to BPF_LD+BPF_IND");
3193 ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
3195 static struct bpf_insn insns[] = {
3196 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3197 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3198 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3199 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3200 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3201 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3202 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3203 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3204 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3205 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3206 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3207 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3208 BPF_STMT(BPF_RET+BPF_K, 0),
3213 uint8_t pkt[2][34] = {
3215 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3216 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3217 0x80, 0x03, 0x70, 0x0f,
3218 0x80, 0x03, 0x70, 0x23
3221 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3222 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3223 0x80, 0x03, 0x70, 0x23,
3224 0x80, 0x03, 0x70, 0x0f
3228 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3230 ATF_CHECK(bpf_validate(insns, insn_count));
3232 code = bpfjit_generate_code(NULL, insns, insn_count);
3233 ATF_REQUIRE(code != NULL);
3235 for (i = 0; i < 2; i++) {
3236 for (j = 1; j < sizeof(pkt[i]); j++)
3237 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3238 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3241 bpfjit_free_code(code);
3244 ATF_TC(libbpfjit_opt_ld_ind_4);
3245 ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
3247 atf_tc_set_md_var(tc, "descr",
3248 "Test JIT compilation with length optimization "
3249 "applied to BPF_LD+BPF_IND");
3252 ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
3254 static struct bpf_insn insns[] = {
3255 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3256 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3257 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3258 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3259 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3260 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3261 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3262 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3263 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3264 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3265 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3266 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3267 BPF_STMT(BPF_RET+BPF_K, 0),
3272 uint8_t pkt[2][34] = {
3274 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3275 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3276 0x80, 0x03, 0x70, 0x0f,
3277 0x80, 0x03, 0x70, 0x23
3280 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3281 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3282 0x80, 0x03, 0x70, 0x23,
3283 0x80, 0x03, 0x70, 0x0f
3287 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3289 ATF_CHECK(bpf_validate(insns, insn_count));
3291 code = bpfjit_generate_code(NULL, insns, insn_count);
3292 ATF_REQUIRE(code != NULL);
3294 for (i = 0; i < 2; i++) {
3295 for (j = 1; j < sizeof(pkt[i]); j++)
3296 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3297 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3300 bpfjit_free_code(code);
3303 ATF_TC(libbpfjit_abc_ja);
3304 ATF_TC_HEAD(libbpfjit_abc_ja, tc)
3306 atf_tc_set_md_var(tc, "descr",
3307 "Test ABC optimization with a single BPF_JMP+BPF_JA");
3310 ATF_TC_BODY(libbpfjit_abc_ja, tc)
3312 static struct bpf_insn insns[] = {
3313 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3314 BPF_STMT(BPF_JMP+BPF_JA, 2),
3315 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
3316 BPF_STMT(BPF_RET+BPF_K, 0),
3317 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
3318 BPF_STMT(BPF_RET+BPF_A, 0),
3319 BPF_STMT(BPF_RET+BPF_K, 1),
3320 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3321 BPF_STMT(BPF_RET+BPF_K, 2),
3322 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
3323 BPF_STMT(BPF_RET+BPF_K, 3),
3327 uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
3329 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3331 ATF_CHECK(bpf_validate(insns, insn_count));
3333 code = bpfjit_generate_code(NULL, insns, insn_count);
3334 ATF_REQUIRE(code != NULL);
3336 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3337 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3338 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3339 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3340 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3341 ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
3343 bpfjit_free_code(code);
3346 ATF_TC(libbpfjit_abc_ja_over);
3347 ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
3349 atf_tc_set_md_var(tc, "descr",
3350 "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
3353 ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
3355 static struct bpf_insn insns[] = {
3356 BPF_STMT(BPF_JMP+BPF_JA, 2),
3357 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
3358 BPF_STMT(BPF_RET+BPF_K, 0),
3359 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3360 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
3361 BPF_STMT(BPF_RET+BPF_K, 1),
3362 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
3363 BPF_STMT(BPF_RET+BPF_K, 2),
3364 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3365 BPF_STMT(BPF_RET+BPF_K, 3),
3369 uint8_t pkt[1]; /* the program doesn't read any data */
3371 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3373 ATF_CHECK(bpf_validate(insns, insn_count));
3375 code = bpfjit_generate_code(NULL, insns, insn_count);
3376 ATF_REQUIRE(code != NULL);
3378 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
3380 bpfjit_free_code(code);
3383 ATF_TC(libbpfjit_abc_ld_chain);
3384 ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
3386 atf_tc_set_md_var(tc, "descr",
3387 "Test ABC optimization of a chain of BPF_LD instructions "
3388 "with exits leading to a single BPF_RET");
3391 ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
3393 static struct bpf_insn insns[] = {
3394 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3395 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
3396 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
3397 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
3398 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
3399 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
3400 BPF_STMT(BPF_RET+BPF_K, 123456789),
3401 BPF_STMT(BPF_RET+BPF_K, 987654321),
3405 uint8_t pkt[10] = {};
3407 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3409 ATF_CHECK(bpf_validate(insns, insn_count));
3411 code = bpfjit_generate_code(NULL, insns, insn_count);
3412 ATF_REQUIRE(code != NULL);
3414 /* Packet is too short. */
3415 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3416 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3417 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3419 /* !(pkt[3] == 8) => return 123456789 */
3420 ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
3421 ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
3422 ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3423 ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
3424 ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
3425 ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3427 /* !(pkt[4:2] >= 7) => too short or return 123456789 */
3429 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3430 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3431 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3432 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3433 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3434 ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3435 ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3437 /* !(pkt[6:4] > 6) => too short or return 987654321 */
3438 pkt[4] = pkt[5] = 1;
3439 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3440 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3441 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3442 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3443 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3444 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3445 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3446 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3447 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3448 ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
3450 /* (pkt[6:4] > 6) => too short or return 123456789 */
3451 pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
3452 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3453 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3454 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3455 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3456 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3457 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3458 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3459 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3460 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3461 ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
3463 bpfjit_free_code(code);
3466 ATF_TC(libbpfjit_examples_1);
3467 ATF_TC_HEAD(libbpfjit_examples_1, tc)
3469 atf_tc_set_md_var(tc, "descr",
3470 "Test the first example from bpf(4) - "
3471 "accept Reverse ARP requests");
3474 ATF_TC_BODY(libbpfjit_examples_1, tc)
3477 * The following filter is taken from the Reverse ARP
3478 * Daemon. It accepts only Reverse ARP requests.
3480 struct bpf_insn insns[] = {
3481 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3482 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
3483 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
3484 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
3485 BPF_STMT(BPF_RET+BPF_K, 42),
3486 BPF_STMT(BPF_RET+BPF_K, 0),
3490 uint8_t pkt[22] = {};
3492 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3494 ATF_CHECK(bpf_validate(insns, insn_count));
3496 code = bpfjit_generate_code(NULL, insns, insn_count);
3497 ATF_REQUIRE(code != NULL);
3499 /* Packet is too short. */
3500 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3501 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3502 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3503 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3504 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3505 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3506 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3507 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3508 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3509 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3510 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3511 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3512 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3513 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3514 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3515 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3516 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3517 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3518 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3519 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3520 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3522 /* The packet doesn't match. */
3523 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3525 /* Still no match after setting the protocol field. */
3526 pkt[12] = 0x80; pkt[13] = 0x35;
3527 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3529 /* Set RARP message type. */
3531 ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
3533 /* Packet is too short. */
3534 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3535 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3536 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3537 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3538 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3539 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3540 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3541 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3542 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3543 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3544 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3545 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3546 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3547 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3548 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3549 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3550 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3551 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3552 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3553 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3554 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3556 /* Change RARP message type. */
3558 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3560 bpfjit_free_code(code);
3563 ATF_TC(libbpfjit_examples_2);
3564 ATF_TC_HEAD(libbpfjit_examples_2, tc)
3566 atf_tc_set_md_var(tc, "descr",
3567 "Test the second example from bpf(4) - "
3568 "accept IP packets between two specified hosts");
3571 ATF_TC_BODY(libbpfjit_examples_2, tc)
3574 * This filter accepts only IP packets between host 128.3.112.15
3577 static struct bpf_insn insns[] = {
3578 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3579 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
3580 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3581 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3582 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3583 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3584 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3585 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3586 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3587 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3588 BPF_STMT(BPF_RET+BPF_K, 0),
3592 uint8_t pkt[34] = {};
3594 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3596 ATF_CHECK(bpf_validate(insns, insn_count));
3598 code = bpfjit_generate_code(NULL, insns, insn_count);
3599 ATF_REQUIRE(code != NULL);
3601 /* Packet is too short. */
3602 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3603 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3604 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3605 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3606 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3607 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3608 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3609 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3610 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3611 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3612 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3613 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3614 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3615 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3616 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3617 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3618 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3619 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3620 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3621 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3622 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3623 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3624 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3625 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3626 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3627 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3628 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3629 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3630 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3631 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3632 ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
3633 ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
3634 ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
3636 /* The packet doesn't match. */
3637 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3639 /* Still no match after setting the protocol field. */
3641 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3643 pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
3644 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3646 pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
3647 ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
3649 /* Swap the ip addresses. */
3650 pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
3651 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3653 pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
3654 ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
3656 /* Packet is too short. */
3657 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3658 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3659 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3660 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3661 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3662 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3663 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3664 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3665 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3666 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3667 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3668 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3669 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3670 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3671 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3672 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3673 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3674 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3675 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3676 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3677 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3678 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3679 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3680 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3681 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3682 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3683 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3684 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3685 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3686 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3687 ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
3688 ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
3689 ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
3691 /* Change the protocol field. */
3693 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3695 bpfjit_free_code(code);
3698 ATF_TC(libbpfjit_examples_3);
3699 ATF_TC_HEAD(libbpfjit_examples_3, tc)
3701 atf_tc_set_md_var(tc, "descr",
3702 "Test the third example from bpf(4) - "
3703 "accept TCP finger packets");
3706 ATF_TC_BODY(libbpfjit_examples_3, tc)
3709 * This filter returns only TCP finger packets.
3711 struct bpf_insn insns[] = {
3712 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3713 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
3714 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
3715 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
3716 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
3717 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
3718 BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
3719 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
3720 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
3721 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
3722 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
3723 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3724 BPF_STMT(BPF_RET+BPF_K, 0),
3728 uint8_t pkt[30] = {};
3730 /* Set IP fragment offset to non-zero. */
3731 pkt[20] = 1; pkt[21] = 1;
3733 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3735 ATF_CHECK(bpf_validate(insns, insn_count));
3737 code = bpfjit_generate_code(NULL, insns, insn_count);
3738 ATF_REQUIRE(code != NULL);
3740 /* Packet is too short. */
3741 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3742 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3743 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3744 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3745 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3746 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3747 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3748 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3749 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3750 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3751 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3752 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3753 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3754 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3755 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3756 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3757 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3758 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3759 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3760 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3761 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3762 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3763 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3764 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3765 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3766 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3767 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3768 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3769 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3771 /* The packet doesn't match. */
3772 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3774 /* Still no match after setting the protocol field. */
3776 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3778 /* Get one step closer to the match. */
3780 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3782 /* Set IP fragment offset to zero. */
3783 pkt[20] = 0x20; pkt[21] = 0;
3784 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3786 /* Set IP header length to 12. */
3788 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3790 /* Match one branch of the program. */
3792 ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
3794 /* Match the other branch of the program. */
3795 pkt[29] = 79; pkt[27] = 0;
3796 ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
3798 /* Packet is too short. */
3799 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3800 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3801 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3802 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3803 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3804 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3805 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3806 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3807 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3808 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3809 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3810 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3811 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3812 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3813 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3814 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3815 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3816 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3817 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3818 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3819 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3820 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3821 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3822 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3823 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3824 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3825 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3826 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3827 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3829 /* Set IP header length to 16. Packet is too short. */
3831 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3833 bpfjit_free_code(code);
3836 ATF_TC(libbpfjit_cop_no_ctx);
3837 ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
3839 atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
3840 "instruction can't be accepted without a context");
3843 ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
3845 static struct bpf_insn insns[] = {
3846 BPF_STMT(BPF_MISC+BPF_COP, 0),
3847 BPF_STMT(BPF_RET+BPF_K, 7)
3850 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3852 ATF_CHECK(!bpf_validate(insns, insn_count));
3854 ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
3857 ATF_TC(libbpfjit_copx_no_ctx);
3858 ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
3860 atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
3861 "instruction can't be accepted without a context");
3864 ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
3866 static struct bpf_insn insns[] = {
3867 BPF_STMT(BPF_MISC+BPF_COPX, 0),
3868 BPF_STMT(BPF_RET+BPF_K, 7)
3871 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3873 ATF_CHECK(!bpf_validate(insns, insn_count));
3875 ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
3882 * For every new test please also add a similar test
3883 * to ../../net/bpfjit/t_bpfjit.c
3885 ATF_TP_ADD_TC(tp, libbpfjit_empty);
3886 ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
3887 ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
3888 ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
3889 ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
3890 ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
3891 ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
3892 ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
3893 ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
3894 ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
3895 ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
3896 ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
3897 ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
3898 ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
3899 ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
3900 ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
3901 ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
3902 ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
3903 ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
3904 ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
3905 ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
3906 ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
3907 ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
3908 ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
3909 ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
3910 ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
3911 ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
3912 ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
3913 ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
3914 ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
3915 ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
3916 ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
3917 ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
3918 ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
3919 ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
3920 ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
3921 ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
3922 ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
3923 ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
3924 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
3925 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
3926 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
3927 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
3928 ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
3929 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
3930 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
3931 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
3932 ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
3933 ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
3934 ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
3935 ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
3936 ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
3937 ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
3938 ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
3939 ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
3940 ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
3941 ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
3942 ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
3943 ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
3944 ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
3945 ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
3946 ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
3947 ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
3948 ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
3949 ATF_TP_ADD_TC(tp, libbpfjit_st1);
3950 ATF_TP_ADD_TC(tp, libbpfjit_st2);
3951 ATF_TP_ADD_TC(tp, libbpfjit_st3);
3952 ATF_TP_ADD_TC(tp, libbpfjit_st4);
3953 ATF_TP_ADD_TC(tp, libbpfjit_st5);
3954 ATF_TP_ADD_TC(tp, libbpfjit_stx1);
3955 ATF_TP_ADD_TC(tp, libbpfjit_stx2);
3956 ATF_TP_ADD_TC(tp, libbpfjit_stx3);
3957 ATF_TP_ADD_TC(tp, libbpfjit_stx4);
3958 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
3959 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
3960 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
3961 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
3962 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
3963 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
3964 ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
3965 ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
3966 ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
3967 ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
3968 ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
3969 ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
3970 ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
3971 ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
3972 ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
3974 return atf_no_error();