On Wed, May 27, 2020 at 5:15 PM David Ahern <dsah...@kernel.org> wrote: > > Add tests to verify ability to add an XDP program to a > entry in a DEVMAP. > > Add negative tests to show DEVMAP programs can not be > attached to devices as a normal XDP program, and accesses > to egress_ifindex require BPF_XDP_DEVMAP attach type. > > Signed-off-by: David Ahern <dsah...@kernel.org> > --- > .../bpf/prog_tests/xdp_devmap_attach.c | 94 +++++++++++++++++++ > .../selftests/bpf/progs/test_xdp_devmap.c | 19 ++++ > .../selftests/bpf/progs/test_xdp_devmap2.c | 19 ++++ > .../bpf/progs/test_xdp_with_devmap.c | 17 ++++ > 4 files changed, 149 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c > create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_devmap.c > create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_devmap2.c > create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_with_devmap.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c > b/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c > new file mode 100644 > index 000000000000..d81b2b366f39 > --- /dev/null > +++ b/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c > @@ -0,0 +1,94 @@ > +// SPDX-License-Identifier: GPL-2.0 > +#include <uapi/linux/bpf.h> > +#include <linux/if_link.h> > +#include <test_progs.h> > + > +#define IFINDEX_LO 1 > + > +void test_xdp_devmap_attach(void) > +{ > + struct bpf_prog_load_attr attr = { > + .prog_type = BPF_PROG_TYPE_XDP, > + }; > + struct bpf_object *obj, *dm_obj = NULL; > + int err, dm_fd = -1, fd = -1, map_fd; > + struct bpf_prog_info info = {}; > + struct devmap_val val = { > + .ifindex = IFINDEX_LO, > + }; > + __u32 id, len = sizeof(info); > + __u32 duration = 0, idx = 0; > + > + attr.file = "./test_xdp_with_devmap.o", > + err = bpf_prog_load_xattr(&attr, &obj, &fd);
please use skeletons instead of loading .o files. > + if (CHECK(err, "load of xdp program with 8-byte devmap", > + "err %d errno %d\n", err, errno)) > + return; > + [...] > diff --git a/tools/testing/selftests/bpf/progs/test_xdp_devmap.c > b/tools/testing/selftests/bpf/progs/test_xdp_devmap.c > new file mode 100644 > index 000000000000..64fc2c3cae01 > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/test_xdp_devmap.c > @@ -0,0 +1,19 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* program inserted into devmap entry */ > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > + > +SEC("xdp_devmap_log") > +int xdpdm_devlog(struct xdp_md *ctx) > +{ > + char fmt[] = "devmap redirect: dev %u -> dev %u len %u\n"; > + void *data_end = (void *)(long)ctx->data_end; > + void *data = (void *)(long)ctx->data; > + unsigned int len = data_end - data; > + > + bpf_trace_printk(fmt, sizeof(fmt), ctx->ingress_ifindex, > ctx->egress_ifindex, len); > + > + return XDP_PASS; > +} > + > +char _license[] SEC("license") = "GPL"; > diff --git a/tools/testing/selftests/bpf/progs/test_xdp_devmap2.c > b/tools/testing/selftests/bpf/progs/test_xdp_devmap2.c > new file mode 100644 > index 000000000000..64fc2c3cae01 > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/test_xdp_devmap2.c > @@ -0,0 +1,19 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* program inserted into devmap entry */ > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > + > +SEC("xdp_devmap_log") > +int xdpdm_devlog(struct xdp_md *ctx) > +{ > + char fmt[] = "devmap redirect: dev %u -> dev %u len %u\n"; > + void *data_end = (void *)(long)ctx->data_end; > + void *data = (void *)(long)ctx->data; > + unsigned int len = data_end - data; > + > + bpf_trace_printk(fmt, sizeof(fmt), ctx->ingress_ifindex, > ctx->egress_ifindex, len); instead of just printing ifindexes, why not return them through global variable and validate in a test? > + > + return XDP_PASS; > +} > + > +char _license[] SEC("license") = "GPL"; > diff --git a/tools/testing/selftests/bpf/progs/test_xdp_with_devmap.c > b/tools/testing/selftests/bpf/progs/test_xdp_with_devmap.c > new file mode 100644 > index 000000000000..815cd59b4866 > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/test_xdp_with_devmap.c > @@ -0,0 +1,17 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > + > +struct bpf_map_def SEC("maps") dm_ports = { > + .type = BPF_MAP_TYPE_DEVMAP, > + .key_size = sizeof(__u32), > + .value_size = sizeof(struct devmap_val), > + .max_entries = 4, > +}; > + This is an old syntax for maps, all the selftests were converted to BTF-defined maps. Please update. > +SEC("xdp_devmap") > +int xdp_with_devmap(struct xdp_md *ctx) > +{ > + return bpf_redirect_map(&dm_ports, 1, 0); > +} > -- > 2.21.1 (Apple Git-122.3) >