net: remove pvconn reference from all devif callback
Do not use 'pvconn' argument to get the connection pointer since pvconn is normally NULL for some events like NETDEV_DOWN. Instead, the connection pointer can be reliably obtained from the corresponding private pointer. Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
parent
1ad066955f
commit
ea621599fd
@ -76,7 +76,7 @@
|
||||
|
||||
struct sixlowpan_send_s
|
||||
{
|
||||
FAR struct socket *s_sock; /* Internal socket reference */
|
||||
FAR struct tcp_conn_s *s_conn; /* Internal connect reference */
|
||||
FAR struct devif_callback_s *s_cb; /* Reference to callback
|
||||
* instance */
|
||||
sem_t s_waitsem; /* Supports waiting for
|
||||
@ -305,7 +305,7 @@ static uint16_t tcp_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct sixlowpan_send_s *sinfo = (FAR struct sixlowpan_send_s *)pvpriv;
|
||||
FAR struct tcp_conn_s *conn = (FAR struct tcp_conn_s *)pvconn;
|
||||
FAR struct tcp_conn_s *conn = sinfo->s_conn;
|
||||
struct ipv6tcp_hdr_s ipv6tcp;
|
||||
int ret;
|
||||
|
||||
@ -391,8 +391,6 @@ static uint16_t tcp_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
else if ((flags & TCP_DISCONN_EVENTS) != 0)
|
||||
{
|
||||
FAR struct socket *psock = sinfo->s_sock;
|
||||
|
||||
nwarn("WARNING: Lost connection\n");
|
||||
|
||||
/* We could get here recursively through the callback actions of
|
||||
@ -400,7 +398,6 @@ static uint16_t tcp_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
* already been disconnected.
|
||||
*/
|
||||
|
||||
DEBUGASSERT(psock != NULL);
|
||||
if (_SS_ISCONNECTED(conn->sconn.s_flags))
|
||||
{
|
||||
/* Report the disconnection event to all socket clones */
|
||||
@ -620,7 +617,7 @@ static int sixlowpan_send_packet(FAR struct socket *psock,
|
||||
nxsem_init(&sinfo.s_waitsem, 0, 0);
|
||||
nxsem_set_protocol(&sinfo.s_waitsem, SEM_PRIO_NONE);
|
||||
|
||||
sinfo.s_sock = psock;
|
||||
sinfo.s_conn = conn;
|
||||
sinfo.s_result = -EBUSY;
|
||||
sinfo.s_destmac = destmac;
|
||||
sinfo.s_buf = buf;
|
||||
|
@ -301,6 +301,10 @@ struct tcp_conn_s
|
||||
FAR struct devif_callback_s *connevents;
|
||||
FAR struct devif_callback_s *connevents_tail;
|
||||
|
||||
/* Reference to TCP close callback instance */
|
||||
|
||||
FAR struct devif_callback_s *clscb;
|
||||
|
||||
#if defined(CONFIG_NET_TCP_WRITE_BUFFERS)
|
||||
/* Callback instance for TCP send() */
|
||||
|
||||
|
@ -69,8 +69,7 @@ static uint16_t tcp_close_eventhandler(FAR struct net_driver_s *dev,
|
||||
FAR void *pvconn, FAR void *pvpriv,
|
||||
uint16_t flags)
|
||||
{
|
||||
FAR struct tcp_conn_s *conn = pvconn;
|
||||
FAR struct devif_callback_s *cb = pvpriv;
|
||||
FAR struct tcp_conn_s *conn = pvpriv;
|
||||
|
||||
ninfo("flags: %04x\n", flags);
|
||||
|
||||
@ -177,7 +176,7 @@ static uint16_t tcp_close_eventhandler(FAR struct net_driver_s *dev,
|
||||
return flags;
|
||||
|
||||
end_wait:
|
||||
tcp_callback_free(conn, cb);
|
||||
tcp_callback_free(conn, conn->clscb);
|
||||
|
||||
/* Free network resources */
|
||||
|
||||
@ -253,7 +252,6 @@ static inline void tcp_close_txnotify(FAR struct socket *psock,
|
||||
static inline int tcp_close_disconnect(FAR struct socket *psock)
|
||||
{
|
||||
FAR struct tcp_conn_s *conn;
|
||||
FAR struct devif_callback_s *cb;
|
||||
int ret = OK;
|
||||
|
||||
/* Interrupts are disabled here to avoid race conditions */
|
||||
@ -306,13 +304,13 @@ static inline int tcp_close_disconnect(FAR struct socket *psock)
|
||||
|
||||
if ((conn->tcpstateflags == TCP_ESTABLISHED ||
|
||||
conn->tcpstateflags == TCP_LAST_ACK) &&
|
||||
(cb = tcp_callback_alloc(conn)) != NULL)
|
||||
(conn->clscb = tcp_callback_alloc(conn)) != NULL)
|
||||
{
|
||||
/* Set up to receive TCP data event callbacks */
|
||||
|
||||
cb->flags = (TCP_NEWDATA | TCP_POLL | TCP_DISCONN_EVENTS);
|
||||
cb->event = tcp_close_eventhandler;
|
||||
cb->priv = cb; /* reference for event handler to free cb */
|
||||
conn->clscb->flags = TCP_NEWDATA | TCP_POLL | TCP_DISCONN_EVENTS;
|
||||
conn->clscb->event = tcp_close_eventhandler;
|
||||
conn->clscb->priv = conn; /* reference for event handler to free cb */
|
||||
|
||||
/* Notify the device driver of the availability of TX data */
|
||||
|
||||
|
@ -74,7 +74,7 @@ enum usrsock_conn_state_e
|
||||
|
||||
struct usrsock_poll_s
|
||||
{
|
||||
FAR struct socket *psock; /* Needed to handle loss of connection */
|
||||
FAR struct usrsock_conn_s *conn; /* Needed to handle loss of connection */
|
||||
struct pollfd *fds; /* Needed to handle poll events */
|
||||
FAR struct devif_callback_s *cb; /* Needed to teardown the poll */
|
||||
};
|
||||
|
@ -42,7 +42,7 @@ static uint16_t accept_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_data_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->reqstate.conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -47,7 +47,7 @@ static uint16_t bind_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -47,7 +47,7 @@ static uint16_t close_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -47,7 +47,7 @@ static uint16_t connect_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ static uint16_t getpeername_event(FAR struct net_driver_s *dev,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_data_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->reqstate.conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ static uint16_t getsockname_event(FAR struct net_driver_s *dev,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_data_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->reqstate.conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -49,7 +49,7 @@ static uint16_t getsockopt_event(FAR struct net_driver_s *dev,
|
||||
uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_data_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->reqstate.conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -49,7 +49,7 @@ static uint16_t ioctl_event(FAR struct net_driver_s *dev,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_data_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->reqstate.conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -42,7 +42,7 @@ static uint16_t listen_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -49,10 +49,10 @@ static uint16_t poll_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_poll_s *info = (FAR struct usrsock_poll_s *)pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = info->conn;
|
||||
pollevent_t eventset = 0;
|
||||
|
||||
DEBUGASSERT(!info || (info->psock && info->fds));
|
||||
DEBUGASSERT(!info || info->fds);
|
||||
|
||||
if (info == NULL)
|
||||
{
|
||||
@ -161,7 +161,7 @@ static int usrsock_pollsetup(FAR struct socket *psock,
|
||||
/* Find a container to hold the poll information */
|
||||
|
||||
info = conn->pollinfo;
|
||||
while (info->psock != NULL)
|
||||
while (info->conn != NULL)
|
||||
{
|
||||
if (++info >= &conn->pollinfo[CONFIG_NET_USRSOCK_NPOLLWAITERS])
|
||||
{
|
||||
@ -181,9 +181,9 @@ static int usrsock_pollsetup(FAR struct socket *psock,
|
||||
|
||||
/* Initialize the poll info container */
|
||||
|
||||
info->psock = psock;
|
||||
info->fds = fds;
|
||||
info->cb = cb;
|
||||
info->conn = conn;
|
||||
info->fds = fds;
|
||||
info->cb = cb;
|
||||
|
||||
/* Initialize the callback structure. Save the reference to the info
|
||||
* structure as callback private data so that it will be available during
|
||||
@ -327,7 +327,7 @@ static int usrsock_pollteardown(FAR struct socket *psock,
|
||||
|
||||
/* Then free the poll info container */
|
||||
|
||||
info->psock = NULL;
|
||||
info->conn = NULL;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
@ -48,7 +48,7 @@ static uint16_t recvfrom_event(FAR struct net_driver_s *dev,
|
||||
uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_data_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->reqstate.conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -47,7 +47,7 @@ static uint16_t sendto_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -49,7 +49,7 @@ static uint16_t setsockopt_event(FAR struct net_driver_s *dev,
|
||||
uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ static uint16_t socket_event(FAR struct net_driver_s *dev, FAR void *pvconn,
|
||||
FAR void *pvpriv, uint16_t flags)
|
||||
{
|
||||
FAR struct usrsock_reqstate_s *pstate = pvpriv;
|
||||
FAR struct usrsock_conn_s *conn = pvconn;
|
||||
FAR struct usrsock_conn_s *conn = pstate->conn;
|
||||
|
||||
if (flags & USRSOCK_EVENT_ABORT)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user