[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200427224633.15627-15-dsahern@kernel.org>
Date: Mon, 27 Apr 2020 16:46:32 -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 v4 bpf-next 14/15] 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 | 56 +++++++++++++++++++
.../selftests/bpf/progs/test_xdp_egress.c | 12 ++++
.../bpf/progs/test_xdp_egress_fail.c | 16 ++++++
3 files changed, 84 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..5253754b27de
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/xdp_egress_attach.c
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/if_link.h>
+#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_prog_info info = {};
+ __u32 id, len = sizeof(info);
+ struct bpf_object *obj;
+ __u32 duration = 0;
+ int err, fd = -1;
+
+ /* 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;
+
+ err = bpf_set_link_xdp_fd(IFINDEX_LO, fd, XDP_FLAGS_EGRESS_MODE);
+ if (CHECK(err, "xdp attach", "xdp attach failed"))
+ goto out_close;
+
+ err = bpf_get_link_xdp_id(IFINDEX_LO, &id, XDP_FLAGS_EGRESS_MODE);
+ if (CHECK(err || id != info.id, "id_check",
+ "loaded prog id %u != id %u, err %d", info.id, id, err))
+ goto out;
+
+out:
+ err = bpf_set_link_xdp_fd(IFINDEX_LO, -1, XDP_FLAGS_EGRESS_MODE);
+ if (CHECK(err, "xdp detach", "xdp detach failed"))
+ goto out_close;
+
+ err = bpf_get_link_xdp_id(IFINDEX_LO, &id, XDP_FLAGS_EGRESS_MODE);
+ 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