diff --git a/extmod/network_wiznet5k.c b/extmod/network_wiznet5k.c index b550f8c1f4..e4597fcc32 100644 --- a/extmod/network_wiznet5k.c +++ b/extmod/network_wiznet5k.c @@ -465,8 +465,15 @@ static void wiznet5k_socket_close(mod_network_socket_obj_t *socket) { } static int wiznet5k_socket_bind(mod_network_socket_obj_t *socket, byte *ip, mp_uint_t port, int *_errno) { + uint8_t flag = 0; + if (socket->timeout == 0) { + // Setup non-blocking mode + flag |= SOCK_IO_NONBLOCK; + } + // open the socket in server mode (if port != 0) - mp_int_t ret = WIZCHIP_EXPORT(socket)(socket->fileno, socket->type, port, 0); + mp_int_t ret = WIZCHIP_EXPORT(socket)(socket->fileno, socket->type, port, flag); + if (ret < 0) { wiznet5k_socket_close(socket); *_errno = -ret; @@ -541,6 +548,10 @@ static int wiznet5k_socket_connect(mod_network_socket_obj_t *socket, byte *ip, m *_errno = -ret; return -1; } + else if (ret == SOCK_BUSY) { + *_errno = MP_EAGAIN; + return -1; + } // success return 0; @@ -557,6 +568,10 @@ static mp_uint_t wiznet5k_socket_send(mod_network_socket_obj_t *socket, const by *_errno = -ret; return -1; } + else if (ret == SOCK_BUSY) { + *_errno = MP_EAGAIN; + return -1; + } return ret; } @@ -571,6 +586,10 @@ static mp_uint_t wiznet5k_socket_recv(mod_network_socket_obj_t *socket, byte *bu *_errno = -ret; return -1; } + else if (ret == SOCK_BUSY) { + *_errno = MP_EAGAIN; + return -1; + } return ret; } @@ -591,6 +610,10 @@ static mp_uint_t wiznet5k_socket_sendto(mod_network_socket_obj_t *socket, const *_errno = -ret; return -1; } + else if (ret == SOCK_BUSY) { + *_errno = MP_EAGAIN; + return -1; + } return ret; } @@ -605,27 +628,47 @@ static mp_uint_t wiznet5k_socket_recvfrom(mod_network_socket_obj_t *socket, byte *_errno = -ret; return -1; } + else if (ret == SOCK_BUSY) { + *_errno = MP_EAGAIN; + return -1; + } return ret; } static int wiznet5k_socket_setsockopt(mod_network_socket_obj_t *socket, mp_uint_t level, mp_uint_t opt, const void *optval, mp_uint_t optlen, int *_errno) { - // TODO - *_errno = MP_EINVAL; - return -1; + switch (opt) { + // level: SOL_SOCKET + case MOD_NETWORK_SO_REUSEADDR: + case MOD_NETWORK_SO_BROADCAST: + // Implied/not-required in Wiznet sockets + break; + + default: + *_errno = MP_EINVAL; + return -1; + } + + return 0; } static int wiznet5k_socket_settimeout(mod_network_socket_obj_t *socket, mp_uint_t timeout_ms, int *_errno) { - // TODO - *_errno = MP_EINVAL; - return -1; - - /* + uint8_t arg; if (timeout_ms == 0) { // set non-blocking mode - uint8_t arg = SOCK_IO_NONBLOCK; - WIZCHIP_EXPORT(ctlsocket)(socket->fileno, CS_SET_IOMODE, &arg); + arg = SOCK_IO_NONBLOCK; } - */ + else { + arg = SOCK_IO_BLOCK; + } + + mp_int_t ret = WIZCHIP_EXPORT(ctlsocket)(socket->fileno, CS_SET_IOMODE, &arg); + if (ret < 0) { + *_errno = -ret; + return -1; + } + + socket->timeout = timeout_ms; + return 0; } static int wiznet5k_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno) { diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h index a29692d0be..1f01a75058 100644 --- a/ports/rp2/mpconfigport.h +++ b/ports/rp2/mpconfigport.h @@ -218,6 +218,10 @@ extern const struct _mp_obj_type_t mod_network_nic_type_nina; #if MICROPY_PY_NETWORK_WIZNET5K extern const struct _mp_obj_type_t mod_network_nic_type_wiznet5k; #define MICROPY_HW_NIC_WIZNET5K { MP_ROM_QSTR(MP_QSTR_WIZNET5K), MP_ROM_PTR(&mod_network_nic_type_wiznet5k) }, +// This Network interface requires the extended socket state for timeouts and non-blocking +#ifndef MICROPY_PY_SOCKET_EXTENDED_STATE +#define MICROPY_PY_SOCKET_EXTENDED_STATE (1) +#endif #else #define MICROPY_HW_NIC_WIZNET5K #endif