aboutsummaryrefslogtreecommitdiff
path: root/extmod/network_ninaw10.c
diff options
context:
space:
mode:
authoriabdalkader <i.abdalkader@gmail.com>2022-01-14 02:17:11 +0200
committerDamien George <damien@micropython.org>2022-01-21 13:30:48 +1100
commit9a61bc3aa78058bf222dec3f01ce3b90fa79108a (patch)
tree4458447ed0496a41c0e7d4c7801f234fb1264a9d /extmod/network_ninaw10.c
parent981664fd079a379dfd9749e9068781590813b401 (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.c38
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[] = {