mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 15:41:39 +00:00
libbpf: Add function to set link XDP fd while specifying old program
This adds a new function to set the XDP fd while specifying the FD of the program to replace, using the newly added IFLA_XDP_EXPECTED_FD netlink parameter. The new function uses the opts struct mechanism to be extendable in the future. Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/158515700857.92963.7052131201257841700.stgit@toke.dk
This commit is contained in:
parent
50a3e678b5
commit
bd5ca3ef93
@ -444,7 +444,15 @@ struct xdp_link_info {
|
|||||||
__u8 attach_mode;
|
__u8 attach_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct bpf_xdp_set_link_opts {
|
||||||
|
size_t sz;
|
||||||
|
__u32 old_fd;
|
||||||
|
};
|
||||||
|
#define bpf_xdp_set_link_opts__last_field old_fd
|
||||||
|
|
||||||
LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);
|
LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);
|
||||||
|
LIBBPF_API int bpf_set_link_xdp_fd_opts(int ifindex, int fd, __u32 flags,
|
||||||
|
const struct bpf_xdp_set_link_opts *opts);
|
||||||
LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags);
|
LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags);
|
||||||
LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info,
|
LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info,
|
||||||
size_t info_size, __u32 flags);
|
size_t info_size, __u32 flags);
|
||||||
|
@ -244,4 +244,5 @@ LIBBPF_0.0.8 {
|
|||||||
bpf_link__pin_path;
|
bpf_link__pin_path;
|
||||||
bpf_link__unpin;
|
bpf_link__unpin;
|
||||||
bpf_program__set_attach_target;
|
bpf_program__set_attach_target;
|
||||||
|
bpf_set_link_xdp_fd_opts;
|
||||||
} LIBBPF_0.0.7;
|
} LIBBPF_0.0.7;
|
||||||
|
@ -132,7 +132,8 @@ done:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags)
|
static int __bpf_set_link_xdp_fd_replace(int ifindex, int fd, int old_fd,
|
||||||
|
__u32 flags)
|
||||||
{
|
{
|
||||||
int sock, seq = 0, ret;
|
int sock, seq = 0, ret;
|
||||||
struct nlattr *nla, *nla_xdp;
|
struct nlattr *nla, *nla_xdp;
|
||||||
@ -178,6 +179,14 @@ int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags)
|
|||||||
nla->nla_len += nla_xdp->nla_len;
|
nla->nla_len += nla_xdp->nla_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & XDP_FLAGS_REPLACE) {
|
||||||
|
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
|
||||||
|
nla_xdp->nla_type = IFLA_XDP_EXPECTED_FD;
|
||||||
|
nla_xdp->nla_len = NLA_HDRLEN + sizeof(old_fd);
|
||||||
|
memcpy((char *)nla_xdp + NLA_HDRLEN, &old_fd, sizeof(old_fd));
|
||||||
|
nla->nla_len += nla_xdp->nla_len;
|
||||||
|
}
|
||||||
|
|
||||||
req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);
|
req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);
|
||||||
|
|
||||||
if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
|
if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) {
|
||||||
@ -191,6 +200,29 @@ cleanup:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bpf_set_link_xdp_fd_opts(int ifindex, int fd, __u32 flags,
|
||||||
|
const struct bpf_xdp_set_link_opts *opts)
|
||||||
|
{
|
||||||
|
int old_fd = -1;
|
||||||
|
|
||||||
|
if (!OPTS_VALID(opts, bpf_xdp_set_link_opts))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (OPTS_HAS(opts, old_fd)) {
|
||||||
|
old_fd = OPTS_GET(opts, old_fd, -1);
|
||||||
|
flags |= XDP_FLAGS_REPLACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return __bpf_set_link_xdp_fd_replace(ifindex, fd,
|
||||||
|
old_fd,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags)
|
||||||
|
{
|
||||||
|
return __bpf_set_link_xdp_fd_replace(ifindex, fd, 0, flags);
|
||||||
|
}
|
||||||
|
|
||||||
static int __dump_link_nlmsg(struct nlmsghdr *nlh,
|
static int __dump_link_nlmsg(struct nlmsghdr *nlh,
|
||||||
libbpf_dump_nlmsg_t dump_link_nlmsg, void *cookie)
|
libbpf_dump_nlmsg_t dump_link_nlmsg, void *cookie)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user