lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 01 Oct 2020 09:43:29 +0200
From:   "Eelco Chaudron" <echaudro@...hat.com>
To:     "Lorenzo Bianconi" <lorenzo@...nel.org>
Cc:     netdev@...r.kernel.org, bpf@...r.kernel.org, davem@...emloft.net,
        sameehj@...zon.com, kuba@...nel.org, john.fastabend@...il.com,
        daniel@...earbox.net, ast@...nel.org, shayagr@...zon.com,
        brouer@...hat.com, lorenzo.bianconi@...hat.com, dsahern@...nel.org
Subject: Re: [PATCH v3 net-next 10/12] bpf: add xdp multi-buffer selftest



On 30 Sep 2020, at 17:42, Lorenzo Bianconi wrote:

> Introduce xdp multi-buffer selftest for the following ebpf helpers:
> - bpf_xdp_get_frags_total_size
> - bpf_xdp_get_frag_count
>
> Co-developed-by: Eelco Chaudron <echaudro@...hat.com>
> Signed-off-by: Eelco Chaudron <echaudro@...hat.com>
> Signed-off-by: Lorenzo Bianconi <lorenzo@...nel.org>
> ---
>  .../testing/selftests/bpf/prog_tests/xdp_mb.c | 77 
> +++++++++++++++++++
>  .../selftests/bpf/progs/test_xdp_multi_buff.c | 24 ++++++
>  2 files changed, 101 insertions(+)
>  create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_mb.c
>  create mode 100644 
> tools/testing/selftests/bpf/progs/test_xdp_multi_buff.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_mb.c 
> b/tools/testing/selftests/bpf/prog_tests/xdp_mb.c
> new file mode 100644
> index 000000000000..8cfe7253bf2a
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/prog_tests/xdp_mb.c
> @@ -0,0 +1,77 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <unistd.h>
> +#include <linux/kernel.h>
> +#include <test_progs.h>
> +#include <network_helpers.h>
> +
> +#include "test_xdp_multi_buff.skel.h"
> +
> +static void test_xdp_mb_check_len(void)
> +{
> +	int test_sizes[] = { 128, 4096, 9000 };
> +	struct test_xdp_multi_buff *pkt_skel;
> +	char *pkt_in = NULL, *pkt_out = NULL;
> +	__u32 duration = 0, retval, size;
> +	int err, pkt_fd, i;
> +
> +	/* Load XDP program */
> +	pkt_skel = test_xdp_multi_buff__open_and_load();
> +	if (CHECK(!pkt_skel, "pkt_skel_load", "test_xdp_mb skeleton 
> failed\n"))
> +		goto out;
> +
> +	/* Allocate resources */
> +	pkt_out = malloc(test_sizes[ARRAY_SIZE(test_sizes) - 1]);
> +	pkt_in = malloc(test_sizes[ARRAY_SIZE(test_sizes) - 1]);
> +	if (CHECK(!pkt_in || !pkt_out, "malloc",
> +		  "Failed malloc, in = %p, out %p\n", pkt_in, pkt_out))
> +		goto out;
> +
> +	pkt_fd = bpf_program__fd(pkt_skel->progs._xdp_check_mb_len);
> +	if (pkt_fd < 0)
> +		goto out;
> +
> +	/* Run test for specific set of packets */
> +	for (i = 0; i < ARRAY_SIZE(test_sizes); i++) {
> +		int frag_count;
> +
> +		/* Run test program */
> +		err = bpf_prog_test_run(pkt_fd, 1, &pkt_in, test_sizes[i],

Small bug, should be:

         err = bpf_prog_test_run(pkt_fd, 1, pkt_in, test_sizes[i],

> +					pkt_out, &size, &retval, &duration);
> +
> +		if (CHECK(err || retval != XDP_PASS, // || size != test_sizes[i],
> +			  "test_run", "err %d errno %d retval %d size %d[%d]\n",
> +			  err, errno, retval, size, test_sizes[i]))
> +			goto out;
> +
> +		/* Verify test results */
> +		frag_count = DIV_ROUND_UP(
> +			test_sizes[i] - pkt_skel->data->test_result_xdp_len,
> +			getpagesize());
> +
> +		if (CHECK(pkt_skel->data->test_result_frag_count != frag_count,
> +			  "result", "frag_count = %llu != %u\n",
> +			  pkt_skel->data->test_result_frag_count, frag_count))
> +			goto out;
> +
> +		if (CHECK(pkt_skel->data->test_result_frag_len != test_sizes[i] -
> +			  pkt_skel->data->test_result_xdp_len,
> +			  "result", "frag_len = %llu != %llu\n",
> +			  pkt_skel->data->test_result_frag_len,
> +			  test_sizes[i] - pkt_skel->data->test_result_xdp_len))
> +			goto out;
> +	}
> +out:
> +	if (pkt_out)
> +		free(pkt_out);
> +	if (pkt_in)
> +		free(pkt_in);
> +
> +	test_xdp_multi_buff__destroy(pkt_skel);
> +}
> +
> +void test_xdp_mb(void)
> +{
> +	if (test__start_subtest("xdp_mb_check_len_frags"))
> +		test_xdp_mb_check_len();
> +}
> diff --git a/tools/testing/selftests/bpf/progs/test_xdp_multi_buff.c 
> b/tools/testing/selftests/bpf/progs/test_xdp_multi_buff.c
> new file mode 100644
> index 000000000000..1a46e0925282
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/test_xdp_multi_buff.c
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <linux/bpf.h>
> +#include <linux/if_ether.h>
> +#include <bpf/bpf_helpers.h>
> +#include <stdint.h>
> +
> +__u64 test_result_frag_len = UINT64_MAX;
> +__u64 test_result_frag_count = UINT64_MAX;
> +__u64 test_result_xdp_len = UINT64_MAX;
> +
> +SEC("xdp_check_mb_len")
> +int _xdp_check_mb_len(struct xdp_md *xdp)
> +{
> +	void *data_end = (void *)(long)xdp->data_end;
> +	void *data = (void *)(long)xdp->data;
> +
> +	test_result_xdp_len = (__u64)(data_end - data);
> +	test_result_frag_len = bpf_xdp_get_frags_total_size(xdp);
> +	test_result_frag_count = bpf_xdp_get_frag_count(xdp);
> +	return XDP_PASS;
> +}
> +
> +char _license[] SEC("license") = "GPL";
> -- 
> 2.26.2

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ