wiznet5k: Add support for nonblocking and settimeout.

Signed-off-by: Jared Hancock <jared@greezybacon.me>
pull/14265/head
Jared Hancock 2024-03-20 21:22:42 -05:00
rodzic 9d27183bde
commit 2e371503d6
2 zmienionych plików z 59 dodań i 12 usunięć

Wyświetl plik

@ -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) {

Wyświetl plik

@ -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