diff options
author | Stanislav Fomichev <sdf@google.com> | 2019-09-04 12:25:08 -0400 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2019-09-06 12:59:05 -0400 |
commit | e3e02e1d9c24b0c3a36f9c854ae80e61fd62b2a9 (patch) | |
tree | dac2384f7034b7c5d93c14c39f67c3f8af3510aa /tools | |
parent | 3886bd7c9b01317a5721161f8314f6c25f4f6229 (diff) |
selftests/bpf: test_progs: convert test_sockopt_inherit
Move the files, adjust includes, remove entry from Makefile & .gitignore
I also added pthread_cond_wait for the server thread startup. We don't
want to connect to the server that's not yet up (for some reason
this existing race is now more prominent with test_progs).
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/testing/selftests/bpf/.gitignore | 1 | ||||
-rw-r--r-- | tools/testing/selftests/bpf/Makefile | 4 | ||||
-rw-r--r-- | tools/testing/selftests/bpf/prog_tests/sockopt_inherit.c (renamed from tools/testing/selftests/bpf/test_sockopt_inherit.c) | 102 |
3 files changed, 43 insertions, 64 deletions
diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore index 4143add5a11e..5b06bb45b500 100644 --- a/tools/testing/selftests/bpf/.gitignore +++ b/tools/testing/selftests/bpf/.gitignore | |||
@@ -39,5 +39,4 @@ libbpf.so.* | |||
39 | test_hashmap | 39 | test_hashmap |
40 | test_btf_dump | 40 | test_btf_dump |
41 | xdping | 41 | xdping |
42 | test_sockopt_inherit | ||
43 | test_tcp_rtt | 42 | test_tcp_rtt |
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 0ab9642c4f5e..4d9a0304a011 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile | |||
@@ -28,8 +28,7 @@ TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test | |||
28 | test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \ | 28 | test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \ |
29 | test_cgroup_storage test_select_reuseport test_section_names \ | 29 | test_cgroup_storage test_select_reuseport test_section_names \ |
30 | test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \ | 30 | test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \ |
31 | test_btf_dump test_cgroup_attach xdping \ | 31 | test_btf_dump test_cgroup_attach xdping test_tcp_rtt |
32 | test_sockopt_inherit test_tcp_rtt | ||
33 | 32 | ||
34 | BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c))) | 33 | BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c))) |
35 | TEST_GEN_FILES = $(BPF_OBJ_FILES) | 34 | TEST_GEN_FILES = $(BPF_OBJ_FILES) |
@@ -113,7 +112,6 @@ $(OUTPUT)/test_netcnt: cgroup_helpers.c | |||
113 | $(OUTPUT)/test_sock_fields: cgroup_helpers.c | 112 | $(OUTPUT)/test_sock_fields: cgroup_helpers.c |
114 | $(OUTPUT)/test_sysctl: cgroup_helpers.c | 113 | $(OUTPUT)/test_sysctl: cgroup_helpers.c |
115 | $(OUTPUT)/test_cgroup_attach: cgroup_helpers.c | 114 | $(OUTPUT)/test_cgroup_attach: cgroup_helpers.c |
116 | $(OUTPUT)/test_sockopt_inherit: cgroup_helpers.c | ||
117 | $(OUTPUT)/test_tcp_rtt: cgroup_helpers.c | 115 | $(OUTPUT)/test_tcp_rtt: cgroup_helpers.c |
118 | 116 | ||
119 | .PHONY: force | 117 | .PHONY: force |
diff --git a/tools/testing/selftests/bpf/test_sockopt_inherit.c b/tools/testing/selftests/bpf/prog_tests/sockopt_inherit.c index 1bf699815b9b..6cbeea7b4bf1 100644 --- a/tools/testing/selftests/bpf/test_sockopt_inherit.c +++ b/tools/testing/selftests/bpf/prog_tests/sockopt_inherit.c | |||
@@ -1,22 +1,7 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <error.h> | 2 | #include <test_progs.h> |
3 | #include <errno.h> | ||
4 | #include <stdio.h> | ||
5 | #include <unistd.h> | ||
6 | #include <sys/types.h> | ||
7 | #include <sys/socket.h> | ||
8 | #include <netinet/in.h> | ||
9 | #include <pthread.h> | ||
10 | |||
11 | #include <linux/filter.h> | ||
12 | #include <bpf/bpf.h> | ||
13 | #include <bpf/libbpf.h> | ||
14 | |||
15 | #include "bpf_rlimit.h" | ||
16 | #include "bpf_util.h" | ||
17 | #include "cgroup_helpers.h" | 3 | #include "cgroup_helpers.h" |
18 | 4 | ||
19 | #define CG_PATH "/sockopt_inherit" | ||
20 | #define SOL_CUSTOM 0xdeadbeef | 5 | #define SOL_CUSTOM 0xdeadbeef |
21 | #define CUSTOM_INHERIT1 0 | 6 | #define CUSTOM_INHERIT1 0 |
22 | #define CUSTOM_INHERIT2 1 | 7 | #define CUSTOM_INHERIT2 1 |
@@ -74,6 +59,9 @@ static int verify_sockopt(int fd, int optname, const char *msg, char expected) | |||
74 | return 0; | 59 | return 0; |
75 | } | 60 | } |
76 | 61 | ||
62 | static pthread_mutex_t server_started_mtx = PTHREAD_MUTEX_INITIALIZER; | ||
63 | static pthread_cond_t server_started = PTHREAD_COND_INITIALIZER; | ||
64 | |||
77 | static void *server_thread(void *arg) | 65 | static void *server_thread(void *arg) |
78 | { | 66 | { |
79 | struct sockaddr_storage addr; | 67 | struct sockaddr_storage addr; |
@@ -82,16 +70,26 @@ static void *server_thread(void *arg) | |||
82 | int client_fd; | 70 | int client_fd; |
83 | int err = 0; | 71 | int err = 0; |
84 | 72 | ||
85 | if (listen(fd, 1) < 0) | 73 | err = listen(fd, 1); |
86 | error(1, errno, "Failed to listed on socket"); | 74 | |
75 | pthread_mutex_lock(&server_started_mtx); | ||
76 | pthread_cond_signal(&server_started); | ||
77 | pthread_mutex_unlock(&server_started_mtx); | ||
78 | |||
79 | if (CHECK_FAIL(err < 0)) { | ||
80 | perror("Failed to listed on socket"); | ||
81 | return NULL; | ||
82 | } | ||
87 | 83 | ||
88 | err += verify_sockopt(fd, CUSTOM_INHERIT1, "listen", 1); | 84 | err += verify_sockopt(fd, CUSTOM_INHERIT1, "listen", 1); |
89 | err += verify_sockopt(fd, CUSTOM_INHERIT2, "listen", 1); | 85 | err += verify_sockopt(fd, CUSTOM_INHERIT2, "listen", 1); |
90 | err += verify_sockopt(fd, CUSTOM_LISTENER, "listen", 1); | 86 | err += verify_sockopt(fd, CUSTOM_LISTENER, "listen", 1); |
91 | 87 | ||
92 | client_fd = accept(fd, (struct sockaddr *)&addr, &len); | 88 | client_fd = accept(fd, (struct sockaddr *)&addr, &len); |
93 | if (client_fd < 0) | 89 | if (CHECK_FAIL(client_fd < 0)) { |
94 | error(1, errno, "Failed to accept client"); | 90 | perror("Failed to accept client"); |
91 | return NULL; | ||
92 | } | ||
95 | 93 | ||
96 | err += verify_sockopt(client_fd, CUSTOM_INHERIT1, "accept", 1); | 94 | err += verify_sockopt(client_fd, CUSTOM_INHERIT1, "accept", 1); |
97 | err += verify_sockopt(client_fd, CUSTOM_INHERIT2, "accept", 1); | 95 | err += verify_sockopt(client_fd, CUSTOM_INHERIT2, "accept", 1); |
@@ -167,7 +165,7 @@ static int prog_attach(struct bpf_object *obj, int cgroup_fd, const char *title) | |||
167 | return 0; | 165 | return 0; |
168 | } | 166 | } |
169 | 167 | ||
170 | static int run_test(int cgroup_fd) | 168 | static void run_test(int cgroup_fd) |
171 | { | 169 | { |
172 | struct bpf_prog_load_attr attr = { | 170 | struct bpf_prog_load_attr attr = { |
173 | .file = "./sockopt_inherit.o", | 171 | .file = "./sockopt_inherit.o", |
@@ -180,40 +178,41 @@ static int run_test(int cgroup_fd) | |||
180 | int err; | 178 | int err; |
181 | 179 | ||
182 | err = bpf_prog_load_xattr(&attr, &obj, &ignored); | 180 | err = bpf_prog_load_xattr(&attr, &obj, &ignored); |
183 | if (err) { | 181 | if (CHECK_FAIL(err)) |
184 | log_err("Failed to load BPF object"); | 182 | return; |
185 | return -1; | ||
186 | } | ||
187 | 183 | ||
188 | err = prog_attach(obj, cgroup_fd, "cgroup/getsockopt"); | 184 | err = prog_attach(obj, cgroup_fd, "cgroup/getsockopt"); |
189 | if (err) | 185 | if (CHECK_FAIL(err)) |
190 | goto close_bpf_object; | 186 | goto close_bpf_object; |
191 | 187 | ||
192 | err = prog_attach(obj, cgroup_fd, "cgroup/setsockopt"); | 188 | err = prog_attach(obj, cgroup_fd, "cgroup/setsockopt"); |
193 | if (err) | 189 | if (CHECK_FAIL(err)) |
194 | goto close_bpf_object; | 190 | goto close_bpf_object; |
195 | 191 | ||
196 | server_fd = start_server(); | 192 | server_fd = start_server(); |
197 | if (server_fd < 0) { | 193 | if (CHECK_FAIL(server_fd < 0)) |
198 | err = -1; | 194 | goto close_bpf_object; |
195 | |||
196 | if (CHECK_FAIL(pthread_create(&tid, NULL, server_thread, | ||
197 | (void *)&server_fd))) | ||
199 | goto close_bpf_object; | 198 | goto close_bpf_object; |
200 | } | ||
201 | 199 | ||
202 | pthread_create(&tid, NULL, server_thread, (void *)&server_fd); | 200 | pthread_mutex_lock(&server_started_mtx); |
201 | pthread_cond_wait(&server_started, &server_started_mtx); | ||
202 | pthread_mutex_unlock(&server_started_mtx); | ||
203 | 203 | ||
204 | client_fd = connect_to_server(server_fd); | 204 | client_fd = connect_to_server(server_fd); |
205 | if (client_fd < 0) { | 205 | if (CHECK_FAIL(client_fd < 0)) |
206 | err = -1; | ||
207 | goto close_server_fd; | 206 | goto close_server_fd; |
208 | } | ||
209 | 207 | ||
210 | err += verify_sockopt(client_fd, CUSTOM_INHERIT1, "connect", 0); | 208 | CHECK_FAIL(verify_sockopt(client_fd, CUSTOM_INHERIT1, "connect", 0)); |
211 | err += verify_sockopt(client_fd, CUSTOM_INHERIT2, "connect", 0); | 209 | CHECK_FAIL(verify_sockopt(client_fd, CUSTOM_INHERIT2, "connect", 0)); |
212 | err += verify_sockopt(client_fd, CUSTOM_LISTENER, "connect", 0); | 210 | CHECK_FAIL(verify_sockopt(client_fd, CUSTOM_LISTENER, "connect", 0)); |
213 | 211 | ||
214 | pthread_join(tid, &server_err); | 212 | pthread_join(tid, &server_err); |
215 | 213 | ||
216 | err += (int)(long)server_err; | 214 | err = (int)(long)server_err; |
215 | CHECK_FAIL(err); | ||
217 | 216 | ||
218 | close(client_fd); | 217 | close(client_fd); |
219 | 218 | ||
@@ -221,33 +220,16 @@ close_server_fd: | |||
221 | close(server_fd); | 220 | close(server_fd); |
222 | close_bpf_object: | 221 | close_bpf_object: |
223 | bpf_object__close(obj); | 222 | bpf_object__close(obj); |
224 | return err; | ||
225 | } | 223 | } |
226 | 224 | ||
227 | int main(int args, char **argv) | 225 | void test_sockopt_inherit(void) |
228 | { | 226 | { |
229 | int cgroup_fd; | 227 | int cgroup_fd; |
230 | int err = EXIT_SUCCESS; | ||
231 | |||
232 | if (setup_cgroup_environment()) | ||
233 | return err; | ||
234 | |||
235 | cgroup_fd = create_and_get_cgroup(CG_PATH); | ||
236 | if (cgroup_fd < 0) | ||
237 | goto cleanup_cgroup_env; | ||
238 | |||
239 | if (join_cgroup(CG_PATH)) | ||
240 | goto cleanup_cgroup; | ||
241 | |||
242 | if (run_test(cgroup_fd)) | ||
243 | err = EXIT_FAILURE; | ||
244 | 228 | ||
245 | printf("test_sockopt_inherit: %s\n", | 229 | cgroup_fd = test__join_cgroup("/sockopt_inherit"); |
246 | err == EXIT_SUCCESS ? "PASSED" : "FAILED"); | 230 | if (CHECK_FAIL(cgroup_fd < 0)) |
231 | return; | ||
247 | 232 | ||
248 | cleanup_cgroup: | 233 | run_test(cgroup_fd); |
249 | close(cgroup_fd); | 234 | close(cgroup_fd); |
250 | cleanup_cgroup_env: | ||
251 | cleanup_cgroup_environment(); | ||
252 | return err; | ||
253 | } | 235 | } |