16bf6affeSStanislav Fomichev /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
27c8dce4bSAndrii Nakryiko #include <iostream>
3f8186bf6SAndrii Nakryiko #include <unistd.h>
4f8186bf6SAndrii Nakryiko #include <linux/bpf.h>
5f8186bf6SAndrii Nakryiko #include <linux/btf.h>
63e689141SToke Høiland-Jørgensen #include <bpf/libbpf.h>
73e689141SToke Høiland-Jørgensen #include <bpf/bpf.h>
83e689141SToke Høiland-Jørgensen #include <bpf/btf.h>
9*aa95073fSTony Ambardar
10*aa95073fSTony Ambardar #ifndef _Bool
11*aa95073fSTony Ambardar #define _Bool bool
12*aa95073fSTony Ambardar #endif
137c8dce4bSAndrii Nakryiko #include "test_core_extern.skel.h"
14c2a0257cSKui-Feng Lee #include "struct_ops_module.skel.h"
156bf6affeSStanislav Fomichev
16189e0ecaSAndrii Nakryiko template <typename T>
17189e0ecaSAndrii Nakryiko class Skeleton {
18189e0ecaSAndrii Nakryiko private:
19189e0ecaSAndrii Nakryiko T *skel;
20189e0ecaSAndrii Nakryiko public:
Skeleton()21189e0ecaSAndrii Nakryiko Skeleton(): skel(nullptr) { }
22189e0ecaSAndrii Nakryiko
~Skeleton()23189e0ecaSAndrii Nakryiko ~Skeleton() { if (skel) T::destroy(skel); }
24189e0ecaSAndrii Nakryiko
open(const struct bpf_object_open_opts * opts=nullptr)25189e0ecaSAndrii Nakryiko int open(const struct bpf_object_open_opts *opts = nullptr)
26189e0ecaSAndrii Nakryiko {
27189e0ecaSAndrii Nakryiko int err;
28189e0ecaSAndrii Nakryiko
29189e0ecaSAndrii Nakryiko if (skel)
30189e0ecaSAndrii Nakryiko return -EBUSY;
31189e0ecaSAndrii Nakryiko
32189e0ecaSAndrii Nakryiko skel = T::open(opts);
33189e0ecaSAndrii Nakryiko err = libbpf_get_error(skel);
34189e0ecaSAndrii Nakryiko if (err) {
35189e0ecaSAndrii Nakryiko skel = nullptr;
36189e0ecaSAndrii Nakryiko return err;
37189e0ecaSAndrii Nakryiko }
38189e0ecaSAndrii Nakryiko
39189e0ecaSAndrii Nakryiko return 0;
40189e0ecaSAndrii Nakryiko }
41189e0ecaSAndrii Nakryiko
load()42189e0ecaSAndrii Nakryiko int load() { return T::load(skel); }
43189e0ecaSAndrii Nakryiko
attach()44189e0ecaSAndrii Nakryiko int attach() { return T::attach(skel); }
45189e0ecaSAndrii Nakryiko
detach()46189e0ecaSAndrii Nakryiko void detach() { return T::detach(skel); }
47189e0ecaSAndrii Nakryiko
operator ->() const48189e0ecaSAndrii Nakryiko const T* operator->() const { return skel; }
49189e0ecaSAndrii Nakryiko
operator ->()50189e0ecaSAndrii Nakryiko T* operator->() { return skel; }
51189e0ecaSAndrii Nakryiko
get() const52189e0ecaSAndrii Nakryiko const T *get() const { return skel; }
53189e0ecaSAndrii Nakryiko };
546bf6affeSStanislav Fomichev
dump_printf(void * ctx,const char * fmt,va_list args)55ecf45e60SJiri Olsa static void dump_printf(void *ctx, const char *fmt, va_list args)
56ecf45e60SJiri Olsa {
57ecf45e60SJiri Olsa }
58ecf45e60SJiri Olsa
try_skeleton_template()59189e0ecaSAndrii Nakryiko static void try_skeleton_template()
60189e0ecaSAndrii Nakryiko {
61189e0ecaSAndrii Nakryiko Skeleton<test_core_extern> skel;
62189e0ecaSAndrii Nakryiko std::string prog_name;
63189e0ecaSAndrii Nakryiko int err;
64189e0ecaSAndrii Nakryiko LIBBPF_OPTS(bpf_object_open_opts, opts);
65189e0ecaSAndrii Nakryiko
66189e0ecaSAndrii Nakryiko err = skel.open(&opts);
67189e0ecaSAndrii Nakryiko if (err) {
68189e0ecaSAndrii Nakryiko fprintf(stderr, "Skeleton open failed: %d\n", err);
69189e0ecaSAndrii Nakryiko return;
70189e0ecaSAndrii Nakryiko }
71189e0ecaSAndrii Nakryiko
72189e0ecaSAndrii Nakryiko skel->data->kern_ver = 123;
73189e0ecaSAndrii Nakryiko skel->data->int_val = skel->data->ushort_val;
74189e0ecaSAndrii Nakryiko
75189e0ecaSAndrii Nakryiko err = skel.load();
76189e0ecaSAndrii Nakryiko if (err) {
77189e0ecaSAndrii Nakryiko fprintf(stderr, "Skeleton load failed: %d\n", err);
78189e0ecaSAndrii Nakryiko return;
79189e0ecaSAndrii Nakryiko }
80189e0ecaSAndrii Nakryiko
81189e0ecaSAndrii Nakryiko if (!skel->kconfig->CONFIG_BPF_SYSCALL)
82189e0ecaSAndrii Nakryiko fprintf(stderr, "Seems like CONFIG_BPF_SYSCALL isn't set?!\n");
83189e0ecaSAndrii Nakryiko
84189e0ecaSAndrii Nakryiko err = skel.attach();
85189e0ecaSAndrii Nakryiko if (err) {
86189e0ecaSAndrii Nakryiko fprintf(stderr, "Skeleton attach failed: %d\n", err);
87189e0ecaSAndrii Nakryiko return;
88189e0ecaSAndrii Nakryiko }
89189e0ecaSAndrii Nakryiko
90189e0ecaSAndrii Nakryiko prog_name = bpf_program__name(skel->progs.handle_sys_enter);
91189e0ecaSAndrii Nakryiko if (prog_name != "handle_sys_enter")
92189e0ecaSAndrii Nakryiko fprintf(stderr, "Unexpected program name: %s\n", prog_name.c_str());
93189e0ecaSAndrii Nakryiko
94189e0ecaSAndrii Nakryiko bpf_link__destroy(skel->links.handle_sys_enter);
95189e0ecaSAndrii Nakryiko skel->links.handle_sys_enter = bpf_program__attach(skel->progs.handle_sys_enter);
96189e0ecaSAndrii Nakryiko
97189e0ecaSAndrii Nakryiko skel.detach();
98189e0ecaSAndrii Nakryiko
99df71a42cSTaichi Nishimura /* destructor will destroy underlying skeleton */
100189e0ecaSAndrii Nakryiko }
101189e0ecaSAndrii Nakryiko
main(int argc,char * argv[])1026bf6affeSStanislav Fomichev int main(int argc, char *argv[])
1036bf6affeSStanislav Fomichev {
104ecf45e60SJiri Olsa struct btf_dump_opts opts = { };
1057c8dce4bSAndrii Nakryiko struct test_core_extern *skel;
106c2a0257cSKui-Feng Lee struct struct_ops_module *skel2;
107ecf45e60SJiri Olsa struct btf *btf;
108f8186bf6SAndrii Nakryiko int fd;
1097c8dce4bSAndrii Nakryiko
110189e0ecaSAndrii Nakryiko try_skeleton_template();
111189e0ecaSAndrii Nakryiko
1126bf6affeSStanislav Fomichev /* libbpf.h */
1136bf6affeSStanislav Fomichev libbpf_set_print(NULL);
1146bf6affeSStanislav Fomichev
1156bf6affeSStanislav Fomichev /* bpf.h */
1166bf6affeSStanislav Fomichev bpf_prog_get_fd_by_id(0);
1176bf6affeSStanislav Fomichev
1186bf6affeSStanislav Fomichev /* btf.h */
119ecf45e60SJiri Olsa btf = btf__new(NULL, 0);
120189e0ecaSAndrii Nakryiko if (!libbpf_get_error(btf))
121ecf45e60SJiri Olsa btf_dump__new(btf, dump_printf, nullptr, &opts);
1226bf6affeSStanislav Fomichev
1237c8dce4bSAndrii Nakryiko /* BPF skeleton */
1247c8dce4bSAndrii Nakryiko skel = test_core_extern__open_and_load();
1257c8dce4bSAndrii Nakryiko test_core_extern__destroy(skel);
1267c8dce4bSAndrii Nakryiko
127c2a0257cSKui-Feng Lee skel2 = struct_ops_module__open_and_load();
128c2a0257cSKui-Feng Lee struct_ops_module__destroy(skel2);
129c2a0257cSKui-Feng Lee
130f8186bf6SAndrii Nakryiko fd = bpf_enable_stats(BPF_STATS_RUN_TIME);
131f8186bf6SAndrii Nakryiko if (fd < 0)
132f8186bf6SAndrii Nakryiko std::cout << "FAILED to enable stats: " << fd << std::endl;
133f8186bf6SAndrii Nakryiko else
134f8186bf6SAndrii Nakryiko ::close(fd);
135f8186bf6SAndrii Nakryiko
1367c8dce4bSAndrii Nakryiko std::cout << "DONE!" << std::endl;
1377c8dce4bSAndrii Nakryiko
1386bf6affeSStanislav Fomichev return 0;
1396bf6affeSStanislav Fomichev }
140