extmod/modlwip: Still process remaining incoming data of a closed socket.

It can happen that a socket gets closed while the pbuf is not completely
drained by the application.  It can also happen that a new pbuf comes in
via the recv callback, and then a "peer closed" event comes via the same
callback (pbuf=NULL) before the previous event has been handled.  In both
cases the socket is closed but there is remaining data.  This patch makes
sure such data is passed to the application.
This commit is contained in:
Damien George 2015-12-30 22:49:50 +00:00 committed by Paul Sokolovsky
parent 6d2e9e70b3
commit 4f64f6bfd3
1 changed files with 4 additions and 6 deletions

View File

@ -384,11 +384,6 @@ STATIC mp_uint_t lwip_tcp_send(lwip_socket_obj_t *socket, const byte *buf, mp_ui
// Helper function for recv/recvfrom to handle TCP packets // Helper function for recv/recvfrom to handle TCP packets
STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) { STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) {
if (socket->state == STATE_PEER_CLOSED) {
return 0;
}
if (socket->incoming.pbuf == NULL) { if (socket->incoming.pbuf == NULL) {
mp_uint_t start = mp_hal_ticks_ms(); mp_uint_t start = mp_hal_ticks_ms();
while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == NULL) { while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == NULL) {
@ -399,7 +394,10 @@ STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_
poll_sockets(); poll_sockets();
} }
if (socket->state == STATE_PEER_CLOSED) { if (socket->state == STATE_PEER_CLOSED) {
return 0; if (socket->incoming.pbuf == NULL) {
// socket closed and no data left in buffer
return 0;
}
} else if (socket->state != STATE_CONNECTED) { } else if (socket->state != STATE_CONNECTED) {
*_errno = -socket->state; *_errno = -socket->state;
return -1; return -1;