@@ -3112,6 +3112,104 @@ ZTEST(net_socket_udp, test_40_clamp_udp_tcp_port_range)
3112
3112
#endif
3113
3113
}
3114
3114
3115
+ static void test_dgram_peer_addr_reset (int sock_c , int sock_s1 , int sock_s2 ,
3116
+ struct sockaddr * addr_c , socklen_t addrlen_c ,
3117
+ struct sockaddr * addr_s1 , socklen_t addrlen_s1 ,
3118
+ struct sockaddr * addr_s2 , socklen_t addrlen_s2 )
3119
+ {
3120
+ uint8_t tx_buf = 0xab ;
3121
+ uint8_t rx_buf ;
3122
+ struct sockaddr_storage unspec = {
3123
+ .ss_family = AF_UNSPEC ,
3124
+ };
3125
+ int rv ;
3126
+
3127
+ rv = zsock_bind (sock_c , addr_c , addrlen_c );
3128
+ zassert_equal (rv , 0 , "client bind failed" );
3129
+
3130
+ rv = zsock_bind (sock_s1 , addr_s1 , addrlen_s1 );
3131
+ zassert_equal (rv , 0 , "server bind failed" );
3132
+
3133
+ rv = zsock_bind (sock_s2 , addr_s2 , addrlen_s2 );
3134
+ zassert_equal (rv , 0 , "server bind failed" );
3135
+
3136
+ /* Connect client socket to a specific peer address. */
3137
+ rv = zsock_connect (sock_c , addr_s1 , addrlen_s1 );
3138
+ zassert_equal (rv , 0 , "connect failed" );
3139
+
3140
+ /* Verify that a datagram is not received from other address */
3141
+ rv = zsock_sendto (sock_s2 , & tx_buf , sizeof (tx_buf ), 0 , addr_c , addrlen_c );
3142
+ zassert_equal (rv , sizeof (tx_buf ), "send failed" );
3143
+
3144
+ /* Give the packet a chance to go through the net stack */
3145
+ k_msleep (10 );
3146
+
3147
+ rv = zsock_recv (sock_c , & rx_buf , sizeof (rx_buf ), ZSOCK_MSG_DONTWAIT );
3148
+ zassert_equal (rv , -1 , "recv should've failed" );
3149
+ zassert_equal (errno , EAGAIN , "incorrect errno" );
3150
+
3151
+ /* Reset peer address */
3152
+ rv = zsock_connect (sock_c , (struct sockaddr * )& unspec , sizeof (unspec ));
3153
+ zassert_equal (rv , 0 , "connect failed" );
3154
+
3155
+ /* Verify that a datagram can be received from other address */
3156
+ rv = zsock_sendto (sock_s2 , & tx_buf , sizeof (tx_buf ), 0 , addr_c , addrlen_c );
3157
+ zassert_equal (rv , sizeof (tx_buf ), "send failed" );
3158
+
3159
+ /* Give the packet a chance to go through the net stack */
3160
+ k_msleep (10 );
3161
+
3162
+ rx_buf = 0 ;
3163
+ rv = zsock_recv (sock_c , & rx_buf , sizeof (rx_buf ), ZSOCK_MSG_DONTWAIT );
3164
+ zassert_equal (rv , sizeof (rx_buf ), "recv failed %d" , errno );
3165
+ zassert_equal (rx_buf , tx_buf , "wrong data" );
3166
+
3167
+ rv = zsock_close (sock_c );
3168
+ zassert_equal (rv , 0 , "close failed" );
3169
+ rv = zsock_close (sock_s1 );
3170
+ zassert_equal (rv , 0 , "close failed" );
3171
+ rv = zsock_close (sock_s2 );
3172
+ zassert_equal (rv , 0 , "close failed" );
3173
+ }
3174
+
3175
+ ZTEST (net_socket_udp , test_41_v4_dgram_peer_addr_reset )
3176
+ {
3177
+ int client_sock ;
3178
+ int server_sock_1 ;
3179
+ int server_sock_2 ;
3180
+ struct sockaddr_in client_addr ;
3181
+ struct sockaddr_in server_addr_1 ;
3182
+ struct sockaddr_in server_addr_2 ;
3183
+
3184
+ prepare_sock_udp_v4 (MY_IPV4_ADDR , CLIENT_PORT , & client_sock , & client_addr );
3185
+ prepare_sock_udp_v4 (MY_IPV4_ADDR , SERVER_PORT , & server_sock_1 , & server_addr_1 );
3186
+ prepare_sock_udp_v4 (MY_IPV4_ADDR , SERVER_PORT + 1 , & server_sock_2 , & server_addr_2 );
3187
+
3188
+ test_dgram_peer_addr_reset (client_sock , server_sock_1 , server_sock_2 ,
3189
+ (struct sockaddr * )& client_addr , sizeof (client_addr ),
3190
+ (struct sockaddr * )& server_addr_1 , sizeof (server_addr_1 ),
3191
+ (struct sockaddr * )& server_addr_2 , sizeof (server_addr_2 ));
3192
+ }
3193
+
3194
+ ZTEST (net_socket_udp , test_42_v6_dgram_peer_addr_reset )
3195
+ {
3196
+ int client_sock ;
3197
+ int server_sock_1 ;
3198
+ int server_sock_2 ;
3199
+ struct sockaddr_in6 client_addr ;
3200
+ struct sockaddr_in6 server_addr_1 ;
3201
+ struct sockaddr_in6 server_addr_2 ;
3202
+
3203
+ prepare_sock_udp_v6 (MY_IPV6_ADDR , CLIENT_PORT , & client_sock , & client_addr );
3204
+ prepare_sock_udp_v6 (MY_IPV6_ADDR , SERVER_PORT , & server_sock_1 , & server_addr_1 );
3205
+ prepare_sock_udp_v6 (MY_IPV6_ADDR , SERVER_PORT + 1 , & server_sock_2 , & server_addr_2 );
3206
+
3207
+ test_dgram_peer_addr_reset (client_sock , server_sock_1 , server_sock_2 ,
3208
+ (struct sockaddr * )& client_addr , sizeof (client_addr ),
3209
+ (struct sockaddr * )& server_addr_1 , sizeof (server_addr_1 ),
3210
+ (struct sockaddr * )& server_addr_2 , sizeof (server_addr_2 ));
3211
+ }
3212
+
3115
3213
static void after (void * arg )
3116
3214
{
3117
3215
ARG_UNUSED (arg );
0 commit comments