test_cpp.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
  2. #include <iostream>
  3. #include <unistd.h>
  4. #include <linux/bpf.h>
  5. #include <linux/btf.h>
  6. #include <bpf/libbpf.h>
  7. #include <bpf/bpf.h>
  8. #include <bpf/btf.h>
  9. #ifndef _Bool
  10. #define _Bool bool
  11. #endif
  12. #include "test_core_extern.skel.h"
  13. #include "struct_ops_module.skel.h"
  14. template <typename T>
  15. class Skeleton {
  16. private:
  17. T *skel;
  18. public:
  19. Skeleton(): skel(nullptr) { }
  20. ~Skeleton() { if (skel) T::destroy(skel); }
  21. int open(const struct bpf_object_open_opts *opts = nullptr)
  22. {
  23. int err;
  24. if (skel)
  25. return -EBUSY;
  26. skel = T::open(opts);
  27. err = libbpf_get_error(skel);
  28. if (err) {
  29. skel = nullptr;
  30. return err;
  31. }
  32. return 0;
  33. }
  34. int load() { return T::load(skel); }
  35. int attach() { return T::attach(skel); }
  36. void detach() { return T::detach(skel); }
  37. const T* operator->() const { return skel; }
  38. T* operator->() { return skel; }
  39. const T *get() const { return skel; }
  40. };
  41. static void dump_printf(void *ctx, const char *fmt, va_list args)
  42. {
  43. }
  44. static void try_skeleton_template()
  45. {
  46. Skeleton<test_core_extern> skel;
  47. std::string prog_name;
  48. int err;
  49. LIBBPF_OPTS(bpf_object_open_opts, opts);
  50. err = skel.open(&opts);
  51. if (err) {
  52. fprintf(stderr, "Skeleton open failed: %d\n", err);
  53. return;
  54. }
  55. skel->data->kern_ver = 123;
  56. skel->data->int_val = skel->data->ushort_val;
  57. err = skel.load();
  58. if (err) {
  59. fprintf(stderr, "Skeleton load failed: %d\n", err);
  60. return;
  61. }
  62. if (!skel->kconfig->CONFIG_BPF_SYSCALL)
  63. fprintf(stderr, "Seems like CONFIG_BPF_SYSCALL isn't set?!\n");
  64. err = skel.attach();
  65. if (err) {
  66. fprintf(stderr, "Skeleton attach failed: %d\n", err);
  67. return;
  68. }
  69. prog_name = bpf_program__name(skel->progs.handle_sys_enter);
  70. if (prog_name != "handle_sys_enter")
  71. fprintf(stderr, "Unexpected program name: %s\n", prog_name.c_str());
  72. bpf_link__destroy(skel->links.handle_sys_enter);
  73. skel->links.handle_sys_enter = bpf_program__attach(skel->progs.handle_sys_enter);
  74. skel.detach();
  75. /* destructor will destroy underlying skeleton */
  76. }
  77. int main(int argc, char *argv[])
  78. {
  79. struct btf_dump_opts opts = { };
  80. struct test_core_extern *skel;
  81. struct struct_ops_module *skel2;
  82. struct btf *btf;
  83. int fd;
  84. try_skeleton_template();
  85. /* libbpf.h */
  86. libbpf_set_print(NULL);
  87. /* bpf.h */
  88. bpf_prog_get_fd_by_id(0);
  89. /* btf.h */
  90. btf = btf__new(NULL, 0);
  91. if (!libbpf_get_error(btf))
  92. btf_dump__new(btf, dump_printf, nullptr, &opts);
  93. /* BPF skeleton */
  94. skel = test_core_extern__open_and_load();
  95. test_core_extern__destroy(skel);
  96. skel2 = struct_ops_module__open_and_load();
  97. struct_ops_module__destroy(skel2);
  98. fd = bpf_enable_stats(BPF_STATS_RUN_TIME);
  99. if (fd < 0)
  100. std::cout << "FAILED to enable stats: " << fd << std::endl;
  101. else
  102. ::close(fd);
  103. std::cout << "DONE!" << std::endl;
  104. return 0;
  105. }