You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/08/26 12:58:17 UTC
[incubator-nuttx] 01/02: net: remove pvconn reference from all devif callback
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/incubator-nuttx.git
commit ea621599fd5502d9bcffeae7723f66797ebd72cc
Author: chao.an <an...@xiaomi.com>
AuthorDate: Thu Aug 25 20:15:56 2022 +0800
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 <an...@xiaomi.com>
---
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)
{