1 /* SPDX-License-Identifier: GPL-2.0
2 * Copyright (c) 2018 Jesper Dangaard Brouer, Red Hat Inc.
4 static const char *__doc__
=
5 "Libbpf test program for loading BPF ELF object files";
11 #include <bpf/libbpf.h>
14 static const struct option long_options
[] = {
15 {"help", no_argument
, NULL
, 'h' },
16 {"debug", no_argument
, NULL
, 'D' },
17 {"quiet", no_argument
, NULL
, 'q' },
21 static void usage(char *argv
[])
25 printf("\nDOCUMENTATION:\n%s\n\n", __doc__
);
26 printf(" Usage: %s (options-see-below) BPF_FILE\n", argv
[0]);
27 printf(" Listing options:\n");
28 for (i
= 0; long_options
[i
].name
!= 0; i
++) {
29 printf(" --%-12s", long_options
[i
].name
);
30 printf(" short-option: -%c",
37 #define DEFINE_PRINT_FN(name, enabled) \
38 static int libbpf_##name(const char *fmt, ...) \
43 va_start(args, fmt); \
45 fprintf(stderr, "[" #name "] "); \
46 ret = vfprintf(stderr, fmt, args); \
51 DEFINE_PRINT_FN(warning
, 1)
52 DEFINE_PRINT_FN(info
, 1)
53 DEFINE_PRINT_FN(debug
, 1)
55 #define EXIT_FAIL_LIBBPF EXIT_FAILURE
56 #define EXIT_FAIL_OPTION 2
58 int test_walk_progs(struct bpf_object
*obj
, bool verbose
)
60 struct bpf_program
*prog
;
63 bpf_object__for_each_program(prog
, obj
) {
66 printf("Prog (count:%d) section_name: %s\n", cnt
,
67 bpf_program__title(prog
, false));
72 int test_walk_maps(struct bpf_object
*obj
, bool verbose
)
77 bpf_map__for_each(map
, obj
) {
80 printf("Map (count:%d) name: %s\n", cnt
,
86 int test_open_file(char *filename
, bool verbose
)
88 struct bpf_object
*bpfobj
= NULL
;
92 printf("Open BPF ELF-file with libbpf: %s\n", filename
);
94 /* Load BPF ELF object file and check for errors */
95 bpfobj
= bpf_object__open(filename
);
96 err
= libbpf_get_error(bpfobj
);
99 libbpf_strerror(err
, err_buf
, sizeof(err_buf
));
101 printf("Unable to load eBPF objects in file '%s': %s\n",
103 return EXIT_FAIL_LIBBPF
;
105 test_walk_progs(bpfobj
, verbose
);
106 test_walk_maps(bpfobj
, verbose
);
109 printf("Close BPF ELF-file with libbpf: %s\n",
110 bpf_object__name(bpfobj
));
111 bpf_object__close(bpfobj
);
116 int main(int argc
, char **argv
)
118 char filename
[1024] = { 0 };
123 libbpf_set_print(libbpf_warning
, libbpf_info
, NULL
);
125 /* Parse commands line args */
126 while ((opt
= getopt_long(argc
, argv
, "hDq",
127 long_options
, &longindex
)) != -1) {
130 libbpf_set_print(libbpf_warning
, libbpf_info
,
133 case 'q': /* Use in scripting mode */
139 return EXIT_FAIL_OPTION
;
142 if (optind
>= argc
) {
144 printf("ERROR: Expected BPF_FILE argument after options\n");
145 return EXIT_FAIL_OPTION
;
147 snprintf(filename
, sizeof(filename
), "%s", argv
[optind
]);
149 return test_open_file(filename
, verbose
);