diff options
| -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 | } |
