From 813a2e6e6a3df9a26b5f6c89b13856f8e3e39e09 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Sun, 28 Aug 2016 17:51:02 +0200 Subject: [PATCH] Fix WINC socket_send. * Check sent bytes returned from async request. --- src/omv/py/py_winc.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/omv/py/py_winc.c b/src/omv/py/py_winc.c index ad5f40312..8179316c2 100644 --- a/src/omv/py/py_winc.c +++ b/src/omv/py/py_winc.c @@ -153,6 +153,8 @@ static void socket_callback(SOCKET sock, uint8_t msg_type, void *msg) // Message send. case SOCKET_MSG_SEND: case SOCKET_MSG_SENDTO: { + // Sent bytes set in msg. + *((int*) async_request_data) = *((int16_t*) msg); async_request_done = true; break; } @@ -491,20 +493,29 @@ static mp_uint_t winc_socket_send(mod_network_socket_obj_t *socket, const byte * while (bytes < len) { int n = MIN((len - bytes), SOCKET_BUFFER_MAX_LENGTH); - // do the send + // Send chunk and check HIF errors. int ret = WINC1500_EXPORT(send)(socket->fd, (uint8_t*)buf + bytes, n, socket->timeout); if (ret != SOCK_ERR_NO_ERROR) { - *_errno = ret; + *_errno = -ret; return -1; } + // Do async request. + async_request_data = &ret; async_request_done = false; // Wait for async request to finish. while (async_request_done == false) { // Handle pending events from network controller. m2m_wifi_handle_events(NULL); } - bytes += n; + + // Check sent bytes returned from async request. + if (ret <= 0) { + *_errno = -ret; + return -1; + } + + bytes += ret; } return bytes;