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 <andr...@fb.com>
---
 tools/include/uapi/linux/bpf.h                         | 10 +++++++++-
 tools/lib/bpf/libbpf.c                                 |  9 ++++++++-
 tools/lib/bpf/libbpf.h                                 |  2 ++
 tools/lib/bpf/libbpf.map                               |  1 +
 tools/testing/selftests/bpf/prog_tests/section_names.c |  2 +-
 5 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 548a749aebb3..533eb4fe4e03 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -227,6 +227,7 @@ enum bpf_attach_type {
        BPF_CGROUP_INET6_GETSOCKNAME,
        BPF_XDP_DEVMAP,
        BPF_CGROUP_INET_SOCK_RELEASE,
+       BPF_XDP,
        __MAX_BPF_ATTACH_TYPE
 };
 
@@ -239,6 +240,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,
 };
@@ -604,7 +606,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;
@@ -3980,6 +3985,9 @@ struct bpf_link_info {
                        __u32 netns_ino;
                        __u32 attach_type;
                } netns;
+               struct {
+                       __u32 ifindex;
+               } xdp;
        };
 } __attribute__((aligned(8)));
 
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 25e4f77be8d7..d2e49b1c09e1 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -6906,7 +6906,8 @@ static const struct bpf_sec_def section_defs[] = {
                .attach_fn = attach_iter),
        BPF_EAPROG_SEC("xdp_devmap",            BPF_PROG_TYPE_XDP,
                                                BPF_XDP_DEVMAP),
-       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),
@@ -8267,6 +8268,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)
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index 2335971ed0bd..000e93734aa6 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -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;
 
diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
index c5d5c7664c3b..a88c07b6d77f 100644
--- a/tools/lib/bpf/libbpf.map
+++ b/tools/lib/bpf/libbpf.map
@@ -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__set_autoload;
                btf__set_fd;
diff --git a/tools/testing/selftests/bpf/prog_tests/section_names.c 
b/tools/testing/selftests/bpf/prog_tests/section_names.c
index 713167449c98..8b571890c57e 100644
--- a/tools/testing/selftests/bpf/prog_tests/section_names.c
+++ b/tools/testing/selftests/bpf/prog_tests/section_names.c
@@ -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} },
-- 
2.24.1

Reply via email to