diff mbox series

[v3,net-next,10/12] bpf: add xdp multi-buffer selftest

Message ID fb036cd7830a6db1ea9d68f8a987bb0004ccb8d6.1601478613.git.lorenzo@kernel.org
State New
Headers show
Series mvneta: introduce XDP multi-buffer support | expand

Commit Message

Lorenzo Bianconi Sept. 30, 2020, 3:42 p.m. UTC
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@redhat.com>
Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.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

Comments

Eelco Chaudron Oct. 1, 2020, 7:43 a.m. UTC | #1
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@redhat.com>

> Signed-off-by: Eelco Chaudron <echaudro@redhat.com>

> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.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
diff mbox series

Patch

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],
+					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";