mirror of
https://github.com/torvalds/linux.git
synced 2024-12-12 14:12:51 +00:00
Merge branch 'libbpf: add unified bpf_prog_load() low-level API'
Andrii Nakryiko says: ==================== This patch set adds unified OPTS-based low-level bpf_prog_load() API for loading BPF programs directly into kernel without utilizing libbpf's bpf_object abstractions. This OPTS-based interface allows for future extensions without breaking backwards or forward API and ABI compatibility. Similar approach will be used for other low-level APIs that require extensive sets of parameters, like BPF_MAP_CREATE command. First half of the patch set adds libbpf API, cleans up internal usage of to-be-deprecated APIs, etc. Second half cleans up and converts selftests away from using deprecated APIs. See individual patches for more details. v1->v2: - dropped exposing sys_bpf() into public API (Alexei, Daniel); - also dropped bpftool/cgroup.c fix for unistd.h include because it's not necessary due to sys_bpf() staying as is. Cc: Hengqi Chen <hengqi.chen@gmail.com> ==================== Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
commit
5577f24cb0
@ -467,7 +467,7 @@ static bool probe_bpf_syscall(const char *define_prefix)
|
||||
{
|
||||
bool res;
|
||||
|
||||
bpf_load_program(BPF_PROG_TYPE_UNSPEC, NULL, 0, NULL, 0, NULL, 0);
|
||||
bpf_prog_load(BPF_PROG_TYPE_UNSPEC, NULL, NULL, NULL, 0, NULL);
|
||||
res = (errno != ENOSYS);
|
||||
|
||||
print_bool_feature("have_bpf_syscall",
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <asm/unistd.h>
|
||||
#include <errno.h>
|
||||
#include <linux/bpf.h>
|
||||
#include <limits.h>
|
||||
#include "bpf.h"
|
||||
#include "libbpf.h"
|
||||
#include "libbpf_internal.h"
|
||||
@ -74,14 +75,15 @@ static inline int sys_bpf_fd(enum bpf_cmd cmd, union bpf_attr *attr,
|
||||
return ensure_good_fd(fd);
|
||||
}
|
||||
|
||||
static inline int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size)
|
||||
#define PROG_LOAD_ATTEMPTS 5
|
||||
|
||||
static inline int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts)
|
||||
{
|
||||
int retries = 5;
|
||||
int fd;
|
||||
|
||||
do {
|
||||
fd = sys_bpf_fd(BPF_PROG_LOAD, attr, size);
|
||||
} while (fd < 0 && errno == EAGAIN && retries-- > 0);
|
||||
} while (fd < 0 && errno == EAGAIN && --attempts > 0);
|
||||
|
||||
return fd;
|
||||
}
|
||||
@ -253,58 +255,91 @@ alloc_zero_tailing_info(const void *orecord, __u32 cnt,
|
||||
return info;
|
||||
}
|
||||
|
||||
int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
|
||||
DEFAULT_VERSION(bpf_prog_load_v0_6_0, bpf_prog_load, LIBBPF_0.6.0)
|
||||
int bpf_prog_load_v0_6_0(enum bpf_prog_type prog_type,
|
||||
const char *prog_name, const char *license,
|
||||
const struct bpf_insn *insns, size_t insn_cnt,
|
||||
const struct bpf_prog_load_opts *opts)
|
||||
{
|
||||
void *finfo = NULL, *linfo = NULL;
|
||||
const char *func_info, *line_info;
|
||||
__u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd;
|
||||
__u32 func_info_rec_size, line_info_rec_size;
|
||||
int fd, attempts;
|
||||
union bpf_attr attr;
|
||||
int fd;
|
||||
char *log_buf;
|
||||
|
||||
if (!load_attr->log_buf != !load_attr->log_buf_sz)
|
||||
if (!OPTS_VALID(opts, bpf_prog_load_opts))
|
||||
return libbpf_err(-EINVAL);
|
||||
|
||||
if (load_attr->log_level > (4 | 2 | 1) || (load_attr->log_level && !load_attr->log_buf))
|
||||
attempts = OPTS_GET(opts, attempts, 0);
|
||||
if (attempts < 0)
|
||||
return libbpf_err(-EINVAL);
|
||||
if (attempts == 0)
|
||||
attempts = PROG_LOAD_ATTEMPTS;
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = load_attr->prog_type;
|
||||
attr.expected_attach_type = load_attr->expected_attach_type;
|
||||
|
||||
if (load_attr->attach_prog_fd)
|
||||
attr.attach_prog_fd = load_attr->attach_prog_fd;
|
||||
attr.prog_type = prog_type;
|
||||
attr.expected_attach_type = OPTS_GET(opts, expected_attach_type, 0);
|
||||
|
||||
attr.prog_btf_fd = OPTS_GET(opts, prog_btf_fd, 0);
|
||||
attr.prog_flags = OPTS_GET(opts, prog_flags, 0);
|
||||
attr.prog_ifindex = OPTS_GET(opts, prog_ifindex, 0);
|
||||
attr.kern_version = OPTS_GET(opts, kern_version, 0);
|
||||
|
||||
if (prog_name)
|
||||
strncat(attr.prog_name, prog_name, sizeof(attr.prog_name) - 1);
|
||||
attr.license = ptr_to_u64(license);
|
||||
|
||||
if (insn_cnt > UINT_MAX)
|
||||
return libbpf_err(-E2BIG);
|
||||
|
||||
attr.insns = ptr_to_u64(insns);
|
||||
attr.insn_cnt = (__u32)insn_cnt;
|
||||
|
||||
attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0);
|
||||
attach_btf_obj_fd = OPTS_GET(opts, attach_btf_obj_fd, 0);
|
||||
|
||||
if (attach_prog_fd && attach_btf_obj_fd)
|
||||
return libbpf_err(-EINVAL);
|
||||
|
||||
attr.attach_btf_id = OPTS_GET(opts, attach_btf_id, 0);
|
||||
if (attach_prog_fd)
|
||||
attr.attach_prog_fd = attach_prog_fd;
|
||||
else
|
||||
attr.attach_btf_obj_fd = load_attr->attach_btf_obj_fd;
|
||||
attr.attach_btf_id = load_attr->attach_btf_id;
|
||||
attr.attach_btf_obj_fd = attach_btf_obj_fd;
|
||||
|
||||
attr.prog_ifindex = load_attr->prog_ifindex;
|
||||
attr.kern_version = load_attr->kern_version;
|
||||
log_buf = OPTS_GET(opts, log_buf, NULL);
|
||||
log_size = OPTS_GET(opts, log_size, 0);
|
||||
log_level = OPTS_GET(opts, log_level, 0);
|
||||
|
||||
attr.insn_cnt = (__u32)load_attr->insn_cnt;
|
||||
attr.insns = ptr_to_u64(load_attr->insns);
|
||||
attr.license = ptr_to_u64(load_attr->license);
|
||||
if (!!log_buf != !!log_size)
|
||||
return libbpf_err(-EINVAL);
|
||||
if (log_level > (4 | 2 | 1))
|
||||
return libbpf_err(-EINVAL);
|
||||
if (log_level && !log_buf)
|
||||
return libbpf_err(-EINVAL);
|
||||
|
||||
attr.log_level = load_attr->log_level;
|
||||
if (attr.log_level) {
|
||||
attr.log_buf = ptr_to_u64(load_attr->log_buf);
|
||||
attr.log_size = load_attr->log_buf_sz;
|
||||
}
|
||||
attr.log_level = log_level;
|
||||
attr.log_buf = ptr_to_u64(log_buf);
|
||||
attr.log_size = log_size;
|
||||
|
||||
attr.prog_btf_fd = load_attr->prog_btf_fd;
|
||||
attr.prog_flags = load_attr->prog_flags;
|
||||
func_info_rec_size = OPTS_GET(opts, func_info_rec_size, 0);
|
||||
func_info = OPTS_GET(opts, func_info, NULL);
|
||||
attr.func_info_rec_size = func_info_rec_size;
|
||||
attr.func_info = ptr_to_u64(func_info);
|
||||
attr.func_info_cnt = OPTS_GET(opts, func_info_cnt, 0);
|
||||
|
||||
attr.func_info_rec_size = load_attr->func_info_rec_size;
|
||||
attr.func_info_cnt = load_attr->func_info_cnt;
|
||||
attr.func_info = ptr_to_u64(load_attr->func_info);
|
||||
line_info_rec_size = OPTS_GET(opts, line_info_rec_size, 0);
|
||||
line_info = OPTS_GET(opts, line_info, NULL);
|
||||
attr.line_info_rec_size = line_info_rec_size;
|
||||
attr.line_info = ptr_to_u64(line_info);
|
||||
attr.line_info_cnt = OPTS_GET(opts, line_info_cnt, 0);
|
||||
|
||||
attr.line_info_rec_size = load_attr->line_info_rec_size;
|
||||
attr.line_info_cnt = load_attr->line_info_cnt;
|
||||
attr.line_info = ptr_to_u64(load_attr->line_info);
|
||||
attr.fd_array = ptr_to_u64(load_attr->fd_array);
|
||||
attr.fd_array = ptr_to_u64(OPTS_GET(opts, fd_array, NULL));
|
||||
|
||||
if (load_attr->name)
|
||||
memcpy(attr.prog_name, load_attr->name,
|
||||
min(strlen(load_attr->name), (size_t)BPF_OBJ_NAME_LEN - 1));
|
||||
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr));
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr), attempts);
|
||||
if (fd >= 0)
|
||||
return fd;
|
||||
|
||||
@ -314,11 +349,11 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
|
||||
*/
|
||||
while (errno == E2BIG && (!finfo || !linfo)) {
|
||||
if (!finfo && attr.func_info_cnt &&
|
||||
attr.func_info_rec_size < load_attr->func_info_rec_size) {
|
||||
attr.func_info_rec_size < func_info_rec_size) {
|
||||
/* try with corrected func info records */
|
||||
finfo = alloc_zero_tailing_info(load_attr->func_info,
|
||||
load_attr->func_info_cnt,
|
||||
load_attr->func_info_rec_size,
|
||||
finfo = alloc_zero_tailing_info(func_info,
|
||||
attr.func_info_cnt,
|
||||
func_info_rec_size,
|
||||
attr.func_info_rec_size);
|
||||
if (!finfo) {
|
||||
errno = E2BIG;
|
||||
@ -326,13 +361,12 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
|
||||
}
|
||||
|
||||
attr.func_info = ptr_to_u64(finfo);
|
||||
attr.func_info_rec_size = load_attr->func_info_rec_size;
|
||||
attr.func_info_rec_size = func_info_rec_size;
|
||||
} else if (!linfo && attr.line_info_cnt &&
|
||||
attr.line_info_rec_size <
|
||||
load_attr->line_info_rec_size) {
|
||||
linfo = alloc_zero_tailing_info(load_attr->line_info,
|
||||
load_attr->line_info_cnt,
|
||||
load_attr->line_info_rec_size,
|
||||
attr.line_info_rec_size < line_info_rec_size) {
|
||||
linfo = alloc_zero_tailing_info(line_info,
|
||||
attr.line_info_cnt,
|
||||
line_info_rec_size,
|
||||
attr.line_info_rec_size);
|
||||
if (!linfo) {
|
||||
errno = E2BIG;
|
||||
@ -340,26 +374,26 @@ int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr)
|
||||
}
|
||||
|
||||
attr.line_info = ptr_to_u64(linfo);
|
||||
attr.line_info_rec_size = load_attr->line_info_rec_size;
|
||||
attr.line_info_rec_size = line_info_rec_size;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr));
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr), attempts);
|
||||
if (fd >= 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (load_attr->log_level || !load_attr->log_buf)
|
||||
if (log_level || !log_buf)
|
||||
goto done;
|
||||
|
||||
/* Try again with log */
|
||||
attr.log_buf = ptr_to_u64(load_attr->log_buf);
|
||||
attr.log_size = load_attr->log_buf_sz;
|
||||
log_buf[0] = 0;
|
||||
attr.log_buf = ptr_to_u64(log_buf);
|
||||
attr.log_size = log_size;
|
||||
attr.log_level = 1;
|
||||
load_attr->log_buf[0] = 0;
|
||||
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr));
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr), attempts);
|
||||
done:
|
||||
/* free() doesn't affect errno, so we don't need to restore it */
|
||||
free(finfo);
|
||||
@ -367,17 +401,20 @@ done:
|
||||
return libbpf_err_errno(fd);
|
||||
}
|
||||
|
||||
__attribute__((alias("bpf_load_program_xattr2")))
|
||||
int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
|
||||
char *log_buf, size_t log_buf_sz)
|
||||
char *log_buf, size_t log_buf_sz);
|
||||
|
||||
static int bpf_load_program_xattr2(const struct bpf_load_program_attr *load_attr,
|
||||
char *log_buf, size_t log_buf_sz)
|
||||
{
|
||||
struct bpf_prog_load_params p = {};
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, p);
|
||||
|
||||
if (!load_attr || !log_buf != !log_buf_sz)
|
||||
return libbpf_err(-EINVAL);
|
||||
|
||||
p.prog_type = load_attr->prog_type;
|
||||
p.expected_attach_type = load_attr->expected_attach_type;
|
||||
switch (p.prog_type) {
|
||||
switch (load_attr->prog_type) {
|
||||
case BPF_PROG_TYPE_STRUCT_OPS:
|
||||
case BPF_PROG_TYPE_LSM:
|
||||
p.attach_btf_id = load_attr->attach_btf_id;
|
||||
@ -391,12 +428,9 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
|
||||
p.prog_ifindex = load_attr->prog_ifindex;
|
||||
p.kern_version = load_attr->kern_version;
|
||||
}
|
||||
p.insn_cnt = load_attr->insns_cnt;
|
||||
p.insns = load_attr->insns;
|
||||
p.license = load_attr->license;
|
||||
p.log_level = load_attr->log_level;
|
||||
p.log_buf = log_buf;
|
||||
p.log_buf_sz = log_buf_sz;
|
||||
p.log_size = log_buf_sz;
|
||||
p.prog_btf_fd = load_attr->prog_btf_fd;
|
||||
p.func_info_rec_size = load_attr->func_info_rec_size;
|
||||
p.func_info_cnt = load_attr->func_info_cnt;
|
||||
@ -404,10 +438,10 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
|
||||
p.line_info_rec_size = load_attr->line_info_rec_size;
|
||||
p.line_info_cnt = load_attr->line_info_cnt;
|
||||
p.line_info = load_attr->line_info;
|
||||
p.name = load_attr->name;
|
||||
p.prog_flags = load_attr->prog_flags;
|
||||
|
||||
return libbpf__bpf_prog_load(&p);
|
||||
return bpf_prog_load(load_attr->prog_type, load_attr->name, load_attr->license,
|
||||
load_attr->insns, load_attr->insns_cnt, &p);
|
||||
}
|
||||
|
||||
int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
@ -426,7 +460,7 @@ int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
load_attr.license = license;
|
||||
load_attr.kern_version = kern_version;
|
||||
|
||||
return bpf_load_program_xattr(&load_attr, log_buf, log_buf_sz);
|
||||
return bpf_load_program_xattr2(&load_attr, log_buf, log_buf_sz);
|
||||
}
|
||||
|
||||
int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
@ -449,7 +483,7 @@ int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
attr.kern_version = kern_version;
|
||||
attr.prog_flags = prog_flags;
|
||||
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr));
|
||||
fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS);
|
||||
return libbpf_err_errno(fd);
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "libbpf_common.h"
|
||||
#include "libbpf_legacy.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -71,6 +72,71 @@ LIBBPF_API int bpf_create_map_in_map(enum bpf_map_type map_type,
|
||||
int inner_map_fd, int max_entries,
|
||||
__u32 map_flags);
|
||||
|
||||
struct bpf_prog_load_opts {
|
||||
size_t sz; /* size of this struct for forward/backward compatibility */
|
||||
|
||||
/* libbpf can retry BPF_PROG_LOAD command if bpf() syscall returns
|
||||
* -EAGAIN. This field determines how many attempts libbpf has to
|
||||
* make. If not specified, libbpf will use default value of 5.
|
||||
*/
|
||||
int attempts;
|
||||
|
||||
enum bpf_attach_type expected_attach_type;
|
||||
__u32 prog_btf_fd;
|
||||
__u32 prog_flags;
|
||||
__u32 prog_ifindex;
|
||||
__u32 kern_version;
|
||||
|
||||
__u32 attach_btf_id;
|
||||
__u32 attach_prog_fd;
|
||||
__u32 attach_btf_obj_fd;
|
||||
|
||||
const int *fd_array;
|
||||
|
||||
/* .BTF.ext func info data */
|
||||
const void *func_info;
|
||||
__u32 func_info_cnt;
|
||||
__u32 func_info_rec_size;
|
||||
|
||||
/* .BTF.ext line info data */
|
||||
const void *line_info;
|
||||
__u32 line_info_cnt;
|
||||
__u32 line_info_rec_size;
|
||||
|
||||
/* verifier log options */
|
||||
__u32 log_level;
|
||||
__u32 log_size;
|
||||
char *log_buf;
|
||||
};
|
||||
#define bpf_prog_load_opts__last_field log_buf
|
||||
|
||||
LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type,
|
||||
const char *prog_name, const char *license,
|
||||
const struct bpf_insn *insns, size_t insn_cnt,
|
||||
const struct bpf_prog_load_opts *opts);
|
||||
/* this "specialization" should go away in libbpf 1.0 */
|
||||
LIBBPF_API int bpf_prog_load_v0_6_0(enum bpf_prog_type prog_type,
|
||||
const char *prog_name, const char *license,
|
||||
const struct bpf_insn *insns, size_t insn_cnt,
|
||||
const struct bpf_prog_load_opts *opts);
|
||||
|
||||
/* This is an elaborate way to not conflict with deprecated bpf_prog_load()
|
||||
* API, defined in libbpf.h. Once we hit libbpf 1.0, all this will be gone.
|
||||
* With this approach, if someone is calling bpf_prog_load() with
|
||||
* 4 arguments, they will use the deprecated API, which keeps backwards
|
||||
* compatibility (both source code and binary). If bpf_prog_load() is called
|
||||
* with 6 arguments, though, it gets redirected to __bpf_prog_load.
|
||||
* So looking forward to libbpf 1.0 when this hack will be gone and
|
||||
* __bpf_prog_load() will be called just bpf_prog_load().
|
||||
*/
|
||||
#ifndef bpf_prog_load
|
||||
#define bpf_prog_load(...) ___libbpf_overload(___bpf_prog_load, __VA_ARGS__)
|
||||
#define ___bpf_prog_load4(file, type, pobj, prog_fd) \
|
||||
bpf_prog_load_deprecated(file, type, pobj, prog_fd)
|
||||
#define ___bpf_prog_load6(prog_type, prog_name, license, insns, insn_cnt, opts) \
|
||||
bpf_prog_load(prog_type, prog_name, license, insns, insn_cnt, opts)
|
||||
#endif /* bpf_prog_load */
|
||||
|
||||
struct bpf_load_program_attr {
|
||||
enum bpf_prog_type prog_type;
|
||||
enum bpf_attach_type expected_attach_type;
|
||||
@ -102,13 +168,15 @@ struct bpf_load_program_attr {
|
||||
|
||||
/* Recommend log buffer size */
|
||||
#define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */
|
||||
LIBBPF_API int
|
||||
bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
|
||||
char *log_buf, size_t log_buf_sz);
|
||||
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_prog_load() instead")
|
||||
LIBBPF_API int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
|
||||
char *log_buf, size_t log_buf_sz);
|
||||
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_prog_load() instead")
|
||||
LIBBPF_API int bpf_load_program(enum bpf_prog_type type,
|
||||
const struct bpf_insn *insns, size_t insns_cnt,
|
||||
const char *license, __u32 kern_version,
|
||||
char *log_buf, size_t log_buf_sz);
|
||||
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_prog_load() instead")
|
||||
LIBBPF_API int bpf_verify_program(enum bpf_prog_type type,
|
||||
const struct bpf_insn *insns,
|
||||
size_t insns_cnt, __u32 prog_flags,
|
||||
|
@ -3,6 +3,8 @@
|
||||
#ifndef __BPF_GEN_INTERNAL_H
|
||||
#define __BPF_GEN_INTERNAL_H
|
||||
|
||||
#include "bpf.h"
|
||||
|
||||
struct ksym_relo_desc {
|
||||
const char *name;
|
||||
int kind;
|
||||
@ -50,8 +52,10 @@ int bpf_gen__finish(struct bpf_gen *gen);
|
||||
void bpf_gen__free(struct bpf_gen *gen);
|
||||
void bpf_gen__load_btf(struct bpf_gen *gen, const void *raw_data, __u32 raw_size);
|
||||
void bpf_gen__map_create(struct bpf_gen *gen, struct bpf_create_map_params *map_attr, int map_idx);
|
||||
struct bpf_prog_load_params;
|
||||
void bpf_gen__prog_load(struct bpf_gen *gen, struct bpf_prog_load_params *load_attr, int prog_idx);
|
||||
void bpf_gen__prog_load(struct bpf_gen *gen,
|
||||
enum bpf_prog_type prog_type, const char *prog_name,
|
||||
const char *license, struct bpf_insn *insns, size_t insn_cnt,
|
||||
struct bpf_prog_load_opts *load_attr, int prog_idx);
|
||||
void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *value, __u32 value_size);
|
||||
void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx);
|
||||
void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *name, enum bpf_attach_type type);
|
||||
|
@ -901,27 +901,27 @@ static void cleanup_relos(struct bpf_gen *gen, int insns)
|
||||
}
|
||||
|
||||
void bpf_gen__prog_load(struct bpf_gen *gen,
|
||||
struct bpf_prog_load_params *load_attr, int prog_idx)
|
||||
enum bpf_prog_type prog_type, const char *prog_name,
|
||||
const char *license, struct bpf_insn *insns, size_t insn_cnt,
|
||||
struct bpf_prog_load_opts *load_attr, int prog_idx)
|
||||
{
|
||||
int attr_size = offsetofend(union bpf_attr, fd_array);
|
||||
int prog_load_attr, license, insns, func_info, line_info;
|
||||
int prog_load_attr, license_off, insns_off, func_info, line_info;
|
||||
union bpf_attr attr;
|
||||
|
||||
memset(&attr, 0, attr_size);
|
||||
pr_debug("gen: prog_load: type %d insns_cnt %zd\n",
|
||||
load_attr->prog_type, load_attr->insn_cnt);
|
||||
pr_debug("gen: prog_load: type %d insns_cnt %zd\n", prog_type, insn_cnt);
|
||||
/* add license string to blob of bytes */
|
||||
license = add_data(gen, load_attr->license, strlen(load_attr->license) + 1);
|
||||
license_off = add_data(gen, license, strlen(license) + 1);
|
||||
/* add insns to blob of bytes */
|
||||
insns = add_data(gen, load_attr->insns,
|
||||
load_attr->insn_cnt * sizeof(struct bpf_insn));
|
||||
insns_off = add_data(gen, insns, insn_cnt * sizeof(struct bpf_insn));
|
||||
|
||||
attr.prog_type = load_attr->prog_type;
|
||||
attr.prog_type = prog_type;
|
||||
attr.expected_attach_type = load_attr->expected_attach_type;
|
||||
attr.attach_btf_id = load_attr->attach_btf_id;
|
||||
attr.prog_ifindex = load_attr->prog_ifindex;
|
||||
attr.kern_version = 0;
|
||||
attr.insn_cnt = (__u32)load_attr->insn_cnt;
|
||||
attr.insn_cnt = (__u32)insn_cnt;
|
||||
attr.prog_flags = load_attr->prog_flags;
|
||||
|
||||
attr.func_info_rec_size = load_attr->func_info_rec_size;
|
||||
@ -934,15 +934,15 @@ void bpf_gen__prog_load(struct bpf_gen *gen,
|
||||
line_info = add_data(gen, load_attr->line_info,
|
||||
attr.line_info_cnt * attr.line_info_rec_size);
|
||||
|
||||
memcpy(attr.prog_name, load_attr->name,
|
||||
min((unsigned)strlen(load_attr->name), BPF_OBJ_NAME_LEN - 1));
|
||||
memcpy(attr.prog_name, prog_name,
|
||||
min((unsigned)strlen(prog_name), BPF_OBJ_NAME_LEN - 1));
|
||||
prog_load_attr = add_data(gen, &attr, attr_size);
|
||||
|
||||
/* populate union bpf_attr with a pointer to license */
|
||||
emit_rel_store(gen, attr_field(prog_load_attr, license), license);
|
||||
emit_rel_store(gen, attr_field(prog_load_attr, license), license_off);
|
||||
|
||||
/* populate union bpf_attr with a pointer to instructions */
|
||||
emit_rel_store(gen, attr_field(prog_load_attr, insns), insns);
|
||||
emit_rel_store(gen, attr_field(prog_load_attr, insns), insns_off);
|
||||
|
||||
/* populate union bpf_attr with a pointer to func_info */
|
||||
emit_rel_store(gen, attr_field(prog_load_attr, func_info), func_info);
|
||||
@ -974,12 +974,12 @@ void bpf_gen__prog_load(struct bpf_gen *gen,
|
||||
emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_7,
|
||||
offsetof(union bpf_attr, attach_btf_obj_fd)));
|
||||
}
|
||||
emit_relos(gen, insns);
|
||||
emit_relos(gen, insns_off);
|
||||
/* emit PROG_LOAD command */
|
||||
emit_sys_bpf(gen, BPF_PROG_LOAD, prog_load_attr, attr_size);
|
||||
debug_ret(gen, "prog_load %s insn_cnt %d", attr.prog_name, attr.insn_cnt);
|
||||
/* successful or not, close btf module FDs used in extern ksyms and attach_btf_obj_fd */
|
||||
cleanup_relos(gen, insns);
|
||||
cleanup_relos(gen, insns_off);
|
||||
if (gen->attach_kind)
|
||||
emit_sys_close_blob(gen,
|
||||
attr_field(prog_load_attr, attach_btf_obj_fd));
|
||||
|
@ -221,7 +221,7 @@ struct reloc_desc {
|
||||
struct bpf_sec_def;
|
||||
|
||||
typedef int (*init_fn_t)(struct bpf_program *prog, long cookie);
|
||||
typedef int (*preload_fn_t)(struct bpf_program *prog, struct bpf_prog_load_params *attr, long cookie);
|
||||
typedef int (*preload_fn_t)(struct bpf_program *prog, struct bpf_prog_load_opts *opts, long cookie);
|
||||
typedef struct bpf_link *(*attach_fn_t)(const struct bpf_program *prog, long cookie);
|
||||
|
||||
/* stored as sec_def->cookie for all libbpf-supported SEC()s */
|
||||
@ -4282,30 +4282,20 @@ int bpf_map__resize(struct bpf_map *map, __u32 max_entries)
|
||||
static int
|
||||
bpf_object__probe_loading(struct bpf_object *obj)
|
||||
{
|
||||
struct bpf_load_program_attr attr;
|
||||
char *cp, errmsg[STRERR_BUFSIZE];
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int ret;
|
||||
int ret, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
if (obj->gen_loader)
|
||||
return 0;
|
||||
|
||||
/* make sure basic loading works */
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
|
||||
attr.insns = insns;
|
||||
attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
attr.license = "GPL";
|
||||
|
||||
ret = bpf_load_program_xattr(&attr, NULL, 0);
|
||||
if (ret < 0) {
|
||||
attr.prog_type = BPF_PROG_TYPE_TRACEPOINT;
|
||||
ret = bpf_load_program_xattr(&attr, NULL, 0);
|
||||
}
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
if (ret < 0)
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
if (ret < 0) {
|
||||
ret = errno;
|
||||
cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg));
|
||||
@ -4329,28 +4319,19 @@ static int probe_fd(int fd)
|
||||
|
||||
static int probe_kern_prog_name(void)
|
||||
{
|
||||
struct bpf_load_program_attr attr;
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int ret;
|
||||
int ret, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
/* make sure loading with name works */
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
|
||||
attr.insns = insns;
|
||||
attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
attr.license = "GPL";
|
||||
attr.name = "test";
|
||||
ret = bpf_load_program_xattr(&attr, NULL, 0);
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, "test", "GPL", insns, insn_cnt, NULL);
|
||||
return probe_fd(ret);
|
||||
}
|
||||
|
||||
static int probe_kern_global_data(void)
|
||||
{
|
||||
struct bpf_load_program_attr prg_attr;
|
||||
struct bpf_create_map_attr map_attr;
|
||||
char *cp, errmsg[STRERR_BUFSIZE];
|
||||
struct bpf_insn insns[] = {
|
||||
@ -4359,7 +4340,7 @@ static int probe_kern_global_data(void)
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int ret, map;
|
||||
int ret, map, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
memset(&map_attr, 0, sizeof(map_attr));
|
||||
map_attr.map_type = BPF_MAP_TYPE_ARRAY;
|
||||
@ -4378,13 +4359,7 @@ static int probe_kern_global_data(void)
|
||||
|
||||
insns[0].imm = map;
|
||||
|
||||
memset(&prg_attr, 0, sizeof(prg_attr));
|
||||
prg_attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
|
||||
prg_attr.insns = insns;
|
||||
prg_attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
prg_attr.license = "GPL";
|
||||
|
||||
ret = bpf_load_program_xattr(&prg_attr, NULL, 0);
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
close(map);
|
||||
return probe_fd(ret);
|
||||
}
|
||||
@ -4500,30 +4475,24 @@ static int probe_kern_array_mmap(void)
|
||||
|
||||
static int probe_kern_exp_attach_type(void)
|
||||
{
|
||||
struct bpf_load_program_attr attr;
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts, .expected_attach_type = BPF_CGROUP_INET_SOCK_CREATE);
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int fd, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
/* use any valid combination of program type and (optional)
|
||||
* non-zero expected attach type (i.e., not a BPF_CGROUP_INET_INGRESS)
|
||||
* to see if kernel supports expected_attach_type field for
|
||||
* BPF_PROG_LOAD command
|
||||
*/
|
||||
attr.prog_type = BPF_PROG_TYPE_CGROUP_SOCK;
|
||||
attr.expected_attach_type = BPF_CGROUP_INET_SOCK_CREATE;
|
||||
attr.insns = insns;
|
||||
attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
attr.license = "GPL";
|
||||
|
||||
return probe_fd(bpf_load_program_xattr(&attr, NULL, 0));
|
||||
fd = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCK, NULL, "GPL", insns, insn_cnt, &opts);
|
||||
return probe_fd(fd);
|
||||
}
|
||||
|
||||
static int probe_kern_probe_read_kernel(void)
|
||||
{
|
||||
struct bpf_load_program_attr attr;
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), /* r1 = r10 (fp) */
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), /* r1 += -8 */
|
||||
@ -4532,26 +4501,21 @@ static int probe_kern_probe_read_kernel(void)
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_probe_read_kernel),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int fd, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = BPF_PROG_TYPE_KPROBE;
|
||||
attr.insns = insns;
|
||||
attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
attr.license = "GPL";
|
||||
|
||||
return probe_fd(bpf_load_program_xattr(&attr, NULL, 0));
|
||||
fd = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
return probe_fd(fd);
|
||||
}
|
||||
|
||||
static int probe_prog_bind_map(void)
|
||||
{
|
||||
struct bpf_load_program_attr prg_attr;
|
||||
struct bpf_create_map_attr map_attr;
|
||||
char *cp, errmsg[STRERR_BUFSIZE];
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int ret, map, prog;
|
||||
int ret, map, prog, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
memset(&map_attr, 0, sizeof(map_attr));
|
||||
map_attr.map_type = BPF_MAP_TYPE_ARRAY;
|
||||
@ -4568,13 +4532,7 @@ static int probe_prog_bind_map(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
memset(&prg_attr, 0, sizeof(prg_attr));
|
||||
prg_attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
|
||||
prg_attr.insns = insns;
|
||||
prg_attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
prg_attr.license = "GPL";
|
||||
|
||||
prog = bpf_load_program_xattr(&prg_attr, NULL, 0);
|
||||
prog = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
if (prog < 0) {
|
||||
close(map);
|
||||
return 0;
|
||||
@ -4619,19 +4577,14 @@ static int probe_module_btf(void)
|
||||
|
||||
static int probe_perf_link(void)
|
||||
{
|
||||
struct bpf_load_program_attr attr;
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int prog_fd, link_fd, err;
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = BPF_PROG_TYPE_TRACEPOINT;
|
||||
attr.insns = insns;
|
||||
attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
attr.license = "GPL";
|
||||
prog_fd = bpf_load_program_xattr(&attr, NULL, 0);
|
||||
prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL",
|
||||
insns, ARRAY_SIZE(insns), NULL);
|
||||
if (prog_fd < 0)
|
||||
return -errno;
|
||||
|
||||
@ -6391,16 +6344,16 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attac
|
||||
|
||||
/* this is called as prog->sec_def->preload_fn for libbpf-supported sec_defs */
|
||||
static int libbpf_preload_prog(struct bpf_program *prog,
|
||||
struct bpf_prog_load_params *attr, long cookie)
|
||||
struct bpf_prog_load_opts *opts, long cookie)
|
||||
{
|
||||
enum sec_def_flags def = cookie;
|
||||
|
||||
/* old kernels might not support specifying expected_attach_type */
|
||||
if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE))
|
||||
attr->expected_attach_type = 0;
|
||||
opts->expected_attach_type = 0;
|
||||
|
||||
if (def & SEC_SLEEPABLE)
|
||||
attr->prog_flags |= BPF_F_SLEEPABLE;
|
||||
opts->prog_flags |= BPF_F_SLEEPABLE;
|
||||
|
||||
if ((prog->type == BPF_PROG_TYPE_TRACING ||
|
||||
prog->type == BPF_PROG_TYPE_LSM ||
|
||||
@ -6419,11 +6372,11 @@ static int libbpf_preload_prog(struct bpf_program *prog,
|
||||
|
||||
/* but by now libbpf common logic is not utilizing
|
||||
* prog->atach_btf_obj_fd/prog->attach_btf_id anymore because
|
||||
* this callback is called after attrs were populated by
|
||||
* libbpf, so this callback has to update attr explicitly here
|
||||
* this callback is called after opts were populated by
|
||||
* libbpf, so this callback has to update opts explicitly here
|
||||
*/
|
||||
attr->attach_btf_obj_fd = btf_obj_fd;
|
||||
attr->attach_btf_id = btf_type_id;
|
||||
opts->attach_btf_obj_fd = btf_obj_fd;
|
||||
opts->attach_btf_id = btf_type_id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -6433,7 +6386,8 @@ static int bpf_object_load_prog_instance(struct bpf_object *obj, struct bpf_prog
|
||||
const char *license, __u32 kern_version,
|
||||
int *prog_fd)
|
||||
{
|
||||
struct bpf_prog_load_params load_attr = {};
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, load_attr);
|
||||
const char *prog_name = NULL;
|
||||
char *cp, errmsg[STRERR_BUFSIZE];
|
||||
size_t log_buf_size = 0;
|
||||
char *log_buf = NULL;
|
||||
@ -6452,13 +6406,9 @@ static int bpf_object_load_prog_instance(struct bpf_object *obj, struct bpf_prog
|
||||
if (!insns || !insns_cnt)
|
||||
return -EINVAL;
|
||||
|
||||
load_attr.prog_type = prog->type;
|
||||
load_attr.expected_attach_type = prog->expected_attach_type;
|
||||
if (kernel_supports(obj, FEAT_PROG_NAME))
|
||||
load_attr.name = prog->name;
|
||||
load_attr.insns = insns;
|
||||
load_attr.insn_cnt = insns_cnt;
|
||||
load_attr.license = license;
|
||||
prog_name = prog->name;
|
||||
load_attr.attach_btf_id = prog->attach_btf_id;
|
||||
load_attr.attach_prog_fd = prog->attach_prog_fd;
|
||||
load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd;
|
||||
@ -6492,7 +6442,8 @@ static int bpf_object_load_prog_instance(struct bpf_object *obj, struct bpf_prog
|
||||
}
|
||||
|
||||
if (obj->gen_loader) {
|
||||
bpf_gen__prog_load(obj->gen_loader, &load_attr,
|
||||
bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name,
|
||||
license, insns, insns_cnt, &load_attr,
|
||||
prog - obj->programs);
|
||||
*prog_fd = -1;
|
||||
return 0;
|
||||
@ -6507,8 +6458,8 @@ retry_load:
|
||||
}
|
||||
|
||||
load_attr.log_buf = log_buf;
|
||||
load_attr.log_buf_sz = log_buf_size;
|
||||
ret = libbpf__bpf_prog_load(&load_attr);
|
||||
load_attr.log_size = log_buf_size;
|
||||
ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr);
|
||||
|
||||
if (ret >= 0) {
|
||||
if (log_buf && load_attr.log_level)
|
||||
@ -6554,19 +6505,19 @@ retry_load:
|
||||
pr_warn("-- BEGIN DUMP LOG ---\n");
|
||||
pr_warn("\n%s\n", log_buf);
|
||||
pr_warn("-- END LOG --\n");
|
||||
} else if (load_attr.insn_cnt >= BPF_MAXINSNS) {
|
||||
pr_warn("Program too large (%zu insns), at most %d insns\n",
|
||||
load_attr.insn_cnt, BPF_MAXINSNS);
|
||||
} else if (insns_cnt >= BPF_MAXINSNS) {
|
||||
pr_warn("Program too large (%d insns), at most %d insns\n",
|
||||
insns_cnt, BPF_MAXINSNS);
|
||||
ret = -LIBBPF_ERRNO__PROG2BIG;
|
||||
} else if (load_attr.prog_type != BPF_PROG_TYPE_KPROBE) {
|
||||
} else if (prog->type != BPF_PROG_TYPE_KPROBE) {
|
||||
/* Wrong program type? */
|
||||
int fd;
|
||||
|
||||
load_attr.prog_type = BPF_PROG_TYPE_KPROBE;
|
||||
load_attr.expected_attach_type = 0;
|
||||
load_attr.log_buf = NULL;
|
||||
load_attr.log_buf_sz = 0;
|
||||
fd = libbpf__bpf_prog_load(&load_attr);
|
||||
load_attr.log_size = 0;
|
||||
fd = bpf_prog_load(BPF_PROG_TYPE_KPROBE, prog_name, license,
|
||||
insns, insns_cnt, &load_attr);
|
||||
if (fd >= 0) {
|
||||
close(fd);
|
||||
ret = -LIBBPF_ERRNO__PROGTYPE;
|
||||
@ -7758,7 +7709,7 @@ int bpf_object__pin_maps(struct bpf_object *obj, const char *path)
|
||||
return 0;
|
||||
|
||||
err_unpin_maps:
|
||||
while ((map = bpf_map__prev(map, obj))) {
|
||||
while ((map = bpf_object__prev_map(obj, map))) {
|
||||
if (!map->pin_path)
|
||||
continue;
|
||||
|
||||
@ -7838,7 +7789,7 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
|
||||
return 0;
|
||||
|
||||
err_unpin_programs:
|
||||
while ((prog = bpf_program__prev(prog, obj))) {
|
||||
while ((prog = bpf_object__prev_program(obj, prog))) {
|
||||
char buf[PATH_MAX];
|
||||
int len;
|
||||
|
||||
@ -8179,9 +8130,11 @@ int bpf_program__set_autoload(struct bpf_program *prog, bool autoload)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bpf_program_nth_fd(const struct bpf_program *prog, int n);
|
||||
|
||||
int bpf_program__fd(const struct bpf_program *prog)
|
||||
{
|
||||
return bpf_program__nth_fd(prog, 0);
|
||||
return bpf_program_nth_fd(prog, 0);
|
||||
}
|
||||
|
||||
size_t bpf_program__size(const struct bpf_program *prog)
|
||||
@ -8227,7 +8180,10 @@ int bpf_program__set_prep(struct bpf_program *prog, int nr_instances,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_program__nth_fd(const struct bpf_program *prog, int n)
|
||||
__attribute__((alias("bpf_program_nth_fd")))
|
||||
int bpf_program__nth_fd(const struct bpf_program *prog, int n);
|
||||
|
||||
static int bpf_program_nth_fd(const struct bpf_program *prog, int n)
|
||||
{
|
||||
int fd;
|
||||
|
||||
@ -9170,21 +9126,12 @@ long libbpf_get_error(const void *ptr)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
int bpf_prog_load(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd)
|
||||
{
|
||||
struct bpf_prog_load_attr attr;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
|
||||
attr.file = file;
|
||||
attr.prog_type = type;
|
||||
attr.expected_attach_type = 0;
|
||||
|
||||
return bpf_prog_load_xattr(&attr, pobj, prog_fd);
|
||||
}
|
||||
|
||||
__attribute__((alias("bpf_prog_load_xattr2")))
|
||||
int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
|
||||
struct bpf_object **pobj, int *prog_fd)
|
||||
struct bpf_object **pobj, int *prog_fd);
|
||||
|
||||
static int bpf_prog_load_xattr2(const struct bpf_prog_load_attr *attr,
|
||||
struct bpf_object **pobj, int *prog_fd)
|
||||
{
|
||||
struct bpf_object_open_attr open_attr = {};
|
||||
struct bpf_program *prog, *first_prog = NULL;
|
||||
@ -9255,6 +9202,20 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
COMPAT_VERSION(bpf_prog_load_deprecated, bpf_prog_load, LIBBPF_0.0.1)
|
||||
int bpf_prog_load_deprecated(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd)
|
||||
{
|
||||
struct bpf_prog_load_attr attr;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
|
||||
attr.file = file;
|
||||
attr.prog_type = type;
|
||||
attr.expected_attach_type = 0;
|
||||
|
||||
return bpf_prog_load_xattr2(&attr, pobj, prog_fd);
|
||||
}
|
||||
|
||||
struct bpf_link {
|
||||
int (*detach)(struct bpf_link *link);
|
||||
void (*dealloc)(struct bpf_link *link);
|
||||
|
@ -431,7 +431,6 @@ bpf_program__attach_iter(const struct bpf_program *prog,
|
||||
* one instance. In this case bpf_program__fd(prog) is equal to
|
||||
* bpf_program__nth_fd(prog, 0).
|
||||
*/
|
||||
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_program__insns() for getting bpf_program instructions")
|
||||
struct bpf_prog_prep_result {
|
||||
/*
|
||||
* If not NULL, load new instruction array.
|
||||
@ -676,8 +675,9 @@ struct bpf_prog_load_attr {
|
||||
|
||||
LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
|
||||
struct bpf_object **pobj, int *prog_fd);
|
||||
LIBBPF_API int bpf_prog_load(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd);
|
||||
LIBBPF_DEPRECATED_SINCE(0, 7, "use bpf_object__open() and bpf_object__load() instead")
|
||||
LIBBPF_API int bpf_prog_load_deprecated(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd);
|
||||
|
||||
/* XDP related API */
|
||||
struct xdp_link_info {
|
||||
|
@ -395,6 +395,8 @@ LIBBPF_0.6.0 {
|
||||
bpf_object__next_program;
|
||||
bpf_object__prev_map;
|
||||
bpf_object__prev_program;
|
||||
bpf_prog_load_deprecated;
|
||||
bpf_prog_load;
|
||||
bpf_program__insn_cnt;
|
||||
bpf_program__insns;
|
||||
btf__add_btf;
|
||||
|
@ -41,6 +41,18 @@
|
||||
#define __LIBBPF_MARK_DEPRECATED_0_7(X)
|
||||
#endif
|
||||
|
||||
/* This set of internal macros allows to do "function overloading" based on
|
||||
* number of arguments provided by used in backwards-compatible way during the
|
||||
* transition to libbpf 1.0
|
||||
* It's ugly but necessary evil that will be cleaned up when we get to 1.0.
|
||||
* See bpf_prog_load() overload for example.
|
||||
*/
|
||||
#define ___libbpf_cat(A, B) A ## B
|
||||
#define ___libbpf_select(NAME, NUM) ___libbpf_cat(NAME, NUM)
|
||||
#define ___libbpf_nth(_1, _2, _3, _4, _5, _6, N, ...) N
|
||||
#define ___libbpf_cnt(...) ___libbpf_nth(__VA_ARGS__, 6, 5, 4, 3, 2, 1)
|
||||
#define ___libbpf_overload(NAME, ...) ___libbpf_select(NAME, ___libbpf_cnt(__VA_ARGS__))(__VA_ARGS__)
|
||||
|
||||
/* Helper macro to declare and initialize libbpf options struct
|
||||
*
|
||||
* This dance with uninitialized declaration, followed by memset to zero,
|
||||
@ -54,7 +66,7 @@
|
||||
* including any extra padding, it with memset() and then assigns initial
|
||||
* values provided by users in struct initializer-syntax as varargs.
|
||||
*/
|
||||
#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \
|
||||
#define LIBBPF_OPTS(TYPE, NAME, ...) \
|
||||
struct TYPE NAME = ({ \
|
||||
memset(&NAME, 0, sizeof(struct TYPE)); \
|
||||
(struct TYPE) { \
|
||||
|
@ -276,37 +276,6 @@ int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz);
|
||||
int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
|
||||
const char *str_sec, size_t str_len);
|
||||
|
||||
struct bpf_prog_load_params {
|
||||
enum bpf_prog_type prog_type;
|
||||
enum bpf_attach_type expected_attach_type;
|
||||
const char *name;
|
||||
const struct bpf_insn *insns;
|
||||
size_t insn_cnt;
|
||||
const char *license;
|
||||
__u32 kern_version;
|
||||
__u32 attach_prog_fd;
|
||||
__u32 attach_btf_obj_fd;
|
||||
__u32 attach_btf_id;
|
||||
__u32 prog_ifindex;
|
||||
__u32 prog_btf_fd;
|
||||
__u32 prog_flags;
|
||||
|
||||
__u32 func_info_rec_size;
|
||||
const void *func_info;
|
||||
__u32 func_info_cnt;
|
||||
|
||||
__u32 line_info_rec_size;
|
||||
const void *line_info;
|
||||
__u32 line_info_cnt;
|
||||
|
||||
__u32 log_level;
|
||||
char *log_buf;
|
||||
size_t log_buf_sz;
|
||||
int *fd_array;
|
||||
};
|
||||
|
||||
int libbpf__bpf_prog_load(const struct bpf_prog_load_params *load_attr);
|
||||
|
||||
struct bpf_create_map_params {
|
||||
const char *name;
|
||||
enum bpf_map_type map_type;
|
||||
|
@ -69,6 +69,7 @@ enum libbpf_strict_mode {
|
||||
|
||||
LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode);
|
||||
|
||||
#define DECLARE_LIBBPF_OPTS LIBBPF_OPTS
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
|
@ -68,21 +68,21 @@ static void
|
||||
probe_load(enum bpf_prog_type prog_type, const struct bpf_insn *insns,
|
||||
size_t insns_cnt, char *buf, size_t buf_len, __u32 ifindex)
|
||||
{
|
||||
struct bpf_load_program_attr xattr = {};
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts);
|
||||
int fd;
|
||||
|
||||
switch (prog_type) {
|
||||
case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
|
||||
xattr.expected_attach_type = BPF_CGROUP_INET4_CONNECT;
|
||||
opts.expected_attach_type = BPF_CGROUP_INET4_CONNECT;
|
||||
break;
|
||||
case BPF_PROG_TYPE_CGROUP_SOCKOPT:
|
||||
xattr.expected_attach_type = BPF_CGROUP_GETSOCKOPT;
|
||||
opts.expected_attach_type = BPF_CGROUP_GETSOCKOPT;
|
||||
break;
|
||||
case BPF_PROG_TYPE_SK_LOOKUP:
|
||||
xattr.expected_attach_type = BPF_SK_LOOKUP;
|
||||
opts.expected_attach_type = BPF_SK_LOOKUP;
|
||||
break;
|
||||
case BPF_PROG_TYPE_KPROBE:
|
||||
xattr.kern_version = get_kernel_version();
|
||||
opts.kern_version = get_kernel_version();
|
||||
break;
|
||||
case BPF_PROG_TYPE_UNSPEC:
|
||||
case BPF_PROG_TYPE_SOCKET_FILTER:
|
||||
@ -115,13 +115,11 @@ probe_load(enum bpf_prog_type prog_type, const struct bpf_insn *insns,
|
||||
break;
|
||||
}
|
||||
|
||||
xattr.prog_type = prog_type;
|
||||
xattr.insns = insns;
|
||||
xattr.insns_cnt = insns_cnt;
|
||||
xattr.license = "GPL";
|
||||
xattr.prog_ifindex = ifindex;
|
||||
opts.prog_ifindex = ifindex;
|
||||
opts.log_buf = buf;
|
||||
opts.log_size = buf_len;
|
||||
|
||||
fd = bpf_load_program_xattr(&xattr, buf, buf_len);
|
||||
fd = bpf_prog_load(prog_type, NULL, "GPL", insns, insns_cnt, NULL);
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
}
|
||||
|
@ -364,7 +364,6 @@ int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
|
||||
static enum xsk_prog get_xsk_prog(void)
|
||||
{
|
||||
enum xsk_prog detected = XSK_PROG_FALLBACK;
|
||||
struct bpf_load_program_attr prog_attr;
|
||||
struct bpf_create_map_attr map_attr;
|
||||
__u32 size_out, retval, duration;
|
||||
char data_in = 0, data_out;
|
||||
@ -375,7 +374,7 @@ static enum xsk_prog get_xsk_prog(void)
|
||||
BPF_EMIT_CALL(BPF_FUNC_redirect_map),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
int prog_fd, map_fd, ret;
|
||||
int prog_fd, map_fd, ret, insn_cnt = ARRAY_SIZE(insns);
|
||||
|
||||
memset(&map_attr, 0, sizeof(map_attr));
|
||||
map_attr.map_type = BPF_MAP_TYPE_XSKMAP;
|
||||
@ -389,13 +388,7 @@ static enum xsk_prog get_xsk_prog(void)
|
||||
|
||||
insns[0].imm = map_fd;
|
||||
|
||||
memset(&prog_attr, 0, sizeof(prog_attr));
|
||||
prog_attr.prog_type = BPF_PROG_TYPE_XDP;
|
||||
prog_attr.insns = insns;
|
||||
prog_attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
prog_attr.license = "GPL";
|
||||
|
||||
prog_fd = bpf_load_program_xattr(&prog_attr, NULL, 0);
|
||||
prog_fd = bpf_prog_load(BPF_PROG_TYPE_XDP, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
if (prog_fd < 0) {
|
||||
close(map_fd);
|
||||
return detected;
|
||||
@ -495,10 +488,13 @@ static int xsk_load_xdp_prog(struct xsk_socket *xsk)
|
||||
};
|
||||
struct bpf_insn *progs[] = {prog, prog_redirect_flags};
|
||||
enum xsk_prog option = get_xsk_prog();
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.log_buf = log_buf,
|
||||
.log_size = log_buf_size,
|
||||
);
|
||||
|
||||
prog_fd = bpf_load_program(BPF_PROG_TYPE_XDP, progs[option], insns_cnt[option],
|
||||
"LGPL-2.1 or BSD-2-Clause", 0, log_buf,
|
||||
log_buf_size);
|
||||
prog_fd = bpf_prog_load(BPF_PROG_TYPE_XDP, NULL, "LGPL-2.1 or BSD-2-Clause",
|
||||
progs[option], insns_cnt[option], &opts);
|
||||
if (prog_fd < 0) {
|
||||
pr_warn("BPF log buffer:\n%s", log_buf);
|
||||
return prog_fd;
|
||||
@ -725,14 +721,12 @@ static int xsk_link_lookup(int ifindex, __u32 *prog_id, int *link_fd)
|
||||
|
||||
static bool xsk_probe_bpf_link(void)
|
||||
{
|
||||
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts,
|
||||
.flags = XDP_FLAGS_SKB_MODE);
|
||||
struct bpf_load_program_attr prog_attr;
|
||||
LIBBPF_OPTS(bpf_link_create_opts, opts, .flags = XDP_FLAGS_SKB_MODE);
|
||||
struct bpf_insn insns[2] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
|
||||
BPF_EXIT_INSN()
|
||||
};
|
||||
int prog_fd, link_fd = -1;
|
||||
int prog_fd, link_fd = -1, insn_cnt = ARRAY_SIZE(insns);
|
||||
int ifindex_lo = 1;
|
||||
bool ret = false;
|
||||
int err;
|
||||
@ -744,13 +738,7 @@ static bool xsk_probe_bpf_link(void)
|
||||
if (link_fd >= 0)
|
||||
return true;
|
||||
|
||||
memset(&prog_attr, 0, sizeof(prog_attr));
|
||||
prog_attr.prog_type = BPF_PROG_TYPE_XDP;
|
||||
prog_attr.insns = insns;
|
||||
prog_attr.insns_cnt = ARRAY_SIZE(insns);
|
||||
prog_attr.license = "GPL";
|
||||
|
||||
prog_fd = bpf_load_program_xattr(&prog_attr, NULL, 0);
|
||||
prog_fd = bpf_prog_load(BPF_PROG_TYPE_XDP, NULL, "GPL", insns, insn_cnt, NULL);
|
||||
if (prog_fd < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -23,9 +23,7 @@ BPF_GCC ?= $(shell command -v bpf-gcc;)
|
||||
SAN_CFLAGS ?=
|
||||
CFLAGS += -g -O0 -rdynamic -Wall $(GENFLAGS) $(SAN_CFLAGS) \
|
||||
-I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \
|
||||
-I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT) \
|
||||
-Dbpf_prog_load=bpf_prog_test_load \
|
||||
-Dbpf_load_program=bpf_test_load_program
|
||||
-I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT)
|
||||
LDLIBS += -lcap -lelf -lz -lrt -lpthread
|
||||
|
||||
# Silence some warnings when compiled with clang
|
||||
@ -178,10 +176,6 @@ $(OUTPUT)/bpf_testmod.ko: $(VMLINUX_BTF) $(wildcard bpf_testmod/Makefile bpf_tes
|
||||
$(Q)$(MAKE) $(submake_extras) -C bpf_testmod
|
||||
$(Q)cp bpf_testmod/bpf_testmod.ko $@
|
||||
|
||||
$(OUTPUT)/test_stub.o: test_stub.c $(BPFOBJ)
|
||||
$(call msg,CC,,$@)
|
||||
$(Q)$(CC) -c $(CFLAGS) -o $@ $<
|
||||
|
||||
DEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool
|
||||
|
||||
$(OUTPUT)/runqslower: $(BPFOBJ) | $(DEFAULT_BPFTOOL) $(RUNQSLOWER_OUTPUT)
|
||||
@ -194,18 +188,24 @@ $(OUTPUT)/runqslower: $(BPFOBJ) | $(DEFAULT_BPFTOOL) $(RUNQSLOWER_OUTPUT)
|
||||
|
||||
TEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPFTOOL)
|
||||
|
||||
$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ)
|
||||
$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ)
|
||||
|
||||
$(OUTPUT)/test_dev_cgroup: cgroup_helpers.c
|
||||
$(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c
|
||||
$(OUTPUT)/test_sock: cgroup_helpers.c
|
||||
$(OUTPUT)/test_sock_addr: cgroup_helpers.c
|
||||
$(OUTPUT)/test_sockmap: cgroup_helpers.c
|
||||
$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c
|
||||
$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c
|
||||
$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
|
||||
$(OUTPUT)/test_sock_fields: cgroup_helpers.c
|
||||
$(OUTPUT)/test_sysctl: cgroup_helpers.c
|
||||
$(OUTPUT)/test_dev_cgroup: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_sock: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_sock_addr: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_sockmap: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_sock_fields: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_sysctl: cgroup_helpers.c testing_helpers.o
|
||||
$(OUTPUT)/test_tag: testing_helpers.o
|
||||
$(OUTPUT)/test_lirc_mode2_user: testing_helpers.o
|
||||
$(OUTPUT)/xdping: testing_helpers.o
|
||||
$(OUTPUT)/flow_dissector_load: testing_helpers.o
|
||||
$(OUTPUT)/test_maps: testing_helpers.o
|
||||
$(OUTPUT)/test_verifier: testing_helpers.o
|
||||
|
||||
BPFTOOL ?= $(DEFAULT_BPFTOOL)
|
||||
$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/libbpf.h>
|
||||
#include "testing_helpers.h"
|
||||
|
||||
static inline int bpf_flow_load(struct bpf_object **obj,
|
||||
const char *path,
|
||||
@ -18,7 +19,7 @@ static inline int bpf_flow_load(struct bpf_object **obj,
|
||||
int prog_array_fd;
|
||||
int ret, fd, i;
|
||||
|
||||
ret = bpf_prog_load(path, BPF_PROG_TYPE_FLOW_DISSECTOR, obj,
|
||||
ret = bpf_prog_test_load(path, BPF_PROG_TYPE_FLOW_DISSECTOR, obj,
|
||||
prog_fd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <bpf/libbpf.h>
|
||||
|
||||
#include "cgroup_helpers.h"
|
||||
#include "testing_helpers.h"
|
||||
#include "bpf_rlimit.h"
|
||||
|
||||
#define CHECK(condition, tag, format...) ({ \
|
||||
@ -66,8 +67,8 @@ int main(int argc, char **argv)
|
||||
if (CHECK(cgroup_fd < 0, "cgroup_setup_and_join", "err %d errno %d\n", cgroup_fd, errno))
|
||||
return 1;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "bpf_prog_load", "err %d errno %d\n", err, errno))
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "bpf_prog_test_load", "err %d errno %d\n", err, errno))
|
||||
goto cleanup_cgroup_env;
|
||||
|
||||
cgidmap_fd = bpf_find_map(__func__, obj, "cg_ids");
|
||||
|
@ -594,6 +594,12 @@ static int do_test_single(struct bpf_align_test *test)
|
||||
struct bpf_insn *prog = test->insns;
|
||||
int prog_type = test->prog_type;
|
||||
char bpf_vlog_copy[32768];
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.prog_flags = BPF_F_STRICT_ALIGNMENT,
|
||||
.log_buf = bpf_vlog,
|
||||
.log_size = sizeof(bpf_vlog),
|
||||
.log_level = 2,
|
||||
);
|
||||
const char *line_ptr;
|
||||
int cur_line = -1;
|
||||
int prog_len, i;
|
||||
@ -601,9 +607,8 @@ static int do_test_single(struct bpf_align_test *test)
|
||||
int ret;
|
||||
|
||||
prog_len = probe_filter_length(prog);
|
||||
fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
|
||||
prog, prog_len, BPF_F_STRICT_ALIGNMENT,
|
||||
"GPL", 0, bpf_vlog, sizeof(bpf_vlog), 2);
|
||||
fd_prog = bpf_prog_load(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL",
|
||||
prog, prog_len, &opts);
|
||||
if (fd_prog < 0 && test->result != REJECT) {
|
||||
printf("Failed to load program.\n");
|
||||
printf("%s", bpf_vlog);
|
||||
|
@ -48,7 +48,7 @@ void serial_test_bpf_obj_id(void)
|
||||
bzero(zeros, sizeof(zeros));
|
||||
for (i = 0; i < nr_iters; i++) {
|
||||
now = time(NULL);
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT,
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT,
|
||||
&objs[i], &prog_fds[i]);
|
||||
/* test_obj_id.o is a dumb prog. It should never fail
|
||||
* to load.
|
||||
|
@ -16,7 +16,7 @@ static int prog_load(void)
|
||||
};
|
||||
size_t insns_cnt = sizeof(prog) / sizeof(struct bpf_insn);
|
||||
|
||||
return bpf_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
return bpf_test_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
prog, insns_cnt, "GPL", 0,
|
||||
bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ static int prog_load_cnt(int verdict, int val)
|
||||
size_t insns_cnt = sizeof(prog) / sizeof(struct bpf_insn);
|
||||
int ret;
|
||||
|
||||
ret = bpf_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
ret = bpf_test_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
prog, insns_cnt, "GPL", 0,
|
||||
bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
|
||||
|
@ -18,7 +18,7 @@ static int prog_load(int verdict)
|
||||
};
|
||||
size_t insns_cnt = sizeof(prog) / sizeof(struct bpf_insn);
|
||||
|
||||
return bpf_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
return bpf_test_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
prog, insns_cnt, "GPL", 0,
|
||||
bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ static void test_fexit_bpf2bpf_common(const char *obj_file,
|
||||
int err, tgt_fd, i;
|
||||
struct btf *btf;
|
||||
|
||||
err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
err = bpf_prog_test_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
&tgt_obj, &tgt_fd);
|
||||
if (!ASSERT_OK(err, "tgt_prog_load"))
|
||||
return;
|
||||
@ -224,7 +224,7 @@ static int test_second_attach(struct bpf_object *obj)
|
||||
if (CHECK(!prog, "find_prog", "prog %s not found\n", prog_name))
|
||||
return -ENOENT;
|
||||
|
||||
err = bpf_prog_load(tgt_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
err = bpf_prog_test_load(tgt_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
&tgt_obj, &tgt_fd);
|
||||
if (CHECK(err, "second_prog_load", "file %s err %d errno %d\n",
|
||||
tgt_obj_file, err, errno))
|
||||
@ -274,7 +274,7 @@ static void test_fmod_ret_freplace(void)
|
||||
__u32 duration = 0;
|
||||
int err, pkt_fd, attach_prog_fd;
|
||||
|
||||
err = bpf_prog_load(tgt_name, BPF_PROG_TYPE_UNSPEC,
|
||||
err = bpf_prog_test_load(tgt_name, BPF_PROG_TYPE_UNSPEC,
|
||||
&pkt_obj, &pkt_fd);
|
||||
/* the target prog should load fine */
|
||||
if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
|
||||
@ -341,7 +341,7 @@ static void test_obj_load_failure_common(const char *obj_file,
|
||||
int err, pkt_fd;
|
||||
__u32 duration = 0;
|
||||
|
||||
err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
err = bpf_prog_test_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
&pkt_obj, &pkt_fd);
|
||||
/* the target prog should load fine */
|
||||
if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
|
||||
|
@ -20,34 +20,33 @@ void test_fexit_stress(void)
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
struct bpf_load_program_attr load_attr = {
|
||||
.prog_type = BPF_PROG_TYPE_TRACING,
|
||||
.license = "GPL",
|
||||
.insns = trace_program,
|
||||
.insns_cnt = sizeof(trace_program) / sizeof(struct bpf_insn),
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, trace_opts,
|
||||
.expected_attach_type = BPF_TRACE_FEXIT,
|
||||
};
|
||||
.log_buf = error,
|
||||
.log_size = sizeof(error),
|
||||
);
|
||||
|
||||
const struct bpf_insn skb_program[] = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
struct bpf_load_program_attr skb_load_attr = {
|
||||
.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
|
||||
.license = "GPL",
|
||||
.insns = skb_program,
|
||||
.insns_cnt = sizeof(skb_program) / sizeof(struct bpf_insn),
|
||||
};
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, skb_opts,
|
||||
.log_buf = error,
|
||||
.log_size = sizeof(error),
|
||||
);
|
||||
|
||||
err = libbpf_find_vmlinux_btf_id("bpf_fentry_test1",
|
||||
load_attr.expected_attach_type);
|
||||
trace_opts.expected_attach_type);
|
||||
if (CHECK(err <= 0, "find_vmlinux_btf_id", "failed: %d\n", err))
|
||||
goto out;
|
||||
load_attr.attach_btf_id = err;
|
||||
trace_opts.attach_btf_id = err;
|
||||
|
||||
for (i = 0; i < CNT; i++) {
|
||||
fexit_fd[i] = bpf_load_program_xattr(&load_attr, error, sizeof(error));
|
||||
fexit_fd[i] = bpf_prog_load(BPF_PROG_TYPE_TRACING, NULL, "GPL",
|
||||
trace_program,
|
||||
sizeof(trace_program) / sizeof(struct bpf_insn),
|
||||
&trace_opts);
|
||||
if (CHECK(fexit_fd[i] < 0, "fexit loaded",
|
||||
"failed: %d errno %d\n", fexit_fd[i], errno))
|
||||
goto out;
|
||||
@ -57,7 +56,9 @@ void test_fexit_stress(void)
|
||||
goto out;
|
||||
}
|
||||
|
||||
filter_fd = bpf_load_program_xattr(&skb_load_attr, error, sizeof(error));
|
||||
filter_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL",
|
||||
skb_program, sizeof(skb_program) / sizeof(struct bpf_insn),
|
||||
&skb_opts);
|
||||
if (CHECK(filter_fd < 0, "test_program_loaded", "failed: %d errno %d\n",
|
||||
filter_fd, errno))
|
||||
goto out;
|
||||
|
@ -30,7 +30,7 @@ void serial_test_flow_dissector_load_bytes(void)
|
||||
|
||||
/* make sure bpf_skb_load_bytes is not allowed from skb-less context
|
||||
*/
|
||||
fd = bpf_load_program(BPF_PROG_TYPE_FLOW_DISSECTOR, prog,
|
||||
fd = bpf_test_load_program(BPF_PROG_TYPE_FLOW_DISSECTOR, prog,
|
||||
ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
|
||||
CHECK(fd < 0,
|
||||
"flow_dissector-bpf_skb_load_bytes-load",
|
||||
|
@ -47,9 +47,9 @@ static int load_prog(enum bpf_prog_type type)
|
||||
};
|
||||
int fd;
|
||||
|
||||
fd = bpf_load_program(type, prog, ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
|
||||
fd = bpf_test_load_program(type, prog, ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
|
||||
if (CHECK_FAIL(fd < 0))
|
||||
perror("bpf_load_program");
|
||||
perror("bpf_test_load_program");
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
@ -94,11 +94,11 @@ void test_get_stack_raw_tp(void)
|
||||
struct bpf_map *map;
|
||||
cpu_set_t cpu_set;
|
||||
|
||||
err = bpf_prog_load(file_err, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file_err, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err >= 0, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
||||
|
@ -136,7 +136,7 @@ void test_global_data(void)
|
||||
struct bpf_object *obj;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
if (CHECK(err, "load program", "error %d loading %s\n", err, file))
|
||||
return;
|
||||
|
||||
|
@ -44,7 +44,7 @@ void test_global_func_args(void)
|
||||
struct bpf_object *obj;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
|
||||
if (CHECK(err, "load program", "error %d loading %s\n", err, file))
|
||||
return;
|
||||
|
||||
|
@ -74,7 +74,7 @@ void serial_test_kfree_skb(void)
|
||||
const int zero = 0;
|
||||
bool test_ok[2];
|
||||
|
||||
err = bpf_prog_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
err = bpf_prog_test_load("./test_pkt_access.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
&obj, &tattr.prog_fd);
|
||||
if (CHECK(err, "prog_load sched cls", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
@ -30,7 +30,7 @@ static void test_l4lb(const char *file)
|
||||
char buf[128];
|
||||
u32 *magic = (u32 *)buf;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -27,7 +27,7 @@ void test_load_bytes_relative(void)
|
||||
if (CHECK_FAIL(server_fd < 0))
|
||||
goto close_cgroup_fd;
|
||||
|
||||
err = bpf_prog_load("./load_bytes_relative.o", BPF_PROG_TYPE_CGROUP_SKB,
|
||||
err = bpf_prog_test_load("./load_bytes_relative.o", BPF_PROG_TYPE_CGROUP_SKB,
|
||||
&obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
goto close_server_fd;
|
||||
|
@ -53,9 +53,9 @@ void test_map_lock(void)
|
||||
int err = 0, key = 0, i;
|
||||
void *ret;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err)) {
|
||||
printf("test_map_lock:bpf_prog_load errno %d\n", errno);
|
||||
printf("test_map_lock:bpf_prog_test_load errno %d\n", errno);
|
||||
goto close_prog;
|
||||
}
|
||||
map_fd[0] = bpf_find_map(__func__, obj, "hash_map");
|
||||
|
@ -9,7 +9,7 @@ void test_pkt_access(void)
|
||||
__u32 duration, retval;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -9,7 +9,7 @@ void test_pkt_md_access(void)
|
||||
__u32 duration, retval;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -27,7 +27,7 @@ static void test_queue_stack_map_by_type(int type)
|
||||
else
|
||||
return;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -18,15 +18,15 @@ void test_raw_tp_writable_reject_nbd_invalid(void)
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
struct bpf_load_program_attr load_attr = {
|
||||
.prog_type = BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,
|
||||
.license = "GPL v2",
|
||||
.insns = program,
|
||||
.insns_cnt = sizeof(program) / sizeof(struct bpf_insn),
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.log_level = 2,
|
||||
};
|
||||
.log_buf = error,
|
||||
.log_size = sizeof(error),
|
||||
);
|
||||
|
||||
bpf_fd = bpf_load_program_xattr(&load_attr, error, sizeof(error));
|
||||
bpf_fd = bpf_prog_load(BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, NULL, "GPL v2",
|
||||
program, sizeof(program) / sizeof(struct bpf_insn),
|
||||
&opts);
|
||||
if (CHECK(bpf_fd < 0, "bpf_raw_tracepoint_writable load",
|
||||
"failed: %d errno %d\n", bpf_fd, errno))
|
||||
return;
|
||||
|
@ -17,15 +17,15 @@ void serial_test_raw_tp_writable_test_run(void)
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
struct bpf_load_program_attr load_attr = {
|
||||
.prog_type = BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,
|
||||
.license = "GPL v2",
|
||||
.insns = trace_program,
|
||||
.insns_cnt = sizeof(trace_program) / sizeof(struct bpf_insn),
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, trace_opts,
|
||||
.log_level = 2,
|
||||
};
|
||||
.log_buf = error,
|
||||
.log_size = sizeof(error),
|
||||
);
|
||||
|
||||
int bpf_fd = bpf_load_program_xattr(&load_attr, error, sizeof(error));
|
||||
int bpf_fd = bpf_prog_load(BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, NULL, "GPL v2",
|
||||
trace_program, sizeof(trace_program) / sizeof(struct bpf_insn),
|
||||
&trace_opts);
|
||||
if (CHECK(bpf_fd < 0, "bpf_raw_tracepoint_writable loaded",
|
||||
"failed: %d errno %d\n", bpf_fd, errno))
|
||||
return;
|
||||
@ -35,15 +35,14 @@ void serial_test_raw_tp_writable_test_run(void)
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
struct bpf_load_program_attr skb_load_attr = {
|
||||
.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
|
||||
.license = "GPL v2",
|
||||
.insns = skb_program,
|
||||
.insns_cnt = sizeof(skb_program) / sizeof(struct bpf_insn),
|
||||
};
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, skb_opts,
|
||||
.log_buf = error,
|
||||
.log_size = sizeof(error),
|
||||
);
|
||||
|
||||
int filter_fd =
|
||||
bpf_load_program_xattr(&skb_load_attr, error, sizeof(error));
|
||||
int filter_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL v2",
|
||||
skb_program, sizeof(skb_program) / sizeof(struct bpf_insn),
|
||||
&skb_opts);
|
||||
if (CHECK(filter_fd < 0, "test_program_loaded", "failed: %d errno %d\n",
|
||||
filter_fd, errno))
|
||||
goto out_bpffd;
|
||||
|
@ -22,7 +22,7 @@ static void test_signal_pending_by_type(enum bpf_prog_type prog_type)
|
||||
prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0);
|
||||
prog[ARRAY_SIZE(prog) - 1] = BPF_EXIT_INSN();
|
||||
|
||||
prog_fd = bpf_load_program(prog_type, prog, ARRAY_SIZE(prog),
|
||||
prog_fd = bpf_test_load_program(prog_type, prog, ARRAY_SIZE(prog),
|
||||
"GPL", 0, NULL, 0);
|
||||
CHECK(prog_fd < 0, "test-run", "errno %d\n", errno);
|
||||
|
||||
|
@ -32,7 +32,7 @@ void test_skb_ctx(void)
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = bpf_prog_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&tattr.prog_fd);
|
||||
if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
@ -20,7 +20,7 @@ void test_skb_helpers(void)
|
||||
struct bpf_object *obj;
|
||||
int err;
|
||||
|
||||
err = bpf_prog_load("./test_skb_helpers.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load("./test_skb_helpers.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&tattr.prog_fd);
|
||||
if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
@ -852,22 +852,21 @@ static struct sockopt_test {
|
||||
static int load_prog(const struct bpf_insn *insns,
|
||||
enum bpf_attach_type expected_attach_type)
|
||||
{
|
||||
struct bpf_load_program_attr attr = {
|
||||
.prog_type = BPF_PROG_TYPE_CGROUP_SOCKOPT,
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.expected_attach_type = expected_attach_type,
|
||||
.insns = insns,
|
||||
.license = "GPL",
|
||||
.log_level = 2,
|
||||
};
|
||||
int fd;
|
||||
.log_buf = bpf_log_buf,
|
||||
.log_size = sizeof(bpf_log_buf),
|
||||
);
|
||||
int fd, insns_cnt = 0;
|
||||
|
||||
for (;
|
||||
insns[attr.insns_cnt].code != (BPF_JMP | BPF_EXIT);
|
||||
attr.insns_cnt++) {
|
||||
insns[insns_cnt].code != (BPF_JMP | BPF_EXIT);
|
||||
insns_cnt++) {
|
||||
}
|
||||
attr.insns_cnt++;
|
||||
insns_cnt++;
|
||||
|
||||
fd = bpf_load_program_xattr(&attr, bpf_log_buf, sizeof(bpf_log_buf));
|
||||
fd = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCKOPT, NULL, "GPL", insns, insns_cnt, &opts);
|
||||
if (verbose && fd < 0)
|
||||
fprintf(stderr, "%s\n", bpf_log_buf);
|
||||
|
||||
|
@ -24,9 +24,9 @@ void test_spinlock(void)
|
||||
int err = 0, i;
|
||||
void *ret;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err)) {
|
||||
printf("test_spin_lock:bpf_prog_load errno %d\n", errno);
|
||||
printf("test_spin_lock:bpf_prog_test_load errno %d\n", errno);
|
||||
goto close_prog;
|
||||
}
|
||||
for (i = 0; i < 4; i++)
|
||||
|
@ -12,7 +12,7 @@ void test_stacktrace_map(void)
|
||||
struct bpf_object *obj;
|
||||
struct bpf_link *link;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
||||
|
@ -12,7 +12,7 @@ void test_stacktrace_map_raw_tp(void)
|
||||
struct bpf_object *obj;
|
||||
struct bpf_link *link = NULL;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
||||
|
@ -16,7 +16,7 @@ static void test_tailcall_1(void)
|
||||
char prog_name[32];
|
||||
char buff[128] = {};
|
||||
|
||||
err = bpf_prog_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -154,7 +154,7 @@ static void test_tailcall_2(void)
|
||||
char prog_name[32];
|
||||
char buff[128] = {};
|
||||
|
||||
err = bpf_prog_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -228,7 +228,7 @@ static void test_tailcall_count(const char *which)
|
||||
__u32 retval, duration;
|
||||
char buff[128] = {};
|
||||
|
||||
err = bpf_prog_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -324,7 +324,7 @@ static void test_tailcall_4(void)
|
||||
char buff[128] = {};
|
||||
char prog_name[32];
|
||||
|
||||
err = bpf_prog_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -412,7 +412,7 @@ static void test_tailcall_5(void)
|
||||
char buff[128] = {};
|
||||
char prog_name[32];
|
||||
|
||||
err = bpf_prog_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
err = bpf_prog_test_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj,
|
||||
&prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -498,7 +498,7 @@ static void test_tailcall_bpf2bpf_1(void)
|
||||
__u32 retval, duration;
|
||||
char prog_name[32];
|
||||
|
||||
err = bpf_prog_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
err = bpf_prog_test_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
&obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -582,7 +582,7 @@ static void test_tailcall_bpf2bpf_2(void)
|
||||
__u32 retval, duration;
|
||||
char buff[128] = {};
|
||||
|
||||
err = bpf_prog_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
err = bpf_prog_test_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
&obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -660,7 +660,7 @@ static void test_tailcall_bpf2bpf_3(void)
|
||||
__u32 retval, duration;
|
||||
char prog_name[32];
|
||||
|
||||
err = bpf_prog_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
err = bpf_prog_test_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
&obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
@ -757,7 +757,7 @@ static void test_tailcall_bpf2bpf_4(bool noise)
|
||||
__u32 retval, duration;
|
||||
char prog_name[32];
|
||||
|
||||
err = bpf_prog_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
err = bpf_prog_test_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS,
|
||||
&obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
@ -11,7 +11,7 @@ void test_task_fd_query_rawtp(void)
|
||||
__u32 duration = 0;
|
||||
char buf[256];
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
||||
|
@ -13,8 +13,8 @@ static void test_task_fd_query_tp_core(const char *probe_name,
|
||||
__u32 duration = 0;
|
||||
char buf[256];
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "bpf_prog_load", "err %d errno %d\n", err, errno))
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
if (CHECK(err, "bpf_prog_test_load", "err %d errno %d\n", err, errno))
|
||||
goto close_prog;
|
||||
|
||||
snprintf(buf, sizeof(buf),
|
||||
|
@ -8,7 +8,7 @@ void test_tcp_estats(void)
|
||||
struct bpf_object *obj;
|
||||
__u32 duration = 0;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
|
||||
CHECK(err, "", "err %d errno %d\n", err, errno);
|
||||
if (err)
|
||||
return;
|
||||
|
@ -35,7 +35,7 @@ void serial_test_tp_attach_query(void)
|
||||
|
||||
query = malloc(sizeof(*query) + sizeof(__u32) * num_progs);
|
||||
for (i = 0; i < num_progs; i++) {
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj[i],
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj[i],
|
||||
&prog_fd[i]);
|
||||
if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
|
||||
goto cleanup1;
|
||||
|
@ -16,7 +16,7 @@ void test_xdp(void)
|
||||
__u32 duration, retval, size;
|
||||
int err, prog_fd, map_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -10,7 +10,7 @@ static void test_xdp_adjust_tail_shrink(void)
|
||||
int err, prog_fd;
|
||||
char buf[128];
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
@ -38,7 +38,7 @@ static void test_xdp_adjust_tail_grow(void)
|
||||
__u32 duration, retval, size, expect_sz;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
@ -75,7 +75,7 @@ static void test_xdp_adjust_tail_grow2(void)
|
||||
.data_size_out = 0, /* Per test */
|
||||
};
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &tattr.prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &tattr.prog_fd);
|
||||
if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno))
|
||||
return;
|
||||
|
||||
|
@ -16,7 +16,7 @@ void serial_test_xdp_attach(void)
|
||||
|
||||
len = sizeof(info);
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj1, &fd1);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj1, &fd1);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
err = bpf_obj_get_info_by_fd(fd1, &info, &len);
|
||||
@ -24,7 +24,7 @@ void serial_test_xdp_attach(void)
|
||||
goto out_1;
|
||||
id1 = info.id;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj2, &fd2);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj2, &fd2);
|
||||
if (CHECK_FAIL(err))
|
||||
goto out_1;
|
||||
|
||||
@ -34,7 +34,7 @@ void serial_test_xdp_attach(void)
|
||||
goto out_2;
|
||||
id2 = info.id;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj3, &fd3);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj3, &fd3);
|
||||
if (CHECK_FAIL(err))
|
||||
goto out_2;
|
||||
|
||||
|
@ -29,7 +29,7 @@ void serial_test_xdp_info(void)
|
||||
|
||||
/* Setup prog */
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -9,7 +9,7 @@ void test_xdp_perf(void)
|
||||
char in[128], out[128];
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
|
@ -73,7 +73,7 @@ int test_subprog2(struct args_subprog2 *ctx)
|
||||
__builtin_preserve_access_index(&skb->len));
|
||||
|
||||
ret = ctx->ret;
|
||||
/* bpf_prog_load() loads "test_pkt_access.o" with BPF_F_TEST_RND_HI32
|
||||
/* bpf_prog_test_load() loads "test_pkt_access.o" with BPF_F_TEST_RND_HI32
|
||||
* which randomizes upper 32 bits after BPF_ALU32 insns.
|
||||
* Hence after 'w0 <<= 1' upper bits of $rax are random.
|
||||
* That is expected and correct. Trim them.
|
||||
|
@ -448,7 +448,7 @@ static __always_inline int process_packet(void *data, __u64 off, void *data_end,
|
||||
return bpf_redirect(ifindex, 0);
|
||||
}
|
||||
|
||||
SEC("l4lb-demo")
|
||||
SEC("tc")
|
||||
int balancer_ingress(struct __sk_buff *ctx)
|
||||
{
|
||||
void *data_end = (void *)(long)ctx->data_end;
|
||||
|
@ -447,7 +447,7 @@ static __noinline int process_packet(void *data, __u64 off, void *data_end,
|
||||
return bpf_redirect(ifindex, 0);
|
||||
}
|
||||
|
||||
SEC("l4lb-demo")
|
||||
SEC("tc")
|
||||
int balancer_ingress(struct __sk_buff *ctx)
|
||||
{
|
||||
void *data_end = (void *)(long)ctx->data_end;
|
||||
|
@ -30,7 +30,7 @@ struct {
|
||||
__type(value, struct array_elem);
|
||||
} array_map SEC(".maps");
|
||||
|
||||
SEC("map_lock_demo")
|
||||
SEC("cgroup/skb")
|
||||
int bpf_map_lock_test(struct __sk_buff *skb)
|
||||
{
|
||||
struct hmap_elem zero = {}, *val;
|
||||
|
@ -24,7 +24,7 @@ struct {
|
||||
__uint(value_size, sizeof(__u32));
|
||||
} map_out SEC(".maps");
|
||||
|
||||
SEC("test")
|
||||
SEC("tc")
|
||||
int _test(struct __sk_buff *skb)
|
||||
{
|
||||
void *data_end = (void *)(long)skb->data_end;
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
SEC("skb_ctx")
|
||||
SEC("tc")
|
||||
int process(struct __sk_buff *skb)
|
||||
{
|
||||
#pragma clang loop unroll(full)
|
||||
|
@ -45,7 +45,7 @@ struct {
|
||||
|
||||
#define CREDIT_PER_NS(delta, rate) (((delta) * rate) >> 20)
|
||||
|
||||
SEC("spin_lock_demo")
|
||||
SEC("tc")
|
||||
int bpf_sping_lock_test(struct __sk_buff *skb)
|
||||
{
|
||||
volatile int credit = 0, max_credit = 100, pkt_len = 64;
|
||||
|
@ -244,7 +244,7 @@ static __always_inline void send_basic_event(struct sock *sk,
|
||||
bpf_map_update_elem(&ev_record_map, &key, &ev, BPF_ANY);
|
||||
}
|
||||
|
||||
SEC("dummy_tracepoint")
|
||||
SEC("tp/dummy/tracepoint")
|
||||
int _dummy_tracepoint(struct dummy_tracepoint_args *arg)
|
||||
{
|
||||
if (!arg->sock)
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "bpf_rlimit.h"
|
||||
#include "cgroup_helpers.h"
|
||||
#include "testing_helpers.h"
|
||||
|
||||
char bpf_log_buf[BPF_LOG_BUF_SIZE];
|
||||
|
||||
@ -66,7 +67,7 @@ int main(int argc, char **argv)
|
||||
|
||||
prog[0].imm = percpu_map_fd;
|
||||
prog[7].imm = map_fd;
|
||||
prog_fd = bpf_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
prog_fd = bpf_test_load_program(BPF_PROG_TYPE_CGROUP_SKB,
|
||||
prog, insns_cnt, "GPL", 0,
|
||||
bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
if (prog_fd < 0) {
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <bpf/libbpf.h>
|
||||
|
||||
#include "cgroup_helpers.h"
|
||||
#include "testing_helpers.h"
|
||||
#include "bpf_rlimit.h"
|
||||
|
||||
#define DEV_CGROUP_PROG "./dev_cgroup.o"
|
||||
@ -27,7 +28,7 @@ int main(int argc, char **argv)
|
||||
int prog_fd, cgroup_fd;
|
||||
__u32 prog_cnt;
|
||||
|
||||
if (bpf_prog_load(DEV_CGROUP_PROG, BPF_PROG_TYPE_CGROUP_DEVICE,
|
||||
if (bpf_prog_test_load(DEV_CGROUP_PROG, BPF_PROG_TYPE_CGROUP_DEVICE,
|
||||
&obj, &prog_fd)) {
|
||||
printf("Failed to load DEV_CGROUP program\n");
|
||||
goto out;
|
||||
|
@ -45,6 +45,8 @@
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/libbpf.h>
|
||||
|
||||
#include "testing_helpers.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct bpf_object *obj;
|
||||
@ -58,8 +60,8 @@ int main(int argc, char **argv)
|
||||
return 2;
|
||||
}
|
||||
|
||||
ret = bpf_prog_load("test_lirc_mode2_kern.o",
|
||||
BPF_PROG_TYPE_LIRC_MODE2, &obj, &progfd);
|
||||
ret = bpf_prog_test_load("test_lirc_mode2_kern.o",
|
||||
BPF_PROG_TYPE_LIRC_MODE2, &obj, &progfd);
|
||||
if (ret) {
|
||||
printf("Failed to load bpf program\n");
|
||||
return 1;
|
||||
|
@ -42,7 +42,6 @@ static int create_map(int map_type, int map_flags, unsigned int size)
|
||||
static int bpf_map_lookup_elem_with_ref_bit(int fd, unsigned long long key,
|
||||
void *value)
|
||||
{
|
||||
struct bpf_load_program_attr prog;
|
||||
struct bpf_create_map_attr map;
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_LD_MAP_VALUE(BPF_REG_9, 0, 0),
|
||||
@ -76,13 +75,7 @@ static int bpf_map_lookup_elem_with_ref_bit(int fd, unsigned long long key,
|
||||
|
||||
insns[0].imm = mfd;
|
||||
|
||||
memset(&prog, 0, sizeof(prog));
|
||||
prog.prog_type = BPF_PROG_TYPE_SCHED_CLS;
|
||||
prog.insns = insns;
|
||||
prog.insns_cnt = ARRAY_SIZE(insns);
|
||||
prog.license = "GPL";
|
||||
|
||||
pfd = bpf_load_program_xattr(&prog, NULL, 0);
|
||||
pfd = bpf_prog_load(BPF_PROG_TYPE_SCHED_CLS, NULL, "GPL", insns, ARRAY_SIZE(insns), NULL);
|
||||
if (pfd < 0) {
|
||||
close(mfd);
|
||||
return -1;
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "bpf_util.h"
|
||||
#include "bpf_rlimit.h"
|
||||
#include "test_maps.h"
|
||||
#include "testing_helpers.h"
|
||||
|
||||
#ifndef ENOTSUPP
|
||||
#define ENOTSUPP 524
|
||||
@ -830,21 +831,21 @@ static void test_sockmap(unsigned int tasks, void *data)
|
||||
}
|
||||
|
||||
/* Load SK_SKB program and Attach */
|
||||
err = bpf_prog_load(SOCKMAP_PARSE_PROG,
|
||||
err = bpf_prog_test_load(SOCKMAP_PARSE_PROG,
|
||||
BPF_PROG_TYPE_SK_SKB, &obj, &parse_prog);
|
||||
if (err) {
|
||||
printf("Failed to load SK_SKB parse prog\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
||||
err = bpf_prog_load(SOCKMAP_TCP_MSG_PROG,
|
||||
err = bpf_prog_test_load(SOCKMAP_TCP_MSG_PROG,
|
||||
BPF_PROG_TYPE_SK_MSG, &obj, &msg_prog);
|
||||
if (err) {
|
||||
printf("Failed to load SK_SKB msg prog\n");
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
||||
err = bpf_prog_load(SOCKMAP_VERDICT_PROG,
|
||||
err = bpf_prog_test_load(SOCKMAP_VERDICT_PROG,
|
||||
BPF_PROG_TYPE_SK_SKB, &obj, &verdict_prog);
|
||||
if (err) {
|
||||
printf("Failed to load SK_SKB verdict prog\n");
|
||||
|
@ -328,18 +328,17 @@ static size_t probe_prog_length(const struct bpf_insn *fp)
|
||||
static int load_sock_prog(const struct bpf_insn *prog,
|
||||
enum bpf_attach_type attach_type)
|
||||
{
|
||||
struct bpf_load_program_attr attr;
|
||||
int ret;
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts);
|
||||
int ret, insn_cnt;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_load_program_attr));
|
||||
attr.prog_type = BPF_PROG_TYPE_CGROUP_SOCK;
|
||||
attr.expected_attach_type = attach_type;
|
||||
attr.insns = prog;
|
||||
attr.insns_cnt = probe_prog_length(attr.insns);
|
||||
attr.license = "GPL";
|
||||
attr.log_level = 2;
|
||||
insn_cnt = probe_prog_length(prog);
|
||||
|
||||
ret = bpf_load_program_xattr(&attr, bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
opts.expected_attach_type = attach_type;
|
||||
opts.log_buf = bpf_log_buf;
|
||||
opts.log_size = BPF_LOG_BUF_SIZE;
|
||||
opts.log_level = 2;
|
||||
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCK, NULL, "GPL", prog, insn_cnt, &opts);
|
||||
if (verbose && ret < 0)
|
||||
fprintf(stderr, "%s\n", bpf_log_buf);
|
||||
|
||||
|
@ -645,17 +645,14 @@ static int mk_sockaddr(int domain, const char *ip, unsigned short port,
|
||||
static int load_insns(const struct sock_addr_test *test,
|
||||
const struct bpf_insn *insns, size_t insns_cnt)
|
||||
{
|
||||
struct bpf_load_program_attr load_attr;
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts);
|
||||
int ret;
|
||||
|
||||
memset(&load_attr, 0, sizeof(struct bpf_load_program_attr));
|
||||
load_attr.prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR;
|
||||
load_attr.expected_attach_type = test->expected_attach_type;
|
||||
load_attr.insns = insns;
|
||||
load_attr.insns_cnt = insns_cnt;
|
||||
load_attr.license = "GPL";
|
||||
opts.expected_attach_type = test->expected_attach_type;
|
||||
opts.log_buf = bpf_log_buf;
|
||||
opts.log_size = BPF_LOG_BUF_SIZE;
|
||||
|
||||
ret = bpf_load_program_xattr(&load_attr, bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCK_ADDR, NULL, "GPL", insns, insns_cnt, &opts);
|
||||
if (ret < 0 && test->expected_result != LOAD_REJECT) {
|
||||
log_err(">>> Loading program error.\n"
|
||||
">>> Verifier output:\n%s\n-------\n", bpf_log_buf);
|
||||
|
@ -1,44 +0,0 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
/* Copyright (C) 2019 Netronome Systems, Inc. */
|
||||
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/libbpf.h>
|
||||
#include <string.h>
|
||||
|
||||
int extra_prog_load_log_flags = 0;
|
||||
|
||||
int bpf_prog_test_load(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd)
|
||||
{
|
||||
struct bpf_prog_load_attr attr;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
|
||||
attr.file = file;
|
||||
attr.prog_type = type;
|
||||
attr.expected_attach_type = 0;
|
||||
attr.prog_flags = BPF_F_TEST_RND_HI32;
|
||||
attr.log_level = extra_prog_load_log_flags;
|
||||
|
||||
return bpf_prog_load_xattr(&attr, pobj, prog_fd);
|
||||
}
|
||||
|
||||
int bpf_test_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
size_t insns_cnt, const char *license,
|
||||
__u32 kern_version, char *log_buf,
|
||||
size_t log_buf_sz)
|
||||
{
|
||||
struct bpf_load_program_attr load_attr;
|
||||
|
||||
memset(&load_attr, 0, sizeof(struct bpf_load_program_attr));
|
||||
load_attr.prog_type = type;
|
||||
load_attr.expected_attach_type = 0;
|
||||
load_attr.name = NULL;
|
||||
load_attr.insns = insns;
|
||||
load_attr.insns_cnt = insns_cnt;
|
||||
load_attr.license = license;
|
||||
load_attr.kern_version = kern_version;
|
||||
load_attr.prog_flags = BPF_F_TEST_RND_HI32;
|
||||
load_attr.log_level = extra_prog_load_log_flags;
|
||||
|
||||
return bpf_load_program_xattr(&load_attr, log_buf, log_buf_sz);
|
||||
}
|
@ -17,6 +17,7 @@
|
||||
#include "bpf_rlimit.h"
|
||||
#include "bpf_util.h"
|
||||
#include "cgroup_helpers.h"
|
||||
#include "testing_helpers.h"
|
||||
|
||||
#define CG_PATH "/foo"
|
||||
#define MAX_INSNS 512
|
||||
@ -1435,14 +1436,10 @@ static int load_sysctl_prog_insns(struct sysctl_test *test,
|
||||
const char *sysctl_path)
|
||||
{
|
||||
struct bpf_insn *prog = test->insns;
|
||||
struct bpf_load_program_attr attr;
|
||||
int ret;
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts);
|
||||
int ret, insn_cnt;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_load_program_attr));
|
||||
attr.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL;
|
||||
attr.insns = prog;
|
||||
attr.insns_cnt = probe_prog_length(attr.insns);
|
||||
attr.license = "GPL";
|
||||
insn_cnt = probe_prog_length(prog);
|
||||
|
||||
if (test->fixup_value_insn) {
|
||||
char buf[128];
|
||||
@ -1465,7 +1462,10 @@ static int load_sysctl_prog_insns(struct sysctl_test *test,
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = bpf_load_program_xattr(&attr, bpf_log_buf, BPF_LOG_BUF_SIZE);
|
||||
opts.log_buf = bpf_log_buf;
|
||||
opts.log_size = BPF_LOG_BUF_SIZE;
|
||||
|
||||
ret = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SYSCTL, NULL, "GPL", prog, insn_cnt, &opts);
|
||||
if (ret < 0 && test->result != LOAD_REJECT) {
|
||||
log_err(">>> Loading program error.\n"
|
||||
">>> Verifier output:\n%s\n-------\n", bpf_log_buf);
|
||||
@ -1476,15 +1476,10 @@ static int load_sysctl_prog_insns(struct sysctl_test *test,
|
||||
|
||||
static int load_sysctl_prog_file(struct sysctl_test *test)
|
||||
{
|
||||
struct bpf_prog_load_attr attr;
|
||||
struct bpf_object *obj;
|
||||
int prog_fd;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
|
||||
attr.file = test->prog_file;
|
||||
attr.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL;
|
||||
|
||||
if (bpf_prog_load_xattr(&attr, &obj, &prog_fd)) {
|
||||
if (bpf_prog_test_load(test->prog_file, BPF_PROG_TYPE_CGROUP_SYSCTL, &obj, &prog_fd)) {
|
||||
if (test->result != LOAD_REJECT)
|
||||
log_err(">>> Loading program (%s) error.\n",
|
||||
test->prog_file);
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
#include "../../../include/linux/filter.h"
|
||||
#include "bpf_rlimit.h"
|
||||
#include "testing_helpers.h"
|
||||
|
||||
static struct bpf_insn prog[BPF_MAXINSNS];
|
||||
|
||||
@ -57,7 +58,7 @@ static int bpf_try_load_prog(int insns, int fd_map,
|
||||
int fd_prog;
|
||||
|
||||
bpf_filler(insns, fd_map);
|
||||
fd_prog = bpf_load_program(BPF_PROG_TYPE_SCHED_CLS, prog, insns, "", 0,
|
||||
fd_prog = bpf_test_load_program(BPF_PROG_TYPE_SCHED_CLS, prog, insns, "", 0,
|
||||
NULL, 0);
|
||||
assert(fd_prog > 0);
|
||||
if (fd_map > 0)
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
#include "test_tcpnotify.h"
|
||||
#include "trace_helpers.h"
|
||||
#include "testing_helpers.h"
|
||||
|
||||
#define SOCKET_BUFFER_SIZE (getpagesize() < 8192L ? getpagesize() : 8192L)
|
||||
|
||||
@ -92,7 +93,7 @@ int main(int argc, char **argv)
|
||||
if (cg_fd < 0)
|
||||
goto err;
|
||||
|
||||
if (bpf_prog_load(file, BPF_PROG_TYPE_SOCK_OPS, &obj, &prog_fd)) {
|
||||
if (bpf_prog_test_load(file, BPF_PROG_TYPE_SOCK_OPS, &obj, &prog_fd)) {
|
||||
printf("FAILED: load_bpf_file failed for: %s\n", file);
|
||||
goto err;
|
||||
}
|
||||
|
@ -498,8 +498,7 @@ static int create_prog_dummy_simple(enum bpf_prog_type prog_type, int ret)
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
return bpf_load_program(prog_type, prog,
|
||||
ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
|
||||
return bpf_prog_load(prog_type, NULL, "GPL", prog, ARRAY_SIZE(prog), NULL);
|
||||
}
|
||||
|
||||
static int create_prog_dummy_loop(enum bpf_prog_type prog_type, int mfd,
|
||||
@ -514,8 +513,7 @@ static int create_prog_dummy_loop(enum bpf_prog_type prog_type, int mfd,
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
return bpf_load_program(prog_type, prog,
|
||||
ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
|
||||
return bpf_prog_load(prog_type, NULL, "GPL", prog, ARRAY_SIZE(prog), NULL);
|
||||
}
|
||||
|
||||
static int create_prog_array(enum bpf_prog_type prog_type, uint32_t max_elem,
|
||||
@ -1045,7 +1043,7 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
|
||||
int fd_prog, expected_ret, alignment_prevented_execution;
|
||||
int prog_len, prog_type = test->prog_type;
|
||||
struct bpf_insn *prog = test->insns;
|
||||
struct bpf_load_program_attr attr;
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts);
|
||||
int run_errs, run_successes;
|
||||
int map_fds[MAX_NR_MAPS];
|
||||
const char *expected_err;
|
||||
@ -1085,32 +1083,34 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
|
||||
test->result_unpriv : test->result;
|
||||
expected_err = unpriv && test->errstr_unpriv ?
|
||||
test->errstr_unpriv : test->errstr;
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.prog_type = prog_type;
|
||||
attr.expected_attach_type = test->expected_attach_type;
|
||||
attr.insns = prog;
|
||||
attr.insns_cnt = prog_len;
|
||||
attr.license = "GPL";
|
||||
|
||||
opts.expected_attach_type = test->expected_attach_type;
|
||||
if (verbose)
|
||||
attr.log_level = 1;
|
||||
opts.log_level = 1;
|
||||
else if (expected_ret == VERBOSE_ACCEPT)
|
||||
attr.log_level = 2;
|
||||
opts.log_level = 2;
|
||||
else
|
||||
attr.log_level = 4;
|
||||
attr.prog_flags = pflags;
|
||||
opts.log_level = 4;
|
||||
opts.prog_flags = pflags;
|
||||
|
||||
if (prog_type == BPF_PROG_TYPE_TRACING && test->kfunc) {
|
||||
attr.attach_btf_id = libbpf_find_vmlinux_btf_id(test->kfunc,
|
||||
attr.expected_attach_type);
|
||||
if (attr.attach_btf_id < 0) {
|
||||
int attach_btf_id;
|
||||
|
||||
attach_btf_id = libbpf_find_vmlinux_btf_id(test->kfunc,
|
||||
opts.expected_attach_type);
|
||||
if (attach_btf_id < 0) {
|
||||
printf("FAIL\nFailed to find BTF ID for '%s'!\n",
|
||||
test->kfunc);
|
||||
(*errors)++;
|
||||
return;
|
||||
}
|
||||
|
||||
opts.attach_btf_id = attach_btf_id;
|
||||
}
|
||||
|
||||
fd_prog = bpf_load_program_xattr(&attr, bpf_vlog, sizeof(bpf_vlog));
|
||||
opts.log_buf = bpf_vlog;
|
||||
opts.log_size = sizeof(bpf_vlog);
|
||||
fd_prog = bpf_prog_load(prog_type, NULL, "GPL", prog, prog_len, &opts);
|
||||
saved_errno = errno;
|
||||
|
||||
/* BPF_PROG_TYPE_TRACING requires more setup and
|
||||
|
@ -1,7 +1,11 @@
|
||||
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
|
||||
/* Copyright (C) 2019 Netronome Systems, Inc. */
|
||||
/* Copyright (C) 2020 Facebook, Inc. */
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/libbpf.h>
|
||||
#include "testing_helpers.h"
|
||||
|
||||
int parse_num_list(const char *s, bool **num_set, int *num_set_len)
|
||||
@ -78,3 +82,54 @@ __u32 link_info_prog_id(const struct bpf_link *link, struct bpf_link_info *info)
|
||||
}
|
||||
return info->prog_id;
|
||||
}
|
||||
|
||||
int extra_prog_load_log_flags = 0;
|
||||
|
||||
int bpf_prog_test_load(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd)
|
||||
{
|
||||
struct bpf_object *obj;
|
||||
struct bpf_program *prog;
|
||||
int err;
|
||||
|
||||
obj = bpf_object__open(file);
|
||||
if (!obj)
|
||||
return -errno;
|
||||
|
||||
prog = bpf_object__next_program(obj, NULL);
|
||||
if (!prog) {
|
||||
err = -ENOENT;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (type != BPF_PROG_TYPE_UNSPEC)
|
||||
bpf_program__set_type(prog, type);
|
||||
|
||||
err = bpf_object__load(obj);
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
*pobj = obj;
|
||||
*prog_fd = bpf_program__fd(prog);
|
||||
|
||||
return 0;
|
||||
err_out:
|
||||
bpf_object__close(obj);
|
||||
return err;
|
||||
}
|
||||
|
||||
int bpf_test_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
size_t insns_cnt, const char *license,
|
||||
__u32 kern_version, char *log_buf,
|
||||
size_t log_buf_sz)
|
||||
{
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.kern_version = kern_version,
|
||||
.prog_flags = BPF_F_TEST_RND_HI32,
|
||||
.log_level = extra_prog_load_log_flags,
|
||||
.log_buf = log_buf,
|
||||
.log_size = log_buf_sz,
|
||||
);
|
||||
|
||||
return bpf_prog_load(type, NULL, license, insns, insns_cnt, &opts);
|
||||
}
|
||||
|
@ -6,3 +6,9 @@
|
||||
|
||||
int parse_num_list(const char *s, bool **set, int *set_len);
|
||||
__u32 link_info_prog_id(const struct bpf_link *link, struct bpf_link_info *info);
|
||||
int bpf_prog_test_load(const char *file, enum bpf_prog_type type,
|
||||
struct bpf_object **pobj, int *prog_fd);
|
||||
int bpf_test_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
|
||||
size_t insns_cnt, const char *license,
|
||||
__u32 kern_version, char *log_buf,
|
||||
size_t log_buf_sz);
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "bpf/libbpf.h"
|
||||
|
||||
#include "xdping.h"
|
||||
#include "testing_helpers.h"
|
||||
|
||||
static int ifindex;
|
||||
static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
|
||||
@ -173,7 +174,7 @@ int main(int argc, char **argv)
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
|
||||
|
||||
if (bpf_prog_load(filename, BPF_PROG_TYPE_XDP, &obj, &prog_fd)) {
|
||||
if (bpf_prog_test_load(filename, BPF_PROG_TYPE_XDP, &obj, &prog_fd)) {
|
||||
fprintf(stderr, "load of %s failed\n", filename);
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user