mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
WINC1500: Fix timeout bugs.
* Setting timeout to 0 (from MicroPython) makes the socket blocking instead of non-blocking. * Sockets were closed on recv/recvfrom timeout.
This commit is contained in:
parent
eff78c2990
commit
f648107bb9
@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <errno.h>
|
#include "mperrno.h"
|
||||||
|
|
||||||
#include "py/nlr.h"
|
#include "py/nlr.h"
|
||||||
#include "py/objtuple.h"
|
#include "py/objtuple.h"
|
||||||
@ -356,7 +356,7 @@ static int py_winc_socket_socket(mod_network_socket_obj_t *socket, int *_errno)
|
|||||||
uint8_t type;
|
uint8_t type;
|
||||||
|
|
||||||
if (socket->u_param.domain != MOD_NETWORK_AF_INET) {
|
if (socket->u_param.domain != MOD_NETWORK_AF_INET) {
|
||||||
*_errno = EAFNOSUPPORT;
|
*_errno = MP_EAFNOSUPPORT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +370,7 @@ static int py_winc_socket_socket(mod_network_socket_obj_t *socket, int *_errno)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
*_errno = EINVAL;
|
*_errno = MP_EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,7 +455,13 @@ static int py_winc_socket_connect(mod_network_socket_obj_t *socket, byte *ip, mp
|
|||||||
static mp_uint_t py_winc_socket_send(mod_network_socket_obj_t *socket, const byte *buf, mp_uint_t len, int *_errno)
|
static mp_uint_t py_winc_socket_send(mod_network_socket_obj_t *socket, const byte *buf, mp_uint_t len, int *_errno)
|
||||||
{
|
{
|
||||||
int ret = winc_socket_send(socket->fd, buf, len, socket->timeout);
|
int ret = winc_socket_send(socket->fd, buf, len, socket->timeout);
|
||||||
if (ret < 0) {
|
if (ret == SOCK_ERR_TIMEOUT) {
|
||||||
|
// The socket is Not closed on timeout when calling
|
||||||
|
// WINC1500 functions that actually accept a timeout.
|
||||||
|
*_errno = MP_ETIMEDOUT;
|
||||||
|
return 0;
|
||||||
|
} else if (ret < 0) {
|
||||||
|
// Close the socket on any other errors.
|
||||||
*_errno = ret;
|
*_errno = ret;
|
||||||
py_winc_socket_close(socket);
|
py_winc_socket_close(socket);
|
||||||
return -1;
|
return -1;
|
||||||
@ -466,7 +472,13 @@ static mp_uint_t py_winc_socket_send(mod_network_socket_obj_t *socket, const byt
|
|||||||
static mp_uint_t py_winc_socket_recv(mod_network_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno)
|
static mp_uint_t py_winc_socket_recv(mod_network_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno)
|
||||||
{
|
{
|
||||||
int ret = winc_socket_recv(socket->fd, buf, len, &socket->sockbuf, socket->timeout);
|
int ret = winc_socket_recv(socket->fd, buf, len, &socket->sockbuf, socket->timeout);
|
||||||
if (ret < 0) {
|
if (ret == SOCK_ERR_TIMEOUT) {
|
||||||
|
// The socket is Not closed on timeout when calling
|
||||||
|
// WINC1500 functions that actually accept a timeout.
|
||||||
|
*_errno = MP_ETIMEDOUT;
|
||||||
|
return 0;
|
||||||
|
} else if (ret < 0) {
|
||||||
|
// Close the socket on any other errors.
|
||||||
*_errno = ret;
|
*_errno = ret;
|
||||||
py_winc_socket_close(socket);
|
py_winc_socket_close(socket);
|
||||||
return -1;
|
return -1;
|
||||||
@ -493,7 +505,13 @@ static mp_uint_t py_winc_socket_recvfrom(mod_network_socket_obj_t *socket,
|
|||||||
sockaddr addr;
|
sockaddr addr;
|
||||||
int ret = winc_socket_recvfrom(socket->fd, buf, len, &addr, socket->timeout);
|
int ret = winc_socket_recvfrom(socket->fd, buf, len, &addr, socket->timeout);
|
||||||
UNPACK_SOCKADDR((&addr), ip, *port);
|
UNPACK_SOCKADDR((&addr), ip, *port);
|
||||||
if (ret < 0) {
|
if (ret == SOCK_ERR_TIMEOUT) {
|
||||||
|
// The socket is Not closed on timeout when calling
|
||||||
|
// WINC1500 functions that actually accept a timeout.
|
||||||
|
*_errno = MP_ETIMEDOUT;
|
||||||
|
return 0;
|
||||||
|
} else if (ret < 0) {
|
||||||
|
// Close the socket on any other errors.
|
||||||
*_errno = ret;
|
*_errno = ret;
|
||||||
py_winc_socket_close(socket);
|
py_winc_socket_close(socket);
|
||||||
return -1;
|
return -1;
|
||||||
@ -515,13 +533,21 @@ static int py_winc_socket_setsockopt(mod_network_socket_obj_t *socket, mp_uint_t
|
|||||||
|
|
||||||
static int py_winc_socket_settimeout(mod_network_socket_obj_t *socket, mp_uint_t timeout_ms, int *_errno)
|
static int py_winc_socket_settimeout(mod_network_socket_obj_t *socket, mp_uint_t timeout_ms, int *_errno)
|
||||||
{
|
{
|
||||||
|
if (timeout_ms == UINT32_MAX) {
|
||||||
|
// no timeout is given, set the socket to blocking mode.
|
||||||
|
timeout_ms = 0;
|
||||||
|
} else if (timeout_ms == 0) {
|
||||||
|
// non-blocking mode, set the timeout to a small number other than zero.
|
||||||
|
timeout_ms = 10;
|
||||||
|
} // otherwise, timeout is provided.
|
||||||
|
|
||||||
socket->timeout = timeout_ms;
|
socket->timeout = timeout_ms;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int py_winc_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno)
|
static int py_winc_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno)
|
||||||
{
|
{
|
||||||
*_errno = EIO;
|
*_errno = MP_EIO;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
#define WINC_MAX_PSK_LEN (65)
|
#define WINC_MAX_PSK_LEN (65)
|
||||||
#define WINC_MAX_BOARD_NAME_LEN (33)
|
#define WINC_MAX_BOARD_NAME_LEN (33)
|
||||||
#define WINC_SOCKBUF_SIZE (1400)
|
#define WINC_SOCKBUF_SIZE (1400)
|
||||||
|
#define WINC_REQUEST_TIMEOUT (5000)
|
||||||
|
|
||||||
#define MAKE_SOCKADDR(addr, ip, port) \
|
#define MAKE_SOCKADDR(addr, ip, port) \
|
||||||
struct sockaddr addr; \
|
struct sockaddr addr; \
|
||||||
|
|||||||
@ -410,8 +410,9 @@ static int winc_async_request(uint8_t msg_type, void *ret, uint32_t timeout)
|
|||||||
while (async_request_done == false) {
|
while (async_request_done == false) {
|
||||||
// Handle pending events from network controller.
|
// Handle pending events from network controller.
|
||||||
m2m_wifi_handle_events(NULL);
|
m2m_wifi_handle_events(NULL);
|
||||||
|
// timeout == 0 in blocking mode.
|
||||||
if (timeout && ((HAL_GetTick() - tick_start) >= timeout)) {
|
if (timeout && ((HAL_GetTick() - tick_start) >= timeout)) {
|
||||||
return -ETIMEDOUT;
|
return SOCK_ERR_TIMEOUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -699,14 +700,14 @@ int winc_gethostbyname(const char *name, uint8_t *out_ip)
|
|||||||
uint32_t ip=0;
|
uint32_t ip=0;
|
||||||
ret = WINC1500_EXPORT(gethostbyname)((uint8_t*) name);
|
ret = WINC1500_EXPORT(gethostbyname)((uint8_t*) name);
|
||||||
if (ret == SOCK_ERR_NO_ERROR) {
|
if (ret == SOCK_ERR_NO_ERROR) {
|
||||||
ret = winc_async_request(0, &ip, 5000);
|
ret = winc_async_request(0, &ip, WINC_REQUEST_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ip == 0) {
|
if (ip == 0) {
|
||||||
// unknown host
|
// unknown host
|
||||||
return -ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
out_ip[0] = ip;
|
out_ip[0] = ip;
|
||||||
@ -733,7 +734,7 @@ int winc_socket_bind(int fd, sockaddr *addr)
|
|||||||
int ret = WINC1500_EXPORT(bind)(fd, addr, sizeof(*addr));
|
int ret = WINC1500_EXPORT(bind)(fd, addr, sizeof(*addr));
|
||||||
if (ret == SOCK_ERR_NO_ERROR) {
|
if (ret == SOCK_ERR_NO_ERROR) {
|
||||||
// Do async request
|
// Do async request
|
||||||
ret = winc_async_request(SOCKET_MSG_BIND, &ret, 1000);
|
ret = winc_async_request(SOCKET_MSG_BIND, &ret, WINC_REQUEST_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -745,7 +746,7 @@ int winc_socket_listen(int fd, uint32_t backlog)
|
|||||||
int ret = WINC1500_EXPORT(listen)(fd, backlog);
|
int ret = WINC1500_EXPORT(listen)(fd, backlog);
|
||||||
if (ret == SOCK_ERR_NO_ERROR) {
|
if (ret == SOCK_ERR_NO_ERROR) {
|
||||||
// Do async request
|
// Do async request
|
||||||
ret = winc_async_request(SOCKET_MSG_LISTEN, &ret, 1000);
|
ret = winc_async_request(SOCKET_MSG_LISTEN, &ret, WINC_REQUEST_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user