1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020 Facebook */
3 
4 #include <test_progs.h>
5 #include "test_module_attach.skel.h"
6 
7 static int duration;
8 
9 static int delete_module(const char *name, int flags)
10 {
11 	return syscall(__NR_delete_module, name, flags);
12 }
13 
14 void test_module_attach(void)
15 {
16 	const int READ_SZ = 456;
17 	const int WRITE_SZ = 457;
18 	struct test_module_attach* skel;
19 	struct test_module_attach__bss *bss;
20 	struct bpf_link *link;
21 	int err;
22 
23 	skel = test_module_attach__open();
24 	if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
25 		return;
26 
27 	err = bpf_program__set_attach_target(skel->progs.handle_fentry_manual,
28 					     0, "bpf_testmod_test_read");
29 	ASSERT_OK(err, "set_attach_target");
30 
31 	err = test_module_attach__load(skel);
32 	if (CHECK(err, "skel_load", "failed to load skeleton\n"))
33 		return;
34 
35 	bss = skel->bss;
36 
37 	err = test_module_attach__attach(skel);
38 	if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err))
39 		goto cleanup;
40 
41 	/* trigger tracepoint */
42 	ASSERT_OK(trigger_module_test_read(READ_SZ), "trigger_read");
43 	ASSERT_OK(trigger_module_test_write(WRITE_SZ), "trigger_write");
44 
45 	ASSERT_EQ(bss->raw_tp_read_sz, READ_SZ, "raw_tp");
46 	ASSERT_EQ(bss->raw_tp_bare_write_sz, WRITE_SZ, "raw_tp_bare");
47 	ASSERT_EQ(bss->tp_btf_read_sz, READ_SZ, "tp_btf");
48 	ASSERT_EQ(bss->fentry_read_sz, READ_SZ, "fentry");
49 	ASSERT_EQ(bss->fentry_manual_read_sz, READ_SZ, "fentry_manual");
50 	ASSERT_EQ(bss->fexit_read_sz, READ_SZ, "fexit");
51 	ASSERT_EQ(bss->fexit_ret, -EIO, "fexit_tet");
52 	ASSERT_EQ(bss->fmod_ret_read_sz, READ_SZ, "fmod_ret");
53 
54 	test_module_attach__detach(skel);
55 
56 	/* attach fentry/fexit and make sure it get's module reference */
57 	link = bpf_program__attach(skel->progs.handle_fentry);
58 	if (!ASSERT_OK_PTR(link, "attach_fentry"))
59 		goto cleanup;
60 
61 	ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module");
62 	bpf_link__destroy(link);
63 
64 	link = bpf_program__attach(skel->progs.handle_fexit);
65 	if (!ASSERT_OK_PTR(link, "attach_fexit"))
66 		goto cleanup;
67 
68 	ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module");
69 	bpf_link__destroy(link);
70 
71 cleanup:
72 	test_module_attach__destroy(skel);
73 }
74