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 <zhanghongyu@xiaomi.com>
This commit is contained in:
parent
aee45c9c43
commit
06a10202af
@ -496,7 +496,8 @@ out:
|
|||||||
retr = usrsock_rpmsg_send_ack(ept, events, req->head.xid, ret);
|
retr = usrsock_rpmsg_send_ack(ept, events, req->head.xid, ret);
|
||||||
if (retr >= 0 && events == 0)
|
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)
|
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)
|
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;
|
return retr;
|
||||||
@ -1054,16 +1056,21 @@ static void usrsock_rpmsg_poll_setup(FAR struct pollfd *pfds,
|
|||||||
|
|
||||||
if (events)
|
if (events)
|
||||||
{
|
{
|
||||||
if (!pfds->events)
|
if (pfds->events)
|
||||||
{
|
{
|
||||||
|
ret = psock_poll(psock, pfds, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
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->revents = 0;
|
||||||
pfds->events = events;
|
pfds->events = events;
|
||||||
ret = psock_poll(psock, pfds, true);
|
ret = psock_poll(psock, pfds, true);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pfds->events = events;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
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)
|
if (events != 0)
|
||||||
{
|
{
|
||||||
|
usrsock_rpmsg_poll_setup(pfds, pfds->events);
|
||||||
usrsock_rpmsg_send_event(priv->epts[pfds->fd], pfds->fd, events);
|
usrsock_rpmsg_send_event(priv->epts[pfds->fd], pfds->fd, events);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user