diff options
author | Damien George <damien.p.george@gmail.com> | 2016-12-02 16:41:51 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-12-02 16:41:51 +1100 |
commit | cb53226b0cda3a69331138fee4936f67f72da76d (patch) | |
tree | 7c921ab54238d60592f860d8ea4f8d88163e7b67 /extmod/modlwip.c | |
parent | 2d329c4a56580e17781febbfe6e42038fc3d9d03 (diff) | |
download | micropython-cb53226b0cda3a69331138fee4936f67f72da76d.tar.gz micropython-cb53226b0cda3a69331138fee4936f67f72da76d.zip |
extmod/modlwip: Add ioctl method to socket, with poll implementation.
Implementation of polling may need further fine tuning, but basic
functionality works (tested on esp8266).
Diffstat (limited to 'extmod/modlwip.c')
-rw-r--r-- | extmod/modlwip.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/extmod/modlwip.c b/extmod/modlwip.c index 11ba6e4231..5bd498dcff 100644 --- a/extmod/modlwip.c +++ b/extmod/modlwip.c @@ -1127,6 +1127,34 @@ STATIC mp_uint_t lwip_socket_write(mp_obj_t self_in, const void *buf, mp_uint_t return MP_STREAM_ERROR; } +STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) { + lwip_socket_obj_t *socket = self_in; + mp_uint_t ret; + + if (request == MP_STREAM_POLL) { + uintptr_t flags = arg; + ret = 0; + + if (flags & MP_STREAM_POLL_RD && socket->incoming.pbuf != NULL) { + ret |= MP_STREAM_POLL_RD; + } + + if (flags & MP_STREAM_POLL_WR && tcp_sndbuf(socket->pcb.tcp) > 0) { + ret |= MP_STREAM_POLL_WR; + } + + if (flags & MP_STREAM_POLL_HUP && socket->state == STATE_PEER_CLOSED) { + ret |= MP_STREAM_POLL_HUP; + } + + } else { + *errcode = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + + return ret; +} + STATIC const mp_map_elem_t lwip_socket_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&lwip_socket_close_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&lwip_socket_close_obj }, @@ -1153,6 +1181,7 @@ STATIC MP_DEFINE_CONST_DICT(lwip_socket_locals_dict, lwip_socket_locals_dict_tab STATIC const mp_stream_p_t lwip_socket_stream_p = { .read = lwip_socket_read, .write = lwip_socket_write, + .ioctl = lwip_socket_ioctl, }; STATIC const mp_obj_type_t lwip_socket_type = { |