@@ -2349,7 +2349,7 @@ ZTEST(net_socket_tcp, test_connect_and_wait_for_v4_poll)
2349
2349
zassert_equal (ret , 0 , "close failed, %d" , errno );
2350
2350
}
2351
2351
2352
- ZTEST (net_socket_tcp , test_so_keepalive )
2352
+ ZTEST (net_socket_tcp , test_so_keepalive_opt )
2353
2353
{
2354
2354
struct sockaddr_in bind_addr4 ;
2355
2355
int sock , ret ;
@@ -2430,55 +2430,92 @@ ZTEST(net_socket_tcp, test_so_keepalive)
2430
2430
test_context_cleanup ();
2431
2431
}
2432
2432
2433
- ZTEST ( net_socket_tcp , test_keepalive_timeout )
2433
+ static void test_prepare_keepalive_socks ( int * c_sock , int * s_sock , int * new_sock )
2434
2434
{
2435
2435
struct sockaddr_in c_saddr , s_saddr ;
2436
- int c_sock , s_sock , new_sock ;
2437
- uint8_t rx_buf ;
2438
2436
int optval ;
2439
2437
int ret ;
2440
2438
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 );
2443
2441
2444
2442
/* Enable keep-alive on both ends and set timeouts/retries to minimum */
2445
2443
optval = 1 ;
2446
- ret = zsock_setsockopt (c_sock , SOL_SOCKET , SO_KEEPALIVE ,
2444
+ ret = zsock_setsockopt (* c_sock , SOL_SOCKET , SO_KEEPALIVE ,
2447
2445
& optval , sizeof (optval ));
2448
2446
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 ,
2450
2448
& optval , sizeof (optval ));
2451
2449
zassert_equal (ret , 0 , "setsockopt failed (%d)" , errno );
2452
2450
2453
2451
optval = 1 ;
2454
- ret = zsock_setsockopt (c_sock , IPPROTO_TCP , TCP_KEEPIDLE ,
2452
+ ret = zsock_setsockopt (* c_sock , IPPROTO_TCP , TCP_KEEPIDLE ,
2455
2453
& optval , sizeof (optval ));
2456
2454
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 ,
2458
2456
& optval , sizeof (optval ));
2459
2457
zassert_equal (ret , 0 , "setsockopt failed (%d)" , errno );
2460
2458
2461
2459
optval = 1 ;
2462
- ret = zsock_setsockopt (c_sock , IPPROTO_TCP , TCP_KEEPINTVL ,
2460
+ ret = zsock_setsockopt (* c_sock , IPPROTO_TCP , TCP_KEEPINTVL ,
2463
2461
& optval , sizeof (optval ));
2464
2462
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 ,
2466
2464
& optval , sizeof (optval ));
2467
2465
zassert_equal (ret , 0 , "setsockopt failed (%d)" , errno );
2468
2466
2469
2467
optval = 1 ;
2470
- ret = zsock_setsockopt (c_sock , IPPROTO_TCP , TCP_KEEPCNT ,
2468
+ ret = zsock_setsockopt (* c_sock , IPPROTO_TCP , TCP_KEEPCNT ,
2471
2469
& optval , sizeof (optval ));
2472
2470
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 ,
2474
2472
& optval , sizeof (optval ));
2475
2473
zassert_equal (ret , 0 , "setsockopt failed (%d)" , errno );
2476
2474
2477
2475
/* 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 );
2482
2519
2483
2520
/* Kill communication - expect that connection will be closed after
2484
2521
* a timeout period.
0 commit comments