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