diff options
author | iabdalkader <i.abdalkader@gmail.com> | 2022-01-14 02:17:11 +0200 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2022-01-21 13:30:48 +1100 |
commit | 9a61bc3aa78058bf222dec3f01ce3b90fa79108a (patch) | |
tree | 4458447ed0496a41c0e7d4c7801f234fb1264a9d /extmod/network_ninaw10.c | |
parent | 981664fd079a379dfd9749e9068781590813b401 (diff) |
extmod/network_ninaw10: Implement MP_STREAM_POLL in ioctl.
There is currently no function to query if the socket is writable.
Diffstat (limited to 'extmod/network_ninaw10.c')
-rw-r--r-- | extmod/network_ninaw10.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/extmod/network_ninaw10.c b/extmod/network_ninaw10.c index cba24ea94..c8fd0ce31 100644 --- a/extmod/network_ninaw10.c +++ b/extmod/network_ninaw10.c @@ -545,8 +545,42 @@ STATIC int network_ninaw10_socket_settimeout(mod_network_socket_obj_t *socket, m } STATIC int network_ninaw10_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno) { - *_errno = MP_EIO; - return -1; + mp_uint_t ret = 0; + uint8_t type; + + switch (socket->type) { + case MOD_NETWORK_SOCK_STREAM: + type = NINA_SOCKET_TYPE_TCP; + break; + + case MOD_NETWORK_SOCK_DGRAM: + type = NINA_SOCKET_TYPE_UDP; + break; + + default: + *_errno = MP_EINVAL; + return MP_STREAM_ERROR; + } + + if (request == MP_STREAM_POLL) { + if (arg & MP_STREAM_POLL_RD) { + uint16_t avail = 0; + if (nina_socket_avail(socket->fileno, type, &avail) != 0) { + *_errno = MP_EIO; + ret = MP_STREAM_ERROR; + } else if (avail) { + // Readable or accepted socket ready. + ret |= MP_STREAM_POLL_RD; + } + } + if (arg & MP_STREAM_POLL_WR) { + ret |= MP_STREAM_POLL_WR; + } + } else { + *_errno = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + return ret; } static const mp_rom_map_elem_t nina_locals_dict_table[] = { |