Added socket send and recv timeout options (#1419)
Added socket send and recv timeout options with implementation for posix platform. This is part of a extending support for sockets in WASI. #1336. Also add sample that sets and reads back the send and receive timeouts using the native function binding.
This commit is contained in:
@ -1126,6 +1126,25 @@ wasi_sock_get_recv_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
return __WASI_ENOSYS;
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_get_recv_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
uint64_t *timeout_us)
|
||||
{
|
||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
||||
struct fd_table *curfds = NULL;
|
||||
|
||||
if (!wasi_ctx)
|
||||
return __WASI_EACCES;
|
||||
|
||||
if (!validate_native_addr(timeout_us, sizeof(uint64_t)))
|
||||
return __WASI_EINVAL;
|
||||
|
||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||
|
||||
return wasmtime_ssp_sock_get_recv_timeout(curfds, fd, timeout_us);
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_get_reuse_addr(wasm_exec_env_t exec_env, wasi_fd_t fd, uint8 *reuse)
|
||||
{
|
||||
@ -1145,6 +1164,25 @@ wasi_sock_get_send_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
return __WASI_ENOSYS;
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_get_send_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
uint64_t *timeout_us)
|
||||
{
|
||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
||||
struct fd_table *curfds = NULL;
|
||||
|
||||
if (!wasi_ctx)
|
||||
return __WASI_EACCES;
|
||||
|
||||
if (!validate_native_addr(timeout_us, sizeof(uint64_t)))
|
||||
return __WASI_EINVAL;
|
||||
|
||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||
|
||||
return wasmtime_ssp_sock_get_send_timeout(curfds, fd, timeout_us);
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_listen(wasm_exec_env_t exec_env, wasi_fd_t fd, uint32 backlog)
|
||||
{
|
||||
@ -1184,6 +1222,22 @@ wasi_sock_set_recv_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
return __WASI_ENOSYS;
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_set_recv_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
uint64_t timeout_us)
|
||||
{
|
||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
||||
struct fd_table *curfds = NULL;
|
||||
|
||||
if (!wasi_ctx)
|
||||
return __WASI_EACCES;
|
||||
|
||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||
|
||||
return wasmtime_ssp_sock_set_recv_timeout(curfds, fd, timeout_us);
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_set_reuse_addr(wasm_exec_env_t exec_env, wasi_fd_t fd, uint8 reuse)
|
||||
{
|
||||
@ -1203,6 +1257,22 @@ wasi_sock_set_send_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
return __WASI_ENOSYS;
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_set_send_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||
uint64_t timeout_us)
|
||||
{
|
||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
||||
struct fd_table *curfds = NULL;
|
||||
|
||||
if (!wasi_ctx)
|
||||
return __WASI_EACCES;
|
||||
|
||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||
|
||||
return wasmtime_ssp_sock_set_send_timeout(curfds, fd, timeout_us);
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_sock_recv(wasm_exec_env_t exec_env, wasi_fd_t sock, iovec_app_t *ri_data,
|
||||
uint32 ri_data_len, wasi_riflags_t ri_flags, uint32 *ro_data_len,
|
||||
@ -1427,17 +1497,21 @@ static NativeSymbol native_symbols_libc_wasi[] = {
|
||||
REG_NATIVE_FUNC(sock_close, "(i)i"),
|
||||
REG_NATIVE_FUNC(sock_connect, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_get_recv_buf_size, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_get_recv_timeout, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_get_reuse_addr, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_get_reuse_port, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_get_send_buf_size, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_get_send_timeout, "(i*)i"),
|
||||
REG_NATIVE_FUNC(sock_listen, "(ii)i"),
|
||||
REG_NATIVE_FUNC(sock_open, "(iii*)i"),
|
||||
REG_NATIVE_FUNC(sock_recv, "(i*ii**)i"),
|
||||
REG_NATIVE_FUNC(sock_send, "(i*ii*)i"),
|
||||
REG_NATIVE_FUNC(sock_set_recv_buf_size, "(ii)i"),
|
||||
REG_NATIVE_FUNC(sock_set_recv_timeout, "(iI)i"),
|
||||
REG_NATIVE_FUNC(sock_set_reuse_addr, "(ii)i"),
|
||||
REG_NATIVE_FUNC(sock_set_reuse_port, "(ii)i"),
|
||||
REG_NATIVE_FUNC(sock_set_send_buf_size, "(ii)i"),
|
||||
REG_NATIVE_FUNC(sock_set_send_timeout, "(iI)i"),
|
||||
REG_NATIVE_FUNC(sock_shutdown, "(ii)i"),
|
||||
REG_NATIVE_FUNC(sched_yield, "()i"),
|
||||
};
|
||||
|
||||
@ -1088,6 +1088,38 @@ __wasi_errno_t wasmtime_ssp_sock_shutdown(
|
||||
__wasi_fd_t sock
|
||||
) WASMTIME_SSP_SYSCALL_NAME(sock_shutdown) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_sock_set_recv_timeout(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_table *curfds,
|
||||
#endif
|
||||
__wasi_fd_t sock,
|
||||
uint64_t timeout_us
|
||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_recv_timeout) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_sock_get_recv_timeout(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_table *curfds,
|
||||
#endif
|
||||
__wasi_fd_t sock,
|
||||
uint64_t *timeout_us
|
||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_recv_timeout) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_sock_set_send_timeout(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_table *curfds,
|
||||
#endif
|
||||
__wasi_fd_t sock,
|
||||
uint64_t timeout_us
|
||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_send_timeout) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_sock_get_send_timeout(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_table *curfds,
|
||||
#endif
|
||||
__wasi_fd_t sock,
|
||||
uint64_t *timeout_us
|
||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_send_timeout) __attribute__((__warn_unused_result__));
|
||||
|
||||
__wasi_errno_t wasmtime_ssp_sched_yield(void)
|
||||
WASMTIME_SSP_SYSCALL_NAME(sched_yield) __attribute__((__warn_unused_result__));
|
||||
|
||||
|
||||
@ -3556,3 +3556,37 @@ addr_pool_destroy(struct addr_pool *addr_pool)
|
||||
cur = next;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef WASMTIME_SSP_STATIC_CURFDS
|
||||
#define WASMTIME_SSP_PASSTHROUGH_FD_TABLE struct fd_table *curfds,
|
||||
#else
|
||||
#define WASMTIME_SSP_PASSTHROUGH_FD_TABLE
|
||||
#endif
|
||||
|
||||
// Defines a function that passes through the socket option to the OS
|
||||
// implementation
|
||||
#define WASMTIME_SSP_PASSTHROUGH_SOCKET_OPTION(FUNC_NAME, OPTION_TYPE) \
|
||||
__wasi_errno_t wasmtime_ssp_sock_##FUNC_NAME( \
|
||||
WASMTIME_SSP_PASSTHROUGH_FD_TABLE __wasi_fd_t sock, \
|
||||
OPTION_TYPE option) \
|
||||
{ \
|
||||
struct fd_object *fo; \
|
||||
__wasi_errno_t error; \
|
||||
int ret; \
|
||||
error = fd_object_get(curfds, &fo, sock, 0, 0); \
|
||||
if (error != 0) \
|
||||
return error; \
|
||||
ret = os_socket_##FUNC_NAME(fd_number(fo), option); \
|
||||
fd_object_release(fo); \
|
||||
if (BHT_OK != ret) \
|
||||
return convert_errno(errno); \
|
||||
return __WASI_ESUCCESS; \
|
||||
}
|
||||
|
||||
WASMTIME_SSP_PASSTHROUGH_SOCKET_OPTION(set_send_timeout, uint64)
|
||||
WASMTIME_SSP_PASSTHROUGH_SOCKET_OPTION(get_send_timeout, uint64 *)
|
||||
WASMTIME_SSP_PASSTHROUGH_SOCKET_OPTION(set_recv_timeout, uint64)
|
||||
WASMTIME_SSP_PASSTHROUGH_SOCKET_OPTION(get_recv_timeout, uint64 *)
|
||||
|
||||
#undef WASMTIME_SSP_PASSTHROUGH_FD_TABLE
|
||||
#undef WASMTIME_SSP_PASSTHROUGH_SOCKET_OPTION
|
||||
|
||||
Reference in New Issue
Block a user