From 39e142243d630ee145d92ccf0c8153e147cb6f5e Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Mon, 7 Feb 2022 11:03:03 +0800 Subject: [PATCH] net/tcp/udp: move the send callback into tcp/udp structure Signed-off-by: chao.an --- include/nuttx/net/net.h | 7 ------- net/socket/socket.c | 3 --- net/tcp/tcp.h | 6 ++++++ net/tcp/tcp_close.c | 10 ++++------ net/tcp/tcp_send_buffered.c | 20 ++++++++++---------- net/udp/udp.h | 4 ++++ net/udp/udp_close.c | 6 +++--- net/udp/udp_sendto_buffered.c | 24 ++++++++++++------------ 8 files changed, 39 insertions(+), 41 deletions(-) diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h index c940e20f56..3c332fe5cc 100644 --- a/include/nuttx/net/net.h +++ b/include/nuttx/net/net.h @@ -264,13 +264,6 @@ struct socket /* Socket interface */ FAR const struct sock_intf_s *s_sockif; - -#if defined(CONFIG_NET_TCP_WRITE_BUFFERS) || \ - defined(CONFIG_NET_UDP_WRITE_BUFFERS) - /* Callback instance for TCP send() or UDP sendto() */ - - FAR struct devif_callback_s *s_sndcb; -#endif }; /**************************************************************************** diff --git a/net/socket/socket.c b/net/socket/socket.c index 5041ab4a86..01117e8191 100644 --- a/net/socket/socket.c +++ b/net/socket/socket.c @@ -87,9 +87,6 @@ int psock_socket(int domain, int type, int protocol, psock->s_domain = domain; psock->s_proto = protocol; psock->s_conn = NULL; -#if defined(CONFIG_NET_TCP_WRITE_BUFFERS) || defined(CONFIG_NET_UDP_WRITE_BUFFERS) - psock->s_sndcb = NULL; -#endif if (type & SOCK_NONBLOCK) { diff --git a/net/tcp/tcp.h b/net/tcp/tcp.h index 0c6e539b26..c4cbf5d68c 100644 --- a/net/tcp/tcp.h +++ b/net/tcp/tcp.h @@ -309,6 +309,12 @@ struct tcp_conn_s FAR struct devif_callback_s *connevents; FAR struct devif_callback_s *connevents_tail; +#if defined(CONFIG_NET_TCP_WRITE_BUFFERS) + /* Callback instance for TCP send() */ + + FAR struct devif_callback_s *sndcb; +#endif + /* accept() is called when the TCP logic has created a connection * * accept_private: This is private data that will be available to the diff --git a/net/tcp/tcp_close.c b/net/tcp/tcp_close.c index 87c2743b77..4d4385a081 100644 --- a/net/tcp/tcp_close.c +++ b/net/tcp/tcp_close.c @@ -161,18 +161,16 @@ static uint16_t tcp_close_eventhandler(FAR struct net_driver_s *dev, */ #ifdef CONFIG_NET_TCP_WRITE_BUFFERS - FAR struct socket *psock = pstate->cl_psock; - /* We don't need the send callback anymore. */ - if (psock->s_sndcb != NULL) + if (conn->sndcb != NULL) { - psock->s_sndcb->flags = 0; - psock->s_sndcb->event = NULL; + conn->sndcb->flags = 0; + conn->sndcb->event = NULL; /* The callback will be freed by tcp_free. */ - psock->s_sndcb = NULL; + conn->sndcb = NULL; } #endif diff --git a/net/tcp/tcp_send_buffered.c b/net/tcp/tcp_send_buffered.c index 894e9edbc5..a3fb67d3e0 100644 --- a/net/tcp/tcp_send_buffered.c +++ b/net/tcp/tcp_send_buffered.c @@ -238,10 +238,10 @@ static inline void psock_lost_connection(FAR struct socket *psock, /* Do not allow any further callbacks */ - if (psock->s_sndcb != NULL) + if (conn->sndcb != NULL) { - psock->s_sndcb->flags = 0; - psock->s_sndcb->event = NULL; + conn->sndcb->flags = 0; + conn->sndcb->event = NULL; } if (conn != NULL) @@ -414,7 +414,7 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev, { /* Report not connected */ - tcp_lost_connection(psock, psock->s_sndcb, flags); + tcp_lost_connection(psock, conn->sndcb, flags); } /* Free write buffers and terminate polling */ @@ -1142,14 +1142,14 @@ ssize_t psock_tcp_send(FAR struct socket *psock, FAR const void *buf, /* Allocate resources to receive a callback */ - if (psock->s_sndcb == NULL) + if (conn->sndcb == NULL) { - psock->s_sndcb = tcp_callback_alloc(conn); + conn->sndcb = tcp_callback_alloc(conn); } /* Test if the callback has been allocated */ - if (psock->s_sndcb == NULL) + if (conn->sndcb == NULL) { /* A buffer allocation error occurred */ @@ -1160,10 +1160,10 @@ ssize_t psock_tcp_send(FAR struct socket *psock, FAR const void *buf, /* Set up the callback in the connection */ - psock->s_sndcb->flags = (TCP_ACKDATA | TCP_REXMIT | TCP_POLL | + conn->sndcb->flags = (TCP_ACKDATA | TCP_REXMIT | TCP_POLL | TCP_DISCONN_EVENTS); - psock->s_sndcb->priv = (FAR void *)psock; - psock->s_sndcb->event = psock_send_eventhandler; + conn->sndcb->priv = (FAR void *)psock; + conn->sndcb->event = psock_send_eventhandler; #if CONFIG_NET_SEND_BUFSIZE > 0 /* If the send buffer size exceeds the send limit, diff --git a/net/udp/udp.h b/net/udp/udp.h index 2083260906..7665429beb 100644 --- a/net/udp/udp.h +++ b/net/udp/udp.h @@ -147,6 +147,10 @@ struct udp_conn_s sq_queue_t write_q; /* Write buffering for UDP packets */ FAR struct net_driver_s *dev; /* Last device */ + + /* Callback instance for UDP sendto() */ + + FAR struct devif_callback_s *sndcb; #endif /* The following is a list of poll structures of threads waiting for diff --git a/net/udp/udp_close.c b/net/udp/udp_close.c index b2610ce407..051be58f71 100644 --- a/net/udp/udp_close.c +++ b/net/udp/udp_close.c @@ -131,10 +131,10 @@ int udp_close(FAR struct socket *psock) #ifdef CONFIG_NET_UDP_WRITE_BUFFERS /* Free any semi-permanent write buffer callback in place. */ - if (psock->s_sndcb != NULL) + if (conn->sndcb != NULL) { - udp_callback_free(conn->dev, conn, psock->s_sndcb); - psock->s_sndcb = NULL; + udp_callback_free(conn->dev, conn, conn->sndcb); + conn->sndcb = NULL; } #endif diff --git a/net/udp/udp_sendto_buffered.c b/net/udp/udp_sendto_buffered.c index abd43ce7b5..e45b4e2b6c 100644 --- a/net/udp/udp_sendto_buffered.c +++ b/net/udp/udp_sendto_buffered.c @@ -173,9 +173,9 @@ static void sendto_writebuffer_release(FAR struct socket *psock, * enqueued. */ - psock->s_sndcb->flags = 0; - psock->s_sndcb->priv = NULL; - psock->s_sndcb->event = NULL; + conn->sndcb->flags = 0; + conn->sndcb->priv = NULL; + conn->sndcb->event = NULL; wrb = NULL; #ifdef CONFIG_NET_UDP_NOTIFIER @@ -331,24 +331,24 @@ static int sendto_next_transfer(FAR struct socket *psock, * callback instance. */ - if (psock->s_sndcb != NULL && conn->dev != dev) + if (conn->sndcb != NULL && conn->dev != dev) { - udp_callback_free(conn->dev, conn, psock->s_sndcb); - psock->s_sndcb = NULL; + udp_callback_free(conn->dev, conn, conn->sndcb); + conn->sndcb = NULL; } /* Allocate resources to receive a callback from this device if the * callback is not already in place. */ - if (psock->s_sndcb == NULL) + if (conn->sndcb == NULL) { - psock->s_sndcb = udp_callback_alloc(dev, conn); + conn->sndcb = udp_callback_alloc(dev, conn); } /* Test if the callback has been allocated */ - if (psock->s_sndcb == NULL) + if (conn->sndcb == NULL) { /* A buffer allocation error occurred */ @@ -360,9 +360,9 @@ static int sendto_next_transfer(FAR struct socket *psock, /* Set up the callback in the connection */ - psock->s_sndcb->flags = (UDP_POLL | NETDEV_DOWN); - psock->s_sndcb->priv = (FAR void *)psock; - psock->s_sndcb->event = sendto_eventhandler; + conn->sndcb->flags = (UDP_POLL | NETDEV_DOWN); + conn->sndcb->priv = (FAR void *)psock; + conn->sndcb->event = sendto_eventhandler; /* Notify the device driver of the availability of TX data */