Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
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     /* destructor will destory underlying skeleton */
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     /* libbpf.h */
0106     libbpf_set_print(NULL);
0107 
0108     /* bpf.h */
0109     bpf_prog_get_fd_by_id(0);
0110 
0111     /* btf.h */
0112     btf = btf__new(NULL, 0);
0113     if (!libbpf_get_error(btf))
0114         btf_dump__new(btf, dump_printf, nullptr, &opts);
0115 
0116     /* BPF skeleton */
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 }