libbpf: Add support for BPF XDP link
authorAndrii Nakryiko <andriin@fb.com>
Wed, 22 Jul 2020 06:46:00 +0000 (23:46 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 26 Jul 2020 03:37:02 +0000 (20:37 -0700)
Sync UAPI header and add support for using bpf_link-based XDP attachment.
Make xdp/ prog type set expected attach type. Kernel didn't enforce
attach_type for XDP programs before, so there is no backwards compatiblity
issues there.

Also fix section_names selftest to recognize that xdp prog types now have
expected attach type.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200722064603.3350758-8-andriin@fb.com
tools/include/uapi/linux/bpf.h
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf.h
tools/lib/bpf/libbpf.map
tools/testing/selftests/bpf/prog_tests/section_names.c

index 828c2f6..e1ba4ae 100644 (file)
@@ -230,6 +230,7 @@ enum bpf_attach_type {
        BPF_CGROUP_INET_SOCK_RELEASE,
        BPF_XDP_CPUMAP,
        BPF_SK_LOOKUP,
+       BPF_XDP,
        __MAX_BPF_ATTACH_TYPE
 };
 
@@ -242,6 +243,7 @@ enum bpf_link_type {
        BPF_LINK_TYPE_CGROUP = 3,
        BPF_LINK_TYPE_ITER = 4,
        BPF_LINK_TYPE_NETNS = 5,
+       BPF_LINK_TYPE_XDP = 6,
 
        MAX_BPF_LINK_TYPE,
 };
@@ -614,7 +616,10 @@ union bpf_attr {
 
        struct { /* struct used by BPF_LINK_CREATE command */
                __u32           prog_fd;        /* eBPF program to attach */
-               __u32           target_fd;      /* object to attach to */
+               union {
+                       __u32           target_fd;      /* object to attach to */
+                       __u32           target_ifindex; /* target ifindex */
+               };
                __u32           attach_type;    /* attach type */
                __u32           flags;          /* extra flags */
        } link_create;
@@ -4064,6 +4069,9 @@ struct bpf_link_info {
                        __u32 netns_ino;
                        __u32 attach_type;
                } netns;
+               struct {
+                       __u32 ifindex;
+               } xdp;
        };
 } __attribute__((aligned(8)));
 
index e51479d..54830d6 100644 (file)
@@ -6915,7 +6915,8 @@ static const struct bpf_sec_def section_defs[] = {
                                                BPF_XDP_DEVMAP),
        BPF_EAPROG_SEC("xdp_cpumap/",           BPF_PROG_TYPE_XDP,
                                                BPF_XDP_CPUMAP),
-       BPF_PROG_SEC("xdp",                     BPF_PROG_TYPE_XDP),
+       BPF_EAPROG_SEC("xdp",                   BPF_PROG_TYPE_XDP,
+                                               BPF_XDP),
        BPF_PROG_SEC("perf_event",              BPF_PROG_TYPE_PERF_EVENT),
        BPF_PROG_SEC("lwt_in",                  BPF_PROG_TYPE_LWT_IN),
        BPF_PROG_SEC("lwt_out",                 BPF_PROG_TYPE_LWT_OUT),
@@ -8281,6 +8282,12 @@ bpf_program__attach_netns(struct bpf_program *prog, int netns_fd)
        return bpf_program__attach_fd(prog, netns_fd, "netns");
 }
 
+struct bpf_link *bpf_program__attach_xdp(struct bpf_program *prog, int ifindex)
+{
+       /* target_fd/target_ifindex use the same field in LINK_CREATE */
+       return bpf_program__attach_fd(prog, ifindex, "xdp");
+}
+
 struct bpf_link *
 bpf_program__attach_iter(struct bpf_program *prog,
                         const struct bpf_iter_attach_opts *opts)
index c681379..9924385 100644 (file)
@@ -257,6 +257,8 @@ LIBBPF_API struct bpf_link *
 bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd);
 LIBBPF_API struct bpf_link *
 bpf_program__attach_netns(struct bpf_program *prog, int netns_fd);
+LIBBPF_API struct bpf_link *
+bpf_program__attach_xdp(struct bpf_program *prog, int ifindex);
 
 struct bpf_map;
 
index 6f0856a..ca49a6a 100644 (file)
@@ -286,6 +286,7 @@ LIBBPF_0.1.0 {
                bpf_map__set_value_size;
                bpf_map__type;
                bpf_map__value_size;
+               bpf_program__attach_xdp;
                bpf_program__autoload;
                bpf_program__is_sk_lookup;
                bpf_program__set_autoload;
index 7131674..8b57189 100644 (file)
@@ -35,7 +35,7 @@ static struct sec_name_test tests[] = {
                {-EINVAL, 0},
        },
        {"raw_tp/", {0, BPF_PROG_TYPE_RAW_TRACEPOINT, 0}, {-EINVAL, 0} },
-       {"xdp", {0, BPF_PROG_TYPE_XDP, 0}, {-EINVAL, 0} },
+       {"xdp", {0, BPF_PROG_TYPE_XDP, BPF_XDP}, {0, BPF_XDP} },
        {"perf_event", {0, BPF_PROG_TYPE_PERF_EVENT, 0}, {-EINVAL, 0} },
        {"lwt_in", {0, BPF_PROG_TYPE_LWT_IN, 0}, {-EINVAL, 0} },
        {"lwt_out", {0, BPF_PROG_TYPE_LWT_OUT, 0}, {-EINVAL, 0} },