static void load_and_attach_program(void) { int prog_fd, ret; struct bpf_object *obj; ret = bpf_flow_load(&obj, cfg_path_name, cfg_section_name, cfg_map_name, &prog_fd); if (ret) error(1, 0, "bpf_flow_load %s", cfg_path_name); ret = bpf_prog_attach(prog_fd, 0 /* Ignore */, BPF_FLOW_DISSECTOR, 0); if (ret) error(1, 0, "bpf_prog_attach %s", cfg_path_name); ret = bpf_object__pin(obj, cfg_pin_path); if (ret) error(1, 0, "bpf_object__pin %s", cfg_pin_path); }
static int __test__bpf(int idx) { int ret; void *obj_buf; size_t obj_buf_sz; struct bpf_object *obj; ret = test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz, bpf_testcase_table[idx].prog_id, true, NULL); if (ret != TEST_OK || !obj_buf || !obj_buf_sz) { pr_debug("Unable to get BPF object, %s\n", bpf_testcase_table[idx].msg_compile_fail); if (idx == 0) return TEST_SKIP; else return TEST_FAIL; } obj = prepare_bpf(obj_buf, obj_buf_sz, bpf_testcase_table[idx].name); if ((!!bpf_testcase_table[idx].target_func) != (!!obj)) { if (!obj) pr_debug("Fail to load BPF object: %s\n", bpf_testcase_table[idx].msg_load_fail); else pr_debug("Success unexpectedly: %s\n", bpf_testcase_table[idx].msg_load_fail); ret = TEST_FAIL; goto out; } if (obj) { ret = do_test(obj, bpf_testcase_table[idx].target_func, bpf_testcase_table[idx].expect_result); if (ret != TEST_OK) goto out; if (bpf_testcase_table[idx].pin) { int err; if (!bpf_fs__mount()) { pr_debug("BPF filesystem not mounted\n"); ret = TEST_FAIL; goto out; } err = mkdir(PERF_TEST_BPF_PATH, 0777); if (err && errno != EEXIST) { pr_debug("Failed to make perf_test dir: %s\n", strerror(errno)); ret = TEST_FAIL; goto out; } if (bpf_object__pin(obj, PERF_TEST_BPF_PATH)) ret = TEST_FAIL; if (rm_rf(PERF_TEST_BPF_PATH)) ret = TEST_FAIL; } } out: bpf__clear(); return ret; }