Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'use network helpers, part 4'

Geliang Tang says:

====================
From: Geliang Tang <tanggeliang@kylinos.cn>

This patchset adds post_socket_cb pointer into
struct network_helper_opts to make start_server_addr() helper
more flexible. With these modifications, many duplicate codes
can be dropped.

Patches 1-3 address Martin's comments in the previous series.
====================

Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

+59 -150
+1
tools/testing/selftests/bpf/Makefile
··· 310 310 $(OUTPUT)/test_maps: $(TESTING_HELPERS) 311 311 $(OUTPUT)/test_verifier: $(TESTING_HELPERS) $(CAP_HELPERS) $(UNPRIV_HELPERS) 312 312 $(OUTPUT)/xsk.o: $(BPFOBJ) 313 + $(OUTPUT)/test_tcp_check_syncookie_user: $(NETWORK_HELPERS) 313 314 314 315 BPFTOOL ?= $(DEFAULT_BPFTOOL) 315 316 $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
+15 -9
tools/testing/selftests/bpf/network_helpers.c
··· 81 81 #define save_errno_close(fd) ({ int __save = errno; close(fd); errno = __save; }) 82 82 83 83 static int __start_server(int type, const struct sockaddr *addr, socklen_t addrlen, 84 - bool reuseport, const struct network_helper_opts *opts) 84 + const struct network_helper_opts *opts) 85 85 { 86 - int on = 1; 87 86 int fd; 88 87 89 88 fd = socket(addr->sa_family, type, opts->proto); ··· 94 95 if (settimeo(fd, opts->timeout_ms)) 95 96 goto error_close; 96 97 97 - if (reuseport && 98 - setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on))) { 99 - log_err("Failed to set SO_REUSEPORT"); 98 + if (opts->post_socket_cb && opts->post_socket_cb(fd, NULL)) { 99 + log_err("Failed to call post_socket_cb"); 100 100 goto error_close; 101 101 } 102 102 ··· 130 132 if (make_sockaddr(family, addr_str, port, &addr, &addrlen)) 131 133 return -1; 132 134 133 - return __start_server(type, (struct sockaddr *)&addr, addrlen, false, &opts); 135 + return __start_server(type, (struct sockaddr *)&addr, addrlen, &opts); 136 + } 137 + 138 + static int reuseport_cb(int fd, const struct post_socket_opts *opts) 139 + { 140 + int on = 1; 141 + 142 + return setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)); 134 143 } 135 144 136 145 int *start_reuseport_server(int family, int type, const char *addr_str, ··· 145 140 { 146 141 struct network_helper_opts opts = { 147 142 .timeout_ms = timeout_ms, 143 + .post_socket_cb = reuseport_cb, 148 144 }; 149 145 struct sockaddr_storage addr; 150 146 unsigned int nr_fds = 0; ··· 162 156 if (!fds) 163 157 return NULL; 164 158 165 - fds[0] = __start_server(type, (struct sockaddr *)&addr, addrlen, true, &opts); 159 + fds[0] = __start_server(type, (struct sockaddr *)&addr, addrlen, &opts); 166 160 if (fds[0] == -1) 167 161 goto close_fds; 168 162 nr_fds = 1; ··· 171 165 goto close_fds; 172 166 173 167 for (; nr_fds < nr_listens; nr_fds++) { 174 - fds[nr_fds] = __start_server(type, (struct sockaddr *)&addr, addrlen, true, &opts); 168 + fds[nr_fds] = __start_server(type, (struct sockaddr *)&addr, addrlen, &opts); 175 169 if (fds[nr_fds] == -1) 176 170 goto close_fds; 177 171 } ··· 189 183 if (!opts) 190 184 opts = &default_opts; 191 185 192 - return __start_server(type, (struct sockaddr *)addr, len, 0, opts); 186 + return __start_server(type, (struct sockaddr *)addr, len, opts); 193 187 } 194 188 195 189 void free_fds(int *fds, unsigned int nr_close_fds)
+3
tools/testing/selftests/bpf/network_helpers.h
··· 21 21 #define VIP_NUM 5 22 22 #define MAGIC_BYTES 123 23 23 24 + struct post_socket_opts {}; 25 + 24 26 struct network_helper_opts { 25 27 const char *cc; 26 28 int timeout_ms; ··· 30 28 bool noconnect; 31 29 int type; 32 30 int proto; 31 + int (*post_socket_cb)(int fd, const struct post_socket_opts *opts); 33 32 }; 34 33 35 34 /* ipv4 test vector */
+13 -51
tools/testing/selftests/bpf/prog_tests/sockopt_inherit.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 #include <test_progs.h> 3 3 #include "cgroup_helpers.h" 4 + #include "network_helpers.h" 4 5 5 6 #include "sockopt_inherit.skel.h" 6 7 ··· 9 8 #define CUSTOM_INHERIT1 0 10 9 #define CUSTOM_INHERIT2 1 11 10 #define CUSTOM_LISTENER 2 12 - 13 - static int connect_to_server(int server_fd) 14 - { 15 - struct sockaddr_storage addr; 16 - socklen_t len = sizeof(addr); 17 - int fd; 18 - 19 - fd = socket(AF_INET, SOCK_STREAM, 0); 20 - if (fd < 0) { 21 - log_err("Failed to create client socket"); 22 - return -1; 23 - } 24 - 25 - if (getsockname(server_fd, (struct sockaddr *)&addr, &len)) { 26 - log_err("Failed to get server addr"); 27 - goto out; 28 - } 29 - 30 - if (connect(fd, (const struct sockaddr *)&addr, len) < 0) { 31 - log_err("Fail to connect to server"); 32 - goto out; 33 - } 34 - 35 - return fd; 36 - 37 - out: 38 - close(fd); 39 - return -1; 40 - } 41 11 42 12 static int verify_sockopt(int fd, int optname, const char *msg, char expected) 43 13 { ··· 70 98 return (void *)(long)err; 71 99 } 72 100 73 - static int start_server(void) 101 + static int custom_cb(int fd, const struct post_socket_opts *opts) 74 102 { 75 - struct sockaddr_in addr = { 76 - .sin_family = AF_INET, 77 - .sin_addr.s_addr = htonl(INADDR_LOOPBACK), 78 - }; 79 103 char buf; 80 104 int err; 81 - int fd; 82 105 int i; 83 - 84 - fd = socket(AF_INET, SOCK_STREAM, 0); 85 - if (fd < 0) { 86 - log_err("Failed to create server socket"); 87 - return -1; 88 - } 89 106 90 107 for (i = CUSTOM_INHERIT1; i <= CUSTOM_LISTENER; i++) { 91 108 buf = 0x01; 92 109 err = setsockopt(fd, SOL_CUSTOM, i, &buf, 1); 93 110 if (err) { 94 111 log_err("Failed to call setsockopt(%d)", i); 95 - close(fd); 96 112 return -1; 97 113 } 98 114 } 99 115 100 - if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) < 0) { 101 - log_err("Failed to bind socket"); 102 - close(fd); 103 - return -1; 104 - } 105 - 106 - return fd; 116 + return 0; 107 117 } 108 118 109 119 static void run_test(int cgroup_fd) 110 120 { 111 121 struct bpf_link *link_getsockopt = NULL; 112 122 struct bpf_link *link_setsockopt = NULL; 123 + struct network_helper_opts opts = { 124 + .post_socket_cb = custom_cb, 125 + }; 113 126 int server_fd = -1, client_fd; 127 + struct sockaddr_in addr = { 128 + .sin_family = AF_INET, 129 + .sin_addr.s_addr = htonl(INADDR_LOOPBACK), 130 + }; 114 131 struct sockopt_inherit *obj; 115 132 void *server_err; 116 133 pthread_t tid; ··· 121 160 if (!ASSERT_OK_PTR(link_setsockopt, "cg-attach-setsockopt")) 122 161 goto close_bpf_object; 123 162 124 - server_fd = start_server(); 163 + server_fd = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr, 164 + sizeof(addr), &opts); 125 165 if (!ASSERT_GE(server_fd, 0, "start_server")) 126 166 goto close_bpf_object; 127 167 ··· 135 173 pthread_cond_wait(&server_started, &server_started_mtx); 136 174 pthread_mutex_unlock(&server_started_mtx); 137 175 138 - client_fd = connect_to_server(server_fd); 176 + client_fd = connect_to_fd(server_fd, 0); 139 177 if (!ASSERT_GE(client_fd, 0, "connect_to_server")) 140 178 goto close_server_fd; 141 179
+27 -90
tools/testing/selftests/bpf/test_tcp_check_syncookie_user.c
··· 16 16 #include <bpf/libbpf.h> 17 17 18 18 #include "cgroup_helpers.h" 19 - 20 - static int start_server(const struct sockaddr *addr, socklen_t len, bool dual) 21 - { 22 - int mode = !dual; 23 - int fd; 24 - 25 - fd = socket(addr->sa_family, SOCK_STREAM, 0); 26 - if (fd == -1) { 27 - log_err("Failed to create server socket"); 28 - goto out; 29 - } 30 - 31 - if (addr->sa_family == AF_INET6) { 32 - if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&mode, 33 - sizeof(mode)) == -1) { 34 - log_err("Failed to set the dual-stack mode"); 35 - goto close_out; 36 - } 37 - } 38 - 39 - if (bind(fd, addr, len) == -1) { 40 - log_err("Failed to bind server socket"); 41 - goto close_out; 42 - } 43 - 44 - if (listen(fd, 128) == -1) { 45 - log_err("Failed to listen on server socket"); 46 - goto close_out; 47 - } 48 - 49 - goto out; 50 - 51 - close_out: 52 - close(fd); 53 - fd = -1; 54 - out: 55 - return fd; 56 - } 57 - 58 - static int connect_to_server(const struct sockaddr *addr, socklen_t len) 59 - { 60 - int fd = -1; 61 - 62 - fd = socket(addr->sa_family, SOCK_STREAM, 0); 63 - if (fd == -1) { 64 - log_err("Failed to create client socket"); 65 - goto out; 66 - } 67 - 68 - if (connect(fd, (const struct sockaddr *)addr, len) == -1) { 69 - log_err("Fail to connect to server"); 70 - goto close_out; 71 - } 72 - 73 - goto out; 74 - 75 - close_out: 76 - close(fd); 77 - fd = -1; 78 - out: 79 - return fd; 80 - } 19 + #include "network_helpers.h" 81 20 82 21 static int get_map_fd_by_prog_id(int prog_id, bool *xdp) 83 22 { ··· 56 117 return map_fd; 57 118 } 58 119 59 - static int run_test(int server_fd, int results_fd, bool xdp, 60 - const struct sockaddr *addr, socklen_t len) 120 + static int run_test(int server_fd, int results_fd, bool xdp) 61 121 { 62 122 int client = -1, srv_client = -1; 63 123 int ret = 0; ··· 82 144 goto err; 83 145 } 84 146 85 - client = connect_to_server(addr, len); 147 + client = connect_to_fd(server_fd, 0); 86 148 if (client == -1) 87 149 goto err; 88 150 ··· 139 201 return ret; 140 202 } 141 203 142 - static bool get_port(int server_fd, in_port_t *port) 204 + static int v6only_true(int fd, const struct post_socket_opts *opts) 143 205 { 144 - struct sockaddr_in addr; 145 - socklen_t len = sizeof(addr); 206 + int mode = true; 146 207 147 - if (getsockname(server_fd, (struct sockaddr *)&addr, &len)) { 148 - log_err("Failed to get server addr"); 149 - return false; 150 - } 208 + return setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &mode, sizeof(mode)); 209 + } 151 210 152 - /* sin_port and sin6_port are located at the same offset. */ 153 - *port = addr.sin_port; 154 - return true; 211 + static int v6only_false(int fd, const struct post_socket_opts *opts) 212 + { 213 + int mode = false; 214 + 215 + return setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &mode, sizeof(mode)); 155 216 } 156 217 157 218 int main(int argc, char **argv) 158 219 { 220 + struct network_helper_opts opts = { 0 }; 159 221 struct sockaddr_in addr4; 160 222 struct sockaddr_in6 addr6; 161 223 struct sockaddr_in addr4dual; ··· 197 259 addr6dual.sin6_addr = in6addr_any; 198 260 addr6dual.sin6_port = 0; 199 261 200 - server = start_server((const struct sockaddr *)&addr4, sizeof(addr4), 201 - false); 202 - if (server == -1 || !get_port(server, &addr4.sin_port)) 262 + server = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr4, 263 + sizeof(addr4), NULL); 264 + if (server == -1) 203 265 goto err; 204 266 205 - server_v6 = start_server((const struct sockaddr *)&addr6, 206 - sizeof(addr6), false); 207 - if (server_v6 == -1 || !get_port(server_v6, &addr6.sin6_port)) 267 + opts.post_socket_cb = v6only_true; 268 + server_v6 = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr6, 269 + sizeof(addr6), &opts); 270 + if (server_v6 == -1) 208 271 goto err; 209 272 210 - server_dual = start_server((const struct sockaddr *)&addr6dual, 211 - sizeof(addr6dual), true); 212 - if (server_dual == -1 || !get_port(server_dual, &addr4dual.sin_port)) 273 + opts.post_socket_cb = v6only_false; 274 + server_dual = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr6dual, 275 + sizeof(addr6dual), &opts); 276 + if (server_dual == -1) 213 277 goto err; 214 278 215 - if (run_test(server, results, xdp, 216 - (const struct sockaddr *)&addr4, sizeof(addr4))) 279 + if (run_test(server, results, xdp)) 217 280 goto err; 218 281 219 - if (run_test(server_v6, results, xdp, 220 - (const struct sockaddr *)&addr6, sizeof(addr6))) 282 + if (run_test(server_v6, results, xdp)) 221 283 goto err; 222 284 223 - if (run_test(server_dual, results, xdp, 224 - (const struct sockaddr *)&addr4dual, sizeof(addr4dual))) 285 + if (run_test(server_dual, results, xdp)) 225 286 goto err; 226 287 227 288 printf("ok\n");