1 // SPDX-License-Identifier: GPL-2.0
12 #include <bpf/libbpf.h>
14 #include "bpf_rlimit.h"
16 const char *cfg_pin_path = "/sys/fs/bpf/flow_dissector";
17 const char *cfg_map_name = "jmp_table";
18 bool cfg_attach = true;
19 char *cfg_section_name;
22 static void load_and_attach_program(void)
24 struct bpf_program *prog, *main_prog;
25 struct bpf_map *prog_array;
26 int i, fd, prog_fd, ret;
27 struct bpf_object *obj;
30 ret = bpf_prog_load(cfg_path_name, BPF_PROG_TYPE_FLOW_DISSECTOR, &obj,
33 error(1, 0, "bpf_prog_load %s", cfg_path_name);
35 main_prog = bpf_object__find_program_by_title(obj, cfg_section_name);
37 error(1, 0, "bpf_object__find_program_by_title %s",
40 prog_fd = bpf_program__fd(main_prog);
42 error(1, 0, "bpf_program__fd");
44 prog_array = bpf_object__find_map_by_name(obj, cfg_map_name);
46 error(1, 0, "bpf_object__find_map_by_name %s", cfg_map_name);
48 prog_array_fd = bpf_map__fd(prog_array);
49 if (prog_array_fd < 0)
50 error(1, 0, "bpf_map__fd %s", cfg_map_name);
53 bpf_object__for_each_program(prog, obj) {
54 fd = bpf_program__fd(prog);
56 error(1, 0, "bpf_program__fd");
59 printf("%d: %s\n", i, bpf_program__title(prog, false));
60 bpf_map_update_elem(prog_array_fd, &i, &fd, BPF_ANY);
65 ret = bpf_prog_attach(prog_fd, 0 /* Ignore */, BPF_FLOW_DISSECTOR, 0);
67 error(1, 0, "bpf_prog_attach %s", cfg_path_name);
69 ret = bpf_object__pin(obj, cfg_pin_path);
71 error(1, 0, "bpf_object__pin %s", cfg_pin_path);
75 static void detach_program(void)
80 ret = bpf_prog_detach(0, BPF_FLOW_DISSECTOR);
82 error(1, 0, "bpf_prog_detach");
84 /* To unpin, it is necessary and sufficient to just remove this dir */
85 sprintf(command, "rm -r %s", cfg_pin_path);
86 ret = system(command);
88 error(1, errno, command);
91 static void parse_opts(int argc, char **argv)
97 while ((c = getopt(argc, argv, "adp:s:")) != -1) {
101 error(1, 0, "attach/detach are exclusive");
106 error(1, 0, "attach/detach are exclusive");
111 error(1, 0, "only one prog name can be given");
113 cfg_path_name = optarg;
116 if (cfg_section_name)
117 error(1, 0, "only one section can be given");
119 cfg_section_name = optarg;
127 if (cfg_attach && !cfg_path_name)
128 error(1, 0, "must provide a path to the BPF program");
130 if (cfg_attach && !cfg_section_name)
131 error(1, 0, "must provide a section name");
134 int main(int argc, char **argv)
136 parse_opts(argc, argv);
138 load_and_attach_program();