Lines Matching +full:spec +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
13 (strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1 : strlen(pfx)) == 0)
41 static int sysctl_unpriv_disabled = -1;
70 if (!tester->log_buf) { in tester_init()
71 tester->log_buf_sz = TEST_LOADER_LOG_BUF_SZ; in tester_init()
72 tester->log_buf = malloc(tester->log_buf_sz); in tester_init()
73 if (!ASSERT_OK_PTR(tester->log_buf, "tester_log_buf")) in tester_init()
74 return -ENOMEM; in tester_init()
85 free(tester->log_buf); in test_loader_fini()
88 static void free_test_spec(struct test_spec *spec) in free_test_spec() argument
90 free(spec->priv.name); in free_test_spec()
91 free(spec->unpriv.name); in free_test_spec()
92 free(spec->priv.expect_msgs); in free_test_spec()
93 free(spec->unpriv.expect_msgs); in free_test_spec()
95 spec->priv.name = NULL; in free_test_spec()
96 spec->unpriv.name = NULL; in free_test_spec()
97 spec->priv.expect_msgs = NULL; in free_test_spec()
98 spec->unpriv.expect_msgs = NULL; in free_test_spec()
105 tmp = realloc(subspec->expect_msgs, (1 + subspec->expect_msg_cnt) * sizeof(void *)); in push_msg()
108 return -ENOMEM; in push_msg()
110 subspec->expect_msgs = tmp; in push_msg()
111 subspec->expect_msgs[subspec->expect_msg_cnt++] = msg; in push_msg()
128 return -EINVAL; in parse_int()
163 struct test_spec *spec) in parse_test_spec() argument
171 memset(spec, 0, sizeof(*spec)); in parse_test_spec()
173 spec->prog_name = bpf_program__name(prog); in parse_test_spec()
178 return -EINVAL; in parse_test_spec()
181 func_id = btf__find_by_name_kind(btf, spec->prog_name, BTF_KIND_FUNC); in parse_test_spec()
183 ASSERT_FAIL("failed to find FUNC BTF type for '%s'", spec->prog_name); in parse_test_spec()
184 return -EINVAL; in parse_test_spec()
196 if (t->type != func_id || btf_decl_tag(t)->component_idx != -1) in parse_test_spec()
199 s = btf__str_by_offset(btf, t->name_off); in parse_test_spec()
201 description = s + sizeof(TEST_TAG_DESCRIPTION_PFX) - 1; in parse_test_spec()
203 spec->priv.expect_failure = true; in parse_test_spec()
204 spec->mode_mask |= PRIV; in parse_test_spec()
206 spec->priv.expect_failure = false; in parse_test_spec()
207 spec->mode_mask |= PRIV; in parse_test_spec()
209 spec->unpriv.expect_failure = true; in parse_test_spec()
210 spec->mode_mask |= UNPRIV; in parse_test_spec()
213 spec->unpriv.expect_failure = false; in parse_test_spec()
214 spec->mode_mask |= UNPRIV; in parse_test_spec()
217 spec->auxiliary = true; in parse_test_spec()
218 spec->mode_mask |= PRIV; in parse_test_spec()
220 spec->auxiliary = true; in parse_test_spec()
221 spec->mode_mask |= UNPRIV; in parse_test_spec()
223 msg = s + sizeof(TEST_TAG_EXPECT_MSG_PFX) - 1; in parse_test_spec()
224 err = push_msg(msg, &spec->priv); in parse_test_spec()
227 spec->mode_mask |= PRIV; in parse_test_spec()
229 msg = s + sizeof(TEST_TAG_EXPECT_MSG_PFX_UNPRIV) - 1; in parse_test_spec()
230 err = push_msg(msg, &spec->unpriv); in parse_test_spec()
233 spec->mode_mask |= UNPRIV; in parse_test_spec()
235 val = s + sizeof(TEST_TAG_RETVAL_PFX) - 1; in parse_test_spec()
236 err = parse_retval(val, &spec->priv.retval, "__retval"); in parse_test_spec()
239 spec->priv.execute = true; in parse_test_spec()
240 spec->mode_mask |= PRIV; in parse_test_spec()
242 val = s + sizeof(TEST_TAG_RETVAL_PFX_UNPRIV) - 1; in parse_test_spec()
243 err = parse_retval(val, &spec->unpriv.retval, "__retval_unpriv"); in parse_test_spec()
246 spec->mode_mask |= UNPRIV; in parse_test_spec()
247 spec->unpriv.execute = true; in parse_test_spec()
250 val = s + sizeof(TEST_TAG_LOG_LEVEL_PFX) - 1; in parse_test_spec()
251 err = parse_int(val, &spec->log_level, "test log level"); in parse_test_spec()
255 val = s + sizeof(TEST_TAG_PROG_FLAGS_PFX) - 1; in parse_test_spec()
257 spec->prog_flags |= BPF_F_STRICT_ALIGNMENT; in parse_test_spec()
259 spec->prog_flags |= BPF_F_ANY_ALIGNMENT; in parse_test_spec()
261 spec->prog_flags |= BPF_F_TEST_RND_HI32; in parse_test_spec()
263 spec->prog_flags |= BPF_F_TEST_STATE_FREQ; in parse_test_spec()
265 spec->prog_flags |= BPF_F_SLEEPABLE; in parse_test_spec()
267 spec->prog_flags |= BPF_F_XDP_HAS_FRAGS; in parse_test_spec()
272 spec->prog_flags |= tmp; in parse_test_spec()
277 if (spec->mode_mask == 0) in parse_test_spec()
278 spec->mode_mask = PRIV; in parse_test_spec()
281 description = spec->prog_name; in parse_test_spec()
283 if (spec->mode_mask & PRIV) { in parse_test_spec()
284 spec->priv.name = strdup(description); in parse_test_spec()
285 if (!spec->priv.name) { in parse_test_spec()
287 err = -ENOMEM; in parse_test_spec()
292 if (spec->mode_mask & UNPRIV) { in parse_test_spec()
300 err = -ENOMEM; in parse_test_spec()
306 spec->unpriv.name = name; in parse_test_spec()
309 if (spec->mode_mask & (PRIV | UNPRIV)) { in parse_test_spec()
311 spec->unpriv.expect_failure = spec->priv.expect_failure; in parse_test_spec()
314 spec->unpriv.retval = spec->priv.retval; in parse_test_spec()
315 spec->unpriv.execute = spec->priv.execute; in parse_test_spec()
318 if (!spec->unpriv.expect_msgs) { in parse_test_spec()
319 size_t sz = spec->priv.expect_msg_cnt * sizeof(void *); in parse_test_spec()
321 spec->unpriv.expect_msgs = malloc(sz); in parse_test_spec()
322 if (!spec->unpriv.expect_msgs) { in parse_test_spec()
324 err = -ENOMEM; in parse_test_spec()
327 memcpy(spec->unpriv.expect_msgs, spec->priv.expect_msgs, sz); in parse_test_spec()
328 spec->unpriv.expect_msg_cnt = spec->priv.expect_msg_cnt; in parse_test_spec()
332 spec->valid = true; in parse_test_spec()
337 free_test_spec(spec); in parse_test_spec()
342 struct test_spec *spec, in prepare_case() argument
353 bpf_program__set_log_buf(prog, tester->log_buf, tester->log_buf_sz); in prepare_case()
359 if ((spec->log_level & 3) < min_log_level) in prepare_case()
360 bpf_program__set_log_level(prog, (spec->log_level & 4) | min_log_level); in prepare_case()
362 bpf_program__set_log_level(prog, spec->log_level); in prepare_case()
365 bpf_program__set_flags(prog, prog_flags | spec->prog_flags); in prepare_case()
367 tester->log_buf[0] = '\0'; in prepare_case()
368 tester->next_match_pos = 0; in prepare_case()
386 for (i = 0; i < subspec->expect_msg_cnt; i++) { in validate_case()
390 expect_msg = subspec->expect_msgs[i]; in validate_case()
392 match = strstr(tester->log_buf + tester->next_match_pos, expect_msg); in validate_case()
396 emit_verifier_log(tester->log_buf, true /*force*/); in validate_case()
399 "MATCHED MSG: '%s'\n", subspec->expect_msgs[j]); in validate_case()
404 tester->next_match_pos = match - tester->log_buf + strlen(expect_msg); in validate_case()
419 err = cap_disable_effective(caps_to_drop, &caps->old_caps); in drop_capabilities()
425 caps->initialized = true; in drop_capabilities()
433 if (!caps->initialized) in restore_capabilities()
436 err = cap_enable_effective(caps->old_caps, NULL); in restore_capabilities()
439 caps->initialized = false; in restore_capabilities()
443 static bool can_execute_unpriv(struct test_loader *tester, struct test_spec *spec) in can_execute_unpriv() argument
449 if ((spec->prog_flags & BPF_F_ANY_ALIGNMENT) && !EFFICIENT_UNALIGNED_ACCESS) in can_execute_unpriv()
511 static bool should_do_test_run(struct test_spec *spec, struct test_subspec *subspec) in should_do_test_run() argument
513 if (!subspec->execute) in should_do_test_run()
516 if (subspec->expect_failure) in should_do_test_run()
519 if ((spec->prog_flags & BPF_F_ANY_ALIGNMENT) && !EFFICIENT_UNALIGNED_ACCESS) { in should_do_test_run()
537 struct test_spec *spec, in run_subtest() argument
540 struct test_subspec *subspec = unpriv ? &spec->unpriv : &spec->priv; in run_subtest()
549 if (!test__start_subtest(subspec->name)) in run_subtest()
553 if (!can_execute_unpriv(tester, spec)) { in run_subtest()
573 if (spec_iter->valid) { in run_subtest()
574 if (strcmp(bpf_program__name(tprog_iter), spec->prog_name) == 0) { in run_subtest()
579 if (spec_iter->auxiliary && in run_subtest()
580 spec_iter->mode_mask & (unpriv ? UNPRIV : PRIV)) in run_subtest()
587 prepare_case(tester, spec, tobj, tprog); in run_subtest()
598 if (subspec->expect_failure) { in run_subtest()
600 emit_verifier_log(tester->log_buf, false /*force*/); in run_subtest()
605 emit_verifier_log(tester->log_buf, true /*force*/); in run_subtest()
610 emit_verifier_log(tester->log_buf, false /*force*/); in run_subtest()
613 if (should_do_test_run(spec, subspec)) { in run_subtest()
620 if (tester->pre_execution_cb) { in run_subtest()
621 err = tester->pre_execution_cb(tobj); in run_subtest()
629 if (retval != subspec->retval && subspec->retval != POINTER_VALUE) { in run_subtest()
630 PRINT_FAIL("Unexpected retval: %d != %d\n", retval, subspec->retval); in run_subtest()
675 PRINT_FAIL("Can't parse test spec for program '%s'\n", in process_subtest()
681 struct test_spec *spec = &specs[i++]; in process_subtest() local
683 if (!spec->valid || spec->auxiliary) in process_subtest()
686 if (spec->mode_mask & PRIV) in process_subtest()
688 specs, spec, false); in process_subtest()
689 if (spec->mode_mask & UNPRIV) in process_subtest()
691 specs, spec, true); in process_subtest()