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

Merge branch 'use-network-helpers-part-7'

Geliang Tang says:

====================
use network helpers, part 7

From: Geliang Tang <tanggeliang@kylinos.cn>

v6:
- update ASSERT strings in patch 4 as Eduard suggested. (thanks)

v5:
- update patch 1, add getsockopt(SO_PROTOCOL) in connect_to_fd() to
fix errors reported by CI.

v4:
- fix errors reported by CI.

v3:
- rename start_client to client_socket
- Use connect_to_addr in connect_to_fd_opt

v2:
- update patch 2, extract a new helper start_client.
- drop patch 3, keep must_fail in network_helper_opts.

Drop type and noconnect from network_helper_opts. And use start_server_str
in mptcp and test_tcp_check_syncookie_user.

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

Link: https://lore.kernel.org/r/cover.1718932493.git.tanggeliang@kylinos.cn
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

+64 -98
+48 -52
tools/testing/selftests/bpf/network_helpers.c
··· 249 249 return -1; 250 250 } 251 251 252 + int client_socket(int family, int type, 253 + const struct network_helper_opts *opts) 254 + { 255 + int fd; 256 + 257 + if (!opts) 258 + opts = &default_opts; 259 + 260 + fd = socket(family, type, opts->proto); 261 + if (fd < 0) { 262 + log_err("Failed to create client socket"); 263 + return -1; 264 + } 265 + 266 + if (settimeo(fd, opts->timeout_ms)) 267 + goto error_close; 268 + 269 + if (opts->post_socket_cb && 270 + opts->post_socket_cb(fd, opts->cb_opts)) 271 + goto error_close; 272 + 273 + return fd; 274 + 275 + error_close: 276 + save_errno_close(fd); 277 + return -1; 278 + } 279 + 252 280 static int connect_fd_to_addr(int fd, 253 281 const struct sockaddr_storage *addr, 254 282 socklen_t addrlen, const bool must_fail) ··· 312 284 if (!opts) 313 285 opts = &default_opts; 314 286 315 - fd = socket(addr->ss_family, type, opts->proto); 287 + fd = client_socket(addr->ss_family, type, opts); 316 288 if (fd < 0) { 317 289 log_err("Failed to create client socket"); 318 290 return -1; 319 291 } 320 - 321 - if (settimeo(fd, opts->timeout_ms)) 322 - goto error_close; 323 292 324 293 if (connect_fd_to_addr(fd, addr, addrlen, opts->must_fail)) 325 294 goto error_close; ··· 328 303 return -1; 329 304 } 330 305 331 - int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts) 306 + int connect_to_fd_opts(int server_fd, int type, const struct network_helper_opts *opts) 332 307 { 333 308 struct sockaddr_storage addr; 334 - struct sockaddr_in *addr_in; 335 - socklen_t addrlen, optlen; 336 - int fd, type, protocol; 309 + socklen_t addrlen; 337 310 338 311 if (!opts) 339 312 opts = &default_opts; 340 - 341 - optlen = sizeof(type); 342 - 343 - if (opts->type) { 344 - type = opts->type; 345 - } else { 346 - if (getsockopt(server_fd, SOL_SOCKET, SO_TYPE, &type, &optlen)) { 347 - log_err("getsockopt(SOL_TYPE)"); 348 - return -1; 349 - } 350 - } 351 - 352 - if (opts->proto) { 353 - protocol = opts->proto; 354 - } else { 355 - if (getsockopt(server_fd, SOL_SOCKET, SO_PROTOCOL, &protocol, &optlen)) { 356 - log_err("getsockopt(SOL_PROTOCOL)"); 357 - return -1; 358 - } 359 - } 360 313 361 314 addrlen = sizeof(addr); 362 315 if (getsockname(server_fd, (struct sockaddr *)&addr, &addrlen)) { ··· 342 339 return -1; 343 340 } 344 341 345 - addr_in = (struct sockaddr_in *)&addr; 346 - fd = socket(addr_in->sin_family, type, protocol); 347 - if (fd < 0) { 348 - log_err("Failed to create client socket"); 349 - return -1; 350 - } 351 - 352 - if (settimeo(fd, opts->timeout_ms)) 353 - goto error_close; 354 - 355 - if (opts->post_socket_cb && 356 - opts->post_socket_cb(fd, opts->cb_opts)) 357 - goto error_close; 358 - 359 - if (!opts->noconnect) 360 - if (connect_fd_to_addr(fd, &addr, addrlen, opts->must_fail)) 361 - goto error_close; 362 - 363 - return fd; 364 - 365 - error_close: 366 - save_errno_close(fd); 367 - return -1; 342 + return connect_to_addr(type, &addr, addrlen, opts); 368 343 } 369 344 370 345 int connect_to_fd(int server_fd, int timeout_ms) ··· 350 369 struct network_helper_opts opts = { 351 370 .timeout_ms = timeout_ms, 352 371 }; 372 + int type, protocol; 373 + socklen_t optlen; 353 374 354 - return connect_to_fd_opts(server_fd, &opts); 375 + optlen = sizeof(type); 376 + if (getsockopt(server_fd, SOL_SOCKET, SO_TYPE, &type, &optlen)) { 377 + log_err("getsockopt(SOL_TYPE)"); 378 + return -1; 379 + } 380 + 381 + optlen = sizeof(protocol); 382 + if (getsockopt(server_fd, SOL_SOCKET, SO_PROTOCOL, &protocol, &optlen)) { 383 + log_err("getsockopt(SOL_PROTOCOL)"); 384 + return -1; 385 + } 386 + opts.proto = protocol; 387 + 388 + return connect_to_fd_opts(server_fd, type, &opts); 355 389 } 356 390 357 391 int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms)
+3 -3
tools/testing/selftests/bpf/network_helpers.h
··· 24 24 struct network_helper_opts { 25 25 int timeout_ms; 26 26 bool must_fail; 27 - bool noconnect; 28 - int type; 29 27 int proto; 30 28 int (*post_socket_cb)(int fd, void *opts); 31 29 void *cb_opts; ··· 56 58 int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t len, 57 59 const struct network_helper_opts *opts); 58 60 void free_fds(int *fds, unsigned int nr_close_fds); 61 + int client_socket(int family, int type, 62 + const struct network_helper_opts *opts); 59 63 int connect_to_addr(int type, const struct sockaddr_storage *addr, socklen_t len, 60 64 const struct network_helper_opts *opts); 61 65 int connect_to_fd(int server_fd, int timeout_ms); 62 - int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts); 66 + int connect_to_fd_opts(int server_fd, int type, const struct network_helper_opts *opts); 63 67 int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms); 64 68 int fastopen_connect(int server_fd, const char *data, unsigned int data_len, 65 69 int timeout_ms);
+1 -1
tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
··· 49 49 goto err; 50 50 51 51 /* connect to server */ 52 - *cli_fd = connect_to_fd_opts(*srv_fd, cli_opts); 52 + *cli_fd = connect_to_fd_opts(*srv_fd, SOCK_STREAM, cli_opts); 53 53 if (!ASSERT_NEQ(*cli_fd, -1, "connect_to_fd_opts")) 54 54 goto err; 55 55
+2 -2
tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c
··· 32 32 goto out; 33 33 } 34 34 35 - fd = connect_to_fd_opts(server_fd, &opts); 35 + fd = connect_to_fd_opts(server_fd, SOCK_STREAM, &opts); 36 36 if (fd < 0) 37 37 err = -1; 38 38 else ··· 52 52 server_fd = start_server(AF_INET, SOCK_STREAM, NULL, port, 0); 53 53 if (!ASSERT_GE(server_fd, 0, "server_fd")) 54 54 return; 55 - client_fd = connect_to_fd_opts(server_fd, &opts); 55 + client_fd = connect_to_fd_opts(server_fd, SOCK_STREAM, &opts); 56 56 if (!ASSERT_GE(client_fd, 0, "client_fd")) { 57 57 close(server_fd); 58 58 return;
+6 -8
tools/testing/selftests/bpf/prog_tests/ip_check_defrag.c
··· 158 158 159 159 void test_bpf_ip_check_defrag_ok(bool ipv6) 160 160 { 161 + int family = ipv6 ? AF_INET6 : AF_INET; 161 162 struct network_helper_opts rx_opts = { 162 163 .timeout_ms = 1000, 163 - .noconnect = true, 164 164 }; 165 165 struct network_helper_opts tx_ops = { 166 166 .timeout_ms = 1000, 167 - .type = SOCK_RAW, 168 167 .proto = IPPROTO_RAW, 169 - .noconnect = true, 170 168 }; 171 169 struct sockaddr_storage caddr; 172 170 struct ip_check_defrag *skel; ··· 190 192 nstoken = open_netns(NS1); 191 193 if (!ASSERT_OK_PTR(nstoken, "setns ns1")) 192 194 goto out; 193 - srv_fd = start_server(ipv6 ? AF_INET6 : AF_INET, SOCK_DGRAM, NULL, SERVER_PORT, 0); 195 + srv_fd = start_server(family, SOCK_DGRAM, NULL, SERVER_PORT, 0); 194 196 close_netns(nstoken); 195 197 if (!ASSERT_GE(srv_fd, 0, "start_server")) 196 198 goto out; ··· 199 201 nstoken = open_netns(NS0); 200 202 if (!ASSERT_OK_PTR(nstoken, "setns ns0")) 201 203 goto out; 202 - client_tx_fd = connect_to_fd_opts(srv_fd, &tx_ops); 204 + client_tx_fd = client_socket(family, SOCK_RAW, &tx_ops); 203 205 close_netns(nstoken); 204 - if (!ASSERT_GE(client_tx_fd, 0, "connect_to_fd_opts")) 206 + if (!ASSERT_GE(client_tx_fd, 0, "client_socket")) 205 207 goto out; 206 208 207 209 /* Open rx socket in ns0 */ 208 210 nstoken = open_netns(NS0); 209 211 if (!ASSERT_OK_PTR(nstoken, "setns ns0")) 210 212 goto out; 211 - client_rx_fd = connect_to_fd_opts(srv_fd, &rx_opts); 213 + client_rx_fd = client_socket(family, SOCK_DGRAM, &rx_opts); 212 214 close_netns(nstoken); 213 - if (!ASSERT_GE(client_rx_fd, 0, "connect_to_fd_opts")) 215 + if (!ASSERT_GE(client_rx_fd, 0, "client_socket")) 214 216 goto out; 215 217 216 218 /* Bind rx socket to a premeditated port */
+1 -6
tools/testing/selftests/bpf/prog_tests/mptcp.c
··· 89 89 .timeout_ms = timeout_ms, 90 90 .proto = IPPROTO_MPTCP, 91 91 }; 92 - struct sockaddr_storage addr; 93 - socklen_t addrlen; 94 92 95 - if (make_sockaddr(family, addr_str, port, &addr, &addrlen)) 96 - return -1; 97 - 98 - return start_server_addr(SOCK_STREAM, &addr, addrlen, &opts); 93 + return start_server_str(family, SOCK_STREAM, addr_str, port, &opts); 99 94 } 100 95 101 96 static int verify_tsk(int map_fd, int client_fd)
+3 -26
tools/testing/selftests/bpf/test_tcp_check_syncookie_user.c
··· 156 156 int main(int argc, char **argv) 157 157 { 158 158 struct network_helper_opts opts = { 0 }; 159 - struct sockaddr_in addr4; 160 - struct sockaddr_in6 addr6; 161 - struct sockaddr_in addr4dual; 162 - struct sockaddr_in6 addr6dual; 163 159 int server = -1; 164 160 int server_v6 = -1; 165 161 int server_dual = -1; ··· 177 181 goto err; 178 182 } 179 183 180 - memset(&addr4, 0, sizeof(addr4)); 181 - addr4.sin_family = AF_INET; 182 - addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 183 - addr4.sin_port = 0; 184 - memcpy(&addr4dual, &addr4, sizeof(addr4dual)); 185 - 186 - memset(&addr6, 0, sizeof(addr6)); 187 - addr6.sin6_family = AF_INET6; 188 - addr6.sin6_addr = in6addr_loopback; 189 - addr6.sin6_port = 0; 190 - 191 - memset(&addr6dual, 0, sizeof(addr6dual)); 192 - addr6dual.sin6_family = AF_INET6; 193 - addr6dual.sin6_addr = in6addr_any; 194 - addr6dual.sin6_port = 0; 195 - 196 - server = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr4, 197 - sizeof(addr4), NULL); 184 + server = start_server_str(AF_INET, SOCK_STREAM, "127.0.0.1", 0, NULL); 198 185 if (server == -1) 199 186 goto err; 200 187 201 188 opts.post_socket_cb = v6only_true; 202 - server_v6 = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr6, 203 - sizeof(addr6), &opts); 189 + server_v6 = start_server_str(AF_INET6, SOCK_STREAM, "::1", 0, &opts); 204 190 if (server_v6 == -1) 205 191 goto err; 206 192 207 193 opts.post_socket_cb = v6only_false; 208 - server_dual = start_server_addr(SOCK_STREAM, (struct sockaddr_storage *)&addr6dual, 209 - sizeof(addr6dual), &opts); 194 + server_dual = start_server_str(AF_INET6, SOCK_STREAM, "::0", 0, &opts); 210 195 if (server_dual == -1) 211 196 goto err; 212 197