You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2023/01/28 06:07:04 UTC

[nuttx] branch master updated: socket:return -EAGAIN if timeout happends in psock_tcp_send

This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new fbe641a916 socket:return -EAGAIN if timeout happends in psock_tcp_send
fbe641a916 is described below

commit fbe641a9164ee04919f172a712f3845e47263d7d
Author: liangchaozhong <li...@xiaomi.com>
AuthorDate: Thu Oct 27 16:45:30 2022 +0800

    socket:return -EAGAIN if timeout happends in psock_tcp_send
    
    psock_tcp_send will enter busyloop state when no IOB keeps at unavailable state
    when the socket is blocking socket and this will cause WDT.
    According to socket's manpage, -1 should be returned while errno set to EAGAIN
    if send/recv timeout was set.
    
    Here's the description:
    SO_RCVTIMEO and SO_SNDTIMEO
    Specify the receiving or sending timeouts until reporting an error. The argument is a struct timeval. If an input or output function blocks for this period of time, and data has been sent or received, the return value of that function will be the amount of data transferred; if no data has been transferred and the timeout has been reached then -1 is returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if the socket was specified to be nonblocking. I [...]
    
    Signed-off-by: liangchaozhong <li...@xiaomi.com>
---
 net/tcp/tcp_send_buffered.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/net/tcp/tcp_send_buffered.c b/net/tcp/tcp_send_buffered.c
index 62651169c5..3c1d35016f 100644
--- a/net/tcp/tcp_send_buffered.c
+++ b/net/tcp/tcp_send_buffered.c
@@ -1549,6 +1549,12 @@ ssize_t psock_tcp_send(FAR struct socket *psock, FAR const void *buf,
             {
               iob_free_chain(iob);
             }
+          else
+            {
+              nerr("ERROR: no IOB available\n");
+              ret = -EAGAIN;
+              goto errout_with_lock;
+            }
         }
 
       /* Dump I/O buffer chain */