summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorStanislav Fomichev <sdf@google.com>2019-09-04 12:25:08 -0400
committerAlexei Starovoitov <ast@kernel.org>2019-09-06 12:59:05 -0400
commite3e02e1d9c24b0c3a36f9c854ae80e61fd62b2a9 (patch)
treedac2384f7034b7c5d93c14c39f67c3f8af3510aa /tools
parent3886bd7c9b01317a5721161f8314f6c25f4f6229 (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/.gitignore1
-rw-r--r--tools/testing/selftests/bpf/Makefile4
-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.*
39test_hashmap 39test_hashmap
40test_btf_dump 40test_btf_dump
41xdping 41xdping
42test_sockopt_inherit
43test_tcp_rtt 42test_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
34BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c))) 33BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c)))
35TEST_GEN_FILES = $(BPF_OBJ_FILES) 34TEST_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
62static pthread_mutex_t server_started_mtx = PTHREAD_MUTEX_INITIALIZER;
63static pthread_cond_t server_started = PTHREAD_COND_INITIALIZER;
64
77static void *server_thread(void *arg) 65static 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
170static int run_test(int cgroup_fd) 168static 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);
222close_bpf_object: 221close_bpf_object:
223 bpf_object__close(obj); 222 bpf_object__close(obj);
224 return err;
225} 223}
226 224
227int main(int args, char **argv) 225void 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
248cleanup_cgroup: 233 run_test(cgroup_fd);
249 close(cgroup_fd); 234 close(cgroup_fd);
250cleanup_cgroup_env:
251 cleanup_cgroup_environment();
252 return err;
253} 235}