net/rpmsg: add nonblock connect(2) support

Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
chao.an
2021-08-19 22:25:44 -07:00
committed by Xiang Xiao
parent 498830d3f4
commit c19edbd08e
+23 -9
View File
@@ -91,6 +91,7 @@ struct rpmsg_socket_conn_s
uint32_t recvlen; uint32_t recvlen;
FAR struct circbuf_s recvbuf; FAR struct circbuf_s recvbuf;
FAR struct socket *psock;
FAR struct rpmsg_socket_conn_s *next; FAR struct rpmsg_socket_conn_s *next;
/* server listen-scoket listening: backlog > 0; /* server listen-scoket listening: backlog > 0;
@@ -291,7 +292,10 @@ static int rpmsg_socket_ept_cb(FAR struct rpmsg_endpoint *ept,
if (head->cmd == RPMSG_SOCKET_CMD_SYNC) if (head->cmd == RPMSG_SOCKET_CMD_SYNC)
{ {
conn->sendsize = head->size; conn->sendsize = head->size;
conn->psock->s_flags |= _SF_CONNECTED;
_SO_SETERRNO(conn->psock, OK);
rpmsg_socket_post(&conn->sendsem); rpmsg_socket_post(&conn->sendsem);
rpmsg_socket_pollnotify(conn, POLLOUT);
} }
else else
{ {
@@ -508,6 +512,7 @@ static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
} }
tmp->next = new; tmp->next = new;
new->psock = server->psock;
rpmsg_socket_unlock(&server->recvlock); rpmsg_socket_unlock(&server->recvlock);
@@ -568,6 +573,7 @@ static int rpmsg_socket_setup(FAR struct socket *psock, int protocol)
} }
psock->s_conn = conn; psock->s_conn = conn;
conn->psock = psock;
return 0; return 0;
} }
@@ -647,16 +653,21 @@ static int rpmsg_socket_connect_internal(FAR struct socket *psock)
if (conn->sendsize == 0) if (conn->sendsize == 0)
{ {
if (_SS_ISNONBLOCK(psock->s_flags))
{
return -EINPROGRESS;
}
ret = net_timedwait(&conn->sendsem, ret = net_timedwait(&conn->sendsem,
_SO_TIMEOUT(psock->s_rcvtimeo)); _SO_TIMEOUT(psock->s_rcvtimeo));
}
if (ret < 0) if (ret < 0)
{ {
rpmsg_unregister_callback(conn, rpmsg_unregister_callback(conn,
rpmsg_socket_device_created, rpmsg_socket_device_created,
rpmsg_socket_device_destroy, rpmsg_socket_device_destroy,
rpmsg_socket_device_connect); rpmsg_socket_device_connect);
}
} }
return ret; return ret;
@@ -836,6 +847,11 @@ static int rpmsg_socket_poll(FAR struct socket *psock,
rpmsg_socket_unlock(&conn->recvlock); rpmsg_socket_unlock(&conn->recvlock);
} }
else if (!_SS_ISCONNECTED(psock->s_flags) &&
_SS_ISNONBLOCK(psock->s_flags))
{
ret = OK;
}
else else
{ {
ret = -EPERM; ret = -EPERM;
@@ -1125,8 +1141,6 @@ static ssize_t rpmsg_socket_recvmsg(FAR struct socket *psock,
{ {
return ret; return ret;
} }
psock->s_flags |= _SF_CONNECTED;
} }
if (!_SS_ISCONNECTED(psock->s_flags)) if (!_SS_ISCONNECTED(psock->s_flags))