This is an automated email from the ASF dual-hosted git repository.
xiaoxiang 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 06a10202af usrsock_server: fix issues with usrsock_rpmsg_sendto_handler
06a10202af is described below
commit 06a10202af23181ce0629c5067d822a1d949d109
Author: zhanghongyu <[email protected]>
AuthorDate: Thu May 11 21:25:02 2023 +0800
usrsock_server: fix issues with usrsock_rpmsg_sendto_handler
If the current poll setup only has POLLIN, adding POLLOUT does not cause the
protocol stack to refocus on flags such as TCP_ACK or UDP_POLL, the user is
not notified when flags for POLLOUT relationships appear and vice versa,
so we have to call poll_setup again.
Signed-off-by: zhanghongyu <[email protected]>
---
drivers/usrsock/usrsock_rpmsg_server.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/drivers/usrsock/usrsock_rpmsg_server.c
b/drivers/usrsock/usrsock_rpmsg_server.c
index fd6b6baa6e..26a49d6c92 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -496,7 +496,8 @@ out:
retr = usrsock_rpmsg_send_ack(ept, events, req->head.xid, ret);
if (retr >= 0 && events == 0)
{
- usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid], POLLOUT);
+ usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid],
+ priv->pfds[req->usockid].events | POLLOUT);
}
if (priv->iov[0].iov_base)
@@ -640,7 +641,8 @@ static int usrsock_rpmsg_recvfrom_handler(FAR struct
rpmsg_endpoint *ept,
if (retr >= 0 && events == 0)
{
- usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid], POLLIN);
+ usrsock_rpmsg_poll_setup(&priv->pfds[req->usockid],
+ priv->pfds[req->usockid].events | POLLIN);
}
return retr;
@@ -1054,15 +1056,20 @@ static void usrsock_rpmsg_poll_setup(FAR struct pollfd
*pfds,
if (events)
{
- if (!pfds->events)
+ if (pfds->events)
{
- pfds->revents = 0;
- pfds->events = events;
- ret = psock_poll(psock, pfds, true);
+ ret = psock_poll(psock, pfds, false);
}
- else
+
+ if (ret >= 0)
{
+ /* The protocol stack monitor flag is different when the events is
+ * POLLIN or POLLOUT, so we have to call poll_setup again.
+ */
+
+ pfds->revents = 0;
pfds->events = events;
+ ret = psock_poll(psock, pfds, true);
}
}
else
@@ -1127,13 +1134,9 @@ static void usrsock_rpmsg_poll_cb(FAR struct pollfd
*pfds)
}
}
- if (!(pfds->events & (POLLIN | POLLOUT)))
- {
- usrsock_rpmsg_poll_setup(pfds, 0);
- }
-
if (events != 0)
{
+ usrsock_rpmsg_poll_setup(pfds, pfds->events);
usrsock_rpmsg_send_event(priv->epts[pfds->fd], pfds->fd, events);
}