Skip to content

Commit dcbd1ed

Browse files
rluboscfriedt
authored andcommitted
tests: net: socket: tcp: Add test for keepalive connection upkeep
Add test verifying that if keep-alive messages are exchanged, the connection remains alive. Signed-off-by: Robert Lubos <[email protected]>
1 parent d93c5d6 commit dcbd1ed

File tree

1 file changed

+55
-18
lines changed
  • tests/net/socket/tcp/src

1 file changed

+55
-18
lines changed

tests/net/socket/tcp/src/main.c

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2349,7 +2349,7 @@ ZTEST(net_socket_tcp, test_connect_and_wait_for_v4_poll)
23492349
zassert_equal(ret, 0, "close failed, %d", errno);
23502350
}
23512351

2352-
ZTEST(net_socket_tcp, test_so_keepalive)
2352+
ZTEST(net_socket_tcp, test_so_keepalive_opt)
23532353
{
23542354
struct sockaddr_in bind_addr4;
23552355
int sock, ret;
@@ -2430,55 +2430,92 @@ ZTEST(net_socket_tcp, test_so_keepalive)
24302430
test_context_cleanup();
24312431
}
24322432

2433-
ZTEST(net_socket_tcp, test_keepalive_timeout)
2433+
static void test_prepare_keepalive_socks(int *c_sock, int *s_sock, int *new_sock)
24342434
{
24352435
struct sockaddr_in c_saddr, s_saddr;
2436-
int c_sock, s_sock, new_sock;
2437-
uint8_t rx_buf;
24382436
int optval;
24392437
int ret;
24402438

2441-
prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr);
2442-
prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr);
2439+
prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, c_sock, &c_saddr);
2440+
prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, s_sock, &s_saddr);
24432441

24442442
/* Enable keep-alive on both ends and set timeouts/retries to minimum */
24452443
optval = 1;
2446-
ret = zsock_setsockopt(c_sock, SOL_SOCKET, SO_KEEPALIVE,
2444+
ret = zsock_setsockopt(*c_sock, SOL_SOCKET, SO_KEEPALIVE,
24472445
&optval, sizeof(optval));
24482446
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2449-
ret = zsock_setsockopt(s_sock, SOL_SOCKET, SO_KEEPALIVE,
2447+
ret = zsock_setsockopt(*s_sock, SOL_SOCKET, SO_KEEPALIVE,
24502448
&optval, sizeof(optval));
24512449
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
24522450

24532451
optval = 1;
2454-
ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPIDLE,
2452+
ret = zsock_setsockopt(*c_sock, IPPROTO_TCP, TCP_KEEPIDLE,
24552453
&optval, sizeof(optval));
24562454
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2457-
ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPIDLE,
2455+
ret = zsock_setsockopt(*s_sock, IPPROTO_TCP, TCP_KEEPIDLE,
24582456
&optval, sizeof(optval));
24592457
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
24602458

24612459
optval = 1;
2462-
ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPINTVL,
2460+
ret = zsock_setsockopt(*c_sock, IPPROTO_TCP, TCP_KEEPINTVL,
24632461
&optval, sizeof(optval));
24642462
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2465-
ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPINTVL,
2463+
ret = zsock_setsockopt(*s_sock, IPPROTO_TCP, TCP_KEEPINTVL,
24662464
&optval, sizeof(optval));
24672465
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
24682466

24692467
optval = 1;
2470-
ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPCNT,
2468+
ret = zsock_setsockopt(*c_sock, IPPROTO_TCP, TCP_KEEPCNT,
24712469
&optval, sizeof(optval));
24722470
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2473-
ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPCNT,
2471+
ret = zsock_setsockopt(*s_sock, IPPROTO_TCP, TCP_KEEPCNT,
24742472
&optval, sizeof(optval));
24752473
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
24762474

24772475
/* Establish connection */
2478-
test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2479-
test_listen(s_sock);
2480-
test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2481-
test_accept(s_sock, &new_sock, NULL, NULL);
2476+
test_bind(*s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2477+
test_listen(*s_sock);
2478+
test_connect(*c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr));
2479+
test_accept(*s_sock, new_sock, NULL, NULL);
2480+
}
2481+
2482+
ZTEST(net_socket_tcp, test_keepalive)
2483+
{
2484+
int c_sock, s_sock, new_sock;
2485+
struct timeval optval = {
2486+
.tv_sec = 2,
2487+
.tv_usec = 500000,
2488+
};
2489+
uint8_t rx_buf;
2490+
int ret;
2491+
2492+
test_prepare_keepalive_socks(&c_sock, &s_sock, &new_sock);
2493+
2494+
ret = zsock_setsockopt(c_sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
2495+
sizeof(optval));
2496+
zassert_equal(ret, 0, "setsockopt failed (%d)", errno);
2497+
2498+
/* recv() should fail, but due to receive timeout (no data), not
2499+
* connection timeout (keepalive).
2500+
*/
2501+
ret = zsock_recv(c_sock, &rx_buf, sizeof(rx_buf), 0);
2502+
zassert_equal(ret, -1, "recv() should've failed");
2503+
zassert_equal(errno, EAGAIN, "wrong errno value, %d", errno);
2504+
2505+
test_close(c_sock);
2506+
test_close(new_sock);
2507+
test_close(s_sock);
2508+
2509+
test_context_cleanup();
2510+
}
2511+
2512+
ZTEST(net_socket_tcp, test_keepalive_timeout)
2513+
{
2514+
int c_sock, s_sock, new_sock;
2515+
uint8_t rx_buf;
2516+
int ret;
2517+
2518+
test_prepare_keepalive_socks(&c_sock, &s_sock, &new_sock);
24822519

24832520
/* Kill communication - expect that connection will be closed after
24842521
* a timeout period.

0 commit comments

Comments
 (0)