From ea621599fd5502d9bcffeae7723f66797ebd72cc Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Thu, 25 Aug 2022 20:15:56 +0800 Subject: [PATCH] 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 --- net/sixlowpan/sixlowpan_tcpsend.c | 9 +++------ net/tcp/tcp.h | 4 ++++ net/tcp/tcp_close.c | 14 ++++++-------- net/usrsock/usrsock.h | 2 +- net/usrsock/usrsock_accept.c | 2 +- net/usrsock/usrsock_bind.c | 2 +- net/usrsock/usrsock_close.c | 2 +- net/usrsock/usrsock_connect.c | 2 +- net/usrsock/usrsock_getpeername.c | 2 +- net/usrsock/usrsock_getsockname.c | 2 +- net/usrsock/usrsock_getsockopt.c | 2 +- net/usrsock/usrsock_ioctl.c | 2 +- net/usrsock/usrsock_listen.c | 2 +- net/usrsock/usrsock_poll.c | 14 +++++++------- net/usrsock/usrsock_recvmsg.c | 2 +- net/usrsock/usrsock_sendmsg.c | 2 +- net/usrsock/usrsock_setsockopt.c | 2 +- net/usrsock/usrsock_socket.c | 2 +- 18 files changed, 34 insertions(+), 35 deletions(-) diff --git a/net/sixlowpan/sixlowpan_tcpsend.c b/net/sixlowpan/sixlowpan_tcpsend.c index cd6e4009c6..0a8acd08f3 100644 --- a/net/sixlowpan/sixlowpan_tcpsend.c +++ b/net/sixlowpan/sixlowpan_tcpsend.c @@ -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; diff --git a/net/tcp/tcp.h b/net/tcp/tcp.h index e18b84d61e..57daa59536 100644 --- a/net/tcp/tcp.h +++ b/net/tcp/tcp.h @@ -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() */ diff --git a/net/tcp/tcp_close.c b/net/tcp/tcp_close.c index 50f466d430..d99096580b 100644 --- a/net/tcp/tcp_close.c +++ b/net/tcp/tcp_close.c @@ -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 */ diff --git a/net/usrsock/usrsock.h b/net/usrsock/usrsock.h index e429a08f08..d663d4661a 100644 --- a/net/usrsock/usrsock.h +++ b/net/usrsock/usrsock.h @@ -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 */ }; diff --git a/net/usrsock/usrsock_accept.c b/net/usrsock/usrsock_accept.c index a5e0dc093c..ca6f8ad5f9 100644 --- a/net/usrsock/usrsock_accept.c +++ b/net/usrsock/usrsock_accept.c @@ -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) { diff --git a/net/usrsock/usrsock_bind.c b/net/usrsock/usrsock_bind.c index 6a15930b5d..2b8905e562 100644 --- a/net/usrsock/usrsock_bind.c +++ b/net/usrsock/usrsock_bind.c @@ -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) { diff --git a/net/usrsock/usrsock_close.c b/net/usrsock/usrsock_close.c index 14b4da8957..f3148fb152 100644 --- a/net/usrsock/usrsock_close.c +++ b/net/usrsock/usrsock_close.c @@ -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) { diff --git a/net/usrsock/usrsock_connect.c b/net/usrsock/usrsock_connect.c index 1a671b66a5..46614aa1d3 100644 --- a/net/usrsock/usrsock_connect.c +++ b/net/usrsock/usrsock_connect.c @@ -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) { diff --git a/net/usrsock/usrsock_getpeername.c b/net/usrsock/usrsock_getpeername.c index 3fafe929cd..268ad38a43 100644 --- a/net/usrsock/usrsock_getpeername.c +++ b/net/usrsock/usrsock_getpeername.c @@ -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) { diff --git a/net/usrsock/usrsock_getsockname.c b/net/usrsock/usrsock_getsockname.c index 10f3f65f99..acabebe18f 100644 --- a/net/usrsock/usrsock_getsockname.c +++ b/net/usrsock/usrsock_getsockname.c @@ -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) { diff --git a/net/usrsock/usrsock_getsockopt.c b/net/usrsock/usrsock_getsockopt.c index 3e23efeccf..57032d093a 100644 --- a/net/usrsock/usrsock_getsockopt.c +++ b/net/usrsock/usrsock_getsockopt.c @@ -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) { diff --git a/net/usrsock/usrsock_ioctl.c b/net/usrsock/usrsock_ioctl.c index f77c563fd4..e541e1d617 100644 --- a/net/usrsock/usrsock_ioctl.c +++ b/net/usrsock/usrsock_ioctl.c @@ -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) { diff --git a/net/usrsock/usrsock_listen.c b/net/usrsock/usrsock_listen.c index 1d691ba32b..d9a7a79a66 100644 --- a/net/usrsock/usrsock_listen.c +++ b/net/usrsock/usrsock_listen.c @@ -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) { diff --git a/net/usrsock/usrsock_poll.c b/net/usrsock/usrsock_poll.c index 2dd4364415..91bcd059f9 100644 --- a/net/usrsock/usrsock_poll.c +++ b/net/usrsock/usrsock_poll.c @@ -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; diff --git a/net/usrsock/usrsock_recvmsg.c b/net/usrsock/usrsock_recvmsg.c index bcf87eb926..74c2092994 100644 --- a/net/usrsock/usrsock_recvmsg.c +++ b/net/usrsock/usrsock_recvmsg.c @@ -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) { diff --git a/net/usrsock/usrsock_sendmsg.c b/net/usrsock/usrsock_sendmsg.c index cc20b0698f..704d17faf0 100644 --- a/net/usrsock/usrsock_sendmsg.c +++ b/net/usrsock/usrsock_sendmsg.c @@ -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) { diff --git a/net/usrsock/usrsock_setsockopt.c b/net/usrsock/usrsock_setsockopt.c index 38788c5e7c..2a97acc65e 100644 --- a/net/usrsock/usrsock_setsockopt.c +++ b/net/usrsock/usrsock_setsockopt.c @@ -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) { diff --git a/net/usrsock/usrsock_socket.c b/net/usrsock/usrsock_socket.c index 0f6c3aadfc..df153140c0 100644 --- a/net/usrsock/usrsock_socket.c +++ b/net/usrsock/usrsock_socket.c @@ -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) {