[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200420200055.49033-16-dsahern@kernel.org>
Date: Mon, 20 Apr 2020 14:00:54 -0600
From: David Ahern <dsahern@...nel.org>
To: netdev@...r.kernel.org
Cc: davem@...emloft.net, kuba@...nel.org,
prashantbhole.linux@...il.com, jasowang@...hat.com,
brouer@...hat.com, toke@...hat.com, toshiaki.makita1@...il.com,
daniel@...earbox.net, john.fastabend@...il.com, ast@...nel.org,
kafai@...com, songliubraving@...com, yhs@...com, andriin@...com,
dsahern@...il.com, David Ahern <dahern@...italocean.com>
Subject: [PATCH bpf-next 15/16] selftest: Add xdp_egress attach tests
From: David Ahern <dahern@...italocean.com>
Add xdp_egress attach tests:
1. verify egress programs cannot access ingress entries in xdp context
2. verify ability to load, attach, and detach xdp egress to a device.
Signed-off-by: David Ahern <dahern@...italocean.com>
---
.../bpf/prog_tests/xdp_egress_attach.c | 62 +++++++++++++++++++
.../selftests/bpf/progs/test_xdp_egress.c | 12 ++++
.../bpf/progs/test_xdp_egress_fail.c | 16 +++++
3 files changed, 90 insertions(+)
create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_egress_attach.c
create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_egress.c
create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_egress_fail.c
diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_egress_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_egress_attach.c
new file mode 100644
index 000000000000..a8727f82a29d
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/xdp_egress_attach.c
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <test_progs.h>
+
+#define IFINDEX_LO 1
+
+void test_xdp_egress_attach(void)
+{
+ struct bpf_prog_load_attr attr = {
+ .prog_type = BPF_PROG_TYPE_XDP,
+ .expected_attach_type = BPF_XDP_EGRESS,
+ };
+ struct bpf_xdp_set_link_opts opts;
+ struct bpf_prog_info info = {};
+ __u32 id, len = sizeof(info);
+ struct bpf_object *obj;
+ __u32 duration = 0;
+ int err, fd = -1;
+
+ memset(&opts, 0, sizeof(opts));
+ opts.sz = sizeof(opts);
+
+ /* should fail - accesses rx queue info */
+ attr.file = "./test_xdp_egress_fail.o",
+ err = bpf_prog_load_xattr(&attr, &obj, &fd);
+ if (CHECK(err == 0 && fd >= 0, "xdp_egress with rx failed to load",
+ "load of xdp_egress with rx succeeded instead of failed"))
+ return;
+
+ attr.file = "./test_xdp_egress.o",
+ err = bpf_prog_load_xattr(&attr, &obj, &fd);
+ if (CHECK_FAIL(err))
+ return;
+
+ err = bpf_obj_get_info_by_fd(fd, &info, &len);
+ if (CHECK_FAIL(err))
+ goto out_close;
+
+ opts.old_fd = -1;
+ opts.egress = 1;
+ err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, fd, 0, &opts);
+ if (CHECK(err, "xdp attach", "xdp attach failed"))
+ goto out_close;
+
+ err = bpf_get_link_xdp_egress_id(IFINDEX_LO, &id, 0);
+ if (CHECK(err || id != info.id, "id_check",
+ "loaded prog id %u != id %u, err %d", info.id, id, err))
+ goto out;
+
+out:
+ opts.old_fd = bpf_prog_get_fd_by_id(id);
+ err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, -1, 0, &opts);
+ if (CHECK(err, "xdp detach", "xdp detach failed"))
+ goto out_close;
+
+ err = bpf_get_link_xdp_egress_id(IFINDEX_LO, &id, 0);
+ if (CHECK(err || id, "id_check",
+ "failed to detach program %u", id))
+ goto out;
+
+out_close:
+ bpf_object__close(obj);
+}
diff --git a/tools/testing/selftests/bpf/progs/test_xdp_egress.c b/tools/testing/selftests/bpf/progs/test_xdp_egress.c
new file mode 100644
index 000000000000..0477e8537b7f
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_xdp_egress.c
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+SEC("xdp_egress")
+int xdp_egress_good(struct xdp_md *ctx)
+{
+ __u32 idx = ctx->egress_ifindex;
+
+ return idx == 1 ? XDP_DROP : XDP_PASS;
+}
diff --git a/tools/testing/selftests/bpf/progs/test_xdp_egress_fail.c b/tools/testing/selftests/bpf/progs/test_xdp_egress_fail.c
new file mode 100644
index 000000000000..76b47b1d3bc3
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_xdp_egress_fail.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+SEC("xdp_egress")
+int xdp_egress_fail(struct xdp_md *ctx)
+{
+ __u32 rxq = ctx->rx_queue_index;
+ __u32 idx = ctx->ingress_ifindex;
+
+ if (idx == 1)
+ return XDP_DROP;
+
+ return rxq ? XDP_DROP : XDP_PASS;
+}
--
2.21.1 (Apple Git-122.3)
Powered by blists - more mailing lists