Skip to content

Commit 5e75627

Browse files
rlubosMaureenHelm
authored andcommitted
tests: net: socket: udp: Add tests for resetting peer address
Verify that resetting peer address with AF_UNSPEC address family work as expected. Signed-off-by: Robert Lubos <[email protected]>
1 parent 09cbd28 commit 5e75627

File tree

1 file changed

+98
-0
lines changed
  • tests/net/socket/udp/src

1 file changed

+98
-0
lines changed

tests/net/socket/udp/src/main.c

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3112,6 +3112,104 @@ ZTEST(net_socket_udp, test_40_clamp_udp_tcp_port_range)
31123112
#endif
31133113
}
31143114

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+
31153213
static void after(void *arg)
31163214
{
31173215
ARG_UNUSED(arg);

0 commit comments

Comments
 (0)