From 9ac98f21dc1f63c2dbc4828297adcb36c760efff Mon Sep 17 00:00:00 2001 From: ligd Date: Fri, 11 Dec 2020 14:38:19 +0800 Subject: [PATCH] net/rpmsgsocket: fix connect timeout when remote not ready force connect to block mode Change-Id: I458f806411c93def0e64596f8e1c1680c485b298 Signed-off-by: ligd --- net/rpmsg/rpmsg_sockif.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/net/rpmsg/rpmsg_sockif.c b/net/rpmsg/rpmsg_sockif.c index d622e542813..5e4355a40d8 100644 --- a/net/rpmsg/rpmsg_sockif.c +++ b/net/rpmsg/rpmsg_sockif.c @@ -612,6 +612,8 @@ static int rpmsg_socket_listen(FAR struct socket *psock, int backlog) static int rpmsg_socket_connect_internal(FAR struct socket *psock) { FAR struct rpmsg_socket_conn_s *conn = psock->s_conn; + unsigned int timeout; + unsigned int tc; int ret; ret = circbuf_resize(&conn->recvbuf, CONFIG_NET_RPMSG_RXBUF_SIZE); @@ -629,30 +631,31 @@ static int rpmsg_socket_connect_internal(FAR struct socket *psock) return ret; } - ret = rpmsg_socket_sync(conn); - if (ret < 0) - { - goto out; - } + ret = -ETIMEDOUT; + timeout = _SO_TIMEOUT(psock->s_rcvtimeo); - ret = net_timedwait(&conn->sendsem, _SO_TIMEOUT(psock->s_rcvtimeo)); - if (!conn->ept.rdev) + for (tc = 0; tc < timeout * 1000;) { - ret = -ECONNRESET; + ret = rpmsg_socket_sync(conn); + if (ret != RPMSG_ERR_ADDR) + { + break; + } + + if (timeout != UINT_MAX) + { + tc += RPMSG_TICK_COUNT; + } } if (ret < 0) { - goto out; + rpmsg_unregister_callback(conn, + rpmsg_socket_device_created, + rpmsg_socket_device_destroy, + NULL); } - return 0; - -out: - rpmsg_unregister_callback(conn, - rpmsg_socket_device_created, - rpmsg_socket_device_destroy, - NULL); return ret; }