" [ node_guid EUI64 ]\n"
" [ port_guid EUI64 ] ]\n"
" [ { xdp | xdpgeneric | xdpdrv | xdpoffload } { off |\n"
+#ifdef HAVE_LIBBPF
+ " object FILE [ { section | program } NAME ] [ verbose ] |\n"
+#else
" object FILE [ section NAME ] [ verbose ] |\n"
+#endif
" pinned FILE } ]\n"
" [ master DEVICE ][ vrf NAME ]\n"
" [ nomaster ]\n"
static int bpf_do_parse(struct bpf_cfg_in *cfg, const bool *opt_tbl)
{
- const char *file, *section, *uds_name;
+ const char *file, *section, *uds_name, *prog_name;
bool verbose = false;
int i, ret, argc;
char **argv;
}
NEXT_ARG();
- file = section = uds_name = NULL;
+ file = section = uds_name = prog_name = NULL;
if (cfg->mode == EBPF_OBJECT || cfg->mode == EBPF_PINNED) {
file = *argv;
NEXT_ARG_FWD();
NEXT_ARG_FWD();
}
+ if (argc > 0 && strcmp(*argv, "program") == 0) {
+ NEXT_ARG();
+ prog_name = *argv;
+ NEXT_ARG_FWD();
+ }
+
if (__bpf_prog_meta[cfg->type].may_uds_export) {
uds_name = getenv(BPF_ENV_UDS);
if (argc > 0 && !uds_name &&
cfg->argc = argc;
cfg->argv = argv;
cfg->verbose = verbose;
+ cfg->prog_name = prog_name;
return ret;
}
return bpf_map__type(map) == BPF_MAP_TYPE_PERF_EVENT_ARRAY;
}
+static bool find_prog_to_attach(struct bpf_program *prog,
+ struct bpf_program *exist_prog,
+ const char *section, const char *prog_name)
+{
+ if (exist_prog)
+ return false;
+
+ /* We have default section name 'prog'. So do not check
+ * section name if there already has program name.
+ */
+ if (prog_name)
+ return !strcmp(bpf_program__name(prog), prog_name);
+ else
+ return !strcmp(get_bpf_program__section_name(prog), section);
+}
+
static int load_bpf_object(struct bpf_cfg_in *cfg)
{
struct bpf_program *p, *prog = NULL;
}
bpf_object__for_each_program(p, obj) {
- bool prog_to_attach = !prog && cfg->section &&
- !strcmp(get_bpf_program__section_name(p), cfg->section);
+ bool prog_to_attach = find_prog_to_attach(p, prog,
+ cfg->section,
+ cfg->prog_name);
/* Only load the programs that will either be subsequently
* attached or inserted into a tail call map */
}
if (!prog) {
- fprintf(stderr, "object file doesn't contain sec %s\n", cfg->section);
+ if (cfg->prog_name)
+ fprintf(stderr, "object file doesn't contain prog %s\n", cfg->prog_name);
+ else
+ fprintf(stderr, "object file doesn't contain sec %s\n", cfg->section);
return -ENOENT;
}
.in +8
.BR object
.IR FILE
-.RB "[ " section
+.RB "[ { " section " | " program " } "
.IR NAME " ]"
.RB "[ " verbose " ] |"
.br
.B object
option.
+.BI program " NAME "
+- Specifies the BPF program name that need to be attached. When the program
+name is specified, the section name parameter will be ignored. This option
+only works when iproute2 build with
+.B libbpf
+support.
+
.BI verbose
- Act in verbose mode. For example, even in case of success, this will
print the verifier log in case a program was loaded from a BPF ELF file.