@@ -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