@@ -3477,6 +3477,115 @@ ZTEST_USER(net_socket_udp, test_44_recvmsg_ancillary_ipv6_hoplimit_data_user)
34773477 sizeof (server_addr ));
34783478}
34793479
3480+ static void sendto_recvfrom (int client_sock ,
3481+ struct sockaddr * client_addr ,
3482+ socklen_t client_addrlen ,
3483+ int server_sock ,
3484+ struct sockaddr * server_addr ,
3485+ socklen_t server_addrlen ,
3486+ bool expect_failure )
3487+ {
3488+ ssize_t sent = 0 ;
3489+ ssize_t recved = 0 ;
3490+ struct sockaddr addr ;
3491+ socklen_t addrlen ;
3492+ struct sockaddr addr2 ;
3493+ socklen_t addrlen2 ;
3494+
3495+ zassert_not_null (client_addr , "null client addr" );
3496+ zassert_not_null (server_addr , "null server addr" );
3497+
3498+ /*
3499+ * Test client -> server sending
3500+ */
3501+
3502+ sent = zsock_sendto (client_sock , TEST_STR_SMALL , strlen (TEST_STR_SMALL ),
3503+ 0 , server_addr , server_addrlen );
3504+ zassert_equal (sent , strlen (TEST_STR_SMALL ), "sendto failed" );
3505+
3506+ k_msleep (100 );
3507+
3508+ /* Test normal recvfrom() */
3509+ addrlen = sizeof (addr );
3510+ clear_buf (rx_buf );
3511+ recved = zsock_recvfrom (server_sock , rx_buf , sizeof (rx_buf ),
3512+ 0 , & addr , & addrlen );
3513+ zassert_true (recved >= 0 , "recvfrom fail" );
3514+ zassert_equal (recved , strlen (TEST_STR_SMALL ),
3515+ "unexpected received bytes" );
3516+ zassert_mem_equal (rx_buf , BUF_AND_SIZE (TEST_STR_SMALL ), "wrong data" );
3517+ zassert_equal (addrlen , client_addrlen , "unexpected addrlen" );
3518+
3519+ /*
3520+ * Test server -> client sending
3521+ */
3522+
3523+ sent = zsock_sendto (server_sock , TEST_STR2 , sizeof (TEST_STR2 ) - 1 ,
3524+ 0 , & addr , addrlen );
3525+ zassert_equal (sent , STRLEN (TEST_STR2 ), "sendto failed" );
3526+
3527+ /* Test normal recvfrom() */
3528+ addrlen2 = sizeof (addr );
3529+ clear_buf (rx_buf );
3530+ recved = zsock_recvfrom (client_sock , rx_buf , sizeof (rx_buf ),
3531+ expect_failure ? ZSOCK_MSG_DONTWAIT : 0 ,
3532+ & addr2 , & addrlen2 );
3533+ if (!expect_failure ) {
3534+ zassert_true (recved >= 0 , "recvfrom fail" );
3535+ zassert_equal (recved , STRLEN (TEST_STR2 ),
3536+ "unexpected received bytes" );
3537+ zassert_mem_equal (rx_buf , BUF_AND_SIZE (TEST_STR2 ), "wrong data" );
3538+ zassert_equal (addrlen2 , server_addrlen , "unexpected addrlen" );
3539+ } else {
3540+ /* We should not receive anything as the socket is shutdown for
3541+ * receiving.
3542+ */
3543+ zassert_equal (recved , -1 , "recvfrom should fail (got %d)" , recved );
3544+ }
3545+ }
3546+
3547+ ZTEST_USER (net_socket_udp , test_45_udp_shutdown_recv )
3548+ {
3549+ int rv ;
3550+ int client_sock ;
3551+ int server_sock ;
3552+ struct sockaddr_in client_addr ;
3553+ struct sockaddr_in server_addr ;
3554+
3555+ prepare_sock_udp_v4 (MY_IPV4_ADDR , ANY_PORT , & client_sock , & client_addr );
3556+ prepare_sock_udp_v4 (MY_IPV4_ADDR , SERVER_PORT , & server_sock , & server_addr );
3557+
3558+ rv = zsock_bind (server_sock ,
3559+ (struct sockaddr * )& server_addr ,
3560+ sizeof (server_addr ));
3561+ zassert_equal (rv , 0 , "bind failed" );
3562+
3563+ sendto_recvfrom (client_sock ,
3564+ (struct sockaddr * )& client_addr ,
3565+ sizeof (client_addr ),
3566+ server_sock ,
3567+ (struct sockaddr * )& server_addr ,
3568+ sizeof (server_addr ),
3569+ false);
3570+
3571+ /* Shutdown UDP socket for receiving and verify that we do not get any data. */
3572+ rv = zsock_shutdown (client_sock , ZSOCK_SHUT_RD );
3573+ zassert_equal (rv , 0 , "shutdown failed (%d)" , - errno );
3574+
3575+ sendto_recvfrom (client_sock ,
3576+ (struct sockaddr * )& client_addr ,
3577+ sizeof (client_addr ),
3578+ server_sock ,
3579+ (struct sockaddr * )& server_addr ,
3580+ sizeof (server_addr ),
3581+ true);
3582+
3583+ rv = zsock_close (client_sock );
3584+ zassert_equal (rv , 0 , "close failed" );
3585+ rv = zsock_close (server_sock );
3586+ zassert_equal (rv , 0 , "close failed" );
3587+ }
3588+
34803589static void after (void * arg )
34813590{
34823591 ARG_UNUSED (arg );
0 commit comments