0001
0002 #include <iostream>
0003 #pragma GCC diagnostic push
0004 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
0005 #include <bpf/libbpf.h>
0006 #pragma GCC diagnostic pop
0007 #include <bpf/bpf.h>
0008 #include <bpf/btf.h>
0009 #include "test_core_extern.skel.h"
0010
0011 template <typename T>
0012 class Skeleton {
0013 private:
0014 T *skel;
0015 public:
0016 Skeleton(): skel(nullptr) { }
0017
0018 ~Skeleton() { if (skel) T::destroy(skel); }
0019
0020 int open(const struct bpf_object_open_opts *opts = nullptr)
0021 {
0022 int err;
0023
0024 if (skel)
0025 return -EBUSY;
0026
0027 skel = T::open(opts);
0028 err = libbpf_get_error(skel);
0029 if (err) {
0030 skel = nullptr;
0031 return err;
0032 }
0033
0034 return 0;
0035 }
0036
0037 int load() { return T::load(skel); }
0038
0039 int attach() { return T::attach(skel); }
0040
0041 void detach() { return T::detach(skel); }
0042
0043 const T* operator->() const { return skel; }
0044
0045 T* operator->() { return skel; }
0046
0047 const T *get() const { return skel; }
0048 };
0049
0050 static void dump_printf(void *ctx, const char *fmt, va_list args)
0051 {
0052 }
0053
0054 static void try_skeleton_template()
0055 {
0056 Skeleton<test_core_extern> skel;
0057 std::string prog_name;
0058 int err;
0059 LIBBPF_OPTS(bpf_object_open_opts, opts);
0060
0061 err = skel.open(&opts);
0062 if (err) {
0063 fprintf(stderr, "Skeleton open failed: %d\n", err);
0064 return;
0065 }
0066
0067 skel->data->kern_ver = 123;
0068 skel->data->int_val = skel->data->ushort_val;
0069
0070 err = skel.load();
0071 if (err) {
0072 fprintf(stderr, "Skeleton load failed: %d\n", err);
0073 return;
0074 }
0075
0076 if (!skel->kconfig->CONFIG_BPF_SYSCALL)
0077 fprintf(stderr, "Seems like CONFIG_BPF_SYSCALL isn't set?!\n");
0078
0079 err = skel.attach();
0080 if (err) {
0081 fprintf(stderr, "Skeleton attach failed: %d\n", err);
0082 return;
0083 }
0084
0085 prog_name = bpf_program__name(skel->progs.handle_sys_enter);
0086 if (prog_name != "handle_sys_enter")
0087 fprintf(stderr, "Unexpected program name: %s\n", prog_name.c_str());
0088
0089 bpf_link__destroy(skel->links.handle_sys_enter);
0090 skel->links.handle_sys_enter = bpf_program__attach(skel->progs.handle_sys_enter);
0091
0092 skel.detach();
0093
0094
0095 }
0096
0097 int main(int argc, char *argv[])
0098 {
0099 struct btf_dump_opts opts = { };
0100 struct test_core_extern *skel;
0101 struct btf *btf;
0102
0103 try_skeleton_template();
0104
0105
0106 libbpf_set_print(NULL);
0107
0108
0109 bpf_prog_get_fd_by_id(0);
0110
0111
0112 btf = btf__new(NULL, 0);
0113 if (!libbpf_get_error(btf))
0114 btf_dump__new(btf, dump_printf, nullptr, &opts);
0115
0116
0117 skel = test_core_extern__open_and_load();
0118 test_core_extern__destroy(skel);
0119
0120 std::cout << "DONE!" << std::endl;
0121
0122 return 0;
0123 }