tools/lib/bpf/libbpf.c
Source file repositories/reference/linux-study-clean/tools/lib/bpf/libbpf.c
File Facts
- System
- Linux kernel
- Corpus path
tools/lib/bpf/libbpf.c- Extension
.c- Size
- 415967 bytes
- Lines
- 15173
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
stdlib.hstdio.hstdarg.hlibgen.hinttypes.hlimits.hstring.hunistd.hendian.hfcntl.herrno.hctype.hasm/unistd.hlinux/err.hlinux/kernel.hlinux/bpf.hlinux/btf.hlinux/filter.hlinux/limits.hlinux/perf_event.hlinux/bpf_perf_event.hlinux/ring_buffer.hsys/epoll.hsys/ioctl.hsys/mman.hsys/stat.hsys/types.hsys/vfs.hsys/utsname.hsys/resource.hlibelf.hgelf.h
Detected Declarations
struct reloc_descstruct bpf_sec_defstruct bpf_light_subprogstruct bpf_programstruct bpf_struct_opsstruct bpf_map_defstruct bpf_mapstruct extern_descstruct module_btfstruct elf_sec_descstruct elf_statestruct usdt_managerstruct bpf_objectstruct pt_regsstruct user_pt_regsstruct user_regs_structstruct bpf_link_perfstruct kprobe_multi_resolvestruct avail_kallsyms_datastruct bpf_link_struct_opsstruct perf_bufferstruct perf_buffer_paramsstruct perf_cpu_bufstruct perf_bufferstruct perf_sample_rawstruct perf_sample_lostenum reloc_typeenum sec_def_flagsenum libbpf_map_typeenum extern_typeenum kcfg_typeenum sec_typeenum bpf_object_stateenum libbpf_pin_typefunction __base_prfunction libbpf_set_printfunction libbpf_printfunction pr_perm_msgfunction ptr_to_u64function libbpf_set_strict_modefunction libbpf_major_versionfunction libbpf_minor_versionfunction bpf_program__unloadfunction bpf_program__exitfunction insn_is_subprog_callfunction is_call_insnfunction insn_is_pseudo_funcfunction bpf_object__init_prog
Annotated Snippet
SEC_DEF("cgroup/sock_create", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE),
SEC_DEF("cgroup/sock_release", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_RELEASE, SEC_ATTACHABLE),
SEC_DEF("cgroup/sock", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE_OPT),
SEC_DEF("cgroup/post_bind4", CGROUP_SOCK, BPF_CGROUP_INET4_POST_BIND, SEC_ATTACHABLE),
SEC_DEF("cgroup/post_bind6", CGROUP_SOCK, BPF_CGROUP_INET6_POST_BIND, SEC_ATTACHABLE),
SEC_DEF("cgroup/bind4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_BIND, SEC_ATTACHABLE),
SEC_DEF("cgroup/bind6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_BIND, SEC_ATTACHABLE),
SEC_DEF("cgroup/connect4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT, SEC_ATTACHABLE),
SEC_DEF("cgroup/connect6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT, SEC_ATTACHABLE),
SEC_DEF("cgroup/connect_unix", CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_CONNECT, SEC_ATTACHABLE),
SEC_DEF("cgroup/sendmsg4", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG, SEC_ATTACHABLE),
SEC_DEF("cgroup/sendmsg6", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG, SEC_ATTACHABLE),
SEC_DEF("cgroup/sendmsg_unix", CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_SENDMSG, SEC_ATTACHABLE),
SEC_DEF("cgroup/recvmsg4", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_RECVMSG, SEC_ATTACHABLE),
SEC_DEF("cgroup/recvmsg6", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_RECVMSG, SEC_ATTACHABLE),
SEC_DEF("cgroup/recvmsg_unix", CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_RECVMSG, SEC_ATTACHABLE),
SEC_DEF("cgroup/getpeername4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETPEERNAME, SEC_ATTACHABLE),
SEC_DEF("cgroup/getpeername6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETPEERNAME, SEC_ATTACHABLE),
SEC_DEF("cgroup/getpeername_unix", CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_GETPEERNAME, SEC_ATTACHABLE),
SEC_DEF("cgroup/getsockname4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETSOCKNAME, SEC_ATTACHABLE),
SEC_DEF("cgroup/getsockname6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETSOCKNAME, SEC_ATTACHABLE),
SEC_DEF("cgroup/getsockname_unix", CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_GETSOCKNAME, SEC_ATTACHABLE),
SEC_DEF("cgroup/sysctl", CGROUP_SYSCTL, BPF_CGROUP_SYSCTL, SEC_ATTACHABLE),
SEC_DEF("cgroup/getsockopt", CGROUP_SOCKOPT, BPF_CGROUP_GETSOCKOPT, SEC_ATTACHABLE),
SEC_DEF("cgroup/setsockopt", CGROUP_SOCKOPT, BPF_CGROUP_SETSOCKOPT, SEC_ATTACHABLE),
SEC_DEF("cgroup/dev", CGROUP_DEVICE, BPF_CGROUP_DEVICE, SEC_ATTACHABLE_OPT),
SEC_DEF("struct_ops+", STRUCT_OPS, 0, SEC_NONE),
SEC_DEF("struct_ops.s+", STRUCT_OPS, 0, SEC_SLEEPABLE),
SEC_DEF("sk_lookup", SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE),
SEC_DEF("netfilter", NETFILTER, BPF_NETFILTER, SEC_NONE),
};
int libbpf_register_prog_handler(const char *sec,
enum bpf_prog_type prog_type,
enum bpf_attach_type exp_attach_type,
const struct libbpf_prog_handler_opts *opts)
{
struct bpf_sec_def *sec_def;
if (!OPTS_VALID(opts, libbpf_prog_handler_opts))
return libbpf_err(-EINVAL);
if (last_custom_sec_def_handler_id == INT_MAX) /* prevent overflow */
return libbpf_err(-E2BIG);
if (sec) {
sec_def = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt + 1,
sizeof(*sec_def));
if (!sec_def)
return libbpf_err(-ENOMEM);
custom_sec_defs = sec_def;
sec_def = &custom_sec_defs[custom_sec_def_cnt];
} else {
if (has_custom_fallback_def)
return libbpf_err(-EBUSY);
sec_def = &custom_fallback_def;
}
sec_def->sec = sec ? strdup(sec) : NULL;
if (sec && !sec_def->sec)
return libbpf_err(-ENOMEM);
sec_def->prog_type = prog_type;
sec_def->expected_attach_type = exp_attach_type;
sec_def->cookie = OPTS_GET(opts, cookie, 0);
sec_def->prog_setup_fn = OPTS_GET(opts, prog_setup_fn, NULL);
sec_def->prog_prepare_load_fn = OPTS_GET(opts, prog_prepare_load_fn, NULL);
sec_def->prog_attach_fn = OPTS_GET(opts, prog_attach_fn, NULL);
sec_def->handler_id = ++last_custom_sec_def_handler_id;
if (sec)
custom_sec_def_cnt++;
else
has_custom_fallback_def = true;
return sec_def->handler_id;
}
int libbpf_unregister_prog_handler(int handler_id)
{
struct bpf_sec_def *sec_defs;
int i;
if (handler_id <= 0)
return libbpf_err(-EINVAL);
Annotation
- Immediate include surface: `stdlib.h`, `stdio.h`, `stdarg.h`, `libgen.h`, `inttypes.h`, `limits.h`, `string.h`, `unistd.h`.
- Detected declarations: `struct reloc_desc`, `struct bpf_sec_def`, `struct bpf_light_subprog`, `struct bpf_program`, `struct bpf_struct_ops`, `struct bpf_map_def`, `struct bpf_map`, `struct extern_desc`, `struct module_btf`, `struct elf_sec_desc`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.