diff --git a/tests/net/socket/udp/prj.conf b/tests/net/socket/udp/prj.conf index 65cd9435eb5079..4b29cd5f9260d2 100644 --- a/tests/net/socket/udp/prj.conf +++ b/tests/net/socket/udp/prj.conf @@ -4,7 +4,7 @@ CONFIG_NEWLIB_LIBC=y # Networking config CONFIG_NETWORKING=y CONFIG_NET_IPV4=y -CONFIG_NET_IPV6=n +CONFIG_NET_IPV6=y CONFIG_NET_UDP=y CONFIG_NET_SOCKETS=y CONFIG_NET_SOCKETS_POSIX_NAMES=y @@ -13,13 +13,14 @@ CONFIG_NET_SOCKETS_POSIX_NAMES=y CONFIG_TEST_RANDOM_GENERATOR=y # Network address config -#CONFIG_NET_APP_SETTINGS=y -#CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1" -#CONFIG_NET_APP_PEER_IPV4_ADDR="192.0.2.2" +CONFIG_NET_APP_SETTINGS=y +CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1" +CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8::1" # Network debug config #CONFIG_NET_LOG=y #CONFIG_NET_DEBUG_SOCKETS=y #CONFIG_SYS_LOG_NET_LEVEL=4 +CONFIG_MAIN_STACK_SIZE=2048 CONFIG_ZTEST=y diff --git a/tests/net/socket/udp/src/main.c b/tests/net/socket/udp/src/main.c index bbd821fd8a9693..6bdda57247c1a7 100644 --- a/tests/net/socket/udp/src/main.c +++ b/tests/net/socket/udp/src/main.c @@ -8,13 +8,207 @@ #include #include -#include #define BUF_AND_SIZE(buf) buf, sizeof(buf) - 1 #define STRLEN(buf) (sizeof(buf) - 1) #define TEST_STR_SMALL "test" +#define LOCAL_PORT 9898 +#define REMOTE_PORT 4242 + +#define V4_ANY_ADDR "0.0.0.0" +#define V6_ANY_ADDR "0:0:0:0:0:0:0:0" + +#define V4_REMOTE_ADDR "192.0.2.2" +#define V6_REMOTE_ADDR "2001:db8::2" + +static void test_v4_sendto_recvfrom(void) +{ + int rv; + int sock; + ssize_t sent = 0; + ssize_t recved = 0; + char rx_buf[30] = {0}; + struct sockaddr_in addr; + socklen_t socklen; + + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + zassert_true(sock >= 0, "socket open failed"); + + addr.sin_family = AF_INET; + addr.sin_port = htons(REMOTE_PORT); + rv = inet_pton(AF_INET, V4_REMOTE_ADDR, &(addr.sin_addr)); + zassert_equal(rv, 1, "inet_pton failed"); + + sent = sendto(sock, + TEST_STR_SMALL, + strlen(TEST_STR_SMALL), + 0, + (struct sockaddr *)&addr, + sizeof(addr)); + zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed"); + + socklen = sizeof(addr); + recved = recvfrom(sock, + rx_buf, + sizeof(rx_buf), + 0, + (struct sockaddr *)&addr, + &socklen); + zassert_true(recved > 0, "recvfrom fail"); + zassert_equal(recved, + strlen(TEST_STR_SMALL), + "unexpected received bytes"); + zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)), + 0, + "unexpected data"); +} + +static void test_v6_sendto_recvfrom(void) +{ + int rv; + int sock; + ssize_t sent = 0; + ssize_t recved = 0; + char rx_buf[30] = {0}; + struct sockaddr_in6 addr; + socklen_t socklen; + + sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + zassert_true(sock >= 0, "socket open failed"); + + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(REMOTE_PORT); + rv = inet_pton(AF_INET6, V6_REMOTE_ADDR, &(addr.sin6_addr)); + zassert_equal(rv, 1, "inet_pton failed"); + + sent = sendto(sock, + TEST_STR_SMALL, + strlen(TEST_STR_SMALL), + 0, + (struct sockaddr *)&addr, + sizeof(addr)); + zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed"); + + socklen = sizeof(addr); + recved = recvfrom(sock, + rx_buf, + sizeof(rx_buf), + 0, + (struct sockaddr *)&addr, + &socklen); + zassert_true(recved > 0, "recvfrom fail"); + zassert_equal(recved, + strlen(TEST_STR_SMALL), + "unexpected received bytes"); + zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)), + 0, + "unexpected data"); +} + +static void test_v4_bind_sendto(void) +{ + int rv; + int sock; + ssize_t sent = 0; + ssize_t recved = 0; + char rx_buf[30] = {0}; + struct sockaddr_in remote_addr; + struct sockaddr_in local_addr; + socklen_t socklen; + + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + zassert_true(sock >= 0, "socket open failed"); + + local_addr.sin_family = AF_INET; + local_addr.sin_port = htons(LOCAL_PORT); + rv = inet_pton(AF_INET, V4_ANY_ADDR, &(local_addr.sin_addr)); + zassert_equal(rv, 1, "inet_pton failed"); + + rv = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)); + zassert_equal(rv, 0, "bind failed"); + + remote_addr.sin_family = AF_INET; + remote_addr.sin_port = htons(REMOTE_PORT); + rv = inet_pton(AF_INET, V4_REMOTE_ADDR, &(remote_addr.sin_addr)); + zassert_equal(rv, 1, "inet_pton failed"); + + sent = sendto(sock, + TEST_STR_SMALL, + strlen(TEST_STR_SMALL), + 0, + (struct sockaddr *)&remote_addr, + sizeof(remote_addr)); + zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed"); + + socklen = sizeof(remote_addr); + recved = recvfrom(sock, + rx_buf, + sizeof(rx_buf), + 0, + (struct sockaddr *)&remote_addr, + &socklen); + zassert_true(recved > 0, "recvfrom fail"); + zassert_equal(recved, + strlen(TEST_STR_SMALL), + "unexpected received bytes"); + zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)), + 0, + "unexpected data"); +} + +static void test_v6_bind_sendto(void) +{ + int rv; + int sock; + ssize_t sent = 0; + ssize_t recved = 0; + char rx_buf[30] = {0}; + struct sockaddr_in6 remote_addr; + struct sockaddr_in6 local_addr; + socklen_t socklen; + + sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + zassert_true(sock >= 0, "socket open failed"); + + local_addr.sin6_family = AF_INET6; + local_addr.sin6_port = htons(LOCAL_PORT); + rv = inet_pton(AF_INET6, V6_ANY_ADDR, &(local_addr.sin6_addr)); + zassert_equal(rv, 1, "inet_pton failed"); + + rv = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)); + zassert_equal(rv, 0, "bind failed"); + + remote_addr.sin6_family = AF_INET6; + remote_addr.sin6_port = htons(REMOTE_PORT); + rv = inet_pton(AF_INET6, V6_REMOTE_ADDR, &(remote_addr.sin6_addr)); + zassert_equal(rv, 1, "inet_pton failed"); + + sent = sendto(sock, + TEST_STR_SMALL, + strlen(TEST_STR_SMALL), + 0, + (struct sockaddr *)&remote_addr, + sizeof(remote_addr)); + zassert_equal(sent, strlen(TEST_STR_SMALL), "sendto failed"); + + socklen = sizeof(remote_addr); + recved = recvfrom(sock, + rx_buf, + sizeof(rx_buf), + 0, + (struct sockaddr *)&remote_addr, + &socklen); + zassert_true(recved > 0, "recvfrom fail"); + zassert_equal(recved, + strlen(TEST_STR_SMALL), + "unexpected received bytes"); + zassert_equal(strncmp(rx_buf, TEST_STR_SMALL, strlen(TEST_STR_SMALL)), + 0, + "unexpected data"); +} + void test_send_recv_2_sock(void) { int sock1, sock2; @@ -45,15 +239,12 @@ void test_send_recv_2_sock(void) void test_main(void) { - zassert_not_null(net_if_get_default(), "No default netif"); - static struct in_addr in4addr_my = { { {192, 0, 2, 1} } }; - - net_if_ipv4_addr_add(net_if_get_default(), &in4addr_my, - NET_ADDR_MANUAL, 0); - ztest_test_suite(socket_udp, - ztest_unit_test(test_send_recv_2_sock) - ); + ztest_unit_test(test_send_recv_2_sock), + ztest_unit_test(test_v4_sendto_recvfrom), + ztest_unit_test(test_v6_sendto_recvfrom), + ztest_unit_test(test_v4_bind_sendto), + ztest_unit_test(test_v6_bind_sendto)); ztest_run_test_suite(socket_udp); }