From ef1d4580892f2350b8c6fb9c8e65d0d6e293cb46 Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Tue, 12 May 2020 14:17:32 +0200 Subject: [PATCH] lwip_sock: re-issue receive events if there are still received messages ... after `*_recv()` or `*_accept()` was called. This prevents a client from needing to call `*_recv()` or `*_accept()` in a loop. --- pkg/lwip/contrib/sock/lwip_sock.c | 7 +++++++ pkg/lwip/contrib/sock/tcp/lwip_sock_tcp.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/lwip/contrib/sock/lwip_sock.c b/pkg/lwip/contrib/sock/lwip_sock.c index 11680fd298..a65a9c4540 100644 --- a/pkg/lwip/contrib/sock/lwip_sock.c +++ b/pkg/lwip/contrib/sock/lwip_sock.c @@ -548,6 +548,13 @@ int lwip_sock_recv(struct netconn *conn, uint32_t timeout, struct netbuf **buf) /* unset flags */ #if LWIP_SO_RCVTIMEO netconn_set_recvtimeout(conn, 0); +#endif +#if IS_ACTIVE(SOCK_HAS_ASYNC) + lwip_sock_base_t *sock = netconn_get_callback_arg(conn); + + if (sock && sock->async_cb.gen && cib_avail(&conn->recvmbox.mbox.cib)) { + sock->async_cb.gen(sock, SOCK_ASYNC_MSG_RECV, sock->async_cb_arg); + } #endif return res; } diff --git a/pkg/lwip/contrib/sock/tcp/lwip_sock_tcp.c b/pkg/lwip/contrib/sock/tcp/lwip_sock_tcp.c index ae403a153a..c9764f25d8 100644 --- a/pkg/lwip/contrib/sock/tcp/lwip_sock_tcp.c +++ b/pkg/lwip/contrib/sock/tcp/lwip_sock_tcp.c @@ -254,6 +254,13 @@ int sock_tcp_accept(sock_tcp_queue_t *queue, sock_tcp_t **sock, } #if LWIP_SO_RCVTIMEO netconn_set_recvtimeout(queue->base.conn, 0); +#endif +#if IS_ACTIVE(SOCK_HAS_ASYNC) + if (queue->base.async_cb.gen && + cib_avail(&queue->base.conn->acceptmbox.mbox.cib)) { + queue->base.async_cb.gen(&queue->base, SOCK_ASYNC_CONN_RECV, + queue->base.async_cb_arg); + } #endif mutex_unlock(&queue->mutex); return res;