Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions libc-bottom-half/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ else()
sources/sockets_utils.c
sources/sockopt.c
sources/tcp.c
sources/udp.c
)
endif()

Expand All @@ -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()

Expand All @@ -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()

Expand Down
9 changes: 7 additions & 2 deletions libc-bottom-half/headers/private/wasi/sockets_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions libc-bottom-half/headers/private/wasi/udp.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@

#include <wasi/sockets_utils.h>

// 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,
Expand Down
5 changes: 0 additions & 5 deletions libc-bottom-half/sources/tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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__

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,18 @@
#include <wasi/udp.h>
#include <wasi/wasip2.h>

#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 {
Expand Down Expand Up @@ -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;
}
Expand All @@ -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:
Expand All @@ -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) {
Expand All @@ -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);
Expand All @@ -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) {
Expand All @@ -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);
}
Expand All @@ -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 =
Expand Down Expand Up @@ -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 {
Expand All @@ -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);
Expand Down Expand Up @@ -838,13 +855,15 @@ static int udp_fcntl_setfl(void *data, int flags) {
}
return 0;
}
#endif

static descriptor_vtable_t udp_vtable = {
.free = udp_free,

.set_blocking = udp_set_blocking,
.fstat = udp_fstat,

#ifdef __wasip2__
.bind = udp_bind,
.connect = udp_connect,
.getsockname = udp_getsockname,
Expand All @@ -858,6 +877,5 @@ static descriptor_vtable_t udp_vtable = {

.fcntl_getfl = udp_fcntl_getfl,
.fcntl_setfl = udp_fcntl_setfl,
#endif
};

#endif // __wasip2__
13 changes: 0 additions & 13 deletions libc-bottom-half/sources/wasip3_udp.c

This file was deleted.

9 changes: 6 additions & 3 deletions test/src/sockets-nonblocking-udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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);
}
Expand Down