From 14dac62192c11f8dfe31a33d766c25b33de97ddd Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 27 Feb 2026 13:27:59 -0800 Subject: [PATCH 1/2] Merge `wasip{2,3}_udp.c` into `udp.c` Same as #748, but for UDP --- libc-bottom-half/CMakeLists.txt | 3 +- .../headers/private/wasi/sockets_utils.h | 9 +++- libc-bottom-half/headers/private/wasi/udp.h | 8 +++ libc-bottom-half/sources/tcp.c | 5 -- .../sources/{wasip2_udp.c => udp.c} | 52 +++++++++++++------ libc-bottom-half/sources/wasip3_udp.c | 13 ----- 6 files changed, 51 insertions(+), 39 deletions(-) rename libc-bottom-half/sources/{wasip2_udp.c => udp.c} (96%) delete mode 100644 libc-bottom-half/sources/wasip3_udp.c diff --git a/libc-bottom-half/CMakeLists.txt b/libc-bottom-half/CMakeLists.txt index b51a1169c..65012cb03 100644 --- a/libc-bottom-half/CMakeLists.txt +++ b/libc-bottom-half/CMakeLists.txt @@ -146,6 +146,7 @@ else() sources/sockets_utils.c sources/sockopt.c sources/tcp.c + sources/udp.c ) endif() @@ -156,7 +157,6 @@ if(WASI STREQUAL "p2") sources/wasip2_file.c sources/wasip2_file_utils.c sources/wasip2_stdio.c - sources/wasip2_udp.c ) endif() @@ -167,7 +167,6 @@ if (WASI STREQUAL "p3") sources/wasip3_file.c sources/wasip3_file_utils.c sources/wasip3_stdio.c - sources/wasip3_udp.c ) endif() diff --git a/libc-bottom-half/headers/private/wasi/sockets_utils.h b/libc-bottom-half/headers/private/wasi/sockets_utils.h index 15ffc785b..9a2369ede 100644 --- a/libc-bottom-half/headers/private/wasi/sockets_utils.h +++ b/libc-bottom-half/headers/private/wasi/sockets_utils.h @@ -11,8 +11,13 @@ typedef network_error_code_t sockets_error_code_t; typedef network_ip_address_family_t sockets_ip_address_family_t; typedef network_ip_socket_address_t sockets_ip_socket_address_t; -typedef tcp_own_tcp_socket_t sockets_own_tcp_socket_t; -typedef udp_own_udp_socket_t sockets_own_udp_socket_t; + +#define sockets_error_code_t network_error_code_t +#define sockets_ip_address_family_t network_ip_address_family_t +#define sockets_ip_socket_address_t network_ip_socket_address_t + +#define SOCKETS_IP_ADDRESS_FAMILY_IPV4 NETWORK_IP_ADDRESS_FAMILY_IPV4 +#define SOCKETS_IP_ADDRESS_FAMILY_IPV6 NETWORK_IP_ADDRESS_FAMILY_IPV6 #elif defined(__wasip3__) // already defines `sockets_*` types #else diff --git a/libc-bottom-half/headers/private/wasi/udp.h b/libc-bottom-half/headers/private/wasi/udp.h index 487411836..07112366a 100644 --- a/libc-bottom-half/headers/private/wasi/udp.h +++ b/libc-bottom-half/headers/private/wasi/udp.h @@ -7,6 +7,14 @@ #include +// Normalize names on WASIp2 to the WASIp3-based names +#ifdef __wasip2__ +typedef udp_own_udp_socket_t sockets_own_udp_socket_t; +typedef udp_borrow_udp_socket_t sockets_borrow_udp_socket_t; +#define sockets_udp_socket_drop_own udp_udp_socket_drop_own +#define sockets_borrow_udp_socket udp_borrow_udp_socket +#endif // __wasip2__ + /// Adds the provided UDP socket to the descriptor table, returning the /// corresponding file descriptor. int __wasilibc_add_udp_socket(sockets_own_udp_socket_t socket, diff --git a/libc-bottom-half/sources/tcp.c b/libc-bottom-half/sources/tcp.c index 925dca3e7..0d18ff9fc 100644 --- a/libc-bottom-half/sources/tcp.c +++ b/libc-bottom-half/sources/tcp.c @@ -56,14 +56,9 @@ #define sockets_borrow_tcp_socket tcp_borrow_tcp_socket #define sockets_borrow_tcp_socket_t tcp_borrow_tcp_socket_t -#define sockets_error_code_t network_error_code_t -#define sockets_ip_address_family_t network_ip_address_family_t -#define sockets_ip_socket_address_t network_ip_socket_address_t #define sockets_own_tcp_socket_t tcp_own_tcp_socket_t #define sockets_tcp_socket_drop_own tcp_tcp_socket_drop_own -#define SOCKETS_IP_ADDRESS_FAMILY_IPV4 NETWORK_IP_ADDRESS_FAMILY_IPV4 -#define SOCKETS_IP_ADDRESS_FAMILY_IPV6 NETWORK_IP_ADDRESS_FAMILY_IPV6 typedef tcp_duration_t sockets_duration_t; #endif // __wasip2__ diff --git a/libc-bottom-half/sources/wasip2_udp.c b/libc-bottom-half/sources/udp.c similarity index 96% rename from libc-bottom-half/sources/wasip2_udp.c rename to libc-bottom-half/sources/udp.c index 2950c3358..7b958633b 100644 --- a/libc-bottom-half/sources/wasip2_udp.c +++ b/libc-bottom-half/sources/udp.c @@ -8,14 +8,18 @@ #include #include -#ifdef __wasip2__ - // Pollables here are lazily initialized as-needed. typedef struct { +#if defined(__wasip2__) udp_own_incoming_datagram_stream_t incoming; poll_own_pollable_t incoming_pollable; udp_own_outgoing_datagram_stream_t outgoing; poll_own_pollable_t outgoing_pollable; +#elif defined(__wasip3__) + int dummy; +#else +#error "Unsupported WASI version" +#endif } udp_socket_streams_t; typedef struct { @@ -55,22 +59,24 @@ typedef struct { } udp_socket_state_t; typedef struct { - udp_own_udp_socket_t socket; + sockets_own_udp_socket_t socket; +#ifdef __wasip2__ // Lazily initialized as-needed pollable. poll_own_pollable_t socket_pollable; +#endif bool blocking; - network_ip_address_family_t family; + sockets_ip_address_family_t family; udp_socket_state_t state; } udp_socket_t; static descriptor_vtable_t udp_vtable; -int __wasilibc_add_udp_socket(udp_own_udp_socket_t socket, - network_ip_address_family_t family, +int __wasilibc_add_udp_socket(sockets_own_udp_socket_t socket, + sockets_ip_address_family_t family, bool blocking) { udp_socket_t *udp = calloc(1, sizeof(udp_socket_t)); if (!udp) { - udp_udp_socket_drop_own(socket); + sockets_udp_socket_drop_own(socket); errno = ENOMEM; return -1; } @@ -86,7 +92,7 @@ int __wasilibc_add_udp_socket(udp_own_udp_socket_t socket, } static int udp_create_streams(udp_socket_t *socket, - network_ip_socket_address_t *remote_address) { + sockets_ip_socket_address_t *remote_address) { // Assert that: // - We're already bound. This is required by WASI. // - We have no active streams. From WASI: @@ -96,7 +102,8 @@ static int udp_create_streams(udp_socket_t *socket, abort(); } - udp_borrow_udp_socket_t socket_borrow = udp_borrow_udp_socket(socket->socket); + sockets_borrow_udp_socket_t socket_borrow = + sockets_borrow_udp_socket(socket->socket); udp_socket_streams_t *dst; if (remote_address != NULL) { @@ -107,7 +114,8 @@ static int udp_create_streams(udp_socket_t *socket, memset(dst, 0, sizeof(*dst)); - network_error_code_t error; + sockets_error_code_t error; +#ifdef __wasip2__ udp_tuple2_own_incoming_datagram_stream_own_outgoing_datagram_stream_t io; if (!udp_method_udp_socket_stream(socket_borrow, remote_address, &io, &error)) return __wasilibc_socket_error_to_errno(error); @@ -121,16 +129,22 @@ static int udp_create_streams(udp_socket_t *socket, socket->state.tag = UDP_SOCKET_STATE_BOUND_STREAMING; } - return true; + return 0; +#else + errno = ENOTSUP; + return -1; +#endif } static void udp_close_streams(udp_socket_streams_t *streams) { +#ifdef __wasip2__ if (streams->incoming_pollable.__handle != 0) poll_pollable_drop_own(streams->incoming_pollable); udp_incoming_datagram_stream_drop_own(streams->incoming); if (streams->outgoing_pollable.__handle != 0) poll_pollable_drop_own(streams->outgoing_pollable); udp_outgoing_datagram_stream_drop_own(streams->outgoing); +#endif } static void udp_free(void *data) { @@ -147,9 +161,11 @@ static void udp_free(void *data) { break; } +#ifdef __wasip2__ if (udp->socket_pollable.__handle != 0) poll_pollable_drop_own(udp->socket_pollable); - udp_udp_socket_drop_own(udp->socket); +#endif + sockets_udp_socket_drop_own(udp->socket); free(udp); } @@ -167,6 +183,7 @@ static int udp_fstat(void *data, struct stat *buf) { return 0; } +#ifdef __wasip2__ static poll_borrow_pollable_t udp_pollable(udp_socket_t *socket) { if (socket->socket_pollable.__handle == 0) { udp_borrow_udp_socket_t socket_borrow = @@ -194,7 +211,7 @@ udp_outgoing_pollable(udp_socket_streams_t *streams) { return poll_borrow_pollable(streams->outgoing_pollable); } -static int udp_handle_error(udp_socket_t *socket, network_error_code_t error) { +static int udp_handle_error(udp_socket_t *socket, sockets_error_code_t error) { if (error == NETWORK_ERROR_CODE_WOULD_BLOCK && socket->blocking) { poll_method_pollable_block(udp_pollable(socket)); } else { @@ -205,13 +222,13 @@ static int udp_handle_error(udp_socket_t *socket, network_error_code_t error) { } static int udp_do_bind(udp_socket_t *socket, - network_ip_socket_address_t *address) { + sockets_ip_socket_address_t *address) { if (socket->state.tag != UDP_SOCKET_STATE_UNBOUND) { errno = EINVAL; return -1; } - network_error_code_t error; + sockets_error_code_t error; network_borrow_network_t network_borrow = __wasi_sockets_utils__borrow_network(); udp_borrow_udp_socket_t socket_borrow = udp_borrow_udp_socket(socket->socket); @@ -838,6 +855,7 @@ static int udp_fcntl_setfl(void *data, int flags) { } return 0; } +#endif static descriptor_vtable_t udp_vtable = { .free = udp_free, @@ -845,6 +863,7 @@ static descriptor_vtable_t udp_vtable = { .set_blocking = udp_set_blocking, .fstat = udp_fstat, +#ifdef __wasip2__ .bind = udp_bind, .connect = udp_connect, .getsockname = udp_getsockname, @@ -858,6 +877,5 @@ static descriptor_vtable_t udp_vtable = { .fcntl_getfl = udp_fcntl_getfl, .fcntl_setfl = udp_fcntl_setfl, +#endif }; - -#endif // __wasip2__ diff --git a/libc-bottom-half/sources/wasip3_udp.c b/libc-bottom-half/sources/wasip3_udp.c deleted file mode 100644 index bd696e65a..000000000 --- a/libc-bottom-half/sources/wasip3_udp.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#ifdef __wasip3__ - -int __wasilibc_add_udp_socket(sockets_own_tcp_socket_t socket, - sockets_ip_address_family_t family, - bool blocking) { - // TODO(wasip3) - errno = ENOTSUP; - return -1; -} -#endif // __wasip3__ From 5bda1ba5479dc91f59601b1af02c25d88f8b22a5 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 27 Feb 2026 13:44:32 -0800 Subject: [PATCH 2/2] Fix test on wasip3 --- test/src/sockets-nonblocking-udp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/src/sockets-nonblocking-udp.c b/test/src/sockets-nonblocking-udp.c index 84bebe791..3782b101f 100644 --- a/test/src/sockets-nonblocking-udp.c +++ b/test/src/sockets-nonblocking-udp.c @@ -59,12 +59,15 @@ void test_udp_client() { int connect_result = connect(socket_fd, (struct sockaddr *)&sockaddr_in, sizeof(sockaddr_in)); while (connect_result == -1) { + if (t_status) + exit(t_status); + connect_result = connect(socket_fd, (struct sockaddr *)&sockaddr_in, sizeof(sockaddr_in)); if (connect_result == -1) { struct pollfd poll_fd = { .fd = socket_fd, .events = POLLWRNORM, .revents = 0}; - poll(&poll_fd, 1, 100); + TEST(poll(&poll_fd, 1, 100) != -1); } } @@ -104,12 +107,12 @@ void test_udp_client() { if (bytes_sent == -1) { struct pollfd poll_fd = { .fd = server_socket_fd, .events = POLLWRNORM, .revents = 0}; - poll(&poll_fd, 1, 100); + TEST(poll(&poll_fd, 1, 100) != -1); } if (bytes_received == -1) { struct pollfd poll_fd = { .fd = socket_fd, .events = POLLRDNORM, .revents = 0}; - poll(&poll_fd, 1, 100); + TEST(poll(&poll_fd, 1, 100) != -1); // Retry bytes_received = recv(socket_fd, client_buffer, BUFSIZE, 0); }