0001
0002 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0003 #include <linux/init.h>
0004 #include <linux/module.h>
0005 #include "bpf_preload.h"
0006 #include "iterators/iterators.lskel.h"
0007
0008 static struct bpf_link *maps_link, *progs_link;
0009 static struct iterators_bpf *skel;
0010
0011 static void free_links_and_skel(void)
0012 {
0013 if (!IS_ERR_OR_NULL(maps_link))
0014 bpf_link_put(maps_link);
0015 if (!IS_ERR_OR_NULL(progs_link))
0016 bpf_link_put(progs_link);
0017 iterators_bpf__destroy(skel);
0018 }
0019
0020 static int preload(struct bpf_preload_info *obj)
0021 {
0022 strlcpy(obj[0].link_name, "maps.debug", sizeof(obj[0].link_name));
0023 obj[0].link = maps_link;
0024 strlcpy(obj[1].link_name, "progs.debug", sizeof(obj[1].link_name));
0025 obj[1].link = progs_link;
0026 return 0;
0027 }
0028
0029 static struct bpf_preload_ops ops = {
0030 .preload = preload,
0031 .owner = THIS_MODULE,
0032 };
0033
0034 static int load_skel(void)
0035 {
0036 int err;
0037
0038 skel = iterators_bpf__open();
0039 if (!skel)
0040 return -ENOMEM;
0041 err = iterators_bpf__load(skel);
0042 if (err)
0043 goto out;
0044 err = iterators_bpf__attach(skel);
0045 if (err)
0046 goto out;
0047 maps_link = bpf_link_get_from_fd(skel->links.dump_bpf_map_fd);
0048 if (IS_ERR(maps_link)) {
0049 err = PTR_ERR(maps_link);
0050 goto out;
0051 }
0052 progs_link = bpf_link_get_from_fd(skel->links.dump_bpf_prog_fd);
0053 if (IS_ERR(progs_link)) {
0054 err = PTR_ERR(progs_link);
0055 goto out;
0056 }
0057
0058
0059
0060 close_fd(skel->links.dump_bpf_map_fd);
0061 skel->links.dump_bpf_map_fd = 0;
0062 close_fd(skel->links.dump_bpf_prog_fd);
0063 skel->links.dump_bpf_prog_fd = 0;
0064 return 0;
0065 out:
0066 free_links_and_skel();
0067 return err;
0068 }
0069
0070 static int __init load(void)
0071 {
0072 int err;
0073
0074 err = load_skel();
0075 if (err)
0076 return err;
0077 bpf_preload_ops = &ops;
0078 return err;
0079 }
0080
0081 static void __exit fini(void)
0082 {
0083 bpf_preload_ops = NULL;
0084 free_links_and_skel();
0085 }
0086 late_initcall(load);
0087 module_exit(fini);
0088 MODULE_LICENSE("GPL");