On 10/27/25 7:51 AM, Alexis Lothoré (eBPF Foundation) wrote:
+static int run_server(struct subtest_cfg *cfg)
+{
+       struct nstoken *nstoken = open_netns(SERVER_NS);

It is unlikely but still better to check for open_netns failure. Just in case that the network changes/traffic is accidentally done in the original netns. There are a few netns switching in the test. Please followup.

+       int family = cfg->ipproto == 6 ? AF_INET6 : AF_INET;
+
+       cfg->server_fd = start_reuseport_server(family, SOCK_STREAM,
+                                               cfg->server_addr, TEST_PORT,
+                                               TIMEOUT_MS, 1);

Why reuseport is needed? Does it have issue in bind() to the same ip/port in the later sub-test?
+       close_netns(nstoken);
+       if (!ASSERT_NEQ(cfg->server_fd, NULL, "start server"))

I changed the check to ASSERT_OK_PTR. Also two other similar ASSERT_[N]EQ(..., NULL, ...) usages.
+               return -1;
+
+       return 0;
+}
+
+static void stop_server(struct subtest_cfg *cfg)
+{
+       close(*cfg->server_fd);

NULL check on cfg->server_fd is needed during the error path of run_test(). cfg->server_fd is leaked also. I changed it to free_fds(cfg->server_fd, 1) instead.

+       cfg->server_fd = NULL;

I don't think cfg will be reused, so I skip this NULL assignment.

+}
+
+static int check_server_rx_data(struct subtest_cfg *cfg,
+                               struct connection *conn, int len)
+{
+       int err;
+
+       memset(rx_buffer, 0, BUFFER_LEN);
+       err = recv(conn->server_fd, rx_buffer, len, 0);
+       if (!ASSERT_EQ(err, len, "check rx data len"))
+               return 1;
+       if (!ASSERT_MEMEQ(tx_buffer, rx_buffer, len, "check received data"))
+               return 1;
+       return 0;
+}
+
+static struct connection *connect_client_to_server(struct subtest_cfg *cfg)
+{
+       struct network_helper_opts opts = {.timeout_ms = 500};
+       int family = cfg->ipproto == 6 ? AF_INET6 : AF_INET;
+       struct connection *conn = NULL;
+       int client_fd, server_fd;
+
+       conn = malloc(sizeof(struct connection));
+       if (!conn)
+               return conn;
+
+       client_fd = connect_to_addr_str(family, SOCK_STREAM, cfg->server_addr,
+                                       TEST_PORT, &opts);
+
+       if (client_fd < 0) {
+               free(conn);
+               return NULL;
+       }
+
+       server_fd = accept(*cfg->server_fd, NULL, NULL);
+       if (server_fd < 0) {

Fixed the client_fd leak.
Applied. Thanks.


Reply via email to