xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/bpf/prog_tests/varlen.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright (c) 2020 Facebook */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #include <test_progs.h>
5*4882a593Smuzhiyun #include <time.h>
6*4882a593Smuzhiyun #include "test_varlen.skel.h"
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define CHECK_VAL(got, exp) \
9*4882a593Smuzhiyun 	CHECK((got) != (exp), "check", "got %ld != exp %ld\n", \
10*4882a593Smuzhiyun 	      (long)(got), (long)(exp))
11*4882a593Smuzhiyun 
test_varlen(void)12*4882a593Smuzhiyun void test_varlen(void)
13*4882a593Smuzhiyun {
14*4882a593Smuzhiyun 	int duration = 0, err;
15*4882a593Smuzhiyun 	struct test_varlen* skel;
16*4882a593Smuzhiyun 	struct test_varlen__bss *bss;
17*4882a593Smuzhiyun 	struct test_varlen__data *data;
18*4882a593Smuzhiyun 	const char str1[] = "Hello, ";
19*4882a593Smuzhiyun 	const char str2[] = "World!";
20*4882a593Smuzhiyun 	const char exp_str[] = "Hello, \0World!\0";
21*4882a593Smuzhiyun 	const int size1 = sizeof(str1);
22*4882a593Smuzhiyun 	const int size2 = sizeof(str2);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	skel = test_varlen__open_and_load();
25*4882a593Smuzhiyun 	if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
26*4882a593Smuzhiyun 		return;
27*4882a593Smuzhiyun 	bss = skel->bss;
28*4882a593Smuzhiyun 	data = skel->data;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	err = test_varlen__attach(skel);
31*4882a593Smuzhiyun 	if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err))
32*4882a593Smuzhiyun 		goto cleanup;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	bss->test_pid = getpid();
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/* trigger everything */
37*4882a593Smuzhiyun 	memcpy(bss->buf_in1, str1, size1);
38*4882a593Smuzhiyun 	memcpy(bss->buf_in2, str2, size2);
39*4882a593Smuzhiyun 	bss->capture = true;
40*4882a593Smuzhiyun 	usleep(1);
41*4882a593Smuzhiyun 	bss->capture = false;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	CHECK_VAL(bss->payload1_len1, size1);
44*4882a593Smuzhiyun 	CHECK_VAL(bss->payload1_len2, size2);
45*4882a593Smuzhiyun 	CHECK_VAL(bss->total1, size1 + size2);
46*4882a593Smuzhiyun 	CHECK(memcmp(bss->payload1, exp_str, size1 + size2), "content_check",
47*4882a593Smuzhiyun 	      "doesn't match!\n");
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	CHECK_VAL(data->payload2_len1, size1);
50*4882a593Smuzhiyun 	CHECK_VAL(data->payload2_len2, size2);
51*4882a593Smuzhiyun 	CHECK_VAL(data->total2, size1 + size2);
52*4882a593Smuzhiyun 	CHECK(memcmp(data->payload2, exp_str, size1 + size2), "content_check",
53*4882a593Smuzhiyun 	      "doesn't match!\n");
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	CHECK_VAL(data->payload3_len1, size1);
56*4882a593Smuzhiyun 	CHECK_VAL(data->payload3_len2, size2);
57*4882a593Smuzhiyun 	CHECK_VAL(data->total3, size1 + size2);
58*4882a593Smuzhiyun 	CHECK(memcmp(data->payload3, exp_str, size1 + size2), "content_check",
59*4882a593Smuzhiyun 	      "doesn't match!\n");
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	CHECK_VAL(data->payload4_len1, size1);
62*4882a593Smuzhiyun 	CHECK_VAL(data->payload4_len2, size2);
63*4882a593Smuzhiyun 	CHECK_VAL(data->total4, size1 + size2);
64*4882a593Smuzhiyun 	CHECK(memcmp(data->payload4, exp_str, size1 + size2), "content_check",
65*4882a593Smuzhiyun 	      "doesn't match!\n");
66*4882a593Smuzhiyun cleanup:
67*4882a593Smuzhiyun 	test_varlen__destroy(skel);
68*4882a593Smuzhiyun }
69