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 'selftests-bpf-enfoce-so_reuseaddr-in-basic-test-servers'

Alexis Lothoré says:

====================
This small series is another follow-up to [1], in which I misunderstood
Martin's initial feedback (see [2]). I proposed to make tc-tunnel apply
SO_REUSEPORT once server is brought up. This series updates
start_server_addr to really apply Martin's proposal after his
clarification [3]

[1] https://lore.kernel.org/bpf/20251031-tc_tunnel_improv-v1-0-0ffe44d27eda@bootlin.com/
[2] https://lore.kernel.org/bpf/efa3540a-1f52-46ca-9f49-e631a5e3e48c@linux.dev/
[3] https://lore.kernel.org/bpf/4cbabdf1-af2c-490a-a41a-b40c1539c1cb@linux.dev/
====================

Link: https://patch.msgid.link/20251105-start-server-soreuseaddr-v1-0-1bbd9c1f8d65@bootlin.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

+21 -17
+7 -1
tools/testing/selftests/bpf/network_helpers.c
··· 97 97 int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t addrlen, 98 98 const struct network_helper_opts *opts) 99 99 { 100 - int fd; 100 + int on = 1, fd; 101 101 102 102 if (!opts) 103 103 opts = &default_opts; ··· 110 110 111 111 if (settimeo(fd, opts->timeout_ms)) 112 112 goto error_close; 113 + 114 + if (type == SOCK_STREAM && 115 + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) { 116 + log_err("Failed to enable SO_REUSEADDR"); 117 + goto error_close; 118 + } 113 119 114 120 if (opts->post_socket_cb && 115 121 opts->post_socket_cb(fd, opts->cb_opts)) {
+14 -16
tools/testing/selftests/bpf/prog_tests/test_tc_tunnel.c
··· 69 69 int client_egress_prog_fd; 70 70 int server_ingress_prog_fd; 71 71 char extra_decap_mod_args[TUNNEL_ARGS_MAX_LEN]; 72 - int *server_fd; 72 + int server_fd; 73 73 }; 74 74 75 75 struct connection { ··· 135 135 { 136 136 int family = cfg->ipproto == 6 ? AF_INET6 : AF_INET; 137 137 struct nstoken *nstoken; 138 + struct network_helper_opts opts = { 139 + .timeout_ms = TIMEOUT_MS 140 + }; 138 141 139 142 nstoken = open_netns(SERVER_NS); 140 143 if (!ASSERT_OK_PTR(nstoken, "open server ns")) 141 144 return -1; 142 145 143 - cfg->server_fd = start_reuseport_server(family, SOCK_STREAM, 144 - cfg->server_addr, TEST_PORT, 145 - TIMEOUT_MS, 1); 146 + cfg->server_fd = start_server_str(family, SOCK_STREAM, cfg->server_addr, 147 + TEST_PORT, &opts); 146 148 close_netns(nstoken); 147 - if (!ASSERT_OK_PTR(cfg->server_fd, "start server")) 149 + if (!ASSERT_OK_FD(cfg->server_fd, "start server")) 148 150 return -1; 149 151 150 152 return 0; 151 - } 152 - 153 - static void stop_server(struct subtest_cfg *cfg) 154 - { 155 - free_fds(cfg->server_fd, 1); 156 153 } 157 154 158 155 static int check_server_rx_data(struct subtest_cfg *cfg, ··· 185 188 return NULL; 186 189 } 187 190 188 - server_fd = accept(*cfg->server_fd, NULL, NULL); 191 + server_fd = accept(cfg->server_fd, NULL, NULL); 189 192 if (server_fd < 0) { 190 193 close(client_fd); 191 194 free(conn); ··· 381 384 382 385 static void run_test(struct subtest_cfg *cfg) 383 386 { 384 - struct nstoken *nstoken = open_netns(CLIENT_NS); 385 - 386 - if (!ASSERT_OK_PTR(nstoken, "open client ns")) 387 - return; 387 + struct nstoken *nstoken; 388 388 389 389 if (!ASSERT_OK(run_server(cfg), "run server")) 390 + return; 391 + 392 + nstoken = open_netns(CLIENT_NS); 393 + if (!ASSERT_OK_PTR(nstoken, "open client ns")) 390 394 goto fail; 391 395 392 396 /* Basic communication must work */ ··· 414 416 ASSERT_OK(send_and_test_data(cfg, true), "connect with encap and decap progs"); 415 417 416 418 fail: 417 - stop_server(cfg); 418 419 close_netns(nstoken); 420 + close(cfg->server_fd); 419 421 } 420 422 421 423 static int setup(void)