tools/bpf: make libbpf _GNU_SOURCE friendly
[linux-2.6-microblaze.git] / tools / lib / bpf / libbpf.c
1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
3 /*
4  * Common eBPF ELF object loading operations.
5  *
6  * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org>
7  * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
8  * Copyright (C) 2015 Huawei Inc.
9  * Copyright (C) 2017 Nicira, Inc.
10  */
11
12 #ifndef _GNU_SOURCE
13 #define _GNU_SOURCE
14 #endif
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <stdarg.h>
18 #include <libgen.h>
19 #include <inttypes.h>
20 #include <string.h>
21 #include <unistd.h>
22 #include <fcntl.h>
23 #include <errno.h>
24 #include <asm/unistd.h>
25 #include <linux/err.h>
26 #include <linux/kernel.h>
27 #include <linux/bpf.h>
28 #include <linux/btf.h>
29 #include <linux/filter.h>
30 #include <linux/list.h>
31 #include <linux/limits.h>
32 #include <linux/perf_event.h>
33 #include <linux/ring_buffer.h>
34 #include <sys/stat.h>
35 #include <sys/types.h>
36 #include <sys/vfs.h>
37 #include <tools/libc_compat.h>
38 #include <libelf.h>
39 #include <gelf.h>
40
41 #include "libbpf.h"
42 #include "bpf.h"
43 #include "btf.h"
44 #include "str_error.h"
45
46 #ifndef EM_BPF
47 #define EM_BPF 247
48 #endif
49
50 #ifndef BPF_FS_MAGIC
51 #define BPF_FS_MAGIC            0xcafe4a11
52 #endif
53
54 #define __printf(a, b)  __attribute__((format(printf, a, b)))
55
56 __printf(1, 2)
57 static int __base_pr(const char *format, ...)
58 {
59         va_list args;
60         int err;
61
62         va_start(args, format);
63         err = vfprintf(stderr, format, args);
64         va_end(args);
65         return err;
66 }
67
68 static __printf(1, 2) libbpf_print_fn_t __pr_warning = __base_pr;
69 static __printf(1, 2) libbpf_print_fn_t __pr_info = __base_pr;
70 static __printf(1, 2) libbpf_print_fn_t __pr_debug;
71
72 #define __pr(func, fmt, ...)    \
73 do {                            \
74         if ((func))             \
75                 (func)("libbpf: " fmt, ##__VA_ARGS__); \
76 } while (0)
77
78 #define pr_warning(fmt, ...)    __pr(__pr_warning, fmt, ##__VA_ARGS__)
79 #define pr_info(fmt, ...)       __pr(__pr_info, fmt, ##__VA_ARGS__)
80 #define pr_debug(fmt, ...)      __pr(__pr_debug, fmt, ##__VA_ARGS__)
81
82 void libbpf_set_print(libbpf_print_fn_t warn,
83                       libbpf_print_fn_t info,
84                       libbpf_print_fn_t debug)
85 {
86         __pr_warning = warn;
87         __pr_info = info;
88         __pr_debug = debug;
89 }
90
91 #define STRERR_BUFSIZE  128
92
93 #define CHECK_ERR(action, err, out) do {        \
94         err = action;                   \
95         if (err)                        \
96                 goto out;               \
97 } while(0)
98
99
100 /* Copied from tools/perf/util/util.h */
101 #ifndef zfree
102 # define zfree(ptr) ({ free(*ptr); *ptr = NULL; })
103 #endif
104
105 #ifndef zclose
106 # define zclose(fd) ({                  \
107         int ___err = 0;                 \
108         if ((fd) >= 0)                  \
109                 ___err = close((fd));   \
110         fd = -1;                        \
111         ___err; })
112 #endif
113
114 #ifdef HAVE_LIBELF_MMAP_SUPPORT
115 # define LIBBPF_ELF_C_READ_MMAP ELF_C_READ_MMAP
116 #else
117 # define LIBBPF_ELF_C_READ_MMAP ELF_C_READ
118 #endif
119
120 struct bpf_capabilities {
121         /* v4.14: kernel support for program & map names. */
122         __u32 name:1;
123 };
124
125 /*
126  * bpf_prog should be a better name but it has been used in
127  * linux/filter.h.
128  */
129 struct bpf_program {
130         /* Index in elf obj file, for relocation use. */
131         int idx;
132         char *name;
133         int prog_ifindex;
134         char *section_name;
135         /* section_name with / replaced by _; makes recursive pinning
136          * in bpf_object__pin_programs easier
137          */
138         char *pin_name;
139         struct bpf_insn *insns;
140         size_t insns_cnt, main_prog_cnt;
141         enum bpf_prog_type type;
142
143         struct reloc_desc {
144                 enum {
145                         RELO_LD64,
146                         RELO_CALL,
147                 } type;
148                 int insn_idx;
149                 union {
150                         int map_idx;
151                         int text_off;
152                 };
153         } *reloc_desc;
154         int nr_reloc;
155
156         struct {
157                 int nr;
158                 int *fds;
159         } instances;
160         bpf_program_prep_t preprocessor;
161
162         struct bpf_object *obj;
163         void *priv;
164         bpf_program_clear_priv_t clear_priv;
165
166         enum bpf_attach_type expected_attach_type;
167         int btf_fd;
168         void *func_info;
169         __u32 func_info_rec_size;
170         __u32 func_info_len;
171
172         struct bpf_capabilities *caps;
173 };
174
175 struct bpf_map {
176         int fd;
177         char *name;
178         size_t offset;
179         int map_ifindex;
180         int inner_map_fd;
181         struct bpf_map_def def;
182         __u32 btf_key_type_id;
183         __u32 btf_value_type_id;
184         void *priv;
185         bpf_map_clear_priv_t clear_priv;
186 };
187
188 static LIST_HEAD(bpf_objects_list);
189
190 struct bpf_object {
191         char license[64];
192         __u32 kern_version;
193
194         struct bpf_program *programs;
195         size_t nr_programs;
196         struct bpf_map *maps;
197         size_t nr_maps;
198
199         bool loaded;
200         bool has_pseudo_calls;
201
202         /*
203          * Information when doing elf related work. Only valid if fd
204          * is valid.
205          */
206         struct {
207                 int fd;
208                 void *obj_buf;
209                 size_t obj_buf_sz;
210                 Elf *elf;
211                 GElf_Ehdr ehdr;
212                 Elf_Data *symbols;
213                 size_t strtabidx;
214                 struct {
215                         GElf_Shdr shdr;
216                         Elf_Data *data;
217                 } *reloc;
218                 int nr_reloc;
219                 int maps_shndx;
220                 int text_shndx;
221         } efile;
222         /*
223          * All loaded bpf_object is linked in a list, which is
224          * hidden to caller. bpf_objects__<func> handlers deal with
225          * all objects.
226          */
227         struct list_head list;
228
229         struct btf *btf;
230         struct btf_ext *btf_ext;
231
232         void *priv;
233         bpf_object_clear_priv_t clear_priv;
234
235         struct bpf_capabilities caps;
236
237         char path[];
238 };
239 #define obj_elf_valid(o)        ((o)->efile.elf)
240
241 void bpf_program__unload(struct bpf_program *prog)
242 {
243         int i;
244
245         if (!prog)
246                 return;
247
248         /*
249          * If the object is opened but the program was never loaded,
250          * it is possible that prog->instances.nr == -1.
251          */
252         if (prog->instances.nr > 0) {
253                 for (i = 0; i < prog->instances.nr; i++)
254                         zclose(prog->instances.fds[i]);
255         } else if (prog->instances.nr != -1) {
256                 pr_warning("Internal error: instances.nr is %d\n",
257                            prog->instances.nr);
258         }
259
260         prog->instances.nr = -1;
261         zfree(&prog->instances.fds);
262
263         zclose(prog->btf_fd);
264         zfree(&prog->func_info);
265 }
266
267 static void bpf_program__exit(struct bpf_program *prog)
268 {
269         if (!prog)
270                 return;
271
272         if (prog->clear_priv)
273                 prog->clear_priv(prog, prog->priv);
274
275         prog->priv = NULL;
276         prog->clear_priv = NULL;
277
278         bpf_program__unload(prog);
279         zfree(&prog->name);
280         zfree(&prog->section_name);
281         zfree(&prog->pin_name);
282         zfree(&prog->insns);
283         zfree(&prog->reloc_desc);
284
285         prog->nr_reloc = 0;
286         prog->insns_cnt = 0;
287         prog->idx = -1;
288 }
289
290 static char *__bpf_program__pin_name(struct bpf_program *prog)
291 {
292         char *name, *p;
293
294         name = p = strdup(prog->section_name);
295         while ((p = strchr(p, '/')))
296                 *p = '_';
297
298         return name;
299 }
300
301 static int
302 bpf_program__init(void *data, size_t size, char *section_name, int idx,
303                   struct bpf_program *prog)
304 {
305         if (size < sizeof(struct bpf_insn)) {
306                 pr_warning("corrupted section '%s'\n", section_name);
307                 return -EINVAL;
308         }
309
310         bzero(prog, sizeof(*prog));
311
312         prog->section_name = strdup(section_name);
313         if (!prog->section_name) {
314                 pr_warning("failed to alloc name for prog under section(%d) %s\n",
315                            idx, section_name);
316                 goto errout;
317         }
318
319         prog->pin_name = __bpf_program__pin_name(prog);
320         if (!prog->pin_name) {
321                 pr_warning("failed to alloc pin name for prog under section(%d) %s\n",
322                            idx, section_name);
323                 goto errout;
324         }
325
326         prog->insns = malloc(size);
327         if (!prog->insns) {
328                 pr_warning("failed to alloc insns for prog under section %s\n",
329                            section_name);
330                 goto errout;
331         }
332         prog->insns_cnt = size / sizeof(struct bpf_insn);
333         memcpy(prog->insns, data,
334                prog->insns_cnt * sizeof(struct bpf_insn));
335         prog->idx = idx;
336         prog->instances.fds = NULL;
337         prog->instances.nr = -1;
338         prog->type = BPF_PROG_TYPE_UNSPEC;
339         prog->btf_fd = -1;
340
341         return 0;
342 errout:
343         bpf_program__exit(prog);
344         return -ENOMEM;
345 }
346
347 static int
348 bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,
349                         char *section_name, int idx)
350 {
351         struct bpf_program prog, *progs;
352         int nr_progs, err;
353
354         err = bpf_program__init(data, size, section_name, idx, &prog);
355         if (err)
356                 return err;
357
358         prog.caps = &obj->caps;
359         progs = obj->programs;
360         nr_progs = obj->nr_programs;
361
362         progs = reallocarray(progs, nr_progs + 1, sizeof(progs[0]));
363         if (!progs) {
364                 /*
365                  * In this case the original obj->programs
366                  * is still valid, so don't need special treat for
367                  * bpf_close_object().
368                  */
369                 pr_warning("failed to alloc a new program under section '%s'\n",
370                            section_name);
371                 bpf_program__exit(&prog);
372                 return -ENOMEM;
373         }
374
375         pr_debug("found program %s\n", prog.section_name);
376         obj->programs = progs;
377         obj->nr_programs = nr_progs + 1;
378         prog.obj = obj;
379         progs[nr_progs] = prog;
380         return 0;
381 }
382
383 static int
384 bpf_object__init_prog_names(struct bpf_object *obj)
385 {
386         Elf_Data *symbols = obj->efile.symbols;
387         struct bpf_program *prog;
388         size_t pi, si;
389
390         for (pi = 0; pi < obj->nr_programs; pi++) {
391                 const char *name = NULL;
392
393                 prog = &obj->programs[pi];
394
395                 for (si = 0; si < symbols->d_size / sizeof(GElf_Sym) && !name;
396                      si++) {
397                         GElf_Sym sym;
398
399                         if (!gelf_getsym(symbols, si, &sym))
400                                 continue;
401                         if (sym.st_shndx != prog->idx)
402                                 continue;
403                         if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL)
404                                 continue;
405
406                         name = elf_strptr(obj->efile.elf,
407                                           obj->efile.strtabidx,
408                                           sym.st_name);
409                         if (!name) {
410                                 pr_warning("failed to get sym name string for prog %s\n",
411                                            prog->section_name);
412                                 return -LIBBPF_ERRNO__LIBELF;
413                         }
414                 }
415
416                 if (!name && prog->idx == obj->efile.text_shndx)
417                         name = ".text";
418
419                 if (!name) {
420                         pr_warning("failed to find sym for prog %s\n",
421                                    prog->section_name);
422                         return -EINVAL;
423                 }
424
425                 prog->name = strdup(name);
426                 if (!prog->name) {
427                         pr_warning("failed to allocate memory for prog sym %s\n",
428                                    name);
429                         return -ENOMEM;
430                 }
431         }
432
433         return 0;
434 }
435
436 static struct bpf_object *bpf_object__new(const char *path,
437                                           void *obj_buf,
438                                           size_t obj_buf_sz)
439 {
440         struct bpf_object *obj;
441
442         obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1);
443         if (!obj) {
444                 pr_warning("alloc memory failed for %s\n", path);
445                 return ERR_PTR(-ENOMEM);
446         }
447
448         strcpy(obj->path, path);
449         obj->efile.fd = -1;
450
451         /*
452          * Caller of this function should also calls
453          * bpf_object__elf_finish() after data collection to return
454          * obj_buf to user. If not, we should duplicate the buffer to
455          * avoid user freeing them before elf finish.
456          */
457         obj->efile.obj_buf = obj_buf;
458         obj->efile.obj_buf_sz = obj_buf_sz;
459         obj->efile.maps_shndx = -1;
460
461         obj->loaded = false;
462
463         INIT_LIST_HEAD(&obj->list);
464         list_add(&obj->list, &bpf_objects_list);
465         return obj;
466 }
467
468 static void bpf_object__elf_finish(struct bpf_object *obj)
469 {
470         if (!obj_elf_valid(obj))
471                 return;
472
473         if (obj->efile.elf) {
474                 elf_end(obj->efile.elf);
475                 obj->efile.elf = NULL;
476         }
477         obj->efile.symbols = NULL;
478
479         zfree(&obj->efile.reloc);
480         obj->efile.nr_reloc = 0;
481         zclose(obj->efile.fd);
482         obj->efile.obj_buf = NULL;
483         obj->efile.obj_buf_sz = 0;
484 }
485
486 static int bpf_object__elf_init(struct bpf_object *obj)
487 {
488         int err = 0;
489         GElf_Ehdr *ep;
490
491         if (obj_elf_valid(obj)) {
492                 pr_warning("elf init: internal error\n");
493                 return -LIBBPF_ERRNO__LIBELF;
494         }
495
496         if (obj->efile.obj_buf_sz > 0) {
497                 /*
498                  * obj_buf should have been validated by
499                  * bpf_object__open_buffer().
500                  */
501                 obj->efile.elf = elf_memory(obj->efile.obj_buf,
502                                             obj->efile.obj_buf_sz);
503         } else {
504                 obj->efile.fd = open(obj->path, O_RDONLY);
505                 if (obj->efile.fd < 0) {
506                         char errmsg[STRERR_BUFSIZE];
507                         char *cp = libbpf_strerror_r(errno, errmsg,
508                                                      sizeof(errmsg));
509
510                         pr_warning("failed to open %s: %s\n", obj->path, cp);
511                         return -errno;
512                 }
513
514                 obj->efile.elf = elf_begin(obj->efile.fd,
515                                 LIBBPF_ELF_C_READ_MMAP,
516                                 NULL);
517         }
518
519         if (!obj->efile.elf) {
520                 pr_warning("failed to open %s as ELF file\n",
521                                 obj->path);
522                 err = -LIBBPF_ERRNO__LIBELF;
523                 goto errout;
524         }
525
526         if (!gelf_getehdr(obj->efile.elf, &obj->efile.ehdr)) {
527                 pr_warning("failed to get EHDR from %s\n",
528                                 obj->path);
529                 err = -LIBBPF_ERRNO__FORMAT;
530                 goto errout;
531         }
532         ep = &obj->efile.ehdr;
533
534         /* Old LLVM set e_machine to EM_NONE */
535         if ((ep->e_type != ET_REL) || (ep->e_machine && (ep->e_machine != EM_BPF))) {
536                 pr_warning("%s is not an eBPF object file\n",
537                         obj->path);
538                 err = -LIBBPF_ERRNO__FORMAT;
539                 goto errout;
540         }
541
542         return 0;
543 errout:
544         bpf_object__elf_finish(obj);
545         return err;
546 }
547
548 static int
549 bpf_object__check_endianness(struct bpf_object *obj)
550 {
551         static unsigned int const endian = 1;
552
553         switch (obj->efile.ehdr.e_ident[EI_DATA]) {
554         case ELFDATA2LSB:
555                 /* We are big endian, BPF obj is little endian. */
556                 if (*(unsigned char const *)&endian != 1)
557                         goto mismatch;
558                 break;
559
560         case ELFDATA2MSB:
561                 /* We are little endian, BPF obj is big endian. */
562                 if (*(unsigned char const *)&endian != 0)
563                         goto mismatch;
564                 break;
565         default:
566                 return -LIBBPF_ERRNO__ENDIAN;
567         }
568
569         return 0;
570
571 mismatch:
572         pr_warning("Error: endianness mismatch.\n");
573         return -LIBBPF_ERRNO__ENDIAN;
574 }
575
576 static int
577 bpf_object__init_license(struct bpf_object *obj,
578                          void *data, size_t size)
579 {
580         memcpy(obj->license, data,
581                min(size, sizeof(obj->license) - 1));
582         pr_debug("license of %s is %s\n", obj->path, obj->license);
583         return 0;
584 }
585
586 static int
587 bpf_object__init_kversion(struct bpf_object *obj,
588                           void *data, size_t size)
589 {
590         __u32 kver;
591
592         if (size != sizeof(kver)) {
593                 pr_warning("invalid kver section in %s\n", obj->path);
594                 return -LIBBPF_ERRNO__FORMAT;
595         }
596         memcpy(&kver, data, sizeof(kver));
597         obj->kern_version = kver;
598         pr_debug("kernel version of %s is %x\n", obj->path,
599                  obj->kern_version);
600         return 0;
601 }
602
603 static int compare_bpf_map(const void *_a, const void *_b)
604 {
605         const struct bpf_map *a = _a;
606         const struct bpf_map *b = _b;
607
608         return a->offset - b->offset;
609 }
610
611 static bool bpf_map_type__is_map_in_map(enum bpf_map_type type)
612 {
613         if (type == BPF_MAP_TYPE_ARRAY_OF_MAPS ||
614             type == BPF_MAP_TYPE_HASH_OF_MAPS)
615                 return true;
616         return false;
617 }
618
619 static int
620 bpf_object__init_maps(struct bpf_object *obj, int flags)
621 {
622         bool strict = !(flags & MAPS_RELAX_COMPAT);
623         int i, map_idx, map_def_sz, nr_maps = 0;
624         Elf_Scn *scn;
625         Elf_Data *data;
626         Elf_Data *symbols = obj->efile.symbols;
627
628         if (obj->efile.maps_shndx < 0)
629                 return -EINVAL;
630         if (!symbols)
631                 return -EINVAL;
632
633         scn = elf_getscn(obj->efile.elf, obj->efile.maps_shndx);
634         if (scn)
635                 data = elf_getdata(scn, NULL);
636         if (!scn || !data) {
637                 pr_warning("failed to get Elf_Data from map section %d\n",
638                            obj->efile.maps_shndx);
639                 return -EINVAL;
640         }
641
642         /*
643          * Count number of maps. Each map has a name.
644          * Array of maps is not supported: only the first element is
645          * considered.
646          *
647          * TODO: Detect array of map and report error.
648          */
649         for (i = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) {
650                 GElf_Sym sym;
651
652                 if (!gelf_getsym(symbols, i, &sym))
653                         continue;
654                 if (sym.st_shndx != obj->efile.maps_shndx)
655                         continue;
656                 nr_maps++;
657         }
658
659         /* Alloc obj->maps and fill nr_maps. */
660         pr_debug("maps in %s: %d maps in %zd bytes\n", obj->path,
661                  nr_maps, data->d_size);
662
663         if (!nr_maps)
664                 return 0;
665
666         /* Assume equally sized map definitions */
667         map_def_sz = data->d_size / nr_maps;
668         if (!data->d_size || (data->d_size % nr_maps) != 0) {
669                 pr_warning("unable to determine map definition size "
670                            "section %s, %d maps in %zd bytes\n",
671                            obj->path, nr_maps, data->d_size);
672                 return -EINVAL;
673         }
674
675         obj->maps = calloc(nr_maps, sizeof(obj->maps[0]));
676         if (!obj->maps) {
677                 pr_warning("alloc maps for object failed\n");
678                 return -ENOMEM;
679         }
680         obj->nr_maps = nr_maps;
681
682         for (i = 0; i < nr_maps; i++) {
683                 /*
684                  * fill all fd with -1 so won't close incorrect
685                  * fd (fd=0 is stdin) when failure (zclose won't close
686                  * negative fd)).
687                  */
688                 obj->maps[i].fd = -1;
689                 obj->maps[i].inner_map_fd = -1;
690         }
691
692         /*
693          * Fill obj->maps using data in "maps" section.
694          */
695         for (i = 0, map_idx = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) {
696                 GElf_Sym sym;
697                 const char *map_name;
698                 struct bpf_map_def *def;
699
700                 if (!gelf_getsym(symbols, i, &sym))
701                         continue;
702                 if (sym.st_shndx != obj->efile.maps_shndx)
703                         continue;
704
705                 map_name = elf_strptr(obj->efile.elf,
706                                       obj->efile.strtabidx,
707                                       sym.st_name);
708                 obj->maps[map_idx].offset = sym.st_value;
709                 if (sym.st_value + map_def_sz > data->d_size) {
710                         pr_warning("corrupted maps section in %s: last map \"%s\" too small\n",
711                                    obj->path, map_name);
712                         return -EINVAL;
713                 }
714
715                 obj->maps[map_idx].name = strdup(map_name);
716                 if (!obj->maps[map_idx].name) {
717                         pr_warning("failed to alloc map name\n");
718                         return -ENOMEM;
719                 }
720                 pr_debug("map %d is \"%s\"\n", map_idx,
721                          obj->maps[map_idx].name);
722                 def = (struct bpf_map_def *)(data->d_buf + sym.st_value);
723                 /*
724                  * If the definition of the map in the object file fits in
725                  * bpf_map_def, copy it.  Any extra fields in our version
726                  * of bpf_map_def will default to zero as a result of the
727                  * calloc above.
728                  */
729                 if (map_def_sz <= sizeof(struct bpf_map_def)) {
730                         memcpy(&obj->maps[map_idx].def, def, map_def_sz);
731                 } else {
732                         /*
733                          * Here the map structure being read is bigger than what
734                          * we expect, truncate if the excess bits are all zero.
735                          * If they are not zero, reject this map as
736                          * incompatible.
737                          */
738                         char *b;
739                         for (b = ((char *)def) + sizeof(struct bpf_map_def);
740                              b < ((char *)def) + map_def_sz; b++) {
741                                 if (*b != 0) {
742                                         pr_warning("maps section in %s: \"%s\" "
743                                                    "has unrecognized, non-zero "
744                                                    "options\n",
745                                                    obj->path, map_name);
746                                         if (strict)
747                                                 return -EINVAL;
748                                 }
749                         }
750                         memcpy(&obj->maps[map_idx].def, def,
751                                sizeof(struct bpf_map_def));
752                 }
753                 map_idx++;
754         }
755
756         qsort(obj->maps, obj->nr_maps, sizeof(obj->maps[0]), compare_bpf_map);
757         return 0;
758 }
759
760 static bool section_have_execinstr(struct bpf_object *obj, int idx)
761 {
762         Elf_Scn *scn;
763         GElf_Shdr sh;
764
765         scn = elf_getscn(obj->efile.elf, idx);
766         if (!scn)
767                 return false;
768
769         if (gelf_getshdr(scn, &sh) != &sh)
770                 return false;
771
772         if (sh.sh_flags & SHF_EXECINSTR)
773                 return true;
774
775         return false;
776 }
777
778 static int bpf_object__elf_collect(struct bpf_object *obj, int flags)
779 {
780         Elf *elf = obj->efile.elf;
781         GElf_Ehdr *ep = &obj->efile.ehdr;
782         Elf_Scn *scn = NULL;
783         int idx = 0, err = 0;
784
785         /* Elf is corrupted/truncated, avoid calling elf_strptr. */
786         if (!elf_rawdata(elf_getscn(elf, ep->e_shstrndx), NULL)) {
787                 pr_warning("failed to get e_shstrndx from %s\n",
788                            obj->path);
789                 return -LIBBPF_ERRNO__FORMAT;
790         }
791
792         while ((scn = elf_nextscn(elf, scn)) != NULL) {
793                 char *name;
794                 GElf_Shdr sh;
795                 Elf_Data *data;
796
797                 idx++;
798                 if (gelf_getshdr(scn, &sh) != &sh) {
799                         pr_warning("failed to get section(%d) header from %s\n",
800                                    idx, obj->path);
801                         err = -LIBBPF_ERRNO__FORMAT;
802                         goto out;
803                 }
804
805                 name = elf_strptr(elf, ep->e_shstrndx, sh.sh_name);
806                 if (!name) {
807                         pr_warning("failed to get section(%d) name from %s\n",
808                                    idx, obj->path);
809                         err = -LIBBPF_ERRNO__FORMAT;
810                         goto out;
811                 }
812
813                 data = elf_getdata(scn, 0);
814                 if (!data) {
815                         pr_warning("failed to get section(%d) data from %s(%s)\n",
816                                    idx, name, obj->path);
817                         err = -LIBBPF_ERRNO__FORMAT;
818                         goto out;
819                 }
820                 pr_debug("section(%d) %s, size %ld, link %d, flags %lx, type=%d\n",
821                          idx, name, (unsigned long)data->d_size,
822                          (int)sh.sh_link, (unsigned long)sh.sh_flags,
823                          (int)sh.sh_type);
824
825                 if (strcmp(name, "license") == 0)
826                         err = bpf_object__init_license(obj,
827                                                        data->d_buf,
828                                                        data->d_size);
829                 else if (strcmp(name, "version") == 0)
830                         err = bpf_object__init_kversion(obj,
831                                                         data->d_buf,
832                                                         data->d_size);
833                 else if (strcmp(name, "maps") == 0)
834                         obj->efile.maps_shndx = idx;
835                 else if (strcmp(name, BTF_ELF_SEC) == 0) {
836                         obj->btf = btf__new(data->d_buf, data->d_size,
837                                             __pr_debug);
838                         if (IS_ERR(obj->btf)) {
839                                 pr_warning("Error loading ELF section %s: %ld. Ignored and continue.\n",
840                                            BTF_ELF_SEC, PTR_ERR(obj->btf));
841                                 obj->btf = NULL;
842                         }
843                 } else if (strcmp(name, BTF_EXT_ELF_SEC) == 0) {
844                         obj->btf_ext = btf_ext__new(data->d_buf, data->d_size,
845                                                     __pr_debug);
846                         if (IS_ERR(obj->btf_ext)) {
847                                 pr_warning("Error loading ELF section %s: %ld. Ignored and continue.\n",
848                                            BTF_EXT_ELF_SEC,
849                                            PTR_ERR(obj->btf_ext));
850                                 obj->btf_ext = NULL;
851                         }
852                 } else if (sh.sh_type == SHT_SYMTAB) {
853                         if (obj->efile.symbols) {
854                                 pr_warning("bpf: multiple SYMTAB in %s\n",
855                                            obj->path);
856                                 err = -LIBBPF_ERRNO__FORMAT;
857                         } else {
858                                 obj->efile.symbols = data;
859                                 obj->efile.strtabidx = sh.sh_link;
860                         }
861                 } else if ((sh.sh_type == SHT_PROGBITS) &&
862                            (sh.sh_flags & SHF_EXECINSTR) &&
863                            (data->d_size > 0)) {
864                         if (strcmp(name, ".text") == 0)
865                                 obj->efile.text_shndx = idx;
866                         err = bpf_object__add_program(obj, data->d_buf,
867                                                       data->d_size, name, idx);
868                         if (err) {
869                                 char errmsg[STRERR_BUFSIZE];
870                                 char *cp = libbpf_strerror_r(-err, errmsg,
871                                                              sizeof(errmsg));
872
873                                 pr_warning("failed to alloc program %s (%s): %s",
874                                            name, obj->path, cp);
875                         }
876                 } else if (sh.sh_type == SHT_REL) {
877                         void *reloc = obj->efile.reloc;
878                         int nr_reloc = obj->efile.nr_reloc + 1;
879                         int sec = sh.sh_info; /* points to other section */
880
881                         /* Only do relo for section with exec instructions */
882                         if (!section_have_execinstr(obj, sec)) {
883                                 pr_debug("skip relo %s(%d) for section(%d)\n",
884                                          name, idx, sec);
885                                 continue;
886                         }
887
888                         reloc = reallocarray(reloc, nr_reloc,
889                                              sizeof(*obj->efile.reloc));
890                         if (!reloc) {
891                                 pr_warning("realloc failed\n");
892                                 err = -ENOMEM;
893                         } else {
894                                 int n = nr_reloc - 1;
895
896                                 obj->efile.reloc = reloc;
897                                 obj->efile.nr_reloc = nr_reloc;
898
899                                 obj->efile.reloc[n].shdr = sh;
900                                 obj->efile.reloc[n].data = data;
901                         }
902                 } else {
903                         pr_debug("skip section(%d) %s\n", idx, name);
904                 }
905                 if (err)
906                         goto out;
907         }
908
909         if (!obj->efile.strtabidx || obj->efile.strtabidx >= idx) {
910                 pr_warning("Corrupted ELF file: index of strtab invalid\n");
911                 return LIBBPF_ERRNO__FORMAT;
912         }
913         if (obj->efile.maps_shndx >= 0) {
914                 err = bpf_object__init_maps(obj, flags);
915                 if (err)
916                         goto out;
917         }
918         err = bpf_object__init_prog_names(obj);
919 out:
920         return err;
921 }
922
923 static struct bpf_program *
924 bpf_object__find_prog_by_idx(struct bpf_object *obj, int idx)
925 {
926         struct bpf_program *prog;
927         size_t i;
928
929         for (i = 0; i < obj->nr_programs; i++) {
930                 prog = &obj->programs[i];
931                 if (prog->idx == idx)
932                         return prog;
933         }
934         return NULL;
935 }
936
937 struct bpf_program *
938 bpf_object__find_program_by_title(struct bpf_object *obj, const char *title)
939 {
940         struct bpf_program *pos;
941
942         bpf_object__for_each_program(pos, obj) {
943                 if (pos->section_name && !strcmp(pos->section_name, title))
944                         return pos;
945         }
946         return NULL;
947 }
948
949 static int
950 bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr,
951                            Elf_Data *data, struct bpf_object *obj)
952 {
953         Elf_Data *symbols = obj->efile.symbols;
954         int text_shndx = obj->efile.text_shndx;
955         int maps_shndx = obj->efile.maps_shndx;
956         struct bpf_map *maps = obj->maps;
957         size_t nr_maps = obj->nr_maps;
958         int i, nrels;
959
960         pr_debug("collecting relocating info for: '%s'\n",
961                  prog->section_name);
962         nrels = shdr->sh_size / shdr->sh_entsize;
963
964         prog->reloc_desc = malloc(sizeof(*prog->reloc_desc) * nrels);
965         if (!prog->reloc_desc) {
966                 pr_warning("failed to alloc memory in relocation\n");
967                 return -ENOMEM;
968         }
969         prog->nr_reloc = nrels;
970
971         for (i = 0; i < nrels; i++) {
972                 GElf_Sym sym;
973                 GElf_Rel rel;
974                 unsigned int insn_idx;
975                 struct bpf_insn *insns = prog->insns;
976                 size_t map_idx;
977
978                 if (!gelf_getrel(data, i, &rel)) {
979                         pr_warning("relocation: failed to get %d reloc\n", i);
980                         return -LIBBPF_ERRNO__FORMAT;
981                 }
982
983                 if (!gelf_getsym(symbols,
984                                  GELF_R_SYM(rel.r_info),
985                                  &sym)) {
986                         pr_warning("relocation: symbol %"PRIx64" not found\n",
987                                    GELF_R_SYM(rel.r_info));
988                         return -LIBBPF_ERRNO__FORMAT;
989                 }
990                 pr_debug("relo for %lld value %lld name %d\n",
991                          (long long) (rel.r_info >> 32),
992                          (long long) sym.st_value, sym.st_name);
993
994                 if (sym.st_shndx != maps_shndx && sym.st_shndx != text_shndx) {
995                         pr_warning("Program '%s' contains non-map related relo data pointing to section %u\n",
996                                    prog->section_name, sym.st_shndx);
997                         return -LIBBPF_ERRNO__RELOC;
998                 }
999
1000                 insn_idx = rel.r_offset / sizeof(struct bpf_insn);
1001                 pr_debug("relocation: insn_idx=%u\n", insn_idx);
1002
1003                 if (insns[insn_idx].code == (BPF_JMP | BPF_CALL)) {
1004                         if (insns[insn_idx].src_reg != BPF_PSEUDO_CALL) {
1005                                 pr_warning("incorrect bpf_call opcode\n");
1006                                 return -LIBBPF_ERRNO__RELOC;
1007                         }
1008                         prog->reloc_desc[i].type = RELO_CALL;
1009                         prog->reloc_desc[i].insn_idx = insn_idx;
1010                         prog->reloc_desc[i].text_off = sym.st_value;
1011                         obj->has_pseudo_calls = true;
1012                         continue;
1013                 }
1014
1015                 if (insns[insn_idx].code != (BPF_LD | BPF_IMM | BPF_DW)) {
1016                         pr_warning("bpf: relocation: invalid relo for insns[%d].code 0x%x\n",
1017                                    insn_idx, insns[insn_idx].code);
1018                         return -LIBBPF_ERRNO__RELOC;
1019                 }
1020
1021                 /* TODO: 'maps' is sorted. We can use bsearch to make it faster. */
1022                 for (map_idx = 0; map_idx < nr_maps; map_idx++) {
1023                         if (maps[map_idx].offset == sym.st_value) {
1024                                 pr_debug("relocation: find map %zd (%s) for insn %u\n",
1025                                          map_idx, maps[map_idx].name, insn_idx);
1026                                 break;
1027                         }
1028                 }
1029
1030                 if (map_idx >= nr_maps) {
1031                         pr_warning("bpf relocation: map_idx %d large than %d\n",
1032                                    (int)map_idx, (int)nr_maps - 1);
1033                         return -LIBBPF_ERRNO__RELOC;
1034                 }
1035
1036                 prog->reloc_desc[i].type = RELO_LD64;
1037                 prog->reloc_desc[i].insn_idx = insn_idx;
1038                 prog->reloc_desc[i].map_idx = map_idx;
1039         }
1040         return 0;
1041 }
1042
1043 static int bpf_map_find_btf_info(struct bpf_map *map, const struct btf *btf)
1044 {
1045         const struct btf_type *container_type;
1046         const struct btf_member *key, *value;
1047         struct bpf_map_def *def = &map->def;
1048         const size_t max_name = 256;
1049         char container_name[max_name];
1050         __s64 key_size, value_size;
1051         __s32 container_id;
1052
1053         if (snprintf(container_name, max_name, "____btf_map_%s", map->name) ==
1054             max_name) {
1055                 pr_warning("map:%s length of '____btf_map_%s' is too long\n",
1056                            map->name, map->name);
1057                 return -EINVAL;
1058         }
1059
1060         container_id = btf__find_by_name(btf, container_name);
1061         if (container_id < 0) {
1062                 pr_debug("map:%s container_name:%s cannot be found in BTF. Missing BPF_ANNOTATE_KV_PAIR?\n",
1063                          map->name, container_name);
1064                 return container_id;
1065         }
1066
1067         container_type = btf__type_by_id(btf, container_id);
1068         if (!container_type) {
1069                 pr_warning("map:%s cannot find BTF type for container_id:%u\n",
1070                            map->name, container_id);
1071                 return -EINVAL;
1072         }
1073
1074         if (BTF_INFO_KIND(container_type->info) != BTF_KIND_STRUCT ||
1075             BTF_INFO_VLEN(container_type->info) < 2) {
1076                 pr_warning("map:%s container_name:%s is an invalid container struct\n",
1077                            map->name, container_name);
1078                 return -EINVAL;
1079         }
1080
1081         key = (struct btf_member *)(container_type + 1);
1082         value = key + 1;
1083
1084         key_size = btf__resolve_size(btf, key->type);
1085         if (key_size < 0) {
1086                 pr_warning("map:%s invalid BTF key_type_size\n",
1087                            map->name);
1088                 return key_size;
1089         }
1090
1091         if (def->key_size != key_size) {
1092                 pr_warning("map:%s btf_key_type_size:%u != map_def_key_size:%u\n",
1093                            map->name, (__u32)key_size, def->key_size);
1094                 return -EINVAL;
1095         }
1096
1097         value_size = btf__resolve_size(btf, value->type);
1098         if (value_size < 0) {
1099                 pr_warning("map:%s invalid BTF value_type_size\n", map->name);
1100                 return value_size;
1101         }
1102
1103         if (def->value_size != value_size) {
1104                 pr_warning("map:%s btf_value_type_size:%u != map_def_value_size:%u\n",
1105                            map->name, (__u32)value_size, def->value_size);
1106                 return -EINVAL;
1107         }
1108
1109         map->btf_key_type_id = key->type;
1110         map->btf_value_type_id = value->type;
1111
1112         return 0;
1113 }
1114
1115 int bpf_map__reuse_fd(struct bpf_map *map, int fd)
1116 {
1117         struct bpf_map_info info = {};
1118         __u32 len = sizeof(info);
1119         int new_fd, err;
1120         char *new_name;
1121
1122         err = bpf_obj_get_info_by_fd(fd, &info, &len);
1123         if (err)
1124                 return err;
1125
1126         new_name = strdup(info.name);
1127         if (!new_name)
1128                 return -errno;
1129
1130         new_fd = open("/", O_RDONLY | O_CLOEXEC);
1131         if (new_fd < 0)
1132                 goto err_free_new_name;
1133
1134         new_fd = dup3(fd, new_fd, O_CLOEXEC);
1135         if (new_fd < 0)
1136                 goto err_close_new_fd;
1137
1138         err = zclose(map->fd);
1139         if (err)
1140                 goto err_close_new_fd;
1141         free(map->name);
1142
1143         map->fd = new_fd;
1144         map->name = new_name;
1145         map->def.type = info.type;
1146         map->def.key_size = info.key_size;
1147         map->def.value_size = info.value_size;
1148         map->def.max_entries = info.max_entries;
1149         map->def.map_flags = info.map_flags;
1150         map->btf_key_type_id = info.btf_key_type_id;
1151         map->btf_value_type_id = info.btf_value_type_id;
1152
1153         return 0;
1154
1155 err_close_new_fd:
1156         close(new_fd);
1157 err_free_new_name:
1158         free(new_name);
1159         return -errno;
1160 }
1161
1162 static int
1163 bpf_object__probe_name(struct bpf_object *obj)
1164 {
1165         struct bpf_load_program_attr attr;
1166         char *cp, errmsg[STRERR_BUFSIZE];
1167         struct bpf_insn insns[] = {
1168                 BPF_MOV64_IMM(BPF_REG_0, 0),
1169                 BPF_EXIT_INSN(),
1170         };
1171         int ret;
1172
1173         /* make sure basic loading works */
1174
1175         memset(&attr, 0, sizeof(attr));
1176         attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
1177         attr.insns = insns;
1178         attr.insns_cnt = ARRAY_SIZE(insns);
1179         attr.license = "GPL";
1180
1181         ret = bpf_load_program_xattr(&attr, NULL, 0);
1182         if (ret < 0) {
1183                 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1184                 pr_warning("Error in %s():%s(%d). Couldn't load basic 'r0 = 0' BPF program.\n",
1185                            __func__, cp, errno);
1186                 return -errno;
1187         }
1188         close(ret);
1189
1190         /* now try the same program, but with the name */
1191
1192         attr.name = "test";
1193         ret = bpf_load_program_xattr(&attr, NULL, 0);
1194         if (ret >= 0) {
1195                 obj->caps.name = 1;
1196                 close(ret);
1197         }
1198
1199         return 0;
1200 }
1201
1202 static int
1203 bpf_object__probe_caps(struct bpf_object *obj)
1204 {
1205         return bpf_object__probe_name(obj);
1206 }
1207
1208 static int
1209 bpf_object__create_maps(struct bpf_object *obj)
1210 {
1211         struct bpf_create_map_attr create_attr = {};
1212         unsigned int i;
1213         int err;
1214
1215         for (i = 0; i < obj->nr_maps; i++) {
1216                 struct bpf_map *map = &obj->maps[i];
1217                 struct bpf_map_def *def = &map->def;
1218                 char *cp, errmsg[STRERR_BUFSIZE];
1219                 int *pfd = &map->fd;
1220
1221                 if (map->fd >= 0) {
1222                         pr_debug("skip map create (preset) %s: fd=%d\n",
1223                                  map->name, map->fd);
1224                         continue;
1225                 }
1226
1227                 if (obj->caps.name)
1228                         create_attr.name = map->name;
1229                 create_attr.map_ifindex = map->map_ifindex;
1230                 create_attr.map_type = def->type;
1231                 create_attr.map_flags = def->map_flags;
1232                 create_attr.key_size = def->key_size;
1233                 create_attr.value_size = def->value_size;
1234                 create_attr.max_entries = def->max_entries;
1235                 create_attr.btf_fd = 0;
1236                 create_attr.btf_key_type_id = 0;
1237                 create_attr.btf_value_type_id = 0;
1238                 if (bpf_map_type__is_map_in_map(def->type) &&
1239                     map->inner_map_fd >= 0)
1240                         create_attr.inner_map_fd = map->inner_map_fd;
1241
1242                 if (obj->btf && !bpf_map_find_btf_info(map, obj->btf)) {
1243                         create_attr.btf_fd = btf__fd(obj->btf);
1244                         create_attr.btf_key_type_id = map->btf_key_type_id;
1245                         create_attr.btf_value_type_id = map->btf_value_type_id;
1246                 }
1247
1248                 *pfd = bpf_create_map_xattr(&create_attr);
1249                 if (*pfd < 0 && create_attr.btf_key_type_id) {
1250                         cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1251                         pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
1252                                    map->name, cp, errno);
1253                         create_attr.btf_fd = 0;
1254                         create_attr.btf_key_type_id = 0;
1255                         create_attr.btf_value_type_id = 0;
1256                         map->btf_key_type_id = 0;
1257                         map->btf_value_type_id = 0;
1258                         *pfd = bpf_create_map_xattr(&create_attr);
1259                 }
1260
1261                 if (*pfd < 0) {
1262                         size_t j;
1263
1264                         err = *pfd;
1265                         cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1266                         pr_warning("failed to create map (name: '%s'): %s\n",
1267                                    map->name, cp);
1268                         for (j = 0; j < i; j++)
1269                                 zclose(obj->maps[j].fd);
1270                         return err;
1271                 }
1272                 pr_debug("create map %s: fd=%d\n", map->name, *pfd);
1273         }
1274
1275         return 0;
1276 }
1277
1278 static int
1279 bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj,
1280                         struct reloc_desc *relo)
1281 {
1282         struct bpf_insn *insn, *new_insn;
1283         struct bpf_program *text;
1284         size_t new_cnt;
1285         int err;
1286
1287         if (relo->type != RELO_CALL)
1288                 return -LIBBPF_ERRNO__RELOC;
1289
1290         if (prog->idx == obj->efile.text_shndx) {
1291                 pr_warning("relo in .text insn %d into off %d\n",
1292                            relo->insn_idx, relo->text_off);
1293                 return -LIBBPF_ERRNO__RELOC;
1294         }
1295
1296         if (prog->main_prog_cnt == 0) {
1297                 text = bpf_object__find_prog_by_idx(obj, obj->efile.text_shndx);
1298                 if (!text) {
1299                         pr_warning("no .text section found yet relo into text exist\n");
1300                         return -LIBBPF_ERRNO__RELOC;
1301                 }
1302                 new_cnt = prog->insns_cnt + text->insns_cnt;
1303                 new_insn = reallocarray(prog->insns, new_cnt, sizeof(*insn));
1304                 if (!new_insn) {
1305                         pr_warning("oom in prog realloc\n");
1306                         return -ENOMEM;
1307                 }
1308
1309                 if (obj->btf && obj->btf_ext) {
1310                         err = btf_ext__reloc(obj->btf, obj->btf_ext,
1311                                              text->section_name,
1312                                              prog->insns_cnt,
1313                                              &prog->func_info,
1314                                              &prog->func_info_len);
1315                         if (err) {
1316                                 pr_warning("error in btf_ext__reloc for sec %s\n",
1317                                            text->section_name);
1318                                 return err;
1319                         }
1320                 }
1321
1322                 memcpy(new_insn + prog->insns_cnt, text->insns,
1323                        text->insns_cnt * sizeof(*insn));
1324                 prog->insns = new_insn;
1325                 prog->main_prog_cnt = prog->insns_cnt;
1326                 prog->insns_cnt = new_cnt;
1327                 pr_debug("added %zd insn from %s to prog %s\n",
1328                          text->insns_cnt, text->section_name,
1329                          prog->section_name);
1330         }
1331         insn = &prog->insns[relo->insn_idx];
1332         insn->imm += prog->main_prog_cnt - relo->insn_idx;
1333         return 0;
1334 }
1335
1336 static int
1337 bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj)
1338 {
1339         int i, err;
1340
1341         if (!prog)
1342                 return 0;
1343
1344         if (obj->btf && obj->btf_ext) {
1345                 err = btf_ext__reloc_init(obj->btf, obj->btf_ext,
1346                                           prog->section_name,
1347                                           &prog->func_info,
1348                                           &prog->func_info_rec_size,
1349                                           &prog->func_info_len);
1350                 if (err) {
1351                         pr_warning("err in btf_ext__reloc_init for sec %s\n",
1352                                    prog->section_name);
1353                         return err;
1354                 }
1355                 prog->btf_fd = btf__fd(obj->btf);
1356         }
1357
1358         if (!prog->reloc_desc)
1359                 return 0;
1360
1361         for (i = 0; i < prog->nr_reloc; i++) {
1362                 if (prog->reloc_desc[i].type == RELO_LD64) {
1363                         struct bpf_insn *insns = prog->insns;
1364                         int insn_idx, map_idx;
1365
1366                         insn_idx = prog->reloc_desc[i].insn_idx;
1367                         map_idx = prog->reloc_desc[i].map_idx;
1368
1369                         if (insn_idx >= (int)prog->insns_cnt) {
1370                                 pr_warning("relocation out of range: '%s'\n",
1371                                            prog->section_name);
1372                                 return -LIBBPF_ERRNO__RELOC;
1373                         }
1374                         insns[insn_idx].src_reg = BPF_PSEUDO_MAP_FD;
1375                         insns[insn_idx].imm = obj->maps[map_idx].fd;
1376                 } else {
1377                         err = bpf_program__reloc_text(prog, obj,
1378                                                       &prog->reloc_desc[i]);
1379                         if (err)
1380                                 return err;
1381                 }
1382         }
1383
1384         zfree(&prog->reloc_desc);
1385         prog->nr_reloc = 0;
1386         return 0;
1387 }
1388
1389
1390 static int
1391 bpf_object__relocate(struct bpf_object *obj)
1392 {
1393         struct bpf_program *prog;
1394         size_t i;
1395         int err;
1396
1397         for (i = 0; i < obj->nr_programs; i++) {
1398                 prog = &obj->programs[i];
1399
1400                 err = bpf_program__relocate(prog, obj);
1401                 if (err) {
1402                         pr_warning("failed to relocate '%s'\n",
1403                                    prog->section_name);
1404                         return err;
1405                 }
1406         }
1407         return 0;
1408 }
1409
1410 static int bpf_object__collect_reloc(struct bpf_object *obj)
1411 {
1412         int i, err;
1413
1414         if (!obj_elf_valid(obj)) {
1415                 pr_warning("Internal error: elf object is closed\n");
1416                 return -LIBBPF_ERRNO__INTERNAL;
1417         }
1418
1419         for (i = 0; i < obj->efile.nr_reloc; i++) {
1420                 GElf_Shdr *shdr = &obj->efile.reloc[i].shdr;
1421                 Elf_Data *data = obj->efile.reloc[i].data;
1422                 int idx = shdr->sh_info;
1423                 struct bpf_program *prog;
1424
1425                 if (shdr->sh_type != SHT_REL) {
1426                         pr_warning("internal error at %d\n", __LINE__);
1427                         return -LIBBPF_ERRNO__INTERNAL;
1428                 }
1429
1430                 prog = bpf_object__find_prog_by_idx(obj, idx);
1431                 if (!prog) {
1432                         pr_warning("relocation failed: no section(%d)\n", idx);
1433                         return -LIBBPF_ERRNO__RELOC;
1434                 }
1435
1436                 err = bpf_program__collect_reloc(prog,
1437                                                  shdr, data,
1438                                                  obj);
1439                 if (err)
1440                         return err;
1441         }
1442         return 0;
1443 }
1444
1445 static int
1446 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
1447              char *license, __u32 kern_version, int *pfd,
1448              __u32 func_info_cnt)
1449 {
1450         struct bpf_load_program_attr load_attr;
1451         char *cp, errmsg[STRERR_BUFSIZE];
1452         char *log_buf;
1453         int ret;
1454
1455         memset(&load_attr, 0, sizeof(struct bpf_load_program_attr));
1456         load_attr.prog_type = prog->type;
1457         load_attr.expected_attach_type = prog->expected_attach_type;
1458         if (prog->caps->name)
1459                 load_attr.name = prog->name;
1460         load_attr.insns = insns;
1461         load_attr.insns_cnt = insns_cnt;
1462         load_attr.license = license;
1463         load_attr.kern_version = kern_version;
1464         load_attr.prog_ifindex = prog->prog_ifindex;
1465         load_attr.prog_btf_fd = prog->btf_fd >= 0 ? prog->btf_fd : 0;
1466         load_attr.func_info = prog->func_info;
1467         load_attr.func_info_rec_size = prog->func_info_rec_size;
1468         load_attr.func_info_cnt = func_info_cnt;
1469
1470         if (!load_attr.insns || !load_attr.insns_cnt)
1471                 return -EINVAL;
1472
1473         log_buf = malloc(BPF_LOG_BUF_SIZE);
1474         if (!log_buf)
1475                 pr_warning("Alloc log buffer for bpf loader error, continue without log\n");
1476
1477         ret = bpf_load_program_xattr(&load_attr, log_buf, BPF_LOG_BUF_SIZE);
1478
1479         if (ret >= 0) {
1480                 *pfd = ret;
1481                 ret = 0;
1482                 goto out;
1483         }
1484
1485         ret = -LIBBPF_ERRNO__LOAD;
1486         cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1487         pr_warning("load bpf program failed: %s\n", cp);
1488
1489         if (log_buf && log_buf[0] != '\0') {
1490                 ret = -LIBBPF_ERRNO__VERIFY;
1491                 pr_warning("-- BEGIN DUMP LOG ---\n");
1492                 pr_warning("\n%s\n", log_buf);
1493                 pr_warning("-- END LOG --\n");
1494         } else if (load_attr.insns_cnt >= BPF_MAXINSNS) {
1495                 pr_warning("Program too large (%zu insns), at most %d insns\n",
1496                            load_attr.insns_cnt, BPF_MAXINSNS);
1497                 ret = -LIBBPF_ERRNO__PROG2BIG;
1498         } else {
1499                 /* Wrong program type? */
1500                 if (load_attr.prog_type != BPF_PROG_TYPE_KPROBE) {
1501                         int fd;
1502
1503                         load_attr.prog_type = BPF_PROG_TYPE_KPROBE;
1504                         load_attr.expected_attach_type = 0;
1505                         fd = bpf_load_program_xattr(&load_attr, NULL, 0);
1506                         if (fd >= 0) {
1507                                 close(fd);
1508                                 ret = -LIBBPF_ERRNO__PROGTYPE;
1509                                 goto out;
1510                         }
1511                 }
1512
1513                 if (log_buf)
1514                         ret = -LIBBPF_ERRNO__KVER;
1515         }
1516
1517 out:
1518         free(log_buf);
1519         return ret;
1520 }
1521
1522 int
1523 bpf_program__load(struct bpf_program *prog,
1524                   char *license, __u32 kern_version)
1525 {
1526         __u32 func_info_cnt;
1527         int err = 0, fd, i;
1528
1529         if (prog->func_info_len == 0)
1530                 func_info_cnt = 0;
1531         else
1532                 func_info_cnt = prog->func_info_len / prog->func_info_rec_size;
1533
1534         if (prog->instances.nr < 0 || !prog->instances.fds) {
1535                 if (prog->preprocessor) {
1536                         pr_warning("Internal error: can't load program '%s'\n",
1537                                    prog->section_name);
1538                         return -LIBBPF_ERRNO__INTERNAL;
1539                 }
1540
1541                 prog->instances.fds = malloc(sizeof(int));
1542                 if (!prog->instances.fds) {
1543                         pr_warning("Not enough memory for BPF fds\n");
1544                         return -ENOMEM;
1545                 }
1546                 prog->instances.nr = 1;
1547                 prog->instances.fds[0] = -1;
1548         }
1549
1550         if (!prog->preprocessor) {
1551                 if (prog->instances.nr != 1) {
1552                         pr_warning("Program '%s' is inconsistent: nr(%d) != 1\n",
1553                                    prog->section_name, prog->instances.nr);
1554                 }
1555                 err = load_program(prog, prog->insns, prog->insns_cnt,
1556                                    license, kern_version, &fd,
1557                                    func_info_cnt);
1558                 if (!err)
1559                         prog->instances.fds[0] = fd;
1560                 goto out;
1561         }
1562
1563         for (i = 0; i < prog->instances.nr; i++) {
1564                 struct bpf_prog_prep_result result;
1565                 bpf_program_prep_t preprocessor = prog->preprocessor;
1566
1567                 bzero(&result, sizeof(result));
1568                 err = preprocessor(prog, i, prog->insns,
1569                                    prog->insns_cnt, &result);
1570                 if (err) {
1571                         pr_warning("Preprocessing the %dth instance of program '%s' failed\n",
1572                                    i, prog->section_name);
1573                         goto out;
1574                 }
1575
1576                 if (!result.new_insn_ptr || !result.new_insn_cnt) {
1577                         pr_debug("Skip loading the %dth instance of program '%s'\n",
1578                                  i, prog->section_name);
1579                         prog->instances.fds[i] = -1;
1580                         if (result.pfd)
1581                                 *result.pfd = -1;
1582                         continue;
1583                 }
1584
1585                 err = load_program(prog, result.new_insn_ptr,
1586                                    result.new_insn_cnt,
1587                                    license, kern_version, &fd,
1588                                    func_info_cnt);
1589
1590                 if (err) {
1591                         pr_warning("Loading the %dth instance of program '%s' failed\n",
1592                                         i, prog->section_name);
1593                         goto out;
1594                 }
1595
1596                 if (result.pfd)
1597                         *result.pfd = fd;
1598                 prog->instances.fds[i] = fd;
1599         }
1600 out:
1601         if (err)
1602                 pr_warning("failed to load program '%s'\n",
1603                            prog->section_name);
1604         zfree(&prog->insns);
1605         prog->insns_cnt = 0;
1606         return err;
1607 }
1608
1609 static bool bpf_program__is_function_storage(struct bpf_program *prog,
1610                                              struct bpf_object *obj)
1611 {
1612         return prog->idx == obj->efile.text_shndx && obj->has_pseudo_calls;
1613 }
1614
1615 static int
1616 bpf_object__load_progs(struct bpf_object *obj)
1617 {
1618         size_t i;
1619         int err;
1620
1621         for (i = 0; i < obj->nr_programs; i++) {
1622                 if (bpf_program__is_function_storage(&obj->programs[i], obj))
1623                         continue;
1624                 err = bpf_program__load(&obj->programs[i],
1625                                         obj->license,
1626                                         obj->kern_version);
1627                 if (err)
1628                         return err;
1629         }
1630         return 0;
1631 }
1632
1633 static bool bpf_prog_type__needs_kver(enum bpf_prog_type type)
1634 {
1635         switch (type) {
1636         case BPF_PROG_TYPE_SOCKET_FILTER:
1637         case BPF_PROG_TYPE_SCHED_CLS:
1638         case BPF_PROG_TYPE_SCHED_ACT:
1639         case BPF_PROG_TYPE_XDP:
1640         case BPF_PROG_TYPE_CGROUP_SKB:
1641         case BPF_PROG_TYPE_CGROUP_SOCK:
1642         case BPF_PROG_TYPE_LWT_IN:
1643         case BPF_PROG_TYPE_LWT_OUT:
1644         case BPF_PROG_TYPE_LWT_XMIT:
1645         case BPF_PROG_TYPE_LWT_SEG6LOCAL:
1646         case BPF_PROG_TYPE_SOCK_OPS:
1647         case BPF_PROG_TYPE_SK_SKB:
1648         case BPF_PROG_TYPE_CGROUP_DEVICE:
1649         case BPF_PROG_TYPE_SK_MSG:
1650         case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
1651         case BPF_PROG_TYPE_LIRC_MODE2:
1652         case BPF_PROG_TYPE_SK_REUSEPORT:
1653         case BPF_PROG_TYPE_FLOW_DISSECTOR:
1654         case BPF_PROG_TYPE_UNSPEC:
1655         case BPF_PROG_TYPE_TRACEPOINT:
1656         case BPF_PROG_TYPE_RAW_TRACEPOINT:
1657         case BPF_PROG_TYPE_PERF_EVENT:
1658                 return false;
1659         case BPF_PROG_TYPE_KPROBE:
1660         default:
1661                 return true;
1662         }
1663 }
1664
1665 static int bpf_object__validate(struct bpf_object *obj, bool needs_kver)
1666 {
1667         if (needs_kver && obj->kern_version == 0) {
1668                 pr_warning("%s doesn't provide kernel version\n",
1669                            obj->path);
1670                 return -LIBBPF_ERRNO__KVERSION;
1671         }
1672         return 0;
1673 }
1674
1675 static struct bpf_object *
1676 __bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz,
1677                    bool needs_kver, int flags)
1678 {
1679         struct bpf_object *obj;
1680         int err;
1681
1682         if (elf_version(EV_CURRENT) == EV_NONE) {
1683                 pr_warning("failed to init libelf for %s\n", path);
1684                 return ERR_PTR(-LIBBPF_ERRNO__LIBELF);
1685         }
1686
1687         obj = bpf_object__new(path, obj_buf, obj_buf_sz);
1688         if (IS_ERR(obj))
1689                 return obj;
1690
1691         CHECK_ERR(bpf_object__elf_init(obj), err, out);
1692         CHECK_ERR(bpf_object__check_endianness(obj), err, out);
1693         CHECK_ERR(bpf_object__elf_collect(obj, flags), err, out);
1694         CHECK_ERR(bpf_object__collect_reloc(obj), err, out);
1695         CHECK_ERR(bpf_object__validate(obj, needs_kver), err, out);
1696
1697         bpf_object__elf_finish(obj);
1698         return obj;
1699 out:
1700         bpf_object__close(obj);
1701         return ERR_PTR(err);
1702 }
1703
1704 struct bpf_object *__bpf_object__open_xattr(struct bpf_object_open_attr *attr,
1705                                             int flags)
1706 {
1707         /* param validation */
1708         if (!attr->file)
1709                 return NULL;
1710
1711         pr_debug("loading %s\n", attr->file);
1712
1713         return __bpf_object__open(attr->file, NULL, 0,
1714                                   bpf_prog_type__needs_kver(attr->prog_type),
1715                                   flags);
1716 }
1717
1718 struct bpf_object *bpf_object__open_xattr(struct bpf_object_open_attr *attr)
1719 {
1720         return __bpf_object__open_xattr(attr, 0);
1721 }
1722
1723 struct bpf_object *bpf_object__open(const char *path)
1724 {
1725         struct bpf_object_open_attr attr = {
1726                 .file           = path,
1727                 .prog_type      = BPF_PROG_TYPE_UNSPEC,
1728         };
1729
1730         return bpf_object__open_xattr(&attr);
1731 }
1732
1733 struct bpf_object *bpf_object__open_buffer(void *obj_buf,
1734                                            size_t obj_buf_sz,
1735                                            const char *name)
1736 {
1737         char tmp_name[64];
1738
1739         /* param validation */
1740         if (!obj_buf || obj_buf_sz <= 0)
1741                 return NULL;
1742
1743         if (!name) {
1744                 snprintf(tmp_name, sizeof(tmp_name), "%lx-%lx",
1745                          (unsigned long)obj_buf,
1746                          (unsigned long)obj_buf_sz);
1747                 tmp_name[sizeof(tmp_name) - 1] = '\0';
1748                 name = tmp_name;
1749         }
1750         pr_debug("loading object '%s' from buffer\n",
1751                  name);
1752
1753         return __bpf_object__open(name, obj_buf, obj_buf_sz, true, true);
1754 }
1755
1756 int bpf_object__unload(struct bpf_object *obj)
1757 {
1758         size_t i;
1759
1760         if (!obj)
1761                 return -EINVAL;
1762
1763         for (i = 0; i < obj->nr_maps; i++)
1764                 zclose(obj->maps[i].fd);
1765
1766         for (i = 0; i < obj->nr_programs; i++)
1767                 bpf_program__unload(&obj->programs[i]);
1768
1769         return 0;
1770 }
1771
1772 int bpf_object__load(struct bpf_object *obj)
1773 {
1774         int err;
1775
1776         if (!obj)
1777                 return -EINVAL;
1778
1779         if (obj->loaded) {
1780                 pr_warning("object should not be loaded twice\n");
1781                 return -EINVAL;
1782         }
1783
1784         obj->loaded = true;
1785
1786         CHECK_ERR(bpf_object__probe_caps(obj), err, out);
1787         CHECK_ERR(bpf_object__create_maps(obj), err, out);
1788         CHECK_ERR(bpf_object__relocate(obj), err, out);
1789         CHECK_ERR(bpf_object__load_progs(obj), err, out);
1790
1791         return 0;
1792 out:
1793         bpf_object__unload(obj);
1794         pr_warning("failed to load object '%s'\n", obj->path);
1795         return err;
1796 }
1797
1798 static int check_path(const char *path)
1799 {
1800         char *cp, errmsg[STRERR_BUFSIZE];
1801         struct statfs st_fs;
1802         char *dname, *dir;
1803         int err = 0;
1804
1805         if (path == NULL)
1806                 return -EINVAL;
1807
1808         dname = strdup(path);
1809         if (dname == NULL)
1810                 return -ENOMEM;
1811
1812         dir = dirname(dname);
1813         if (statfs(dir, &st_fs)) {
1814                 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1815                 pr_warning("failed to statfs %s: %s\n", dir, cp);
1816                 err = -errno;
1817         }
1818         free(dname);
1819
1820         if (!err && st_fs.f_type != BPF_FS_MAGIC) {
1821                 pr_warning("specified path %s is not on BPF FS\n", path);
1822                 err = -EINVAL;
1823         }
1824
1825         return err;
1826 }
1827
1828 int bpf_program__pin_instance(struct bpf_program *prog, const char *path,
1829                               int instance)
1830 {
1831         char *cp, errmsg[STRERR_BUFSIZE];
1832         int err;
1833
1834         err = check_path(path);
1835         if (err)
1836                 return err;
1837
1838         if (prog == NULL) {
1839                 pr_warning("invalid program pointer\n");
1840                 return -EINVAL;
1841         }
1842
1843         if (instance < 0 || instance >= prog->instances.nr) {
1844                 pr_warning("invalid prog instance %d of prog %s (max %d)\n",
1845                            instance, prog->section_name, prog->instances.nr);
1846                 return -EINVAL;
1847         }
1848
1849         if (bpf_obj_pin(prog->instances.fds[instance], path)) {
1850                 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
1851                 pr_warning("failed to pin program: %s\n", cp);
1852                 return -errno;
1853         }
1854         pr_debug("pinned program '%s'\n", path);
1855
1856         return 0;
1857 }
1858
1859 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path,
1860                                 int instance)
1861 {
1862         int err;
1863
1864         err = check_path(path);
1865         if (err)
1866                 return err;
1867
1868         if (prog == NULL) {
1869                 pr_warning("invalid program pointer\n");
1870                 return -EINVAL;
1871         }
1872
1873         if (instance < 0 || instance >= prog->instances.nr) {
1874                 pr_warning("invalid prog instance %d of prog %s (max %d)\n",
1875                            instance, prog->section_name, prog->instances.nr);
1876                 return -EINVAL;
1877         }
1878
1879         err = unlink(path);
1880         if (err != 0)
1881                 return -errno;
1882         pr_debug("unpinned program '%s'\n", path);
1883
1884         return 0;
1885 }
1886
1887 static int make_dir(const char *path)
1888 {
1889         char *cp, errmsg[STRERR_BUFSIZE];
1890         int err = 0;
1891
1892         if (mkdir(path, 0700) && errno != EEXIST)
1893                 err = -errno;
1894
1895         if (err) {
1896                 cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg));
1897                 pr_warning("failed to mkdir %s: %s\n", path, cp);
1898         }
1899         return err;
1900 }
1901
1902 int bpf_program__pin(struct bpf_program *prog, const char *path)
1903 {
1904         int i, err;
1905
1906         err = check_path(path);
1907         if (err)
1908                 return err;
1909
1910         if (prog == NULL) {
1911                 pr_warning("invalid program pointer\n");
1912                 return -EINVAL;
1913         }
1914
1915         if (prog->instances.nr <= 0) {
1916                 pr_warning("no instances of prog %s to pin\n",
1917                            prog->section_name);
1918                 return -EINVAL;
1919         }
1920
1921         if (prog->instances.nr == 1) {
1922                 /* don't create subdirs when pinning single instance */
1923                 return bpf_program__pin_instance(prog, path, 0);
1924         }
1925
1926         err = make_dir(path);
1927         if (err)
1928                 return err;
1929
1930         for (i = 0; i < prog->instances.nr; i++) {
1931                 char buf[PATH_MAX];
1932                 int len;
1933
1934                 len = snprintf(buf, PATH_MAX, "%s/%d", path, i);
1935                 if (len < 0) {
1936                         err = -EINVAL;
1937                         goto err_unpin;
1938                 } else if (len >= PATH_MAX) {
1939                         err = -ENAMETOOLONG;
1940                         goto err_unpin;
1941                 }
1942
1943                 err = bpf_program__pin_instance(prog, buf, i);
1944                 if (err)
1945                         goto err_unpin;
1946         }
1947
1948         return 0;
1949
1950 err_unpin:
1951         for (i = i - 1; i >= 0; i--) {
1952                 char buf[PATH_MAX];
1953                 int len;
1954
1955                 len = snprintf(buf, PATH_MAX, "%s/%d", path, i);
1956                 if (len < 0)
1957                         continue;
1958                 else if (len >= PATH_MAX)
1959                         continue;
1960
1961                 bpf_program__unpin_instance(prog, buf, i);
1962         }
1963
1964         rmdir(path);
1965
1966         return err;
1967 }
1968
1969 int bpf_program__unpin(struct bpf_program *prog, const char *path)
1970 {
1971         int i, err;
1972
1973         err = check_path(path);
1974         if (err)
1975                 return err;
1976
1977         if (prog == NULL) {
1978                 pr_warning("invalid program pointer\n");
1979                 return -EINVAL;
1980         }
1981
1982         if (prog->instances.nr <= 0) {
1983                 pr_warning("no instances of prog %s to pin\n",
1984                            prog->section_name);
1985                 return -EINVAL;
1986         }
1987
1988         if (prog->instances.nr == 1) {
1989                 /* don't create subdirs when pinning single instance */
1990                 return bpf_program__unpin_instance(prog, path, 0);
1991         }
1992
1993         for (i = 0; i < prog->instances.nr; i++) {
1994                 char buf[PATH_MAX];
1995                 int len;
1996
1997                 len = snprintf(buf, PATH_MAX, "%s/%d", path, i);
1998                 if (len < 0)
1999                         return -EINVAL;
2000                 else if (len >= PATH_MAX)
2001                         return -ENAMETOOLONG;
2002
2003                 err = bpf_program__unpin_instance(prog, buf, i);
2004                 if (err)
2005                         return err;
2006         }
2007
2008         err = rmdir(path);
2009         if (err)
2010                 return -errno;
2011
2012         return 0;
2013 }
2014
2015 int bpf_map__pin(struct bpf_map *map, const char *path)
2016 {
2017         char *cp, errmsg[STRERR_BUFSIZE];
2018         int err;
2019
2020         err = check_path(path);
2021         if (err)
2022                 return err;
2023
2024         if (map == NULL) {
2025                 pr_warning("invalid map pointer\n");
2026                 return -EINVAL;
2027         }
2028
2029         if (bpf_obj_pin(map->fd, path)) {
2030                 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
2031                 pr_warning("failed to pin map: %s\n", cp);
2032                 return -errno;
2033         }
2034
2035         pr_debug("pinned map '%s'\n", path);
2036
2037         return 0;
2038 }
2039
2040 int bpf_map__unpin(struct bpf_map *map, const char *path)
2041 {
2042         int err;
2043
2044         err = check_path(path);
2045         if (err)
2046                 return err;
2047
2048         if (map == NULL) {
2049                 pr_warning("invalid map pointer\n");
2050                 return -EINVAL;
2051         }
2052
2053         err = unlink(path);
2054         if (err != 0)
2055                 return -errno;
2056         pr_debug("unpinned map '%s'\n", path);
2057
2058         return 0;
2059 }
2060
2061 int bpf_object__pin_maps(struct bpf_object *obj, const char *path)
2062 {
2063         struct bpf_map *map;
2064         int err;
2065
2066         if (!obj)
2067                 return -ENOENT;
2068
2069         if (!obj->loaded) {
2070                 pr_warning("object not yet loaded; load it first\n");
2071                 return -ENOENT;
2072         }
2073
2074         err = make_dir(path);
2075         if (err)
2076                 return err;
2077
2078         bpf_map__for_each(map, obj) {
2079                 char buf[PATH_MAX];
2080                 int len;
2081
2082                 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2083                                bpf_map__name(map));
2084                 if (len < 0) {
2085                         err = -EINVAL;
2086                         goto err_unpin_maps;
2087                 } else if (len >= PATH_MAX) {
2088                         err = -ENAMETOOLONG;
2089                         goto err_unpin_maps;
2090                 }
2091
2092                 err = bpf_map__pin(map, buf);
2093                 if (err)
2094                         goto err_unpin_maps;
2095         }
2096
2097         return 0;
2098
2099 err_unpin_maps:
2100         while ((map = bpf_map__prev(map, obj))) {
2101                 char buf[PATH_MAX];
2102                 int len;
2103
2104                 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2105                                bpf_map__name(map));
2106                 if (len < 0)
2107                         continue;
2108                 else if (len >= PATH_MAX)
2109                         continue;
2110
2111                 bpf_map__unpin(map, buf);
2112         }
2113
2114         return err;
2115 }
2116
2117 int bpf_object__unpin_maps(struct bpf_object *obj, const char *path)
2118 {
2119         struct bpf_map *map;
2120         int err;
2121
2122         if (!obj)
2123                 return -ENOENT;
2124
2125         bpf_map__for_each(map, obj) {
2126                 char buf[PATH_MAX];
2127                 int len;
2128
2129                 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2130                                bpf_map__name(map));
2131                 if (len < 0)
2132                         return -EINVAL;
2133                 else if (len >= PATH_MAX)
2134                         return -ENAMETOOLONG;
2135
2136                 err = bpf_map__unpin(map, buf);
2137                 if (err)
2138                         return err;
2139         }
2140
2141         return 0;
2142 }
2143
2144 int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
2145 {
2146         struct bpf_program *prog;
2147         int err;
2148
2149         if (!obj)
2150                 return -ENOENT;
2151
2152         if (!obj->loaded) {
2153                 pr_warning("object not yet loaded; load it first\n");
2154                 return -ENOENT;
2155         }
2156
2157         err = make_dir(path);
2158         if (err)
2159                 return err;
2160
2161         bpf_object__for_each_program(prog, obj) {
2162                 char buf[PATH_MAX];
2163                 int len;
2164
2165                 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2166                                prog->pin_name);
2167                 if (len < 0) {
2168                         err = -EINVAL;
2169                         goto err_unpin_programs;
2170                 } else if (len >= PATH_MAX) {
2171                         err = -ENAMETOOLONG;
2172                         goto err_unpin_programs;
2173                 }
2174
2175                 err = bpf_program__pin(prog, buf);
2176                 if (err)
2177                         goto err_unpin_programs;
2178         }
2179
2180         return 0;
2181
2182 err_unpin_programs:
2183         while ((prog = bpf_program__prev(prog, obj))) {
2184                 char buf[PATH_MAX];
2185                 int len;
2186
2187                 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2188                                prog->pin_name);
2189                 if (len < 0)
2190                         continue;
2191                 else if (len >= PATH_MAX)
2192                         continue;
2193
2194                 bpf_program__unpin(prog, buf);
2195         }
2196
2197         return err;
2198 }
2199
2200 int bpf_object__unpin_programs(struct bpf_object *obj, const char *path)
2201 {
2202         struct bpf_program *prog;
2203         int err;
2204
2205         if (!obj)
2206                 return -ENOENT;
2207
2208         bpf_object__for_each_program(prog, obj) {
2209                 char buf[PATH_MAX];
2210                 int len;
2211
2212                 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2213                                prog->pin_name);
2214                 if (len < 0)
2215                         return -EINVAL;
2216                 else if (len >= PATH_MAX)
2217                         return -ENAMETOOLONG;
2218
2219                 err = bpf_program__unpin(prog, buf);
2220                 if (err)
2221                         return err;
2222         }
2223
2224         return 0;
2225 }
2226
2227 int bpf_object__pin(struct bpf_object *obj, const char *path)
2228 {
2229         int err;
2230
2231         err = bpf_object__pin_maps(obj, path);
2232         if (err)
2233                 return err;
2234
2235         err = bpf_object__pin_programs(obj, path);
2236         if (err) {
2237                 bpf_object__unpin_maps(obj, path);
2238                 return err;
2239         }
2240
2241         return 0;
2242 }
2243
2244 void bpf_object__close(struct bpf_object *obj)
2245 {
2246         size_t i;
2247
2248         if (!obj)
2249                 return;
2250
2251         if (obj->clear_priv)
2252                 obj->clear_priv(obj, obj->priv);
2253
2254         bpf_object__elf_finish(obj);
2255         bpf_object__unload(obj);
2256         btf__free(obj->btf);
2257         btf_ext__free(obj->btf_ext);
2258
2259         for (i = 0; i < obj->nr_maps; i++) {
2260                 zfree(&obj->maps[i].name);
2261                 if (obj->maps[i].clear_priv)
2262                         obj->maps[i].clear_priv(&obj->maps[i],
2263                                                 obj->maps[i].priv);
2264                 obj->maps[i].priv = NULL;
2265                 obj->maps[i].clear_priv = NULL;
2266         }
2267         zfree(&obj->maps);
2268         obj->nr_maps = 0;
2269
2270         if (obj->programs && obj->nr_programs) {
2271                 for (i = 0; i < obj->nr_programs; i++)
2272                         bpf_program__exit(&obj->programs[i]);
2273         }
2274         zfree(&obj->programs);
2275
2276         list_del(&obj->list);
2277         free(obj);
2278 }
2279
2280 struct bpf_object *
2281 bpf_object__next(struct bpf_object *prev)
2282 {
2283         struct bpf_object *next;
2284
2285         if (!prev)
2286                 next = list_first_entry(&bpf_objects_list,
2287                                         struct bpf_object,
2288                                         list);
2289         else
2290                 next = list_next_entry(prev, list);
2291
2292         /* Empty list is noticed here so don't need checking on entry. */
2293         if (&next->list == &bpf_objects_list)
2294                 return NULL;
2295
2296         return next;
2297 }
2298
2299 const char *bpf_object__name(struct bpf_object *obj)
2300 {
2301         return obj ? obj->path : ERR_PTR(-EINVAL);
2302 }
2303
2304 unsigned int bpf_object__kversion(struct bpf_object *obj)
2305 {
2306         return obj ? obj->kern_version : 0;
2307 }
2308
2309 int bpf_object__btf_fd(const struct bpf_object *obj)
2310 {
2311         return obj->btf ? btf__fd(obj->btf) : -1;
2312 }
2313
2314 int bpf_object__set_priv(struct bpf_object *obj, void *priv,
2315                          bpf_object_clear_priv_t clear_priv)
2316 {
2317         if (obj->priv && obj->clear_priv)
2318                 obj->clear_priv(obj, obj->priv);
2319
2320         obj->priv = priv;
2321         obj->clear_priv = clear_priv;
2322         return 0;
2323 }
2324
2325 void *bpf_object__priv(struct bpf_object *obj)
2326 {
2327         return obj ? obj->priv : ERR_PTR(-EINVAL);
2328 }
2329
2330 static struct bpf_program *
2331 __bpf_program__iter(struct bpf_program *p, struct bpf_object *obj, bool forward)
2332 {
2333         size_t nr_programs = obj->nr_programs;
2334         ssize_t idx;
2335
2336         if (!nr_programs)
2337                 return NULL;
2338
2339         if (!p)
2340                 /* Iter from the beginning */
2341                 return forward ? &obj->programs[0] :
2342                         &obj->programs[nr_programs - 1];
2343
2344         if (p->obj != obj) {
2345                 pr_warning("error: program handler doesn't match object\n");
2346                 return NULL;
2347         }
2348
2349         idx = (p - obj->programs) + (forward ? 1 : -1);
2350         if (idx >= obj->nr_programs || idx < 0)
2351                 return NULL;
2352         return &obj->programs[idx];
2353 }
2354
2355 struct bpf_program *
2356 bpf_program__next(struct bpf_program *prev, struct bpf_object *obj)
2357 {
2358         struct bpf_program *prog = prev;
2359
2360         do {
2361                 prog = __bpf_program__iter(prog, obj, true);
2362         } while (prog && bpf_program__is_function_storage(prog, obj));
2363
2364         return prog;
2365 }
2366
2367 struct bpf_program *
2368 bpf_program__prev(struct bpf_program *next, struct bpf_object *obj)
2369 {
2370         struct bpf_program *prog = next;
2371
2372         do {
2373                 prog = __bpf_program__iter(prog, obj, false);
2374         } while (prog && bpf_program__is_function_storage(prog, obj));
2375
2376         return prog;
2377 }
2378
2379 int bpf_program__set_priv(struct bpf_program *prog, void *priv,
2380                           bpf_program_clear_priv_t clear_priv)
2381 {
2382         if (prog->priv && prog->clear_priv)
2383                 prog->clear_priv(prog, prog->priv);
2384
2385         prog->priv = priv;
2386         prog->clear_priv = clear_priv;
2387         return 0;
2388 }
2389
2390 void *bpf_program__priv(struct bpf_program *prog)
2391 {
2392         return prog ? prog->priv : ERR_PTR(-EINVAL);
2393 }
2394
2395 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex)
2396 {
2397         prog->prog_ifindex = ifindex;
2398 }
2399
2400 const char *bpf_program__title(struct bpf_program *prog, bool needs_copy)
2401 {
2402         const char *title;
2403
2404         title = prog->section_name;
2405         if (needs_copy) {
2406                 title = strdup(title);
2407                 if (!title) {
2408                         pr_warning("failed to strdup program title\n");
2409                         return ERR_PTR(-ENOMEM);
2410                 }
2411         }
2412
2413         return title;
2414 }
2415
2416 int bpf_program__fd(struct bpf_program *prog)
2417 {
2418         return bpf_program__nth_fd(prog, 0);
2419 }
2420
2421 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances,
2422                           bpf_program_prep_t prep)
2423 {
2424         int *instances_fds;
2425
2426         if (nr_instances <= 0 || !prep)
2427                 return -EINVAL;
2428
2429         if (prog->instances.nr > 0 || prog->instances.fds) {
2430                 pr_warning("Can't set pre-processor after loading\n");
2431                 return -EINVAL;
2432         }
2433
2434         instances_fds = malloc(sizeof(int) * nr_instances);
2435         if (!instances_fds) {
2436                 pr_warning("alloc memory failed for fds\n");
2437                 return -ENOMEM;
2438         }
2439
2440         /* fill all fd with -1 */
2441         memset(instances_fds, -1, sizeof(int) * nr_instances);
2442
2443         prog->instances.nr = nr_instances;
2444         prog->instances.fds = instances_fds;
2445         prog->preprocessor = prep;
2446         return 0;
2447 }
2448
2449 int bpf_program__nth_fd(struct bpf_program *prog, int n)
2450 {
2451         int fd;
2452
2453         if (!prog)
2454                 return -EINVAL;
2455
2456         if (n >= prog->instances.nr || n < 0) {
2457                 pr_warning("Can't get the %dth fd from program %s: only %d instances\n",
2458                            n, prog->section_name, prog->instances.nr);
2459                 return -EINVAL;
2460         }
2461
2462         fd = prog->instances.fds[n];
2463         if (fd < 0) {
2464                 pr_warning("%dth instance of program '%s' is invalid\n",
2465                            n, prog->section_name);
2466                 return -ENOENT;
2467         }
2468
2469         return fd;
2470 }
2471
2472 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type)
2473 {
2474         prog->type = type;
2475 }
2476
2477 static bool bpf_program__is_type(struct bpf_program *prog,
2478                                  enum bpf_prog_type type)
2479 {
2480         return prog ? (prog->type == type) : false;
2481 }
2482
2483 #define BPF_PROG_TYPE_FNS(NAME, TYPE)                   \
2484 int bpf_program__set_##NAME(struct bpf_program *prog)   \
2485 {                                                       \
2486         if (!prog)                                      \
2487                 return -EINVAL;                         \
2488         bpf_program__set_type(prog, TYPE);              \
2489         return 0;                                       \
2490 }                                                       \
2491                                                         \
2492 bool bpf_program__is_##NAME(struct bpf_program *prog)   \
2493 {                                                       \
2494         return bpf_program__is_type(prog, TYPE);        \
2495 }                                                       \
2496
2497 BPF_PROG_TYPE_FNS(socket_filter, BPF_PROG_TYPE_SOCKET_FILTER);
2498 BPF_PROG_TYPE_FNS(kprobe, BPF_PROG_TYPE_KPROBE);
2499 BPF_PROG_TYPE_FNS(sched_cls, BPF_PROG_TYPE_SCHED_CLS);
2500 BPF_PROG_TYPE_FNS(sched_act, BPF_PROG_TYPE_SCHED_ACT);
2501 BPF_PROG_TYPE_FNS(tracepoint, BPF_PROG_TYPE_TRACEPOINT);
2502 BPF_PROG_TYPE_FNS(raw_tracepoint, BPF_PROG_TYPE_RAW_TRACEPOINT);
2503 BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP);
2504 BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT);
2505
2506 void bpf_program__set_expected_attach_type(struct bpf_program *prog,
2507                                            enum bpf_attach_type type)
2508 {
2509         prog->expected_attach_type = type;
2510 }
2511
2512 #define BPF_PROG_SEC_IMPL(string, ptype, eatype, is_attachable, atype) \
2513         { string, sizeof(string) - 1, ptype, eatype, is_attachable, atype }
2514
2515 /* Programs that can NOT be attached. */
2516 #define BPF_PROG_SEC(string, ptype) BPF_PROG_SEC_IMPL(string, ptype, 0, 0, 0)
2517
2518 /* Programs that can be attached. */
2519 #define BPF_APROG_SEC(string, ptype, atype) \
2520         BPF_PROG_SEC_IMPL(string, ptype, 0, 1, atype)
2521
2522 /* Programs that must specify expected attach type at load time. */
2523 #define BPF_EAPROG_SEC(string, ptype, eatype) \
2524         BPF_PROG_SEC_IMPL(string, ptype, eatype, 1, eatype)
2525
2526 /* Programs that can be attached but attach type can't be identified by section
2527  * name. Kept for backward compatibility.
2528  */
2529 #define BPF_APROG_COMPAT(string, ptype) BPF_PROG_SEC(string, ptype)
2530
2531 static const struct {
2532         const char *sec;
2533         size_t len;
2534         enum bpf_prog_type prog_type;
2535         enum bpf_attach_type expected_attach_type;
2536         int is_attachable;
2537         enum bpf_attach_type attach_type;
2538 } section_names[] = {
2539         BPF_PROG_SEC("socket",                  BPF_PROG_TYPE_SOCKET_FILTER),
2540         BPF_PROG_SEC("kprobe/",                 BPF_PROG_TYPE_KPROBE),
2541         BPF_PROG_SEC("kretprobe/",              BPF_PROG_TYPE_KPROBE),
2542         BPF_PROG_SEC("classifier",              BPF_PROG_TYPE_SCHED_CLS),
2543         BPF_PROG_SEC("action",                  BPF_PROG_TYPE_SCHED_ACT),
2544         BPF_PROG_SEC("tracepoint/",             BPF_PROG_TYPE_TRACEPOINT),
2545         BPF_PROG_SEC("raw_tracepoint/",         BPF_PROG_TYPE_RAW_TRACEPOINT),
2546         BPF_PROG_SEC("xdp",                     BPF_PROG_TYPE_XDP),
2547         BPF_PROG_SEC("perf_event",              BPF_PROG_TYPE_PERF_EVENT),
2548         BPF_PROG_SEC("lwt_in",                  BPF_PROG_TYPE_LWT_IN),
2549         BPF_PROG_SEC("lwt_out",                 BPF_PROG_TYPE_LWT_OUT),
2550         BPF_PROG_SEC("lwt_xmit",                BPF_PROG_TYPE_LWT_XMIT),
2551         BPF_PROG_SEC("lwt_seg6local",           BPF_PROG_TYPE_LWT_SEG6LOCAL),
2552         BPF_APROG_SEC("cgroup_skb/ingress",     BPF_PROG_TYPE_CGROUP_SKB,
2553                                                 BPF_CGROUP_INET_INGRESS),
2554         BPF_APROG_SEC("cgroup_skb/egress",      BPF_PROG_TYPE_CGROUP_SKB,
2555                                                 BPF_CGROUP_INET_EGRESS),
2556         BPF_APROG_COMPAT("cgroup/skb",          BPF_PROG_TYPE_CGROUP_SKB),
2557         BPF_APROG_SEC("cgroup/sock",            BPF_PROG_TYPE_CGROUP_SOCK,
2558                                                 BPF_CGROUP_INET_SOCK_CREATE),
2559         BPF_EAPROG_SEC("cgroup/post_bind4",     BPF_PROG_TYPE_CGROUP_SOCK,
2560                                                 BPF_CGROUP_INET4_POST_BIND),
2561         BPF_EAPROG_SEC("cgroup/post_bind6",     BPF_PROG_TYPE_CGROUP_SOCK,
2562                                                 BPF_CGROUP_INET6_POST_BIND),
2563         BPF_APROG_SEC("cgroup/dev",             BPF_PROG_TYPE_CGROUP_DEVICE,
2564                                                 BPF_CGROUP_DEVICE),
2565         BPF_APROG_SEC("sockops",                BPF_PROG_TYPE_SOCK_OPS,
2566                                                 BPF_CGROUP_SOCK_OPS),
2567         BPF_APROG_SEC("sk_skb/stream_parser",   BPF_PROG_TYPE_SK_SKB,
2568                                                 BPF_SK_SKB_STREAM_PARSER),
2569         BPF_APROG_SEC("sk_skb/stream_verdict",  BPF_PROG_TYPE_SK_SKB,
2570                                                 BPF_SK_SKB_STREAM_VERDICT),
2571         BPF_APROG_COMPAT("sk_skb",              BPF_PROG_TYPE_SK_SKB),
2572         BPF_APROG_SEC("sk_msg",                 BPF_PROG_TYPE_SK_MSG,
2573                                                 BPF_SK_MSG_VERDICT),
2574         BPF_APROG_SEC("lirc_mode2",             BPF_PROG_TYPE_LIRC_MODE2,
2575                                                 BPF_LIRC_MODE2),
2576         BPF_APROG_SEC("flow_dissector",         BPF_PROG_TYPE_FLOW_DISSECTOR,
2577                                                 BPF_FLOW_DISSECTOR),
2578         BPF_EAPROG_SEC("cgroup/bind4",          BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
2579                                                 BPF_CGROUP_INET4_BIND),
2580         BPF_EAPROG_SEC("cgroup/bind6",          BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
2581                                                 BPF_CGROUP_INET6_BIND),
2582         BPF_EAPROG_SEC("cgroup/connect4",       BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
2583                                                 BPF_CGROUP_INET4_CONNECT),
2584         BPF_EAPROG_SEC("cgroup/connect6",       BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
2585                                                 BPF_CGROUP_INET6_CONNECT),
2586         BPF_EAPROG_SEC("cgroup/sendmsg4",       BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
2587                                                 BPF_CGROUP_UDP4_SENDMSG),
2588         BPF_EAPROG_SEC("cgroup/sendmsg6",       BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
2589                                                 BPF_CGROUP_UDP6_SENDMSG),
2590 };
2591
2592 #undef BPF_PROG_SEC_IMPL
2593 #undef BPF_PROG_SEC
2594 #undef BPF_APROG_SEC
2595 #undef BPF_EAPROG_SEC
2596 #undef BPF_APROG_COMPAT
2597
2598 int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type,
2599                              enum bpf_attach_type *expected_attach_type)
2600 {
2601         int i;
2602
2603         if (!name)
2604                 return -EINVAL;
2605
2606         for (i = 0; i < ARRAY_SIZE(section_names); i++) {
2607                 if (strncmp(name, section_names[i].sec, section_names[i].len))
2608                         continue;
2609                 *prog_type = section_names[i].prog_type;
2610                 *expected_attach_type = section_names[i].expected_attach_type;
2611                 return 0;
2612         }
2613         return -EINVAL;
2614 }
2615
2616 int libbpf_attach_type_by_name(const char *name,
2617                                enum bpf_attach_type *attach_type)
2618 {
2619         int i;
2620
2621         if (!name)
2622                 return -EINVAL;
2623
2624         for (i = 0; i < ARRAY_SIZE(section_names); i++) {
2625                 if (strncmp(name, section_names[i].sec, section_names[i].len))
2626                         continue;
2627                 if (!section_names[i].is_attachable)
2628                         return -EINVAL;
2629                 *attach_type = section_names[i].attach_type;
2630                 return 0;
2631         }
2632         return -EINVAL;
2633 }
2634
2635 static int
2636 bpf_program__identify_section(struct bpf_program *prog,
2637                               enum bpf_prog_type *prog_type,
2638                               enum bpf_attach_type *expected_attach_type)
2639 {
2640         return libbpf_prog_type_by_name(prog->section_name, prog_type,
2641                                         expected_attach_type);
2642 }
2643
2644 int bpf_map__fd(struct bpf_map *map)
2645 {
2646         return map ? map->fd : -EINVAL;
2647 }
2648
2649 const struct bpf_map_def *bpf_map__def(struct bpf_map *map)
2650 {
2651         return map ? &map->def : ERR_PTR(-EINVAL);
2652 }
2653
2654 const char *bpf_map__name(struct bpf_map *map)
2655 {
2656         return map ? map->name : NULL;
2657 }
2658
2659 __u32 bpf_map__btf_key_type_id(const struct bpf_map *map)
2660 {
2661         return map ? map->btf_key_type_id : 0;
2662 }
2663
2664 __u32 bpf_map__btf_value_type_id(const struct bpf_map *map)
2665 {
2666         return map ? map->btf_value_type_id : 0;
2667 }
2668
2669 int bpf_map__set_priv(struct bpf_map *map, void *priv,
2670                      bpf_map_clear_priv_t clear_priv)
2671 {
2672         if (!map)
2673                 return -EINVAL;
2674
2675         if (map->priv) {
2676                 if (map->clear_priv)
2677                         map->clear_priv(map, map->priv);
2678         }
2679
2680         map->priv = priv;
2681         map->clear_priv = clear_priv;
2682         return 0;
2683 }
2684
2685 void *bpf_map__priv(struct bpf_map *map)
2686 {
2687         return map ? map->priv : ERR_PTR(-EINVAL);
2688 }
2689
2690 bool bpf_map__is_offload_neutral(struct bpf_map *map)
2691 {
2692         return map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY;
2693 }
2694
2695 void bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex)
2696 {
2697         map->map_ifindex = ifindex;
2698 }
2699
2700 int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd)
2701 {
2702         if (!bpf_map_type__is_map_in_map(map->def.type)) {
2703                 pr_warning("error: unsupported map type\n");
2704                 return -EINVAL;
2705         }
2706         if (map->inner_map_fd != -1) {
2707                 pr_warning("error: inner_map_fd already specified\n");
2708                 return -EINVAL;
2709         }
2710         map->inner_map_fd = fd;
2711         return 0;
2712 }
2713
2714 static struct bpf_map *
2715 __bpf_map__iter(struct bpf_map *m, struct bpf_object *obj, int i)
2716 {
2717         ssize_t idx;
2718         struct bpf_map *s, *e;
2719
2720         if (!obj || !obj->maps)
2721                 return NULL;
2722
2723         s = obj->maps;
2724         e = obj->maps + obj->nr_maps;
2725
2726         if ((m < s) || (m >= e)) {
2727                 pr_warning("error in %s: map handler doesn't belong to object\n",
2728                            __func__);
2729                 return NULL;
2730         }
2731
2732         idx = (m - obj->maps) + i;
2733         if (idx >= obj->nr_maps || idx < 0)
2734                 return NULL;
2735         return &obj->maps[idx];
2736 }
2737
2738 struct bpf_map *
2739 bpf_map__next(struct bpf_map *prev, struct bpf_object *obj)
2740 {
2741         if (prev == NULL)
2742                 return obj->maps;
2743
2744         return __bpf_map__iter(prev, obj, 1);
2745 }
2746
2747 struct bpf_map *
2748 bpf_map__prev(struct bpf_map *next, struct bpf_object *obj)
2749 {
2750         if (next == NULL) {
2751                 if (!obj->nr_maps)
2752                         return NULL;
2753                 return obj->maps + obj->nr_maps - 1;
2754         }
2755
2756         return __bpf_map__iter(next, obj, -1);
2757 }
2758
2759 struct bpf_map *
2760 bpf_object__find_map_by_name(struct bpf_object *obj, const char *name)
2761 {
2762         struct bpf_map *pos;
2763
2764         bpf_map__for_each(pos, obj) {
2765                 if (pos->name && !strcmp(pos->name, name))
2766                         return pos;
2767         }
2768         return NULL;
2769 }
2770
2771 struct bpf_map *
2772 bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset)
2773 {
2774         int i;
2775
2776         for (i = 0; i < obj->nr_maps; i++) {
2777                 if (obj->maps[i].offset == offset)
2778                         return &obj->maps[i];
2779         }
2780         return ERR_PTR(-ENOENT);
2781 }
2782
2783 long libbpf_get_error(const void *ptr)
2784 {
2785         if (IS_ERR(ptr))
2786                 return PTR_ERR(ptr);
2787         return 0;
2788 }
2789
2790 int bpf_prog_load(const char *file, enum bpf_prog_type type,
2791                   struct bpf_object **pobj, int *prog_fd)
2792 {
2793         struct bpf_prog_load_attr attr;
2794
2795         memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
2796         attr.file = file;
2797         attr.prog_type = type;
2798         attr.expected_attach_type = 0;
2799
2800         return bpf_prog_load_xattr(&attr, pobj, prog_fd);
2801 }
2802
2803 int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
2804                         struct bpf_object **pobj, int *prog_fd)
2805 {
2806         struct bpf_object_open_attr open_attr = {
2807                 .file           = attr->file,
2808                 .prog_type      = attr->prog_type,
2809         };
2810         struct bpf_program *prog, *first_prog = NULL;
2811         enum bpf_attach_type expected_attach_type;
2812         enum bpf_prog_type prog_type;
2813         struct bpf_object *obj;
2814         struct bpf_map *map;
2815         int err;
2816
2817         if (!attr)
2818                 return -EINVAL;
2819         if (!attr->file)
2820                 return -EINVAL;
2821
2822         obj = bpf_object__open_xattr(&open_attr);
2823         if (IS_ERR_OR_NULL(obj))
2824                 return -ENOENT;
2825
2826         bpf_object__for_each_program(prog, obj) {
2827                 /*
2828                  * If type is not specified, try to guess it based on
2829                  * section name.
2830                  */
2831                 prog_type = attr->prog_type;
2832                 prog->prog_ifindex = attr->ifindex;
2833                 expected_attach_type = attr->expected_attach_type;
2834                 if (prog_type == BPF_PROG_TYPE_UNSPEC) {
2835                         err = bpf_program__identify_section(prog, &prog_type,
2836                                                             &expected_attach_type);
2837                         if (err < 0) {
2838                                 pr_warning("failed to guess program type based on section name %s\n",
2839                                            prog->section_name);
2840                                 bpf_object__close(obj);
2841                                 return -EINVAL;
2842                         }
2843                 }
2844
2845                 bpf_program__set_type(prog, prog_type);
2846                 bpf_program__set_expected_attach_type(prog,
2847                                                       expected_attach_type);
2848
2849                 if (!first_prog)
2850                         first_prog = prog;
2851         }
2852
2853         bpf_map__for_each(map, obj) {
2854                 if (!bpf_map__is_offload_neutral(map))
2855                         map->map_ifindex = attr->ifindex;
2856         }
2857
2858         if (!first_prog) {
2859                 pr_warning("object file doesn't contain bpf program\n");
2860                 bpf_object__close(obj);
2861                 return -ENOENT;
2862         }
2863
2864         err = bpf_object__load(obj);
2865         if (err) {
2866                 bpf_object__close(obj);
2867                 return -EINVAL;
2868         }
2869
2870         *pobj = obj;
2871         *prog_fd = bpf_program__fd(first_prog);
2872         return 0;
2873 }
2874
2875 enum bpf_perf_event_ret
2876 bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,
2877                            void **copy_mem, size_t *copy_size,
2878                            bpf_perf_event_print_t fn, void *private_data)
2879 {
2880         struct perf_event_mmap_page *header = mmap_mem;
2881         __u64 data_head = ring_buffer_read_head(header);
2882         __u64 data_tail = header->data_tail;
2883         void *base = ((__u8 *)header) + page_size;
2884         int ret = LIBBPF_PERF_EVENT_CONT;
2885         struct perf_event_header *ehdr;
2886         size_t ehdr_size;
2887
2888         while (data_head != data_tail) {
2889                 ehdr = base + (data_tail & (mmap_size - 1));
2890                 ehdr_size = ehdr->size;
2891
2892                 if (((void *)ehdr) + ehdr_size > base + mmap_size) {
2893                         void *copy_start = ehdr;
2894                         size_t len_first = base + mmap_size - copy_start;
2895                         size_t len_secnd = ehdr_size - len_first;
2896
2897                         if (*copy_size < ehdr_size) {
2898                                 free(*copy_mem);
2899                                 *copy_mem = malloc(ehdr_size);
2900                                 if (!*copy_mem) {
2901                                         *copy_size = 0;
2902                                         ret = LIBBPF_PERF_EVENT_ERROR;
2903                                         break;
2904                                 }
2905                                 *copy_size = ehdr_size;
2906                         }
2907
2908                         memcpy(*copy_mem, copy_start, len_first);
2909                         memcpy(*copy_mem + len_first, base, len_secnd);
2910                         ehdr = *copy_mem;
2911                 }
2912
2913                 ret = fn(ehdr, private_data);
2914                 data_tail += ehdr_size;
2915                 if (ret != LIBBPF_PERF_EVENT_CONT)
2916                         break;
2917         }
2918
2919         ring_buffer_write_tail(header, data_tail);
2920         return ret;
2921 }