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:
chao.an 2022-08-25 20:15:56 +08:00 committed by Xiang Xiao
parent 1ad066955f
commit ea621599fd
18 changed files with 34 additions and 35 deletions

View File

@ -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;

View File

@ -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() */

View File

@ -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 */

View File

@ -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 */
};

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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;

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{