root/tools/testing/selftests/bpf/flow_dissector_load.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. bpf_flow_load

   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 
   8 static 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 */

/* [<][>][^][v][top][bottom][index][help] */