net/icmp: Save poll device in icmp_poll_s
ICMP's conn->dev is changing in icmp_sendmsg, when sending to different address, or when error occurs (like NETDEV_DOWN). Then the poll callback cannot be dropped from previous dev in free, because the dev is wrong. So add dev to struct icmp_poll_s just like struct udp_poll_s. Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
This commit is contained in:
parent
c1bcf59a85
commit
f71fb738c5
@ -69,6 +69,7 @@ struct devif_callback_s; /* Forward reference */
|
|||||||
struct icmp_poll_s
|
struct icmp_poll_s
|
||||||
{
|
{
|
||||||
FAR struct socket *psock; /* IPPROTO_ICMP socket structure */
|
FAR struct socket *psock; /* IPPROTO_ICMP socket structure */
|
||||||
|
FAR struct net_driver_s *dev; /* Needed to free the callback structure */
|
||||||
FAR struct pollfd *fds; /* Needed to handle poll events */
|
FAR struct pollfd *fds; /* Needed to handle poll events */
|
||||||
FAR struct devif_callback_s *cb; /* Needed to teardown the poll */
|
FAR struct devif_callback_s *cb; /* Needed to teardown the poll */
|
||||||
};
|
};
|
||||||
|
@ -181,6 +181,7 @@ int icmp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
|
|||||||
/* Initialize the poll info container */
|
/* Initialize the poll info container */
|
||||||
|
|
||||||
info->psock = psock;
|
info->psock = psock;
|
||||||
|
info->dev = conn->dev;
|
||||||
info->fds = fds;
|
info->fds = fds;
|
||||||
info->cb = cb;
|
info->cb = cb;
|
||||||
|
|
||||||
@ -272,7 +273,7 @@ int icmp_pollteardown(FAR struct socket *psock, FAR struct pollfd *fds)
|
|||||||
{
|
{
|
||||||
/* Release the callback */
|
/* Release the callback */
|
||||||
|
|
||||||
icmp_callback_free(conn->dev, conn, info->cb);
|
icmp_callback_free(info->dev, conn, info->cb);
|
||||||
|
|
||||||
/* Release the poll/select data slot */
|
/* Release the poll/select data slot */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user