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).
This commit is contained in:
parent
2d329c4a56
commit
cb53226b0c
|
@ -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 = {
|
||||
|
|
Loading…
Reference in New Issue