1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
3 | #include <linux/init.h> |
4 | #include <linux/module.h> |
5 | #include "bpf_preload.h" |
6 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
7 | #include "iterators/iterators.lskel-little-endian.h" |
8 | #else |
9 | #include "iterators/iterators.lskel-big-endian.h" |
10 | #endif |
11 | |
12 | static struct bpf_link *maps_link, *progs_link; |
13 | static struct iterators_bpf *skel; |
14 | |
15 | static void free_links_and_skel(void) |
16 | { |
17 | if (!IS_ERR_OR_NULL(ptr: maps_link)) |
18 | bpf_link_put(maps_link); |
19 | if (!IS_ERR_OR_NULL(ptr: progs_link)) |
20 | bpf_link_put(progs_link); |
21 | iterators_bpf__destroy(skel); |
22 | } |
23 | |
24 | static int preload(struct bpf_preload_info *obj) |
25 | { |
26 | strscpy(obj[0].link_name, "maps.debug", sizeof(obj[0].link_name)); |
27 | obj[0].link = maps_link; |
28 | strscpy(obj[1].link_name, "progs.debug", sizeof(obj[1].link_name)); |
29 | obj[1].link = progs_link; |
30 | return 0; |
31 | } |
32 | |
33 | static struct bpf_preload_ops ops = { |
34 | .preload = preload, |
35 | .owner = THIS_MODULE, |
36 | }; |
37 | |
38 | static int load_skel(void) |
39 | { |
40 | int err; |
41 | |
42 | skel = iterators_bpf__open(); |
43 | if (!skel) |
44 | return -ENOMEM; |
45 | err = iterators_bpf__load(skel); |
46 | if (err) |
47 | goto out; |
48 | err = iterators_bpf__attach(skel); |
49 | if (err) |
50 | goto out; |
51 | maps_link = bpf_link_get_from_fd(skel->links.dump_bpf_map_fd); |
52 | if (IS_ERR(ptr: maps_link)) { |
53 | err = PTR_ERR(ptr: maps_link); |
54 | goto out; |
55 | } |
56 | progs_link = bpf_link_get_from_fd(skel->links.dump_bpf_prog_fd); |
57 | if (IS_ERR(ptr: progs_link)) { |
58 | err = PTR_ERR(ptr: progs_link); |
59 | goto out; |
60 | } |
61 | /* Avoid taking over stdin/stdout/stderr of init process. Zeroing out |
62 | * makes skel_closenz() a no-op later in iterators_bpf__destroy(). |
63 | */ |
64 | close_fd(skel->links.dump_bpf_map_fd); |
65 | skel->links.dump_bpf_map_fd = 0; |
66 | close_fd(skel->links.dump_bpf_prog_fd); |
67 | skel->links.dump_bpf_prog_fd = 0; |
68 | return 0; |
69 | out: |
70 | free_links_and_skel(); |
71 | return err; |
72 | } |
73 | |
74 | static int __init load(void) |
75 | { |
76 | int err; |
77 | |
78 | err = load_skel(); |
79 | if (err) |
80 | return err; |
81 | bpf_preload_ops = &ops; |
82 | return err; |
83 | } |
84 | |
85 | static void __exit fini(void) |
86 | { |
87 | bpf_preload_ops = NULL; |
88 | free_links_and_skel(); |
89 | } |
90 | late_initcall(load); |
91 | module_exit(fini); |
92 | MODULE_LICENSE("GPL"); |
93 |