xref: /linux/tools/testing/selftests/bpf/prog_tests/fsession_test.c (revision 6f7e6393d1ce636bb7ec77a7fe7b77458fddf701)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2025 ChinaTelecom */
3 #include <test_progs.h>
4 #include "fsession_test.skel.h"
5 
6 static int check_result(struct fsession_test *skel)
7 {
8 	LIBBPF_OPTS(bpf_test_run_opts, topts);
9 	int err, prog_fd;
10 
11 	/* Trigger test function calls */
12 	prog_fd = bpf_program__fd(skel->progs.test1);
13 	err = bpf_prog_test_run_opts(prog_fd, &topts);
14 	if (!ASSERT_OK(err, "test_run_opts err"))
15 		return err;
16 	if (!ASSERT_OK(topts.retval, "test_run_opts retval"))
17 		return topts.retval;
18 
19 	for (int i = 0; i < sizeof(*skel->bss) / sizeof(__u64); i++) {
20 		if (!ASSERT_EQ(((__u64 *)skel->bss)[i], 1, "test_result"))
21 			return -EINVAL;
22 	}
23 
24 	return 0;
25 }
26 
27 static void test_fsession_basic(void)
28 {
29 	struct fsession_test *skel = NULL;
30 	int err;
31 
32 	skel = fsession_test__open();
33 	if (!ASSERT_OK_PTR(skel, "fsession_test__open"))
34 		return;
35 
36 	err = fsession_test__load(skel);
37 	if (err == -EOPNOTSUPP) {
38 		test__skip();
39 		goto cleanup;
40 	}
41 	if (!ASSERT_OK(err, "fsession_test__load"))
42 		goto cleanup;
43 
44 	err = fsession_test__attach(skel);
45 	if (!ASSERT_OK(err, "fsession_attach"))
46 		goto cleanup;
47 
48 	check_result(skel);
49 cleanup:
50 	fsession_test__destroy(skel);
51 }
52 
53 static void test_fsession_reattach(void)
54 {
55 	struct fsession_test *skel = NULL;
56 	int err;
57 
58 	skel = fsession_test__open();
59 	if (!ASSERT_OK_PTR(skel, "fsession_test__open"))
60 		return;
61 
62 	err = fsession_test__load(skel);
63 	if (err == -EOPNOTSUPP) {
64 		test__skip();
65 		goto cleanup;
66 	}
67 	if (!ASSERT_OK(err, "fsession_test__load"))
68 		goto cleanup;
69 
70 	/* first attach */
71 	err = fsession_test__attach(skel);
72 	if (!ASSERT_OK(err, "fsession_first_attach"))
73 		goto cleanup;
74 
75 	if (check_result(skel))
76 		goto cleanup;
77 
78 	/* detach */
79 	fsession_test__detach(skel);
80 
81 	/* reset counters */
82 	memset(skel->bss, 0, sizeof(*skel->bss));
83 
84 	/* second attach */
85 	err = fsession_test__attach(skel);
86 	if (!ASSERT_OK(err, "fsession_second_attach"))
87 		goto cleanup;
88 
89 	if (check_result(skel))
90 		goto cleanup;
91 
92 cleanup:
93 	fsession_test__destroy(skel);
94 }
95 
96 static void test_fsession_cookie(void)
97 {
98 	struct fsession_test *skel = NULL;
99 	int err;
100 
101 	skel = fsession_test__open();
102 	if (!ASSERT_OK_PTR(skel, "fsession_test__open"))
103 		goto cleanup;
104 
105 	/*
106 	 * The test_fsession_basic() will test the session cookie with
107 	 * bpf_get_func_ip() case, so we need only check
108 	 * the cookie without bpf_get_func_ip() case here
109 	 */
110 	bpf_program__set_autoload(skel->progs.test6, false);
111 
112 	err = fsession_test__load(skel);
113 	if (err == -EOPNOTSUPP) {
114 		test__skip();
115 		goto cleanup;
116 	}
117 	if (!ASSERT_OK(err, "fsession_test__load"))
118 		goto cleanup;
119 
120 	err = fsession_test__attach(skel);
121 	if (!ASSERT_OK(err, "fsession_attach"))
122 		goto cleanup;
123 
124 	skel->bss->test6_entry_result = 1;
125 	skel->bss->test6_exit_result = 1;
126 
127 	check_result(skel);
128 cleanup:
129 	fsession_test__destroy(skel);
130 }
131 
132 void test_fsession_test(void)
133 {
134 	if (test__start_subtest("fsession_test"))
135 		test_fsession_basic();
136 	if (test__start_subtest("fsession_reattach"))
137 		test_fsession_reattach();
138 	if (test__start_subtest("fsession_cookie"))
139 		test_fsession_cookie();
140 }
141