Skip to content

Commit

Permalink
libbpf: Add support for BPF tc link
Browse files Browse the repository at this point in the history
tbd

Co-developed-by: Nikolay Aleksandrov <[email protected]>
Signed-off-by: Nikolay Aleksandrov <[email protected]>
Signed-off-by: Daniel Borkmann <[email protected]>

link opts errata

Signed-off-by: Daniel Borkmann <[email protected]>
  • Loading branch information
borkmann committed May 24, 2023
1 parent ef45d3b commit 5305823
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 5 deletions.
4 changes: 4 additions & 0 deletions tools/lib/bpf/bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,10 @@ int bpf_link_create(int prog_fd, int target_fd,
if (!OPTS_ZEROED(opts, tracing))
return libbpf_err(-EINVAL);
break;
case BPF_TCX_INGRESS:
case BPF_TCX_EGRESS:
attr.link_create.tcx.relative_fd = OPTS_GET(opts, tcx.relative_fd, 0);
attr.link_create.tcx.expected_revision = OPTS_GET(opts, tcx.expected_revision, 0);
default:
if (!OPTS_ZEROED(opts, flags))
return libbpf_err(-EINVAL);
Expand Down
7 changes: 7 additions & 0 deletions tools/lib/bpf/bpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,13 @@ struct bpf_link_create_opts {
struct {
__u64 cookie;
} tracing;
struct {
union {
__u32 relative_fd;
__u32 relative_id;
};
__u32 expected_revision;
} tcx;
};
size_t :0;
};
Expand Down
42 changes: 37 additions & 5 deletions tools/lib/bpf/libbpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -11566,11 +11566,10 @@ static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_li
}

static struct bpf_link *
bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id,
const char *target_name)
bpf_program__attach_fd_opts(const struct bpf_program *prog,
const struct bpf_link_create_opts *opts,
int target_fd, const char *target_name)
{
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts,
.target_btf_id = btf_id);
enum bpf_attach_type attach_type;
char errmsg[STRERR_BUFSIZE];
struct bpf_link *link;
Expand All @@ -11588,7 +11587,7 @@ bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id
link->detach = &bpf_link__detach_fd;

attach_type = bpf_program__expected_attach_type(prog);
link_fd = bpf_link_create(prog_fd, target_fd, attach_type, &opts);
link_fd = bpf_link_create(prog_fd, target_fd, attach_type, opts);
if (link_fd < 0) {
link_fd = -errno;
free(link);
Expand All @@ -11601,6 +11600,16 @@ bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id
return link;
}

static struct bpf_link *
bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id,
const char *target_name)
{
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts,
.target_btf_id = btf_id);

return bpf_program__attach_fd_opts(prog, &opts, target_fd, target_name);
}

struct bpf_link *
bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd)
{
Expand All @@ -11619,6 +11628,29 @@ struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifi
return bpf_program__attach_fd(prog, ifindex, 0, "xdp");
}

struct bpf_link *
bpf_program__attach_tcx_opts(const struct bpf_program *prog,
const struct bpf_tcx_opts *opts)
{
DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_create_opts);
int ifindex = OPTS_GET(opts, ifindex, 0);

if (!OPTS_VALID(opts, bpf_tcx_opts))
return libbpf_err_ptr(-EINVAL);
if (!ifindex) {
pr_warn("prog '%s': target netdevice ifindex cannot be zero\n",
prog->name);
return libbpf_err_ptr(-EINVAL);
}

link_create_opts.tcx.expected_revision = OPTS_GET(opts, expected_revision, 0);
link_create_opts.tcx.relative_fd = OPTS_GET(opts, relative_fd, 0);
link_create_opts.flags = OPTS_GET(opts, flags, 0);

/* target_fd/target_ifindex use the same field in LINK_CREATE */
return bpf_program__attach_fd_opts(prog, &link_create_opts, ifindex, "tc");
}

struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog,
int target_fd,
const char *attach_func_name)
Expand Down
17 changes: 17 additions & 0 deletions tools/lib/bpf/libbpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,23 @@ LIBBPF_API struct bpf_link *
bpf_program__attach_freplace(const struct bpf_program *prog,
int target_fd, const char *attach_func_name);

struct bpf_tcx_opts {
/* size of this struct, for forward/backward compatibility */
size_t sz;
int ifindex;
__u32 flags;
union {
__u32 relative_fd;
__u32 relative_id;
};
__u32 expected_revision;
};
#define bpf_tcx_opts__last_field expected_revision

LIBBPF_API struct bpf_link *
bpf_program__attach_tcx_opts(const struct bpf_program *prog,
const struct bpf_tcx_opts *opts);

struct bpf_map;

LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map);
Expand Down
1 change: 1 addition & 0 deletions tools/lib/bpf/libbpf.map
Original file line number Diff line number Diff line change
Expand Up @@ -395,4 +395,5 @@ LIBBPF_1.2.0 {
LIBBPF_1.3.0 {
global:
bpf_prog_detach_opts;
bpf_program__attach_tcx_opts;
} LIBBPF_1.2.0;

0 comments on commit 5305823

Please sign in to comment.