Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (c) 2025 ChinaTelecom */
3#include <test_progs.h>
4#include "fsession_test.skel.h"
5
6static 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
27static 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);
49cleanup:
50 fsession_test__destroy(skel);
51}
52
53static 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
92cleanup:
93 fsession_test__destroy(skel);
94}
95
96static 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);
128cleanup:
129 fsession_test__destroy(skel);
130}
131
132void 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}