0001
0002 #ifndef FLOW_DISSECTOR_LOAD
0003 #define FLOW_DISSECTOR_LOAD
0004
0005 #include <bpf/bpf.h>
0006 #include <bpf/libbpf.h>
0007 #include "testing_helpers.h"
0008
0009 static inline int bpf_flow_load(struct bpf_object **obj,
0010 const char *path,
0011 const char *prog_name,
0012 const char *map_name,
0013 const char *keys_map_name,
0014 int *prog_fd,
0015 int *keys_fd)
0016 {
0017 struct bpf_program *prog, *main_prog;
0018 struct bpf_map *prog_array, *keys;
0019 int prog_array_fd;
0020 int ret, fd, i;
0021
0022 ret = bpf_prog_test_load(path, BPF_PROG_TYPE_FLOW_DISSECTOR, obj,
0023 prog_fd);
0024 if (ret)
0025 return ret;
0026
0027 main_prog = bpf_object__find_program_by_name(*obj, prog_name);
0028 if (!main_prog)
0029 return -1;
0030
0031 *prog_fd = bpf_program__fd(main_prog);
0032 if (*prog_fd < 0)
0033 return -1;
0034
0035 prog_array = bpf_object__find_map_by_name(*obj, map_name);
0036 if (!prog_array)
0037 return -1;
0038
0039 prog_array_fd = bpf_map__fd(prog_array);
0040 if (prog_array_fd < 0)
0041 return -1;
0042
0043 if (keys_map_name && keys_fd) {
0044 keys = bpf_object__find_map_by_name(*obj, keys_map_name);
0045 if (!keys)
0046 return -1;
0047
0048 *keys_fd = bpf_map__fd(keys);
0049 if (*keys_fd < 0)
0050 return -1;
0051 }
0052
0053 i = 0;
0054 bpf_object__for_each_program(prog, *obj) {
0055 fd = bpf_program__fd(prog);
0056 if (fd < 0)
0057 return fd;
0058
0059 if (fd != *prog_fd) {
0060 bpf_map_update_elem(prog_array_fd, &i, &fd, BPF_ANY);
0061 ++i;
0062 }
0063 }
0064
0065 return 0;
0066 }
0067
0068 #endif