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) {
|
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)
|
// 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) {
|
if (ret < 0) {
|
||||||
wiznet5k_socket_close(socket);
|
wiznet5k_socket_close(socket);
|
||||||
*_errno = -ret;
|
*_errno = -ret;
|
||||||
|
@ -541,6 +548,10 @@ static int wiznet5k_socket_connect(mod_network_socket_obj_t *socket, byte *ip, m
|
||||||
*_errno = -ret;
|
*_errno = -ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (ret == SOCK_BUSY) {
|
||||||
|
*_errno = MP_EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// success
|
// success
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -557,6 +568,10 @@ static mp_uint_t wiznet5k_socket_send(mod_network_socket_obj_t *socket, const by
|
||||||
*_errno = -ret;
|
*_errno = -ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (ret == SOCK_BUSY) {
|
||||||
|
*_errno = MP_EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,6 +586,10 @@ static mp_uint_t wiznet5k_socket_recv(mod_network_socket_obj_t *socket, byte *bu
|
||||||
*_errno = -ret;
|
*_errno = -ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (ret == SOCK_BUSY) {
|
||||||
|
*_errno = MP_EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -591,6 +610,10 @@ static mp_uint_t wiznet5k_socket_sendto(mod_network_socket_obj_t *socket, const
|
||||||
*_errno = -ret;
|
*_errno = -ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (ret == SOCK_BUSY) {
|
||||||
|
*_errno = MP_EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,27 +628,47 @@ static mp_uint_t wiznet5k_socket_recvfrom(mod_network_socket_obj_t *socket, byte
|
||||||
*_errno = -ret;
|
*_errno = -ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (ret == SOCK_BUSY) {
|
||||||
|
*_errno = MP_EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return ret;
|
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) {
|
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
|
switch (opt) {
|
||||||
*_errno = MP_EINVAL;
|
// level: SOL_SOCKET
|
||||||
return -1;
|
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) {
|
static int wiznet5k_socket_settimeout(mod_network_socket_obj_t *socket, mp_uint_t timeout_ms, int *_errno) {
|
||||||
// TODO
|
uint8_t arg;
|
||||||
*_errno = MP_EINVAL;
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (timeout_ms == 0) {
|
if (timeout_ms == 0) {
|
||||||
// set non-blocking mode
|
// set non-blocking mode
|
||||||
uint8_t arg = SOCK_IO_NONBLOCK;
|
arg = SOCK_IO_NONBLOCK;
|
||||||
WIZCHIP_EXPORT(ctlsocket)(socket->fileno, CS_SET_IOMODE, &arg);
|
|
||||||
}
|
}
|
||||||
*/
|
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) {
|
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
|
#if MICROPY_PY_NETWORK_WIZNET5K
|
||||||
extern const struct _mp_obj_type_t mod_network_nic_type_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) },
|
#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
|
#else
|
||||||
#define MICROPY_HW_NIC_WIZNET5K
|
#define MICROPY_HW_NIC_WIZNET5K
|
||||||
#endif
|
#endif
|
||||||
|
|
Ładowanie…
Reference in New Issue