On 01/25/2018 01:05 AM, Eric Leblond wrote: > Most of the code is taken from set_link_xdp_fd() in bpf_load.c and > slightly modified to be library compliant. > > Signed-off-by: Eric Leblond <e...@regit.org> > Acked-by: Alexei Starovoitov <a...@kernel.org> > --- > tools/lib/bpf/bpf.c | 127 > +++++++++++++++++++++++++++++++++++++++++++++++++ > tools/lib/bpf/libbpf.c | 2 + > tools/lib/bpf/libbpf.h | 4 ++ > 3 files changed, 133 insertions(+) > > diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c > index 5128677e4117..749a447ec9ed 100644 > --- a/tools/lib/bpf/bpf.c > +++ b/tools/lib/bpf/bpf.c > @@ -25,6 +25,17 @@ > #include <asm/unistd.h> > #include <linux/bpf.h> > #include "bpf.h" > +#include "libbpf.h" > +#include "nlattr.h" > +#include <uapi/linux/rtnetlink.h>
Doesn't libbpf pull in already -I$(srctree)/tools/include/uapi? Seems the other headers don't need 'uapi/' path prefix. > +#include <sys/socket.h> > +#include <errno.h> > + > +#ifndef IFLA_XDP_MAX > +#define IFLA_XDP 43 > +#define IFLA_XDP_FD 1 > +#define IFLA_XDP_FLAGS 3 > +#endif Hm, given we pull in tools/include/uapi/linux/netlink.h, shouldn't we also get include/uapi/linux/if_link.h dependency in here, so above ifdef workaround can be avoided? > /* > * When building perf, unistd.h is overridden. __NR_bpf is > @@ -46,7 +57,9 @@ > # endif > #endif > > +#ifndef min > #define min(x, y) ((x) < (y) ? (x) : (y)) > +#endif > > static inline __u64 ptr_to_u64(const void *ptr) > { > @@ -413,3 +426,117 @@ int bpf_obj_get_info_by_fd(int prog_fd, void *info, > __u32 *info_len) > > return err; > } > + > +int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags) > +{ > + struct sockaddr_nl sa; > + int sock, seq = 0, len, ret = -1; > + char buf[4096]; > + struct nlattr *nla, *nla_xdp; > + struct { [...]