@@ -3477,6 +3477,115 @@ ZTEST_USER(net_socket_udp, test_44_recvmsg_ancillary_ipv6_hoplimit_data_user)
3477
3477
sizeof (server_addr ));
3478
3478
}
3479
3479
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
+
3480
3589
static void after (void * arg )
3481
3590
{
3482
3591
ARG_UNUSED (arg );
0 commit comments