1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
6 #include <bpf/libbpf.h>
13 #include "test_core_extern.skel.h"
14 #include "struct_ops_module.skel.h"
21 Skeleton(): skel(nullptr) { }
23 ~Skeleton() { if (skel
) T::destroy(skel
); }
25 int open(const struct bpf_object_open_opts
*opts
= nullptr)
33 err
= libbpf_get_error(skel
);
42 int load() { return T::load(skel
); }
44 int attach() { return T::attach(skel
); }
46 void detach() { return T::detach(skel
); }
48 const T
* operator->() const { return skel
; }
50 T
* operator->() { return skel
; }
52 const T
*get() const { return skel
; }
55 static void dump_printf(void *ctx
, const char *fmt
, va_list args
)
59 static void try_skeleton_template()
61 Skeleton
<test_core_extern
> skel
;
62 std::string prog_name
;
64 LIBBPF_OPTS(bpf_object_open_opts
, opts
);
66 err
= skel
.open(&opts
);
68 fprintf(stderr
, "Skeleton open failed: %d\n", err
);
72 skel
->data
->kern_ver
= 123;
73 skel
->data
->int_val
= skel
->data
->ushort_val
;
77 fprintf(stderr
, "Skeleton load failed: %d\n", err
);
81 if (!skel
->kconfig
->CONFIG_BPF_SYSCALL
)
82 fprintf(stderr
, "Seems like CONFIG_BPF_SYSCALL isn't set?!\n");
86 fprintf(stderr
, "Skeleton attach failed: %d\n", err
);
90 prog_name
= bpf_program__name(skel
->progs
.handle_sys_enter
);
91 if (prog_name
!= "handle_sys_enter")
92 fprintf(stderr
, "Unexpected program name: %s\n", prog_name
.c_str());
94 bpf_link__destroy(skel
->links
.handle_sys_enter
);
95 skel
->links
.handle_sys_enter
= bpf_program__attach(skel
->progs
.handle_sys_enter
);
99 /* destructor will destroy underlying skeleton */
102 int main(int argc
, char *argv
[])
104 struct btf_dump_opts opts
= { };
105 struct test_core_extern
*skel
;
106 struct struct_ops_module
*skel2
;
110 try_skeleton_template();
113 libbpf_set_print(NULL
);
116 bpf_prog_get_fd_by_id(0);
119 btf
= btf__new(NULL
, 0);
120 if (!libbpf_get_error(btf
))
121 btf_dump__new(btf
, dump_printf
, nullptr, &opts
);
124 skel
= test_core_extern__open_and_load();
125 test_core_extern__destroy(skel
);
127 skel2
= struct_ops_module__open_and_load();
128 struct_ops_module__destroy(skel2
);
130 fd
= bpf_enable_stats(BPF_STATS_RUN_TIME
);
132 std::cout
<< "FAILED to enable stats: " << fd
<< std::endl
;
136 std::cout
<< "DONE!" << std::endl
;