Skip to content

Commit 4225dfa

Browse files
0x7f454c46Paolo Abeni
authored andcommitted
selftests/tcp_ao: Make RST tests less flaky
Currently, "active reset" cases are flaky, because select() is called for 3 sockets, while only 2 are expected to receive RST. The idea of the third socket was to get into request_sock_queue, but the test mistakenly attempted to connect() after the listener socket was shut down. Repair this test, it's important to check the different kernel code-paths for signing RST TCP-AO segments. Fixes: c6df7b2 ("selftests/net: Add TCP-AO RST test") Reported-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Dmitry Safonov <0x7f454c46@gmail.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 75ce950 commit 4225dfa

File tree

1 file changed

+13
-10
lines changed
  • tools/testing/selftests/net/tcp_ao

1 file changed

+13
-10
lines changed

tools/testing/selftests/net/tcp_ao/rst.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,6 @@ static int test_wait_fds(int sk[], size_t nr, bool is_writable[],
256256

257257
static void test_client_active_rst(unsigned int port)
258258
{
259-
/* one in queue, another accept()ed */
260-
unsigned int wait_for = backlog + 2;
261259
int i, sk[3], err;
262260
bool is_writable[ARRAY_SIZE(sk)] = {false};
263261
unsigned int last = ARRAY_SIZE(sk) - 1;
@@ -275,30 +273,35 @@ static void test_client_active_rst(unsigned int port)
275273
for (i = 0; i < last; i++) {
276274
err = _test_connect_socket(sk[i], this_ip_dest, port,
277275
(i == 0) ? TEST_TIMEOUT_SEC : -1);
278-
279276
if (err < 0)
280277
test_error("failed to connect()");
281278
}
282279

283-
synchronize_threads(); /* 2: connection accept()ed, another queued */
284-
err = test_wait_fds(sk, last, is_writable, wait_for, TEST_TIMEOUT_SEC);
280+
synchronize_threads(); /* 2: two connections: one accept()ed, another queued */
281+
err = test_wait_fds(sk, last, is_writable, last, TEST_TIMEOUT_SEC);
285282
if (err < 0)
286283
test_error("test_wait_fds(): %d", err);
287284

285+
/* async connect() with third sk to get into request_sock_queue */
286+
err = _test_connect_socket(sk[last], this_ip_dest, port, -1);
287+
if (err < 0)
288+
test_error("failed to connect()");
289+
288290
synchronize_threads(); /* 3: close listen socket */
289291
if (test_client_verify(sk[0], packet_sz, quota / packet_sz, TEST_TIMEOUT_SEC))
290292
test_fail("Failed to send data on connected socket");
291293
else
292294
test_ok("Verified established tcp connection");
293295

294296
synchronize_threads(); /* 4: finishing up */
295-
err = _test_connect_socket(sk[last], this_ip_dest, port, -1);
296-
if (err < 0)
297-
test_error("failed to connect()");
298297

299298
synchronize_threads(); /* 5: closed active sk */
300-
err = test_wait_fds(sk, ARRAY_SIZE(sk), NULL,
301-
wait_for, TEST_TIMEOUT_SEC);
299+
/*
300+
* Wait for 2 connections: one accepted, another in the accept queue,
301+
* the one in request_sock_queue won't get fully established, so
302+
* doesn't receive an active RST, see inet_csk_listen_stop().
303+
*/
304+
err = test_wait_fds(sk, last, NULL, last, TEST_TIMEOUT_SEC);
302305
if (err < 0)
303306
test_error("select(): %d", err);
304307

0 commit comments

Comments
 (0)