From: David Ahern <dah...@digitalocean.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 <dah...@digitalocean.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)

Reply via email to