Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
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 /* FLOW_DISSECTOR_LOAD */