Man page - bpf(2)
Packages contains this manual
- __malloc_initialize_hook(3)
- getpwuid(3)
- frexpl(3)
- fchown(2)
- setttyent(3)
- pthread_attr_setstacksize(3)
- calloc(3)
- clog(3)
- seteuid(2)
- res_nquerydomain(3)
- y0l(3)
- catanl(3)
- catanh(3)
- inet_addr(3)
- getcwd(2)
- epoll_create1(2)
- atol(3)
- pciconfig_write(2)
- htonl(3)
- timer_settime(2)
- munmap(2)
- cexpl(3)
- rt_sigsuspend(2)
- msgctl(2)
- tan(3)
- get_mempolicy(2)
- roundf(3)
- towctrans(3)
- xdr_opaque(3)
- psignal(3)
- error_at_line(3)
- xdrmem_create(3)
- select(2)
- getdate_r(3)
- getprotobyname_r(3)
- nrand48_r(3)
- inet_netof(3)
- inet_ntoa(3)
- nextafterl(3)
- innetgr(3)
- on_exit(3)
- expm1l(3)
- strfmon(3)
- strdup(3)
- getservbyport(3)
- arch_prctl(2)
- j0(3)
- wait4(2)
- personality(2)
- bpf(2)
- pvalloc(3)
- getresuid32(2)
- des_setparity(3)
- prctl(2)
- clog10(3)
- aio_init(3)
- pthread_getconcurrency(3)
- csinl(3)
- linkat(2)
- vsscanf(3)
- isascii(3)
- xdr_union(3)
- nan(3)
- utimensat(2)
- ioctl_vt(2)
- _newselect(2)
- ldexpl(3)
- fabsf(3)
- chown(2)
- mkstemps(3)
- pthread_attr_getstacksize(3)
- listxattr(2)
- getpgrp(2)
- xdr_short(3)
- tcflush(3)
- pthread_cond_wait(3)
- argz_add(3)
- wcpncpy(3)
- reallocarray(3)
- llrintf(3)
- outsl(2)
- qsort(3)
- authnone_create(3)
- tzname(3)
- setresuid32(2)
- isspace(3)
- open_by_handle_at(2)
- drem(3)
- conjf(3)
- nanosleep(2)
- pthread_kill(3)
- putc(3)
- pthread_condattr_destroy(3)
- getpwuid_r(3)
- strverscmp(3)
- res_init(3)
- cacosl(3)
- qecvt_r(3)
- iswgraph(3)
- gethostbyname(3)
- ntohl(3)
- acct(2)
- asinl(3)
- envz_merge(3)
- strdupa(3)
- idle(2)
- getopt_long_only(3)
- hstrerror(3)
- fanotify_init(2)
- fputs_unlocked(3)
- sleep(3)
- vfprintf(3)
- scalb(3)
- nanl(3)
- lchown32(2)
- getnetent_r(3)
- fcntl(2)
- inw(2)
- rintl(3)
- arc4random(3)
- getsockopt(2)
- ilogbl(3)
- clog2(3)
- encrypt(3)
- sqrtf(3)
- isspace_l(3)
- tanl(3)
- cfmakeraw(3)
- assert(3)
- strtoull(3)
- xdrstdio_create(3)
- optopt(3)
- setrlimit(2)
- lround(3)
- xdr_accepted_reply(3)
- fmin(3)
- mq_notify(3)
- svcerr_auth(3)
- sbrk(2)
- recv(2)
- mq_unlink(2)
- strxfrm(3)
- ctan(3)
- atoi(3)
- xcrypt(3)
- sgetspent(3)
- fread(3)
- isless(3)
- ceil(3)
- pthread_cond_broadcast(3)
- oldfstat(2)
- outl(2)
- times(2)
- wcslen(3)
- popen(3)
- wprintf(3)
- labs(3)
- getrpcbynumber(3)
- shmat(2)
- clock_gettime(2)
- btree(3)
- s390_sthyi(2)
- siggetmask(3)
- getgid32(2)
- puts(3)
- scalblnl(3)
- strpbrk(3)
- catanhl(3)
- vlimit(3)
- getrpcent(3)
- tgammal(3)
- strtoll(3)
- funlockfile(3)
- xdecrypt(3)
- pthread_key_delete(3)
- setgrent(3)
- wmemmove(3)
- gnu_dev_major(3)
- regexec(3)
- lrintl(3)
- __ppc_set_ppr_med(3)
- rmdir(2)
- io_getevents(2)
- request_key(2)
- ecvt(3)
- __ppc_mdoom(3)
- mktemp(3)
- key_gendes(3)
- le64toh(3)
- statvfs(3)
- rpc(3)
- getdate_err(3)
- munlockall(2)
- close(2)
- xdr_rejected_reply(3)
- dlerror(3)
- le32toh(3)
- feclearexcept(3)
- insque(3)
- clntraw_create(3)
- getutid(3)
- strtof(3)
- settimeofday(2)
- mkdir(2)
- rewind(3)
- logf(3)
- tmpnam(3)
- iswpunct(3)
- wcrtomb(3)
- epoll_pwait(2)
- getitimer(2)
- wordexp(3)
- clog2f(3)
- capset(2)
- strrchr(3)
- outsb(2)
- freeifaddrs(3)
- getwc_unlocked(3)
- ustat(2)
- bswap_16(3)
- program_invocation_short_name(3)
- ldiv(3)
- exp10f(3)
- vprintf(3)
- wcsncpy(3)
- iscntrl(3)
- readlink(2)
- semget(2)
- connect(2)
- psiginfo(3)
- epoll_ctl(2)
- removexattr(2)
- envz_strip(3)
- fgetxattr(2)
- atexit(3)
- putgrent(3)
- bswap(3)
- getegid32(2)
- qecvt(3)
- asinh(3)
- isfdtype(3)
- setenv(3)
- readdir(3)
- rtime(3)
- nearbyint(3)
- getgroups32(2)
- statx(2)
- modify_ldt(2)
- cpow(3)
- eventfd_read(3)
- sendfile64(2)
- getnetbyname(3)
- fremovexattr(2)
- uselib(2)
- inet(3)
- endutxent(3)
- clnt_spcreateerror(3)
- pututline(3)
- nexttowardl(3)
- getipnodebyaddr(3)
- fts_set(3)
- memmem(3)
- fmodl(3)
- setfsuid32(2)
- wordfree(3)
- fadvise64(2)
- getppid(2)
- qsort_r(3)
- toupper(3)
- getwc(3)
- fputws(3)
- mrand48(3)
- preadv(2)
- sincosf(3)
- fstatat64(2)
- dirfd(3)
- jnf(3)
- static_assert(3)
- wctype(3)
- vwarn(3)
- setfsent(3)
- listen(2)
- wcstok(3)
- argz_insert(3)
- select_tut(2)
- ctanl(3)
- getunwind(2)
- difftime(3)
- daylight(3)
- sigpause(3)
- wcscat(3)
- dlclose(3)
- __ppc_set_ppr_med_low(3)
- pread(2)
- fstatvfs(3)
- cbrtf(3)
- strnlen(3)
- sinhl(3)
- inl_p(2)
- setregid32(2)
- putwc(3)
- register_printf_type(3)
- nextafterf(3)
- opendir(3)
- strtod(3)
- tgamma(3)
- malloc_get_state(3)
- aio_write(3)
- timezone(3)
- xdr_pmaplist(3)
- sysfs(2)
- index(3)
- svcerr_noproc(3)
- envz(3)
- klogctl(3)
- pselect(2)
- get_current_dir_name(3)
- xdr_char(3)
- asinhf(3)
- preadv2(2)
- inotify_init1(2)
- pthread_attr_setstackaddr(3)
- getline(3)
- tanhf(3)
- rtnetlink(3)
- pkey_alloc(2)
- edata(3)
- stailq(3)
- isastream(2)
- setregid(2)
- copy_file_range(2)
- rcmd_af(3)
- futex(2)
- prof(2)
- siglongjmp(3)
- hdestroy(3)
- catan(3)
- pthread_cond_signal(3)
- mkfifoat(3)
- clntudp_create(3)
- getentropy(3)
- vsprintf(3)
- fabs(3)
- lseek64(3)
- pthread_setname_np(3)
- conjl(3)
- chroot(2)
- ccoshf(3)
- erand48_r(3)
- wcsnrtombs(3)
- rindex(3)
- fputc_unlocked(3)
- setresgid32(2)
- gettimeofday(2)
- cexp(3)
- inotify_add_watch(2)
- set_robust_list(2)
- nice(2)
- strtold(3)
- mq_getattr(3)
- xdr(3)
- getxattr(2)
- getrandom(2)
- splice(2)
- strerror(3)
- fcntl64(2)
- fnmatch(3)
- ungetwc(3)
- getspnam_r(3)
- clearenv(3)
- atan2(3)
- get_myaddress(3)
- open(2)
- pthread_setcancelstate(3)
- newlocale(3)
- open_memstream(3)
- setprotoent(3)
- logbf(3)
- ilogb(3)
- wmemcpy(3)
- tcsendbreak(3)
- be16toh(3)
- perfmonctl(2)
- strtoq(3)
- getgrgid_r(3)
- pthread_timedjoin_np(3)
- memfd_create(2)
- getttynam(3)
- mcheck_pedantic(3)
- _llseek(2)
- renameat2(2)
- ioperm(2)
- ecb_crypt(3)
- pthread_condattr_init(3)
- fminl(3)
- lio_listio(3)
- envz_add(3)
- setbuf(3)
- setkey(3)
- expm1(3)
- strtoul(3)
- getcwd(3)
- setutxent(3)
- getrpcent_r(3)
- unimplemented(2)
- fclose(3)
- epoll_create(2)
- getfsent(3)
- key_secretkey_is_set(3)
- vserver(2)
- vswprintf(3)
- sigsuspend(2)
- pututxline(3)
- clnt_freeres(3)
- cacheflush(2)
- ioprio_set(2)
- alarm(2)
- fgetc(3)
- __fpurge(3)
- getlogin_r(3)
- vfork(2)
- bstring(3)
- div(3)
- getrusage(2)
- gettid(2)
- dprintf(3)
- strtoumax(3)
- jrand48(3)
- iswcntrl(3)
- vwarnx(3)
- cacos(3)
- ccoshl(3)
- fesetexceptflag(3)
- res_nclose(3)
- shmop(2)
- mcheck_check_all(3)
- vscanf(3)
- tolower(3)
- landlock_add_rule(2)
- argz_next(3)
- lroundl(3)
- ruserok(3)
- glob(3)
- brk(2)
- rename(2)
- strcspn(3)
- sched_getscheduler(2)
- wcstoumax(3)
- dbopen(3)
- xdr_bytes(3)
- fegetenv(3)
- scalbf(3)
- pkey_free(2)
- fgetgrent(3)
- strchrnul(3)
- fork(2)
- log1pf(3)
- strtoimax(3)
- fputs(3)
- putspent(3)
- ttyname_r(3)
- iswlower(3)
- epoll_wait(2)
- minor(3)
- wcsspn(3)
- sendmmsg(2)
- pthread_attr_getsigmask_np(3)
- erand48(3)
- setpgrp(2)
- db(3)
- readv(2)
- cimagf(3)
- pthread_sigmask(3)
- getresuid(2)
- gamma(3)
- logwtmp(3)
- imaxabs(3)
- y1(3)
- swapoff(2)
- svcerr_weakauth(3)
- mbtowc(3)
- madvise(2)
- __fbufsize(3)
- swapon(2)
- towlower(3)
- asin(3)
- initgroups(3)
- svc_getreqset(3)
- pthread_attr_destroy(3)
- scalblnf(3)
- ispunct(3)
- casin(3)
- xdr_pmap(3)
- sigvec(3)
- dlmopen(3)
- localeconv(3)
- tcgetattr(3)
- mempcpy(3)
- clnt_perrno(3)
- clock_getcpuclockid(3)
- setaliasent(3)
- clock(3)
- ftok(3)
- svc_run(3)
- getsubopt(3)
- coshf(3)
- pow(3)
- getpwent(3)
- ntp_gettime(3)
- xdrrec_skiprecord(3)
- symlink(2)
- shmctl(2)
- mq_timedreceive(2)
- malloc(3)
- tgkill(2)
- l64a(3)
- unlockpt(3)
- mallopt(3)
- creal(3)
- syscalls(2)
- set_tid_address(2)
- exp2f(3)
- fstatfs(2)
- statfs(2)
- dreml(3)
- feenableexcept(3)
- ftw(3)
- fanotify_mark(2)
- clnt_sperror(3)
- realpath(3)
- sysconf(3)
- _syscall(2)
- set_mempolicy(2)
- mq_unlink(3)
- freehostent(3)
- rresvport_af(3)
- nl_langinfo_l(3)
- fmaxl(3)
- iscntrl_l(3)
- copysignf(3)
- llseek(2)
- bzero(3)
- ioctl_fsmap(2)
- remquof(3)
- malloc_trim(3)
- pthread_getattr_default_np(3)
- isalnum_l(3)
- mlock(2)
- nearbyintf(3)
- confstr(3)
- sinf(3)
- ioctl_eventpoll(2)
- sigstack(3)
- seed48_r(3)
- utmpname(3)
- malloc_stats(3)
- stpncpy(3)
- getservbyport_r(3)
- cabsl(3)
- isblank(3)
- sigprocmask(2)
- isinfl(3)
- isinff(3)
- pathconf(3)
- xdr_u_short(3)
- acos(3)
- timerfd_create(2)
- key_encryptsession(3)
- log2f(3)
- oldlstat(2)
- res_querydomain(3)
- memcmp(3)
- gethostbyaddr(3)
- sighold(3)
- gtty(2)
- xdr_void(3)
- getmsg(2)
- io_setup(2)
- ttyslot(3)
- recno(3)
- cuserid(3)
- nanf(3)
- pthread_getaffinity_np(3)
- if_indextoname(3)
- remainderf(3)
- putpwent(3)
- pow10f(3)
- pwritev(2)
- swapcontext(3)
- cfsetospeed(3)
- envz_remove(3)
- cosh(3)
- a64l(3)
- uselocale(3)
- yn(3)
- msgget(2)
- pthread_equal(3)
- prlimit(2)
- setspent(3)
- newfstatat(2)
- renameat(2)
- truncf(3)
- pthread_yield(3)
- tkill(2)
- islessequal(3)
- isnanf(3)
- sethostent(3)
- setvbuf(3)
- gnu_get_libc_release(3)
- atoll(3)
- getgrnam(3)
- get_robust_list(2)
- __ppc_yield(3)
- __memalign_hook(3)
- eventfd2(2)
- mq_setattr(3)
- tmpnam_r(3)
- pmap_getport(3)
- svcfd_create(3)
- getfsspec(3)
- setgid(2)
- getlogin(3)
- get_nprocs(3)
- canonicalize_file_name(3)
- pthread_mutexattr_getrobust(3)
- strerrorname_np(3)
- csinh(3)
- malloc_set_state(3)
- tcgetsid(3)
- ssignal(3)
- secure_getenv(3)
- significandl(3)
- wcschr(3)
- isgraph(3)
- pthread_mutexattr_gettype(3)
- creat(2)
- cabsf(3)
- __ppc_set_ppr_med_high(3)
- fchdir(2)
- backtrace_symbols(3)
- exp10l(3)
- euidaccess(3)
- sync_file_range(2)
- getutxline(3)
- isdigit(3)
- sinhf(3)
- lgetxattr(2)
- getaliasent(3)
- memrchr(3)
- io_submit(2)
- clnt_create(3)
- __setfpucw(3)
- _flushlbf(3)
- lcong48_r(3)
- clog10l(3)
- pmap_getmaps(3)
- memalign(3)
- xdr_authunix_parms(3)
- execl(3)
- getdate(3)
- cfsetispeed(3)
- tanhl(3)
- wmempcpy(3)
- outw_p(2)
- faccessat(2)
- rresvport(3)
- nextup(3)
- fgetgrent_r(3)
- getopt(3)
- xdr_vector(3)
- aio_error(3)
- frexpf(3)
- getpw(3)
- sscanf(3)
- mprotect(2)
- exp(3)
- sched_getaffinity(2)
- accept4(2)
- remainderl(3)
- pthread_key_create(3)
- endian(3)
- setmntent(3)
- get_phys_pages(3)
- argz(3)
- _exit(2)
- towupper_l(3)
- lrand48(3)
- csqrt(3)
- hdestroy_r(3)
- remquo(3)
- feof_unlocked(3)
- isprint(3)
- pivot_root(2)
- arc4random_uniform(3)
- strfroml(3)
- getdomainname(2)
- va_end(3)
- getresgid(2)
- cosf(3)
- endhostent(3)
- setgid32(2)
- ioctl_fs(2)
- getaddrinfo(3)
- fgetwc(3)
- lock(2)
- getservbyname_r(3)
- sys_nerr(3)
- insb(2)
- usleep(3)
- security(2)
- cfree(3)
- tanf(3)
- fprintf(3)
- pthread_mutexattr_setpshared(3)
- xprt_unregister(3)
- alphasort(3)
- getgrent(3)
- scandirat(3)
- iruserok(3)
- ttyname(3)
- tdestroy(3)
- strcasecmp(3)
- getpgid(2)
- drand48_r(3)
- mmap(2)
- sigtimedwait(2)
- pthread_once(3)
- mq_receive(3)
- pthread_mutexattr_setkind_np(3)
- iopl(2)
- s390_runtime_instr(2)
- lckpwdf(3)
- memmove(3)
- __fpending(3)
- mbsrtowcs(3)
- restart_syscall(2)
- memset(3)
- significandf(3)
- openat2(2)
- timeradd(3)
- conj(3)
- flockfile(3)
- madvise1(2)
- inet_aton(3)
- fstatfs64(2)
- fmax(3)
- fmemopen(3)
- fmaf(3)
- lseek(2)
- registerrpc(3)
- kexec_file_load(2)
- gammal(3)
- feof(3)
- pidfd_open(2)
- crealf(3)
- clogl(3)
- getutmp(3)
- umount(2)
- inet_pton(3)
- flistxattr(2)
- xdr_wrapstring(3)
- socketcall(2)
- setrpcent(3)
- rint(3)
- vm86(2)
- sincosl(3)
- getprotoent_r(3)
- mknod(2)
- getdents64(2)
- gai_cancel(3)
- srandom_r(3)
- getnetbyname_r(3)
- sigaddset(3)
- htole16(3)
- endnetent(3)
- nextafter(3)
- timerisset(3)
- getgrent_r(3)
- freeaddrinfo(3)
- endprotoent(3)
- mbind(2)
- sigorset(3)
- pthread_rwlockattr_setkind_np(3)
- cimag(3)
- waitid(2)
- abs(3)
- unlink(2)
- recvmsg(2)
- getaliasbyname(3)
- wctrans(3)
- kill(2)
- strtol(3)
- __ppc_set_ppr_very_low(3)
- membarrier(2)
- getnetbyaddr_r(3)
- writev(2)
- errx(3)
- tfind(3)
- clone3(2)
- __freading(3)
- outw(2)
- regfree(3)
- accept(2)
- timer_getoverrun(2)
- shmdt(2)
- svcerr_decode(3)
- getnameinfo(3)
- endusershell(3)
- execvpe(3)
- cbc_crypt(3)
- res_send(3)
- xdr_destroy(3)
- getcontext(3)
- pkey_mprotect(2)
- twalk_r(3)
- isalnum(3)
- timercmp(3)
- setxattr(2)
- pthread_cleanup_pop_restore_np(3)
- stat(2)
- isupper(3)
- vsyslog(3)
- strlen(3)
- pthread_attr_setinheritsched(3)
- xdr_inline(3)
- strtouq(3)
- raise(3)
- getpeername(2)
- capget(2)
- atanl(3)
- ferror_unlocked(3)
- isxdigit_l(3)
- modfl(3)
- pthread_mutexattr_init(3)
- pthread_mutexattr_getkind_np(3)
- phys(2)
- llabs(3)
- sched_rr_get_interval(2)
- asprintf(3)
- explicit_bzero(3)
- asctime(3)
- clone(2)
- munlock(2)
- __realloc_hook(3)
- atof(3)
- rt_tgsigqueueinfo(2)
- syslog(2)
- inet_makeaddr(3)
- epoll_pwait2(2)
- iswalpha(3)
- netlink(3)
- sched_setattr(2)
- sigdescr_np(3)
- access(2)
- getc_unlocked(3)
- dysize(3)
- inet_net_pton(3)
- sched_setparam(2)
- timerfd_settime(2)
- nexttowardf(3)
- expf(3)
- svcerr_progvers(3)
- getwchar(3)
- ftime(3)
- if_nametoindex(3)
- argz_add_sep(3)
- vasprintf(3)
- unlinkat(2)
- putenv(3)
- pthread_mutexattr_setrobust_np(3)
- error_message_count(3)
- setfsgid(2)
- cmsg(3)
- setpwent(3)
- cfgetospeed(3)
- end(3)
- pidfd_send_signal(2)
- scalbn(3)
- closelog(3)
- srandom(3)
- argz_replace(3)
- ioctl_tty(2)
- va_arg(3)
- towlower_l(3)
- isblank_l(3)
- remove(3)
- expl(3)
- fscanf(3)
- versionsort(3)
- pow10(3)
- hsearch(3)
- gethostid(3)
- fchownat(2)
- group_member(3)
- getchar_unlocked(3)
- getservbyname(3)
- pthread_mutexattr_destroy(3)
- setpgid(2)
- acosf(3)
- ctanhf(3)
- shm_open(3)
- towupper(3)
- getdents(2)
- chown32(2)
- hypotf(3)
- undocumented(3)
- drand48(3)
- csinf(3)
- ctime_r(3)
- setlinebuf(3)
- ulimit(3)
- spu_create(2)
- fcvt_r(3)
- ipc(2)
- ftruncate64(2)
- fdopen(3)
- svcerr_noprog(3)
- getrpcport(3)
- csin(3)
- sinh(3)
- nrand48(3)
- openpty(3)
- xdr_double(3)
- pthread_attr_getscope(3)
- vfscanf(3)
- catanhf(3)
- inb(2)
- wcpcpy(3)
- ldexp(3)
- getopt_long(3)
- strerrordesc_np(3)
- mbsinit(3)
- argz_stringify(3)
- setbuffer(3)
- byteorder(3)
- expm1f(3)
- pthread_attr_setscope(3)
- gnu_dev_makedev(3)
- pipe(2)
- updwtmp(3)
- fts_read(3)
- ioctl_fat(2)
- h_errno(3)
- sem_getvalue(3)
- iswupper(3)
- lrint(3)
- perror(3)
- xdr_u_int(3)
- timer_create(2)
- iswdigit(3)
- fgetspent(3)
- fwrite_unlocked(3)
- reboot(2)
- ftruncate(2)
- getutmpx(3)
- pwrite64(2)
- getauxval(3)
- xdr_pointer(3)
- getprotobynumber(3)
- svc_destroy(3)
- vmsplice(2)
- inet_network(3)
- readdir_r(3)
- setsockopt(2)
- rexec(3)
- flock(2)
- getw(3)
- mmap2(2)
- j1f(3)
- cprojf(3)
- mkstemp(3)
- symlinkat(2)
- tempnam(3)
- pthread_attr_getaffinity_np(3)
- gethostbyname_r(3)
- signalfd4(2)
- sys_siglist(3)
- erfc(3)
- truncate64(2)
- verr(3)
- pthread_kill_other_threads_np(3)
- eaccess(3)
- fsetpos(3)
- slist(3)
- pmap_unset(3)
- modf(3)
- ioctl_pipe(2)
- vfwprintf(3)
- getresgid32(2)
- statfs64(2)
- cexp2(3)
- stdio_ext(3)
- login_tty(3)
- xdr_long(3)
- dlsym(3)
- clog2l(3)
- malloc_usable_size(3)
- fegetexceptflag(3)
- basename(3)
- fwrite(3)
- vhangup(2)
- printf(3)
- setnetent(3)
- gethostbyname2(3)
- mallinfo2(3)
- signbit(3)
- clnt_broadcast(3)
- sched_yield(2)
- sem_open(3)
- sigsetjmp(3)
- cacoshl(3)
- sem_unlink(3)
- setresuid(2)
- signgam(3)
- putw(3)
- imaxdiv(3)
- regex(3)
- alloc_hugepages(2)
- modff(3)
- exp10(3)
- cprojl(3)
- utime(2)
- clogf(3)
- pthread_mutex_unlock(3)
- erff(3)
- ioctl_userfaultfd(2)
- iswprint(3)
- roundl(3)
- sqrtl(3)
- fpurge(3)
- getusershell(3)
- fcloseall(3)
- xdr_opaque_auth(3)
- gethostent_r(3)
- fgetwc_unlocked(3)
- fchmod(2)
- strptime(3)
- lutimes(3)
- htole64(3)
- putchar_unlocked(3)
- create_module(2)
- isascii_l(3)
- sigaction(2)
- stdout(3)
- geteuid32(2)
- xprt_register(3)
- freopen(3)
- ccosl(3)
- pthread_setschedprio(3)
- rt_sigaction(2)
- getmntent(3)
- putwchar_unlocked(3)
- logl(3)
- remque(3)
- unsetenv(3)
- sigwaitinfo(2)
- pthread_mutexattr_getrobust_np(3)
- initstate_r(3)
- getfsfile(3)
- exp2l(3)
- isatty(3)
- lgamma_r(3)
- lrintf(3)
- outb(2)
- __clone2(2)
- strcpy(3)
- clnt_call(3)
- hypot(3)
- fegetexcept(3)
- tcsetpgrp(3)
- gets(3)
- malloc_info(3)
- nextupf(3)
- pthread_attr_getdetachstate(3)
- getaliasent_r(3)
- fstat64(2)
- futimesat(2)
- dl_iterate_phdr(3)
- posix_madvise(3)
- endnetgrent(3)
- tolower_l(3)
- pthread_attr_setstack(3)
- pread64(2)
- sigsetops(3)
- stty(2)
- process_vm_readv(2)
- isfinite(3)
- gethostbyaddr_r(3)
- cproj(3)
- gai_strerror(3)
- key_decryptsession(3)
- inet_ntop(3)
- __ppc_mdoio(3)
- btowc(3)
- setstate_r(3)
- if_nameindex(3)
- fdetach(2)
- random_r(3)
- iruserok_af(3)
- truncl(3)
- clearerr(3)
- lgammaf(3)
- lfind(3)
- ctanf(3)
- strcat(3)
- pthread_attr_getschedpolicy(3)
- pthread_rwlockattr_getkind_np(3)
- sigrelse(3)
- daemon(3)
- pthread_setcanceltype(3)
- sigevent(7)
- iswalnum(3)
- pmap_set(3)
- stdin(3)
- ceilf(3)
- asctime_r(3)
- poll(2)
- svc_unregister(3)
- isnanl(3)
- carg(3)
- getprotobyname(3)
- arm_fadvise(2)
- optind(3)
- mount_setattr(2)
- dlvsym(3)
- ntp_adjtime(3)
- abort(3)
- pthread_getname_np(3)
- execlp(3)
- bind(2)
- bsearch(3)
- endspent(3)
- register_printf_specifier(3)
- landlock_create_ruleset(2)
- mkostemp(3)
- setgroups(2)
- toupper_l(3)
- argz_extract(3)
- sigblock(3)
- j0l(3)
- argz_delete(3)
- setusershell(3)
- getspnam(3)
- optarg(3)
- vm86old(2)
- sigandset(3)
- getdtablesize(3)
- getsockname(2)
- pthread_sigqueue(3)
- ptsname(3)
- j1(3)
- lgamma(3)
- getpagesize(2)
- pthread_mutex_lock(3)
- setsid(2)
- strncat(3)
- ioctl_kd(2)
- tsearch(3)
- mq_notify(2)
- fcvt(3)
- clntudp_bufcreate(3)
- getpwent_r(3)
- pthread_getspecific(3)
- memfrob(3)
- arc4random_buf(3)
- forkpty(3)
- powl(3)
- dlopen(3)
- stderr(3)
- set_thread_area(2)
- query_module(2)
- sem_close(3)
- strndup(3)
- __malloc_hook(3)
- setjmp(3)
- stdio(3)
- bdflush(2)
- sendto(2)
- mpx(2)
- fopen(3)
- setpriority(2)
- nextdownl(3)
- mprobe(3)
- oldstat(2)
- sem_destroy(3)
- bcopy(3)
- remap_file_pages(2)
- isgreaterequal(3)
- getpass(3)
- seekdir(3)
- break(2)
- authunix_create_default(3)
- tty_ioctl(4)
- process_madvise(2)
- endfsent(3)
- atoq(3)
- strftime(3)
- fts(3)
- getgrgid(3)
- isxdigit(3)
- ftello(3)
- regcomp(3)
- error(3)
- getenv(3)
- clnt_sperrno(3)
- readahead(2)
- y0(3)
- roundup(3)
- io_destroy(2)
- vsnprintf(3)
- lgammal(3)
- eventfd_write(3)
- pthread_mutex_trylock(3)
- lchown(2)
- dladdr(3)
- error_print_progname(3)
- pthread_mutexattr_settype(3)
- strspn(3)
- __after_morecore_hook(3)
- localtime(3)
- fsync(2)
- ether_aton(3)
- csinhl(3)
- trunc(3)
- xdr_u_char(3)
- syslog(3)
- y1f(3)
- ioctl_nsfs(2)
- wmemcmp(3)
- ffsll(3)
- ether_ntohost(3)
- bswap_32(3)
- umount2(2)
- sigfillset(3)
- landlock_restrict_self(2)
- pthread_join(3)
- sysinfo(2)
- clock_settime(2)
- llrint(3)
- s390_guarded_storage(2)
- getc(3)
- inet_lnaof(3)
- tcgetpgrp(3)
- clock_getres(2)
- etext(3)
- strfmon_l(3)
- putwc_unlocked(3)
- xdr_replymsg(3)
- scalbl(3)
- fdim(3)
- getspent(3)
- sem_timedwait(3)
- posix_fallocate(3)
- res_nmkquery(3)
- pthread_spin_unlock(3)
- mq_timedsend(2)
- opterr(3)
- getloadavg(3)
- strsignal(3)
- finite(3)
- inw_p(2)
- csinhf(3)
- execveat(2)
- seed48(3)
- sigset(3)
- setgroups32(2)
- logbl(3)
- wcsdup(3)
- clnt_geterr(3)
- sys_errlist(3)
- inotify_rm_watch(2)
- qgcvt(3)
- wcspbrk(3)
- sin(3)
- lookup_dcookie(2)
- s390_pci_mmio_read(2)
- wcscmp(3)
- getutxent(3)
- pciconfig_read(2)
- initstate(3)
- backtrace(3)
- putc_unlocked(3)
- fedisableexcept(3)
- rt_sigprocmask(2)
- clock_adjtime(2)
- fwprintf(3)
- jnl(3)
- grantpt(3)
- cimagl(3)
- getgrnam_r(3)
- remquol(3)
- swprintf(3)
- mbrtowc(3)
- fileno_unlocked(3)
- readlinkat(2)
- sigignore(3)
- strndupa(3)
- semctl(2)
- assert_perror(3)
- sendfile(2)
- shm_unlink(3)
- log(3)
- ungetc(3)
- erf(3)
- qfcvt(3)
- pthread_atfork(3)
- login(3)
- setservent(3)
- jrand48_r(3)
- wcsnlen(3)
- tcflow(3)
- pthread_cond_destroy(3)
- inl(2)
- srand48_r(3)
- erfcf(3)
- iconv(3)
- pthread_mutex_consistent_np(3)
- fabsl(3)
- pclose(3)
- nfsservctl(2)
- gai_error(3)
- wcsncmp(3)
- islower_l(3)
- iswctype(3)
- svc_register(3)
- arm_sync_file_range(2)
- strfry(3)
- strfromd(3)
- getttyent(3)
- rand(3)
- fchown32(2)
- ctime(3)
- fsetxattr(2)
- feupdateenv(3)
- random(3)
- getpwnam_r(3)
- sigwait(3)
- aio_fsync(3)
- mq_open(2)
- tanh(3)
- localtime_r(3)
- bsd_signal(3)
- strsep(3)
- mknodat(2)
- cexpf(3)
- cacosh(3)
- mbrlen(3)
- aio_cancel(3)
- mq_getsetattr(2)
- fdatasync(2)
- htons(3)
- sem_post(3)
- htobe16(3)
- vtimes(3)
- fgetpwent_r(3)
- getwchar_unlocked(3)
- mkdirat(2)
- dup(2)
- free_hugepages(2)
- feraiseexcept(3)
- lockf(3)
- userfaultfd(2)
- pthread_attr_setaffinity_np(3)
- memcpy(3)
- prlimit64(2)
- ferror(3)
- ldexpf(3)
- aio_return(3)
- adjtimex(2)
- execle(3)
- tailq(3)
- cabs(3)
- endaliasent(3)
- execvp(3)
- hasmntopt(3)
- if_freenameindex(3)
- signal(2)
- dn_comp(3)
- pthread_attr_getstack(3)
- ether_hostton(3)
- re_comp(3)
- cexp2l(3)
- getwd(3)
- llroundl(3)
- cos(3)
- pthread_mutex_consistent(3)
- isalpha_l(3)
- io_cancel(2)
- frexp(3)
- finitel(3)
- perf_event_open(2)
- pthread_exit(3)
- ioctl_console(2)
- timelocal(3)
- timersub(3)
- setresgid(2)
- semop(2)
- getgroups(2)
- envz_entry(3)
- xdr_u_long(3)
- seccomp(2)
- ftrylockfile(3)
- setuid(2)
- wcwidth(3)
- llround(3)
- cacoshf(3)
- pthread_attr_setschedpolicy(3)
- fgetpos(3)
- xdr_array(3)
- sprintf(3)
- wmemset(3)
- setcontext(3)
- copysignl(3)
- be64toh(3)
- matherr(3)
- hypotl(3)
- rawmemchr(3)
- fmodf(3)
- mount(2)
- mktime(3)
- stdarg(3)
- clnttcp_create(3)
- string(3)
- profil(3)
- clnt_perror(3)
- getpriority(2)
- regerror(3)
- clone2(2)
- getgid(2)
- pthread_spin_lock(3)
- iswblank(3)
- ftell(3)
- dup3(2)
- toascii(3)
- strncpy(3)
- mrand48_r(3)
- setstate(3)
- sigqueue(3)
- cpowf(3)
- setlogmask(3)
- sched_getcpu(3)
- htobe32(3)
- list(3)
- isdigit_l(3)
- chdir(2)
- fstat(2)
- pwritev2(2)
- get_thread_area(2)
- freelocale(3)
- acoshl(3)
- socketpair(2)
- scalbln(3)
- fpclassify(3)
- getpwnam(3)
- pthread_getcpuclockid(3)
- ioprio_get(2)
- strtok_r(3)
- exit_group(2)
- scalbnf(3)
- xdrrec_create(3)
- pthread_mutex_destroy(3)
- sqrt(3)
- dirname(3)
- exit(2)
- ulckpwdf(3)
- cargl(3)
- powerof2(3)
- simpleq(3)
- process_vm_writev(2)
- fdopendir(3)
- getpt(3)
- floorl(3)
- va_start(3)
- lcong48(3)
- strerror_l(3)
- xdrrec_eof(3)
- key_setsecret(3)
- lstat64(2)
- memfd_secret(2)
- sigreturn(2)
- casinhf(3)
- valloc(3)
- stat64(2)
- jn(3)
- sinl(3)
- pthread_testcancel(3)
- cfgetispeed(3)
- dup2(2)
- getnetent(3)
- pthread_setconcurrency(3)
- memccpy(3)
- rt_sigqueueinfo(2)
- ccosf(3)
- sincos(3)
- tcdrain(3)
- ccos(3)
- chmod(2)
- cacosf(3)
- lstat(2)
- pthread_spin_trylock(3)
- sigisemptyset(3)
- getrpcbyname(3)
- fpathconf(3)
- copysign(3)
- round(3)
- wmemchr(3)
- qfcvt_r(3)
- fattach(2)
- __fsetlocking(3)
- adjtime(3)
- makedev(3)
- des_crypt(3)
- iswspace(3)
- twalk(3)
- exec(3)
- link(2)
- fileno(3)
- endpwent(3)
- logb(3)
- wcscspn(3)
- console_ioctl(4)
- fgetpwent(3)
- setegid(2)
- clnt_destroy(3)
- getaddrinfo_a(3)
- svc_getargs(3)
- addmntent(3)
- globfree(3)
- islower(3)
- muntrace(3)
- clnt_pcreateerror(3)
- llrintl(3)
- clnt_control(3)
- fgetspent_r(3)
- strstr(3)
- putmsg(2)
- __fwritable(3)
- res_nsearch(3)
- fseeko(3)
- mq_timedreceive(3)
- log10(3)
- fexecve(3)
- gammaf(3)
- pthread_setschedparam(3)
- wcscpy(3)
- xdr_float(3)
- pthread_attr_setdetachstate(3)
- sem_wait(3)
- pow10l(3)
- re_exec(3)
- rand_r(3)
- putpmsg(2)
- getdelim(3)
- utimes(2)
- mq_close(3)
- setutent(3)
- creall(3)
- mq_send(3)
- telldir(3)
- powf(3)
- erfl(3)
- pthread_self(3)
- pselect6(2)
- unlocked_stdio(3)
- insw(2)
- cfsetspeed(3)
- argz_create(3)
- xdr_string(3)
- pthread_attr_getguardsize(3)
- finitef(3)
- setlocale(3)
- bcmp(3)
- fmtmsg(3)
- sendmsg(2)
- pthread_cleanup_push(3)
- inb_p(2)
- mmap64(3)
- getuid32(2)
- truncate(2)
- mlock2(2)
- fegetround(3)
- ugetrlimit(2)
- getprotobynumber_r(3)
- utmpxname(3)
- isinf(3)
- clearerr_unlocked(3)
- stime(2)
- nftw(3)
- duplocale(3)
- svcraw_create(3)
- svc_getcaller(3)
- ctanhl(3)
- cbrt(3)
- floorf(3)
- sethostid(3)
- sigemptyset(3)
- sigaltstack(2)
- mkfifo(3)
- lsearch(3)
- getservent_r(3)
- islessgreater(3)
- floor(3)
- argz_append(3)
- tzset(3)
- res_mkquery(3)
- fstatat(2)
- strchr(3)
- semtimedop(2)
- bindresvport(3)
- tcsetattr(3)
- warn(3)
- getservent(3)
- atanhl(3)
- tdelete(3)
- ynf(3)
- ether_ntoa_r(3)
- fesetenv(3)
- mq_timedsend(3)
- quotactl(2)
- init_module(2)
- rcmd(3)
- fenv(3)
- getutxid(3)
- pthread_mutexattr_getpshared(3)
- scalbnl(3)
- atan2l(3)
- argz_count(3)
- rpmatch(3)
- timerfd_gettime(2)
- ualarm(3)
- pthread_attr_init(3)
- vdprintf(3)
- pthread_cancel(3)
- fflush(3)
- setkey_r(3)
- mbstowcs(3)
- mremap(2)
- strcasestr(3)
- hcreate_r(3)
- siginterrupt(3)
- offsetof(3)
- atan(3)
- wctomb(3)
- getutent(3)
- significand(3)
- arm_fadvise64_64(2)
- dremf(3)
- wcswidth(3)
- syscall(2)
- rintf(3)
- bswap_64(3)
- pthread_attr_getschedparam(3)
- lroundf(3)
- timegm(3)
- posix_fadvise(2)
- getrlimit(2)
- svc_freeargs(3)
- xdr_enum(3)
- hcreate(3)
- ptrace(2)
- backtrace_symbols_fd(3)
- fetestexcept(3)
- ccosh(3)
- htole32(3)
- kexec_load(2)
- fallocate(2)
- timer_gettime(2)
- tgammaf(3)
- errno(3)
- sched_get_priority_max(2)
- xdr_getpos(3)
- vwprintf(3)
- ssetmask(2)
- ether_ntoa(3)
- waitpid(2)
- sched_getattr(2)
- inotify_init(2)
- fma(3)
- gnu_get_libc_version(3)
- svctcp_create(3)
- wcstombs(3)
- gethostname(2)
- strerror_r(3)
- sigismember(3)
- fgetws_unlocked(3)
- hash(3)
- circleq(3)
- getrpcbynumber_r(3)
- pthread_cond_timedwait(3)
- uname(2)
- fgetc_unlocked(3)
- mq_open(3)
- cosl(3)
- rewinddir(3)
- nextdown(3)
- longjmp(3)
- execv(3)
- iconv_open(3)
- xencrypt(3)
- ctermid(3)
- isgraph_l(3)
- move_pages(2)
- isunordered(3)
- msgsnd(2)
- rt_sigtimedwait(2)
- syncfs(2)
- mlockall(2)
- pthread_getschedparam(3)
- lsetxattr(2)
- getutid_r(3)
- log1pl(3)
- catanf(3)
- passwd2des(3)
- iconv_close(3)
- aligned_alloc(3)
- sched_setscheduler(2)
- gmtime(3)
- __free_hook(3)
- acoshf(3)
- mtrace(3)
- resolver(3)
- clog10f(3)
- sethostname(2)
- pthread_attr_setguardsize(3)
- tuxcall(2)
- atanh(3)
- ispunct_l(3)
- svcudp_bufcreate(3)
- ctanh(3)
- j1l(3)
- log10l(3)
- alloca(3)
- sigpending(2)
- nexttoward(3)
- isnormal(3)
- svc_getreq(3)
- putchar(3)
- getnetbyaddr(3)
- cpowl(3)
- get_kernel_syms(2)
- getutline_r(3)
- pthread_setaffinity_np(3)
- isnan(3)
- getprotoent(3)
- catclose(3)
- getsid(2)
- endrpcent(3)
- fts_close(3)
- gnu_dev_minor(3)
- ruserok_af(3)
- getutent_r(3)
- getegid(2)
- sgetmask(2)
- posix_memalign(3)
- atanf(3)
- unshare(2)
- lremovexattr(2)
- strncasecmp(3)
- endutent(3)
- updwtmpx(3)
- outsw(2)
- sched_getparam(2)
- setuid32(2)
- catgets(3)
- nextupl(3)
- openat(2)
- logout(3)
- free(3)
- setfsuid(2)
- getutline(3)
- svc_sendreply(3)
- fadvise64_64(2)
- cargf(3)
- __ppc_set_ppr_low(3)
- casinh(3)
- outb_p(2)
- fputwc(3)
- log10f(3)
- getnetgrent(3)
- fputws_unlocked(3)
- ffsl(3)
- endttyent(3)
- isgreater(3)
- sigmask(3)
- sgetspent_r(3)
- fmaxf(3)
- openlog(3)
- strncmp(3)
- closedir(3)
- rexec_af(3)
- exp2(3)
- mcheck(3)
- isalpha(3)
- pthread_mutex_init(3)
- catopen(3)
- clock_nanosleep(2)
- ioctl(2)
- remainder(3)
- olduname(2)
- getcpu(2)
- setns(2)
- asinhl(3)
- wcscasecmp(3)
- nearbyintl(3)
- atan2f(3)
- wctob(3)
- nextdownf(3)
- gmtime_r(3)
- fmal(3)
- setfsgid32(2)
- dlinfo(3)
- posix_spawnp(3)
- fgets_unlocked(3)
- major(3)
- fseek(3)
- xdr_callhdr(3)
- execve(2)
- exit(3)
- makecontext(3)
- sysctl(2)
- oldolduname(2)
- getgrouplist(3)
- pthread_getattr_np(3)
- ffs(3)
- sem_init(3)
- gcvt(3)
- fts_children(3)
- rt_sigreturn(2)
- mallinfo(3)
- insl(2)
- geteuid(2)
- signalfd(2)
- erfcl(3)
- sched_get_priority_min(2)
- sched_setaffinity(2)
- wcsrchr(3)
- xdr_reference(3)
- snprintf(3)
- delete_module(2)
- j0f(3)
- malloc_hook(3)
- casinf(3)
- y0f(3)
- endgrent(3)
- y1l(3)
- pthread_create(3)
- wcsncasecmp(3)
- pidfd_getfd(2)
- htobe64(3)
- _sysctl(2)
- lrand48_r(3)
- warnx(3)
- lgammaf_r(3)
- verrx(3)
- finit_module(2)
- gsignal(3)
- recvfrom(2)
- log2(3)
- fflush_unlocked(3)
- getaliasbyname_r(3)
- pthread_mutexattr_setrobust(3)
- getdirentries(3)
- getrpcbyname_r(3)
- ppoll(2)
- tmpfile(3)
- isupper_l(3)
- xdr_free(3)
- res_nquery(3)
- fts_open(3)
- shutdown(2)
- xdr_callmsg(3)
- coshl(3)
- ntp_gettimex(3)
- afs_syscall(2)
- be32toh(3)
- fchmodat(2)
- addseverity(3)
- pause(2)
- strcmp(3)
- mkostemps(3)
- wcsrtombs(3)
- scandir(3)
- __freadable(3)
- killpg(3)
- add_key(2)
- strcoll(3)
- migrate_pages(2)
- pthread_setattr_default_np(3)
- pthread_attr_setsigmask_np(3)
- sigabbrev_np(3)
- readdir(2)
- subpage_prot(2)
- strfromf(3)
- sysv_signal(3)
- gethostbyname2_r(3)
- outl_p(2)
- sync(2)
- pthread_attr_getinheritsched(3)
- socket(2)
- msgrcv(2)
- fgetws(3)
- pthread_cleanup_push_defer_np(3)
- getnetgrent_r(3)
- ynl(3)
- endservent(3)
- srand(3)
- endmntent(3)
- cbrtl(3)
- setitimer(2)
- pmap_rmtcall(3)
- svcerr_systemerr(3)
- fesetround(3)
- ilogbf(3)
- __fwriting(3)
- log1p(3)
- futimens(3)
- xdrrec_endofrecord(3)
- setreuid32(2)
- swab(3)
- pthread_spin_init(3)
- memchr(3)
- fminf(3)
- getipnodebyname(3)
- msgop(2)
- wait(2)
- ether_aton_r(3)
- open_wmemstream(3)
- xdr_bool(3)
- pthread_tryjoin_np(3)
- xdr_int(3)
- inet_net_ntop(3)
- fdimf(3)
- srand48(3)
- xdr_setpos(3)
- asinf(3)
- program_invocation_name(3)
- write(2)
- mkdtemp(3)
- pthread_cleanup_pop(3)
- ptsname_r(3)
- lgammal_r(3)
- pthread_attr_getstackaddr(3)
- authunix_create(3)
- getpmsg(2)
- ceill(3)
- cexp2f(3)
- kcmp(2)
- setup(2)
- err(3)
- sync_file_range2(2)
- getpid(2)
- wcsncat(3)
- envz_get(3)
- futimes(3)
- mincore(2)
- herror(3)
- ether_line(3)
- feholdexcept(3)
- fputc(3)
- keyctl(2)
- timer_delete(2)
- posix_spawn(3)
- faccessat2(2)
- setnetgrent(3)
- pwrite(2)
- aio_read(3)
- shmget(2)
- acosh(3)
- sigdelset(3)
- __ppc_get_timebase(3)
- __flbf(3)
- dladdr1(3)
- argz_create_sep(3)
- mblen(3)
- gethostent(3)
- pciconfig_iobase(2)
- recvmmsg(2)
- isprint_l(3)
- csqrtf(3)
- wcstoimax(3)
- hsearch_r(3)
- svcudp_create(3)
- setreuid(2)
- le16toh(3)
- name_to_handle_at(2)
- strftime_l(3)
- pthread_attr_setschedparam(3)
- eventfd(2)
- atanhf(3)
- pthread_setspecific(3)
- pthread_cond_init(3)
- acosl(3)
- llistxattr(2)
- fputwc_unlocked(3)
- scanf(3)
- getmntent_r(3)
- getchar(3)
- res_ninit(3)
- error_one_per_line(3)
- sigsetmask(3)
- putwchar(3)
- llroundf(3)
- rt_sigpending(2)
- send(2)
- wcsstr(3)
- log2l(3)
- fmod(3)
- va_copy(3)
- res_search(3)
- res_nsend(3)
- res_query(3)
- wait3(2)
- encrypt_r(3)
- system(3)
- close_range(2)
- ecvt_r(3)
- read(2)
- auth_destroy(3)
- realloc(3)
- pipe2(2)
- dn_expand(3)
- timerclear(3)
- get_avphys_pages(3)
- mbsnrtowcs(3)
- strtok(3)
- fwide(3)
- __ppc_get_timebase_freq(3)
- gai_suspend(3)
- stpcpy(3)
- lldiv(3)
- iswxdigit(3)
- posix_openpt(3)
- s390_pci_mmio_write(2)
- pthread_spin_destroy(3)
- callrpc(3)
- getifaddrs(3)
- aio_suspend(3)
- fread_unlocked(3)
- get_nprocs_conf(3)
- getuid(2)
- spu_run(2)
- termios(3)
- umask(2)
- csqrtl(3)
- register_printf_modifier(3)
- sem_trywait(3)
- tee(2)
- msync(2)
- mpool(3)
- setdomainname(2)
- fopencookie(3)
- nl_langinfo(3)
- sockatmark(3)
- getspent_r(3)
- casinhl(3)
- fdiml(3)
- ntohs(3)
- fgets(3)
- time(2)
- casinl(3)
- pthread_detach(3)
- seccomp_unotify(2)
apt-get install manpages-dev
Available languages:
en fr ruManual
bpf
NOMSYNOPSIS
DESCRIPTION
Conception/architecture de BPF étendu
Argument
mappes eBPF
Types de mappe eBPF
Programmes eBPF
Types de programme eBPF
ĂvĂ©nements
VALEUR RENVOYĂE
ERREURS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION
NOM
bpf - Lancer une commande sur une mappe ou un programme BPF
SYNOPSIS
#include <linux/bpf.h>
int bpf(int cmd , union bpf_attr * attr , unsigned int size );
DESCRIPTION
Lâappel systĂšme bpf () effectue une sĂ©rie dâopĂ©rations liĂ©es aux Berkeley Packet Filters Ă©tendus (« filtres de paquets Berkeley »). BPF Ă©tendu (ou eBPF) est identique au BPF « classique » originel (cBPF) utilisĂ© pour filtrer les paquets rĂ©seau. Pour les programmes tant cBPF quâeBPF, le noyau analyse de maniĂšre statique les programmes avant de les charger, afin de garantir quâils ne puissent pas mettre en danger le systĂšme en cours dâexĂ©cution.
eBPF Ă©tend cBPF de plusieurs maniĂšres, notamment par la possibilitĂ© dâappeler un ensemble fixĂ© de fonctions dâaide du noyau (Ă lâaide de lâextension dâopcode BPF_CALL fournie par eBPF) et dâaccĂ©der aux structures de donnĂ©es partagĂ©es telles que les mappes eBPF.
Conception/architecture de BPF étendu
Les mappes eBPF sont des structures de donnĂ©es gĂ©nĂ©riques pour stocker diffĂ©rents types de donnĂ©es. Les types de donnĂ©es sont gĂ©nĂ©ralement traitĂ©s comme des blobs binaires, donc lâutilisateur indique seulement la taille de la clĂ© et celle de la valeur au moment de la crĂ©ation de la mappe. En dâautres termes, la clĂ©/valeur dâune mappe donnĂ©e peut avoir une structure arbitraire.
Un processus utilisateur peut crĂ©er plusieurs mappes (dont les paires clĂ©/valeur sont des octets de donnĂ©es opaques) et y accĂ©der par les descripteurs de fichier. DiffĂ©rents programmes eBPF peuvent accĂ©der aux mĂȘmes mappes en parallĂšle. Il appartient au processus utilisateur et au programme eBPF de dĂ©cider ce quâils stockent dans leurs mappes.
Il existe un type de mappe spĂ©cial appelĂ© un tableau de programmes (« program array »). Ce type de mappe stocke des descripteurs de fichiers qui renvoient Ă dâautres programmes eBPF. Quand une recherche est effectuĂ©e sur la mappe, le flux du programme est redirigĂ© directement au dĂ©but dâun autre programme eBPF et il ne renvoie rien au programme appelant. Le niveau de redirections est de 32 pour Ă©viter de crĂ©er des boucles infinies. Au moment de lâexĂ©cution, les descripteurs de fichier du programme stockĂ©s dans la mappe peuvent ĂȘtre modifiĂ©s, donc la fonctionnalitĂ© de programme peut ĂȘtre modifiĂ©e sur la base dâexigences spĂ©cifiques. Tous les programmes auxquels renvoie une mappe tableau de programmes (program-array) doivent avoir Ă©tĂ© prĂ©cĂ©demment chargĂ©s dans le noyau avec bpf (). Si une recherche de mappe Ă©choue, le programme en cours poursuit son exĂ©cution. Voir BPF_MAP_TYPE_PROG_ARRAY ci-dessous pour des dĂ©tails.
GĂ©nĂ©ralement, les programmes eBPF sont chargĂ©s par le processus de lâutilisateur et dĂ©chargĂ©s automatiquement quand le processus se termine. Dans certains cas, par exemple tc-bpf (8), le programme restera en vie dans le noyau mĂȘme aprĂšs que le processus qui lâa chargĂ© est fini. Dans ce cas, le sous-systĂšme tc garde une rĂ©fĂ©rence au programme eBPF aprĂšs que le descripteur de fichier est fermĂ© par le programme de lâespace utilisateur. Ainsi, la survie dâun programme spĂ©cifique dans le noyau dĂ©pend de la maniĂšre dont il a Ă©tĂ© rattachĂ© Ă un sous-systĂšme donnĂ© du noyau aprĂšs quâil a Ă©tĂ© chargĂ© par bpf ().
Chaque programme eBPF est un ensemble dâinstructions quâon peut exĂ©cuter en sĂ©curitĂ© jusquâĂ leur fin. Un vĂ©rificateur interne au noyau dĂ©termine de maniĂšre statique ce que le programme eBPF interrompt et sâil peut ĂȘtre exĂ©cutĂ© en toute sĂ©curitĂ©. Pendant la vĂ©rification, le noyau ajoute un numĂ©ro de rĂ©fĂ©rence de maniĂšre incrĂ©mentale pour chacune des mappes utilisĂ©es par le programme eBPF, si bien que les mappes qui y sont rattachĂ©es ne peuvent pas ĂȘtre supprimĂ©es avant que le programme soit dĂ©chargĂ©.
Les programmes eBPF peuvent ĂȘtre rattachĂ©s Ă diffĂ©rents Ă©vĂ©nements. Ces Ă©vĂ©nements peuvent ĂȘtre lâarrivĂ©e de paquets rĂ©seaux, le traçage dâĂ©vĂ©nements, la classification dâĂ©vĂ©nements en disciplines de files dâattente rĂ©seau (pour les programmes eBPF rattachĂ©s Ă un classificateur tc (8)), et dâautres types qui pourront ĂȘtre ajoutĂ©s dans le futur. Un nouvel Ă©vĂ©nement provoque lâexĂ©cution dâun programme eBPF, qui peut stocker des informations sur lâĂ©vĂšnement dans des mappes eBPF. Par-delĂ les donnĂ©es stockĂ©es, les programmes eBPF peuvent appeler un ensemble fixĂ© de fonctions dâaide internes au noyau.
Un mĂȘme programme eBPF peut ĂȘtre rattachĂ© Ă plusieurs Ă©vĂ©nements (Ă©vt) et divers programmes eBPF peuvent accĂ©der Ă la mĂȘme mappe :
traçage
traçage traçage paquet paquet paquet
évt A évt B évt C sur eth0 sur eth1 sur
eth2
| | | | | ^
| | | | v |
--> traçage <-- traçage socket tc
ingress tc egress
prog_1 prog_2 prog_3 classifieur action
| | | | prog_4 prog_5
|--- -----| |------| mappe_3 | |
mappe_1 mappe_2 --| mappe_4 |--
Argument
LâopĂ©ration Ă effectuer par lâappel systĂšme bpf () est dĂ©terminĂ©e par le paramĂštre cmd . Chaque opĂ©ration prend un paramĂštre, fourni par attr , qui est un pointeur vers une union de type bpf_attr (voir ci-dessous). Les champs inutilisĂ©s et de remplissage doivent ĂȘtre mis Ă zĂ©ro avant lâappel. Le paramĂštre size est la taille de lâunion vers laquelle pointe attr .
La valeur
fournie dans
cmd
est une parmi :
BPF_MAP_CREATE
CrĂ©er une mappe et renvoyer un descripteur de fichier qui sây rapporte. Le drapeau de descripteur de fichier close-on-exec (voir fcntl (2)) est automatiquement activĂ© pour le nouveau descripteur de fichier.
BPF_MAP_LOOKUP_ELEM
Chercher un élément par clé dans une mappe spécifiée et renvoyer sa valeur.
BPF_MAP_UPDATE_ELEM
Créer ou mettre à jour un élément (paire clé/valeur) dans une mappe spécifiée.
BPF_MAP_DELETE_ELEM
Chercher et effacer un élément par clé dans une mappe spécifiée.
BPF_MAP_GET_NEXT_KEY
Chercher un Ă©lĂ©ment par clĂ© dans une mappe spĂ©cifiĂ©e et renvoyer la clĂ© de lâĂ©lĂ©ment suivant.
BPF_PROG_LOAD
Vérifier et charger un programme eBPF, en renvoyant un nouveau descripteur de fichier associé au programme. Le drapeau de descripteur de fichier close-on-exec (voir fcntl (2)) est activé automatiquement pour le nouveau descripteur de fichier.
Lâunion bpf_attr consiste dans diverses structures anonymes utilisĂ©es par diffĂ©rentes commandes bpf () :
union bpf_attr
{
struct { /* Utilisé par BPF_MAP_CREATE */
__u32 map_type;
__u32 key_size; /* taille de la clé en octets */
__u32 value_size; /* taille de la valeur en octets */
__u32 max_entries; /* nombre maximal dâentrĂ©es
dans une mappe */
};
struct { /* Utilisé par les commandes BPF_MAP_*_ELEM
et
BPF_MAP_GET_NEXT_KEY */
__u32 map_fd;
__aligned_u64 key;
union {
__aligned_u64 value;
__aligned_u64 next_key;
};
__u64 flags;
};
struct { /* Utilisé par BPF_PROG_LOAD */
__u32 prog_type;
__u32 insn_cnt;
__aligned_u64 insns; /* 'const struct bpf_insn *' */
__aligned_u64 license; /* 'const char *' */
__u32 log_level; /* niveau de bavardage du
vérificateur */
__u32 log_size; /* taille du tampon utilisateur */
__aligned_u64 log_buf; /* lâutilisateur a fourni 'char
*'
de tampon */
__u32 kern_version;
/* vérifier quand prog_type=kprobe
(depuis Linux 4.1) */
};
} __attribute__((aligned(8)));
mappes eBPF
Les mappes sont des structures de donnĂ©es gĂ©nĂ©riques pour stocker diffĂ©rents types de donnĂ©es. Elles permettent de partager des donnĂ©es entre des programmes eBPF du noyau, mais aussi entre les applications du noyau et de lâespace utilisateur.
Chaque type de mappe a les attributs suivants :
|
- |
type |
|||
|
- |
nombre maximal dâĂ©lĂ©ments |
|||
|
- |
taille de la clé en octets |
|||
|
- |
valeur de la clé en octets |
Les fonctions
enveloppe suivantes montrent la maniĂšre dont diverses
commandes
bpf
() peuvent ĂȘtre utilisĂ©es
pour accéder aux mappes. Les fonctions utilisent le
paramĂštre
cmd
pour appeler différentes
opérations.
BPF_MAP_CREATE
La commande BPF_MAP_CREATE crĂ©e une nouvelle mappe, renvoyant un nouveau descripteur de fichier qui sây rapporte.
int
bpf_create_map(enum bpf_map_type map_type,
unsigned int key_size,
unsigned int value_size,
unsigned int max_entries)
{
union bpf_attr attr = {
.map_type = map_type,
.key_size = key_size,
.value_size = value_size,
.max_entries = max_entries
};
return bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
}
La nouvelle mappe possĂšde le type indiquĂ© avec map_type et les attributs indiquĂ©s dans key_size , value_size et max_entries . En cas de succĂšs, cette opĂ©ration renvoie un descripteur de fichier. En cas dâerreur, -1 est renvoyĂ© et errno est positionnĂ© sur EINVAL , EPERM ou ENOMEM .
Les attributs key_size et value_size seront utilisĂ©s par le vĂ©rificateur lors du chargement du programme pour vĂ©rifier que le programme appelle les fonctions dâaide bpf_map_*_elem () avec une key correctement initialisĂ©e et pour vĂ©rifier que le programme nâaccĂšde pas Ă une value de lâĂ©lĂ©ment de la mappe au-delĂ de la value_size indiquĂ©e. Par exemple, quand une mappe est créée avec key_size de 8 et que le programme eBPF appelle un
bpf_map_lookup_elem(map_fd, fp - 4)
le programme sera rejetĂ©, puisque la fonction dâaide du noyau
bpf_map_lookup_elem(map_fd, void *key)
sâattend Ă lire 8 octets Ă lâendroit oĂč pointe key , mais lâadresse de dĂ©part fp - 4 (oĂč fp est le haut de la pile) crĂ©e un accĂšs de la pile hors limites.
De mĂȘme, lorsquâune mappe est créée avec une value_size de 1 et que le programme eBPF contient
value =
bpf_map_lookup_elem(...);
*(u32 *) value = 1;
le programme sera rejetĂ© puisquâil accĂšde au pointeur value au-delĂ de la la limite value_size dâun octet spĂ©cifiĂ©e.
Actuellement, les valeurs suivantes sont prises en charge par map_type :
enum
bpf_map_type {
BPF_MAP_TYPE_UNSPEC, /* Réserver 0 comme type de
mappe non valable */
BPF_MAP_TYPE_HASH,
BPF_MAP_TYPE_ARRAY,
BPF_MAP_TYPE_PROG_ARRAY,
BPF_MAP_TYPE_PERF_EVENT_ARRAY,
BPF_MAP_TYPE_PERCPU_HASH,
BPF_MAP_TYPE_PERCPU_ARRAY,
BPF_MAP_TYPE_STACK_TRACE,
BPF_MAP_TYPE_CGROUP_ARRAY,
BPF_MAP_TYPE_LRU_HASH,
BPF_MAP_TYPE_LRU_PERCPU_HASH,
BPF_MAP_TYPE_LPM_TRIE,
BPF_MAP_TYPE_ARRAY_OF_MAPS,
BPF_MAP_TYPE_HASH_OF_MAPS,
BPF_MAP_TYPE_DEVMAP,
BPF_MAP_TYPE_SOCKMAP,
BPF_MAP_TYPE_CPUMAP,
BPF_MAP_TYPE_XSKMAP,
BPF_MAP_TYPE_SOCKHASH,
BPF_MAP_TYPE_CGROUP_STORAGE,
BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
BPF_MAP_TYPE_QUEUE,
BPF_MAP_TYPE_STACK,
/* Voir /usr/include/linux/bpf.h pour la liste
complĂšte. */
};
map_type sĂ©lectionne une des implĂ©mentations de mappe disponibles dans le noyau. Pour tous les types de mappe, les programmes eBPF accĂšdent aux mappes avec les mĂȘmes fonctions dâaide bpf_map_lookup_elem () et bpf_map_update_elem (). Vous trouverez ci-dessous plus de dĂ©tails sur les diffĂ©rents types de mappes.
BPF_MAP_LOOKUP_ELEM
La commande BPF_MAP_LOOKUP_ELEM cherche un élément avec une key donnée dans la mappe à laquelle se rapporte le descripteur de fichier fd .
int
bpf_lookup_elem(int fd, const void *key, void *value)
{
union bpf_attr attr = {
.map_fd = fd,
.key = ptr_to_u64(key),
.value = ptr_to_u64(value),
};
return bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
}
Si un Ă©lĂ©ment est trouvĂ©, lâopĂ©ration renvoie zĂ©ro et stocke la valeur de lâĂ©lĂ©ment dans value , qui doit pointer vers un tampon de value_size octets.
Si aucun Ă©lĂ©ment nâest trouvĂ©, lâopĂ©ration renvoie -1 et errno est positionnĂ© sur ENOENT .
BPF_MAP_UPDATE_ELEM
La commande BPF_MAP_UPDATE_ELEM crée ou met à jour un élément avec une key/value donnée dans la mappe à laquelle se rapporte le descripteur de fichier fd .
int
bpf_update_elem(int fd, const void *key, const void *value,
uint64_t flags)
{
union bpf_attr attr = {
.map_fd = fd,
.key = ptr_to_u64(key),
.value = ptr_to_u64(value),
.flags = flags,
};
return bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr));
}
Le
paramĂštre
flags
devrait ĂȘtre
formĂ© dâune des maniĂšres
suivantes :
BPF_ANY
Créer un nouvel élément ou mettre à jour un élément existant.
BPF_NOEXIST
CrĂ©er un nouvel Ă©lĂ©ment seulement sâil nâexiste pas.
BPF_EXIST
Mettre à jour un élément existant.
En cas de succĂšs, lâopĂ©ration renvoie zĂ©ro. En cas dâerreur, -1 est renvoyĂ© et errno est positionnĂ© sur EINVAL , EPERM , ENOMEM ou E2BIG . E2BIG indique que le nombre dâĂ©lĂ©ments de la mappe a atteint la limite max_entries spĂ©cifiĂ©e au moment de la crĂ©ation de la mappe. EEXIST sera renvoyĂ© si flags spĂ©cifie BPF_NOEXIST et si lâĂ©lĂ©ment contenant key existe dĂ©jĂ sur la mappe. ENOENT sera renvoyĂ© si flags spĂ©cifie BPF_EXIST et si lâĂ©lĂ©ment contenant key nâexiste pas sur la mappe.
BPF_MAP_DELETE_ELEM
La commande BPF_MAP_DELETE_ELEM efface lâĂ©lĂ©ment dont la clĂ© est key sur la mappe Ă laquelle se rapporte le descripteur de fichier fd .
int
bpf_delete_elem(int fd, const void *key)
{
union bpf_attr attr = {
.map_fd = fd,
.key = ptr_to_u64(key),
};
return bpf(BPF_MAP_DELETE_ELEM, &attr, sizeof(attr));
}
Sâil rĂ©ussit, cet appel systĂšme renvoie 0 . Si lâĂ©lĂ©ment nâest pas trouvĂ©, -1 est renvoyĂ© et errno est positionnĂ© sur ENOENT .
BPF_MAP_GET_NEXT_KEY
La commande BPF_MAP_GET_NEXT_KEY recherche un élément par key sur la mappe à laquelle se réfÚre le descripteur de fichier fd et elle définit le pointeur next_key vers la clé du prochain élément.
int
bpf_get_next_key(int fd, const void *key, void *next_key)
{
union bpf_attr attr = {
.map_fd = fd,
.key = ptr_to_u64(key),
.next_key = ptr_to_u64(next_key),
};
return bpf(BPF_MAP_GET_NEXT_KEY, &attr, sizeof(attr));
}
Si key est trouvĂ©e, lâopĂ©ration renvoie zĂ©ro et next_key pointe vers la clĂ© de lâĂ©lĂ©ment suivant. Si key nâest pas trouvĂ©e, lâopĂ©ration renvoie zĂ©ro et next_key pointe vers la clĂ© du premier Ă©lĂ©ment. Si key est le dernier Ă©lĂ©ment, -1 est renvoyĂ© et errno est positionnĂ© sur ENOENT . Les autres valeurs possibles de errno sont ENOMEM , EFAULT , EPERM et EINVAL . Cette mĂ©thode peut ĂȘtre utilisĂ©e pour itĂ©rer entre tous les Ă©lĂ©ments dâune mappe.
close(map_fd)
Effacer la mappe Ă laquelle se rĂ©fĂšre le descripteur de fichier map_fd . Quand le programme de lâespace utilisateur ayant créé la mappe se termine, toutes les mappes sont effacĂ©es automatiquement (mais voir REMARQUES).
Types de mappe eBPF
Les types de
mappe suivants sont pris en charge :
BPF_MAP_TYPE_HASH
Les mappes table de hachage (hash-table) présentent les caractéristiques suivantes :
|
- |
Les mappes sont créées et dĂ©truites par les programmes dans lâespace utilisateur. Tant les programmes eBPF que ceux de lâespace utilisateur peuvent effectuer des opĂ©rations de recherche, de mise Ă jour et dâeffacement. |
||
|
- |
Le noyau se charge dâallouer et de libĂ©rer les paires clĂ©/valeur. |
||
|
- |
Lâaide map_update_elem () Ă©chouera si vous insĂ©rez un nouvel Ă©lĂ©ment quand la limite max_entries est atteinte (cela garantit que les programmes eBPF ne peuvent pas Ă©puiser la mĂ©moire). |
||
|
- |
map_update_elem () remplace atomiquement les éléments existants. |
Les mappes table de hachage (hash-table) sont optimisées pour accélérer la recherche.
BPF_MAP_TYPE_ARRAY
Les mappes tableau (array) présentent les caractéristiques suivantes :
|
- |
Elles sont optimisĂ©es pour une recherche plus rapide. Ă lâavenir, le compilateur du vĂ©rificateur/JIT pourrait reconnaĂźtre les opĂ©rations lookup () qui utilisent une clĂ© constante et lâoptimiser dans un pointeur constant. Il est Ă©galement possible dâoptimiser une clĂ© non constante dans un pointeur arithmĂ©tique direct, car les pointeurs et les value_size sont constants durant toute la vie des programmes eBPF. En dâautres termes, array_map_lookup_elem () peut ĂȘtre mise « inline » par le compilateur du vĂ©rificateur/JIT tout en prĂ©servant lâaccĂšs concurrent Ă cette mappe Ă partir de lâespace utilisateur. |
||
|
- |
Tous les Ă©lĂ©ments du tableau sont prĂ©allouĂ©s et initialisĂ©s Ă zĂ©ro au moment de lâinitialisation |
||
|
- |
La clĂ© est un indice de tableau et doit ĂȘtre exactement de quatre octets. |
||
|
- |
map_delete_elem () Ă©choue avec lâerreur EINVAL , car les Ă©lĂ©ments ne peuvent pas ĂȘtre effacĂ©s. |
||
|
- |
map_update_elem () remplace les Ă©lĂ©ments de maniĂšre non atomique ; pour des mises Ă jour atomiques, vous devriez plutĂŽt utiliser une mappe table de hachage (hash-table). Toutefois, il existe un cas particulier qui peut aussi ĂȘtre utilisĂ© avec les tableaux : le __sync_fetch_and_add() interne atomique peut ĂȘtre utilisĂ© sur des compteurs atomiques en 32 ou 64 bits. Par exemple, il peut sâappliquer sur la valeur entiĂšre si elle reprĂ©sente un compteur unique ou, si une structure contient plusieurs compteurs, il pourrait ĂȘtre utilisĂ© sur des compteurs individuels. Cela est trĂšs souvent utile pour agrĂ©ger et compter des Ă©vĂ©nements. |
Voici quelques cas dâusage des mappes tableau (array)Â :
|
- |
Sous forme de variables eBPF « globales » : un tableau dâun Ă©lĂ©ment dont la clĂ© (indice) est 0 et dont la valeur est un ensemble de variables « globales » que les programmes eBPF peuvent utiliser pour conserver leur Ă©tat entre les Ă©vĂ©nements. |
||
|
- |
AgrĂ©gation dâĂ©vĂ©nements de traçage dans un ensemble fixe de « buckets ». |
||
|
- |
Comptabilité des événements réseaux, par exemple le nombre de paquets et leur taille. |
BPF_MAP_TYPE_PROG_ARRAY (depuis Linux 4.2)
Une mappe tableau de programmes est un type spĂ©cial de mappe tableau dont les valeurs ne contiennent que des descripteurs de fichier qui se rapportent Ă dâautres programmes eBPF. Ainsi, tant key_size que value_size doivent ĂȘtre dâexactement quatre octets. Cette mappe est utilisĂ©e en association avec lâaide bpf_tail_call ().
Cela signifie quâun programme eBPF auquel est rattachĂ© un tableau de programmes (program array) peut appeler Ă partir du noyau
void
bpf_tail_call(void *context, void *prog_map,
unsigned int index);
et donc remplacer le flux de son propre programme par celui du programme sur la tranche du tableau de programmes donnĂ© sâil y en a un. Vous pouvez considĂ©rer cela comme un saut de tableau vers un autre programme eBPF. Le programme appelĂ© rĂ©utilisera ensuite la mĂȘme pile. Quand un saut vers un nouveau programme a Ă©tĂ© fait, il ne renverra plus Ă lâancien programme.
Si aucun programme eBPF nâest trouvĂ© sur lâindice donnĂ© du tableau de programmes (car la tranche de la mappe ne contient pas de descripteur de fichier de programme valable, la recherche dâindice/clĂ© indiquĂ©e dĂ©passe la plage ou la limite de 32 appels en interne a Ă©tĂ© dĂ©passĂ©e), lâexĂ©cution continue avec le programme eBPF actuel. Cela peut ĂȘtre utilisĂ© comme solution de repli pour les cas par dĂ©faut.
Une mappe tableau de programmes sert, par exemple, Ă tracer ou mettre en rĂ©seau, Ă gĂ©rer des appels systĂšme individuels ou des protocoles dans leurs propres sous-programmes et Ă utiliser leurs identifiants comme identifiant individuel de mappe. Cette approche peut apporter des gains de performance et permet de dĂ©passer la limite du nombre dâinstructions dâun programme eBPF. Dans des environnements dynamiques, un dĂ©mon de lâespace utilisateur pourrait remplacer de maniĂšre atomique des sous-programmes au moment de leur exĂ©cution par de nouvelles versions, pour modifier le comportement gĂ©nĂ©ral dâun programme, par exemple, si les rĂšgles globales changent.
Programmes eBPF
La commande BPF_PROG_LOAD est utilisée pour charger un programme eBPF dans le noyau. Le code de retour de cette commande est un nouveau descripteur de fichier associé à ce programme eBPF.
char
bpf_log_buf[LOG_BUF_SIZE];
int
bpf_prog_load(enum bpf_prog_type type,
const struct bpf_insn *insns, int insn_cnt,
const char *license)
{
union bpf_attr attr = {
.prog_type = type,
.insns = ptr_to_u64(insns),
.insn_cnt = insn_cnt,
.license = ptr_to_u64(license),
.log_buf = ptr_to_u64(bpf_log_buf),
.log_size = LOG_BUF_SIZE,
.log_level = 1,
};
return bpf(BPF_PROG_LOAD, &attr, sizeof(attr));
}
prog_type est un des types de programme suivants :
enum
bpf_prog_type {
BPF_PROG_TYPE_UNSPEC, /* Réserver 0 comme type de
programme
non valable */
BPF_PROG_TYPE_SOCKET_FILTER,
BPF_PROG_TYPE_KPROBE,
BPF_PROG_TYPE_SCHED_CLS,
BPF_PROG_TYPE_SCHED_ACT,
BPF_PROG_TYPE_TRACEPOINT,
BPF_PROG_TYPE_XDP,
BPF_PROG_TYPE_PERF_EVENT,
BPF_PROG_TYPE_CGROUP_SKB,
BPF_PROG_TYPE_CGROUP_SOCK,
BPF_PROG_TYPE_LWT_IN,
BPF_PROG_TYPE_LWT_OUT,
BPF_PROG_TYPE_LWT_XMIT,
BPF_PROG_TYPE_SOCK_OPS,
BPF_PROG_TYPE_SK_SKB,
BPF_PROG_TYPE_CGROUP_DEVICE,
BPF_PROG_TYPE_SK_MSG,
BPF_PROG_TYPE_RAW_TRACEPOINT,
BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
BPF_PROG_TYPE_LWT_SEG6LOCAL,
BPF_PROG_TYPE_LIRC_MODE2,
BPF_PROG_TYPE_SK_REUSEPORT,
BPF_PROG_TYPE_FLOW_DISSECTOR,
/* Voir /usr/include/linux/bpf.h pour la liste
complĂšte. */
};
Pour plus de détails sur le type de programme eBPF, voir ci-dessous.
Les autres champs de bpf_attr sont définis comme suit :
|
- |
insns est un tableau dâinstructions struct bpf_insn . |
||
|
- |
insn_cnt est le nombre dâinstructions du programme auquel se rapporte insns . |
||
|
- |
license est une chaĂźne de licence, qui doit ĂȘtre compatible GPL pour appeler les fonctions dâaide marquĂ©es comme gpl_only (les rĂšgles de licence sont les mĂȘmes que celles pour les modules du noyau, pour que mĂȘme des licences duales, telles que « Dual BSD/GPL », puissent ĂȘtre utilisĂ©es). |
||
|
- |
log_buf est un pointeur vers un tampon allouĂ© Ă lâappelant (caller-allocated) oĂč le vĂ©rificateur du noyau peut stocker le journal de sa vĂ©rification. Ce journal est une chaĂźne de plusieurs lignes qui peut ĂȘtre vĂ©rifiĂ©e par lâauteur du programme pour comprendre la maniĂšre par laquelle le vĂ©rificateur est arrivĂ© Ă la conclusion que le programme eBPF nâest pas sĂ»r. Le format de sortie peut changer nâimporte quand puisque le vĂ©rificateur Ă©volue. |
||
|
- |
log_size dimensionne le tampon vers lequel pointe log_buf . Si la taille du tampon nâest pas assez grande pour stocker tous les messages du vĂ©rificateur, -1 est renvoyĂ© et errno est positionnĂ© sur ENOSPC . |
||
|
- |
Le niveau de prĂ©cisions log_level du vĂ©rificateur. Une valeur de zĂ©ro signifie que le vĂ©rificateur ne gĂ©nĂšrera aucun journal ; dans ce cas log_buf doit ĂȘtre un pointeur NULL et log_size doit valoir zĂ©ro. |
Le fait dâappliquer close (2) au descripteur de fichier renvoyĂ© par BPF_PROG_LOAD dĂ©chargera le programme eBPF (mais voir les REMARQUES).
Les mappes sont accessibles Ă partir des programmes eBPF et elles sont utilisĂ©es pour Ă©changer des donnĂ©es entre des programmes eBPF et entre des programmes eBPF et dâautres de lâespace utilisateur. Par exemple, des programmes eBPF peuvent traiter divers Ă©vĂ©nements (comme kprobe, packets) et stocker leurs donnĂ©es dans une mappe, et les programmes de lâespace utilisateur peuvent alors rĂ©cupĂ©rer ces donnĂ©es dans la mappe. Inversement, des programmes de lâespace utilisateur peuvent utiliser une mappe en tant que mĂ©canisme de configuration, la mappe Ă©tant peuplĂ©e par des valeurs vĂ©rifiĂ©es par le programme eBPF qui modifie ensuite son comportement Ă la volĂ©e en fonction de ces valeurs.
Types de programme eBPF
Le type de programme eBPF ( prog_type ) dĂ©termine le sous-ensemble de fonctions dâaide du noyau que peut appeler le programme. Le type de programme dĂ©termine Ă©galement le format dâentrĂ©e du programme (contexte) â le format de struct bpf_context (qui est le blob de donnĂ©es passĂ© au programme eBPF en tant que premier paramĂštre).
Par exemple, un programme de traçage nâa pas exactement le mĂȘme sous-jeu de fonctions dâaide quâun programme de filtrage de socket (bien quâils peuvent en avoir en commun). De mĂȘme lâentrĂ©e (le contexte) dâun programme de traçage est un jeu de valeurs de registre, alors que ce sera un paquet rĂ©seau pour le filtrage de socket.
Le jeu de fonctions disponibles pour les programmes eBPF dâun type donnĂ© pourra augmenter dans le futur.
Les types de
programmes suivants sont pris en charge :
BPF_PROG_TYPE_SOCKET_FILTER
(depuis Linux 3.19)
Actuellement, le jeu de fonctions pour BPF_PROG_TYPE_SOCKET_FILTER est :
bpf_map_lookup_elem(map_fd,
void *key)
/* rechercher la clé dans une map_fd */
bpf_map_update_elem(map_fd, void *key, void *value)
/* mettre à jour la clé/valeur */
bpf_map_delete_elem(map_fd, void *key)
/* effacer la clĂ© dâune map_fd */
Le paramĂštre bpf_context est un pointeur vers une struct __sk_buff .
BPF_PROG_TYPE_KPROBE (depuis Linux 4.1)
[Ă documenter]
BPF_PROG_TYPE_SCHED_CLS (depuis Linux 4.1)
[Ă documenter]
BPF_PROG_TYPE_SCHED_ACT (depuis Linux 4.1)
[Ă documenter]
ĂvĂ©nements
Une fois quâun programme est chargĂ©, il peut ĂȘtre rattachĂ© Ă un Ă©vĂ©nement. Divers sous-systĂšmes du noyau ont plusieurs maniĂšres de le faire.
Depuis Linux 3.19, lâappel suivant rattachera le programme prog_fd au socket sockfd , qui a Ă©tĂ© prĂ©cĂ©demment créé par un appel socket (2) :
setsockopt(sockfd,
SOL_SOCKET, SO_ATTACH_BPF,
&prog_fd, sizeof(prog_fd));
Depuis Linux 4.1, lâappel suivant peut ĂȘtre utilisĂ© pour rattacher un programme eBPF auquel se rapporte le descripteur de fichier prog_fd Ă un descripteur de fichier dâĂ©vĂ©nement perf , event_fd , créé par un appel prĂ©cĂ©dent Ă perf_event_open (2) :
ioctl(event_fd, PERF_EVENT_IOC_SET_BPF, prog_fd);
VALEUR RENVOYĂE
Pour quâun
appel réussisse, le code de retour dépend de
lâopĂ©ration :
BPF_MAP_CREATE
Le nouveau descripteur de fichier associé à la mappe eBPF.
BPF_PROG_LOAD
Le nouveau descripteur de fichier associé au programme eBPF.
Toutes les autres commandes :
Zéro.
En cas dâerreur, la valeur de retour est -1 et errno est dĂ©finie pour prĂ©ciser lâerreur.
ERREURS
|
E2BIG |
Le programme eBPF est trop grand ou une mappe a atteint la limite max_entries (nombre maximal dâĂ©lĂ©ments). |
||
|
EACCES |
Pour BPF_PROG_LOAD , mĂȘme si toutes les instructions du programme sont valables, le programme a Ă©tĂ© rejetĂ© car il a Ă©tĂ© considĂ©rĂ© comme non sĂ»r. Cela est possible sâil a eu un accĂšs Ă une zone de la mĂ©moire interdite ou Ă une pile ou un registre non initialisĂ©, ou parce que les contraintes de la fonction ne correspondent pas aux types rĂ©els, ou quâil y a eu un accĂšs mĂ©moire non alignĂ©. Dans ce cas, il est recommandĂ© dâappeler bpf () Ă nouveau, avec log_level = 1 et dâexaminer le log_buf pour connaĂźtre la raison exacte fournie par le vĂ©rificateur. |
||
|
EAGAIN |
Pour BPF_PROG_LOAD , indique que les ressources nĂ©cessaires sont bloquĂ©es. Cela se produit quand le vĂ©rificateur dĂ©tecte des signaux en attente alors quâil vĂ©rifie la validitĂ© du programme bpf. Dans ce cas, appeler Ă nouveau simplement bpf () avec les mĂȘmes paramĂštres. |
||
|
EBADF |
fd nâest pas un descripteur de fichier ouvert |
||
|
EFAULT |
Un des pointeurs ( key ou value ou log_buf ou insns ) dĂ©passe lâespace dâadressage accessible. |
||
|
EINVAL |
La valeur indiquĂ©e dans cmd nâest pas reconnue par ce noyau. |
||
|
EINVAL |
Pour BPF_MAP_CREATE , soit map_type , soit les attributs ne sont pas autorisés. |
||
|
EINVAL |
Pour des commandes BPF_MAP_*_ELEM , certains champs de union bpf_attr non utilisĂ©s par cette commande nâont pas Ă©tĂ© positionnĂ©s sur zĂ©ro. |
||
|
EINVAL |
Pour BPF_PROG_LOAD , indique une tentative de charger un programme non valable. Les programmes eBPF peuvent ĂȘtre jugĂ©s non valables du fait dâinstructions non reconnues, de lâutilisation de champs rĂ©servĂ©s, de dĂ©passements de plage, de boucles infinies ou dâappels Ă des fonctions inconnues. |
||
|
ENOENT |
Pour BPF_MAP_LOOKUP_ELEM ou BPF_MAP_DELETE_ELEM , indique quâun Ă©lĂ©ment avec la key donnĂ©e nâa pas Ă©tĂ© trouvĂ©. |
||
|
ENOMEM |
Ne peut pas allouer suffisamment de mémoire. |
||
|
EPERM |
Lâappel a Ă©tĂ© fait sans privilĂšges suffisants (sans la capacitĂ© CAP_SYS_ADMIN ). |
STANDARDS
Linux.
HISTORIQUE
Linux 3.18.
NOTES
Avant Linux 4.4, toutes les commandes bpf () exigeaient que lâappelant ait la capacitĂ© CAP_SYS_ADMIN . Depuis Linux 4.4 jusquâĂ prĂ©sent, un utilisateur non privilĂ©giĂ© peut crĂ©er des programmes limitĂ©s de type BPF_PROG_TYPE_SOCKET_FILTER et mappes associĂ©es. Toutefois, ils ne peuvent pas stocker des pointeurs du noyau dans les mappes et ils sont actuellement limitĂ©s aux fonctions dâaide suivantes :
|
- |
get_random |
|||
|
- |
get_smp_processor_id |
|||
|
- |
tail_call |
|||
|
- |
ktime_get_ns |
Un accĂšs sans privilĂšges peut ĂȘtre bloquĂ© en Ă©crivant la valeur 1 dans le fichier /proc/sys/kernel/unprivileged_bpf_disabled .
Les objets eBPF (les mappes et les programmes) peuvent ĂȘtre partagĂ©s entre les processus. Par exemple, aprĂšs fork (2), lâenfant rĂ©cupĂšre les descripteurs de fichier qui se rapportent aux mĂȘmes objets eBPF. De plus, les descripteurs de fichier qui se rapportent aux objets eBPF peuvent ĂȘtre transfĂ©rĂ©s Ă travers des sockets de domaine UNIX. Les descripteurs de fichier qui se rapportent aux objets eBPF peuvent ĂȘtre dupliquĂ©s de la maniĂšre habituelle, en utilisant dup (2) ou des appels similaires. Un objet eBPF nâest dĂ©sallouĂ© quâaprĂšs que tous les descripteurs de fichier qui se rapportent Ă lâobjet sont fermĂ©s.
Les programmes eBPF peuvent ĂȘtre Ă©crits en C restreint compilĂ© en bytecode eBPF (en utilisant le compilateur clang ). Diverses fonctionnalitĂ©s sont absentes de ce C restreint, telles que les boucles, les variables globales, les fonctions variadiques, les nombres dĂ©cimaux et le passage de structures comme paramĂštres dâune fonction. Vous pouvez trouver des exemples dans les fichiers samples/bpf/*_kern.c de lâarborescence des sources du noyau.
Le noyau contient un compilateur « just-in-time (JIT) » qui traduit du bytecode eBPF en langage machine natif pour de meilleures performances. Avant Linux 4.15, le compilateur JIT est dĂ©sactivĂ© par dĂ©faut, mais ce quâil fait peut ĂȘtre contrĂŽlĂ© en Ă©crivant une des chaĂźnes suivantes dâentiers dans le fichier /proc/sys/net/core/bpf_jit_enable :
|
0 |
Désactiver la compilation JIT (par défaut). |
||
|
1 |
Compilation normale. |
||
|
2 |
Mode dĂ©bogage. Les opcodes gĂ©nĂ©rĂ©s sont Ă©crits en hexadĂ©cimal dans le journal du noyau. Ces opcodes peuvent alors ĂȘtre dĂ©sassemblĂ©s avec le programme tools/net/bpf_jit_disasm.c fourni dans lâarborescence des sources du noyau. |
Depuis Linux 4.15, le noyau peut ĂȘtre configurĂ© avec lâoption CONFIG_BPF_JIT_ALWAYS_ON . Dans ce cas, le compilateur JIT est toujours activĂ© et bpf_jit_enable est positionnĂ© sur 1 et immuable (cette option de configuration du noyau est fournie pour contrer une des attaques Spectre contre lâinterprĂ©teur BPF).
Le compilateur JIT pour eBPF est actuellement disponible pour les architectures suivantes :
|
- |
x86-64 (depuis Linux 3.18Â ; cBPF depuis Linux 3.0)Â ; |
|||
|
- |
ARM32 (depuis Linux 3.18Â ; cBPF depuis Linux 3.4)Â ; |
|||
|
- |
SPARC 32 (depuis Linux 3.18Â ; cBPF depuis Linux 3.5)Â ; |
|||
|
- |
ARM-64 (depuis Linux 3.18)Â ;; |
|||
|
- |
s390 (depuis Linux 4.1Â ; cBPF depuis Linux 3.7)Â ; |
|||
|
- |
PowerPC 64 (depuis Linux 4.8Â ; cBPF depuis Linux 3.1)Â ; |
|||
|
- |
SPARC 64 (depuis Linux 4.12)Â ; |
|||
|
- |
x86-32 (depuis Linux 4.18)Â ; |
|||
|
- |
MIPS 64 (depuis Linux 4.18Â ; cBPF depuis Linux 3.16)Â ; |
|||
|
- |
riscv (depuis Linux 5.1). |
EXEMPLES
/* Exemple de
bpf+sockets :
* 1. Créer une mappe tableau de 256
éléments
* 2. Charger le programme qui compte le nombre de paquets
reçus
* r0 = skb->data[ETH_HLEN + offsetof(struct iphdr,
protocol)]
* map[r0]++
* 3. Rattacher prog_fd au socket brut Ă lâaide
de setsockopt()
* 4. Afficher le nombre de paquets TCP/UDP reçus
toutes les secondes
*/
int
main(int argc, char *argv[])
{
int sock, map_fd, prog_fd, key;
long long value = 0, tcp_cnt, udp_cnt;
map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(key),
sizeof(value), 256);
if (map_fd < 0) {
printf("impossible de créer la projection
'%s'\n", strerror(errno));
/* probablement non lancé en tant que root */
return 1;
}
struct bpf_insn prog[] = {
BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), /* r6 = r1 */
BPF_LD_ABS(BPF_B, ETH_HLEN + offsetof(struct iphdr,
protocol)),
/* r0 = ip->proto */
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4),
/* *(u32 *)(fp - 4) = r0 */
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* r2 = fp */
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), /* r2 = r2 - 4 */
BPF_LD_MAP_FD(BPF_REG_1, map_fd), /* r1 = map_fd */
BPF_CALL_FUNC(BPF_FUNC_map_lookup_elem),
/* r0 = map_lookup(r1, r2) */
BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
/* if (r0 == 0) goto pc+2 */
BPF_MOV64_IMM(BPF_REG_1, 1), /* r1 = 1 */
BPF_XADD(BPF_DW, BPF_REG_0, BPF_REG_1, 0, 0),
/* lock *(u64 *) r0 += r1 */
BPF_MOV64_IMM(BPF_REG_0, 0), /* r0 = 0 */
BPF_EXIT_INSN(), /* return r0 */
};
prog_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, prog,
sizeof(prog) / sizeof(prog[0]), "GPL");
sock = open_raw_sock("lo");
assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF,
&prog_fd,
sizeof(prog_fd)) == 0);
for (;;) {
key = IPPROTO_TCP;
assert(bpf_lookup_elem(map_fd, &key, &tcp_cnt) ==
0);
key = IPPROTO_UDP;
assert(bpf_lookup_elem(map_fd, &key, &udp_cnt) ==
0);
printf("TCP %lld UDP %lld packets\n", tcp_cnt,
udp_cnt);
sleep(1);
}
return 0;
}
Vous pouvez trouvez du code complet opĂ©rationnel dans le rĂ©pertoire samples/bpf de lâarborescence des sources du noyau.
VOIR AUSSI
seccomp (2), bpf-helpers (7), socket (7), tc (8), tc-bpf (8)
Les BPF classique et étendu sont expliqués dans le fichier Documentation/networking/filter.txt des sources du noyau.
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .