flow_dissector_load.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
  2. #ifndef FLOW_DISSECTOR_LOAD
  3. #define FLOW_DISSECTOR_LOAD
  4. #include <bpf/bpf.h>
  5. #include <bpf/libbpf.h>
  6. #include "testing_helpers.h"
  7. static inline int bpf_flow_load(struct bpf_object **obj,
  8. const char *path,
  9. const char *prog_name,
  10. const char *map_name,
  11. const char *keys_map_name,
  12. int *prog_fd,
  13. int *keys_fd)
  14. {
  15. struct bpf_program *prog, *main_prog;
  16. struct bpf_map *prog_array, *keys;
  17. int prog_array_fd;
  18. int ret, fd, i;
  19. ret = bpf_prog_test_load(path, BPF_PROG_TYPE_FLOW_DISSECTOR, obj,
  20. prog_fd);
  21. if (ret)
  22. return ret;
  23. main_prog = bpf_object__find_program_by_name(*obj, prog_name);
  24. if (!main_prog)
  25. return -1;
  26. *prog_fd = bpf_program__fd(main_prog);
  27. if (*prog_fd < 0)
  28. return -1;
  29. prog_array = bpf_object__find_map_by_name(*obj, map_name);
  30. if (!prog_array)
  31. return -1;
  32. prog_array_fd = bpf_map__fd(prog_array);
  33. if (prog_array_fd < 0)
  34. return -1;
  35. if (keys_map_name && keys_fd) {
  36. keys = bpf_object__find_map_by_name(*obj, keys_map_name);
  37. if (!keys)
  38. return -1;
  39. *keys_fd = bpf_map__fd(keys);
  40. if (*keys_fd < 0)
  41. return -1;
  42. }
  43. i = 0;
  44. bpf_object__for_each_program(prog, *obj) {
  45. fd = bpf_program__fd(prog);
  46. if (fd < 0)
  47. return fd;
  48. if (fd != *prog_fd) {
  49. bpf_map_update_elem(prog_array_fd, &i, &fd, BPF_ANY);
  50. ++i;
  51. }
  52. }
  53. return 0;
  54. }
  55. #endif /* FLOW_DISSECTOR_LOAD */