kopia lustrzana https://github.com/micropython/micropython
wiznet5k: Add support for nonblocking and settimeout.
Signed-off-by: Jared Hancock <jared@greezybacon.me>pull/14265/head
rodzic
9d27183bde
commit
2e371503d6
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue