hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/testing/selftests/bpf/test_tcpbpf_user.c
....@@ -16,6 +16,9 @@
1616
1717 #include "test_tcpbpf.h"
1818
19
+/* 3 comes from one listening socket + both ends of the connection */
20
+#define EXPECTED_CLOSE_EVENTS 3
21
+
1922 #define EXPECT_EQ(expected, actual, fmt) \
2023 do { \
2124 if ((expected) != (actual)) { \
....@@ -23,13 +26,14 @@
2326 " Actual: %" fmt "\n" \
2427 " Expected: %" fmt "\n", \
2528 (actual), (expected)); \
26
- goto err; \
29
+ ret--; \
2730 } \
2831 } while (0)
2932
3033 int verify_result(const struct tcpbpf_globals *result)
3134 {
3235 __u32 expected_events;
36
+ int ret = 0;
3337
3438 expected_events = ((1 << BPF_SOCK_OPS_TIMEOUT_INIT) |
3539 (1 << BPF_SOCK_OPS_RWND_INIT) |
....@@ -48,10 +52,28 @@
4852 EXPECT_EQ(0x80, result->bad_cb_test_rv, PRIu32);
4953 EXPECT_EQ(0, result->good_cb_test_rv, PRIu32);
5054 EXPECT_EQ(1, result->num_listen, PRIu32);
55
+ EXPECT_EQ(EXPECTED_CLOSE_EVENTS, result->num_close_events, PRIu32);
5156
52
- return 0;
53
-err:
54
- return -1;
57
+ return ret;
58
+}
59
+
60
+int verify_sockopt_result(int sock_map_fd)
61
+{
62
+ __u32 key = 0;
63
+ int ret = 0;
64
+ int res;
65
+ int rv;
66
+
67
+ /* check setsockopt for SAVE_SYN */
68
+ rv = bpf_map_lookup_elem(sock_map_fd, &key, &res);
69
+ EXPECT_EQ(0, rv, "d");
70
+ EXPECT_EQ(0, res, "d");
71
+ key = 1;
72
+ /* check getsockopt for SAVED_SYN */
73
+ rv = bpf_map_lookup_elem(sock_map_fd, &key, &res);
74
+ EXPECT_EQ(0, rv, "d");
75
+ EXPECT_EQ(1, res, "d");
76
+ return ret;
5577 }
5678
5779 static int bpf_find_map(const char *test, struct bpf_object *obj,
....@@ -70,23 +92,18 @@
7092 int main(int argc, char **argv)
7193 {
7294 const char *file = "test_tcpbpf_kern.o";
95
+ int prog_fd, map_fd, sock_map_fd;
7396 struct tcpbpf_globals g = {0};
7497 const char *cg_path = "/foo";
7598 int error = EXIT_FAILURE;
7699 struct bpf_object *obj;
77
- int prog_fd, map_fd;
78100 int cg_fd = -1;
101
+ int retry = 10;
79102 __u32 key = 0;
80103 int rv;
81104
82
- if (setup_cgroup_environment())
83
- goto err;
84
-
85
- cg_fd = create_and_get_cgroup(cg_path);
86
- if (!cg_fd)
87
- goto err;
88
-
89
- if (join_cgroup(cg_path))
105
+ cg_fd = cgroup_setup_and_join(cg_path);
106
+ if (cg_fd < 0)
90107 goto err;
91108
92109 if (bpf_prog_load(file, BPF_PROG_TYPE_SOCK_OPS, &obj, &prog_fd)) {
....@@ -110,17 +127,34 @@
110127 if (map_fd < 0)
111128 goto err;
112129
130
+ sock_map_fd = bpf_find_map(__func__, obj, "sockopt_results");
131
+ if (sock_map_fd < 0)
132
+ goto err;
133
+
134
+retry_lookup:
113135 rv = bpf_map_lookup_elem(map_fd, &key, &g);
114136 if (rv != 0) {
115137 printf("FAILED: bpf_map_lookup_elem returns %d\n", rv);
116138 goto err;
117139 }
118140
141
+ if (g.num_close_events != EXPECTED_CLOSE_EVENTS && retry--) {
142
+ printf("Unexpected number of close events (%d), retrying!\n",
143
+ g.num_close_events);
144
+ usleep(100);
145
+ goto retry_lookup;
146
+ }
147
+
119148 if (verify_result(&g)) {
120149 printf("FAILED: Wrong stats\n");
121150 goto err;
122151 }
123152
153
+ if (verify_sockopt_result(sock_map_fd)) {
154
+ printf("FAILED: Wrong sockopt stats\n");
155
+ goto err;
156
+ }
157
+
124158 printf("PASSED!\n");
125159 error = 0;
126160 err: