net/udp: remove psock hook to avoid invalid reference
Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
parent
8fb2468785
commit
eac13a113d
@ -90,7 +90,7 @@ struct udp_hdr_s; /* Forward reference */
|
||||
|
||||
struct udp_poll_s
|
||||
{
|
||||
FAR struct socket *psock; /* Needed to handle loss of connection */
|
||||
FAR struct udp_conn_s *conn; /* Needed to handle loss of connection */
|
||||
FAR struct net_driver_s *dev; /* Needed to free the callback structure */
|
||||
struct pollfd *fds; /* Needed to handle poll events */
|
||||
FAR struct devif_callback_s *cb; /* Needed to teardown the poll */
|
||||
@ -375,7 +375,7 @@ void udp_poll(FAR struct net_driver_s *dev, FAR struct udp_conn_s *conn);
|
||||
* write occurs first.
|
||||
*
|
||||
* Input Parameters:
|
||||
* psock An instance of the internal socket structure.
|
||||
* conn A reference to UDP connection structure.
|
||||
*
|
||||
* Returned Value:
|
||||
* -ENOSYS (Function not implemented, always have to wait to send).
|
||||
@ -385,7 +385,7 @@ void udp_poll(FAR struct net_driver_s *dev, FAR struct udp_conn_s *conn);
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_udp_cansend(FAR struct socket *psock);
|
||||
int psock_udp_cansend(FAR struct udp_conn_s *conn);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: udp_send
|
||||
|
@ -69,7 +69,7 @@ static uint16_t udp_poll_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
ninfo("flags: %04x\n", flags);
|
||||
|
||||
DEBUGASSERT(!info || (info->psock && info->fds));
|
||||
DEBUGASSERT(!info || (info->conn && info->fds));
|
||||
|
||||
/* 'priv' might be null in some race conditions (?) */
|
||||
|
||||
@ -93,7 +93,7 @@ static uint16_t udp_poll_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
/* A poll is a sign that we are free to send data. */
|
||||
|
||||
else if (psock_udp_cansend(info->psock) >= 0)
|
||||
else if (psock_udp_cansend(info->conn) >= 0)
|
||||
{
|
||||
eventset |= (POLLOUT & info->fds->events);
|
||||
}
|
||||
@ -153,7 +153,7 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
|
||||
/* 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_UDP_NPOLLWAITERS])
|
||||
{
|
||||
@ -180,9 +180,9 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
|
||||
|
||||
/* 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
|
||||
@ -218,7 +218,7 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds)
|
||||
fds->revents |= (POLLRDNORM & fds->events);
|
||||
}
|
||||
|
||||
if (psock_udp_cansend(psock) >= 0)
|
||||
if (psock_udp_cansend(conn) >= 0)
|
||||
{
|
||||
/* Normal data may be sent without blocking (at least one byte). */
|
||||
|
||||
@ -285,7 +285,7 @@ int udp_pollteardown(FAR struct socket *psock, FAR struct pollfd *fds)
|
||||
|
||||
/* Then free the poll info container */
|
||||
|
||||
info->psock = NULL;
|
||||
info->conn = NULL;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
@ -58,7 +58,7 @@
|
||||
|
||||
struct udp_recvfrom_s
|
||||
{
|
||||
FAR struct socket *ir_sock; /* The parent socket structure */
|
||||
FAR struct udp_conn_s *ir_conn; /* Connection associated with the socket */
|
||||
FAR struct devif_callback_s *ir_cb; /* Reference to callback instance */
|
||||
sem_t ir_sem; /* Semaphore signals recv completion */
|
||||
size_t ir_buflen; /* Length of receive buffer */
|
||||
@ -181,8 +181,7 @@ static inline void udp_newdata(FAR struct net_driver_s *dev,
|
||||
|
||||
static inline void udp_readahead(struct udp_recvfrom_s *pstate)
|
||||
{
|
||||
FAR struct udp_conn_s *conn = (FAR struct udp_conn_s *)
|
||||
pstate->ir_sock->s_conn;
|
||||
FAR struct udp_conn_s *conn = pstate->ir_conn;
|
||||
FAR struct iob_s *iob;
|
||||
int recvlen;
|
||||
|
||||
@ -325,8 +324,7 @@ static inline void udp_sender(FAR struct net_driver_s *dev,
|
||||
if (infrom)
|
||||
{
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
FAR struct udp_conn_s *conn =
|
||||
(FAR struct udp_conn_s *)pstate->ir_sock->s_conn;
|
||||
FAR struct udp_conn_s *conn = pstate->ir_conn;
|
||||
|
||||
/* Hybrid dual-stack IPv6/IPv4 implementations recognize a special
|
||||
* class of addresses, the IPv4-mapped IPv6 addresses.
|
||||
@ -482,7 +480,7 @@ static uint16_t udp_eventhandler(FAR struct net_driver_s *dev,
|
||||
* Initialize the state structure
|
||||
*
|
||||
* Input Parameters:
|
||||
* psock Pointer to the socket structure for the socket
|
||||
* conn The UDP connection of interest
|
||||
* buf Buffer to receive data
|
||||
* len Length of buffer
|
||||
* pstate A pointer to the state structure to be initialized
|
||||
@ -494,8 +492,9 @@ static uint16_t udp_eventhandler(FAR struct net_driver_s *dev,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void udp_recvfrom_initialize(FAR struct socket *psock, FAR void *buf,
|
||||
size_t len, FAR struct sockaddr *infrom,
|
||||
static void udp_recvfrom_initialize(FAR struct udp_conn_s *conn,
|
||||
FAR void *buf, size_t len,
|
||||
FAR struct sockaddr *infrom,
|
||||
FAR socklen_t *fromlen,
|
||||
FAR struct udp_recvfrom_s *pstate)
|
||||
{
|
||||
@ -517,7 +516,7 @@ static void udp_recvfrom_initialize(FAR struct socket *psock, FAR void *buf,
|
||||
|
||||
/* Set up the start time for the timeout */
|
||||
|
||||
pstate->ir_sock = psock;
|
||||
pstate->ir_conn = conn;
|
||||
}
|
||||
|
||||
/* The only un-initialization that has to be performed is destroying the
|
||||
@ -611,7 +610,7 @@ ssize_t psock_udp_recvfrom(FAR struct socket *psock, FAR void *buf,
|
||||
*/
|
||||
|
||||
net_lock();
|
||||
udp_recvfrom_initialize(psock, buf, len, from, fromlen, &state);
|
||||
udp_recvfrom_initialize(conn, buf, len, from, fromlen, &state);
|
||||
|
||||
/* Copy the read-ahead data from the packet */
|
||||
|
||||
|
@ -95,8 +95,7 @@
|
||||
static inline void sendto_ipselect(FAR struct net_driver_s *dev,
|
||||
FAR struct udp_conn_s *conn);
|
||||
#endif
|
||||
static int sendto_next_transfer(FAR struct socket *psock,
|
||||
FAR struct udp_conn_s *conn);
|
||||
static int sendto_next_transfer(FAR struct udp_conn_s *conn);
|
||||
static uint16_t sendto_eventhandler(FAR struct net_driver_s *dev,
|
||||
FAR void *pvconn, FAR void *pvpriv,
|
||||
uint16_t flags);
|
||||
@ -146,8 +145,7 @@ static uint32_t udp_inqueue_wrb_size(FAR struct udp_conn_s *conn)
|
||||
* Release the write buffer at the head of the write buffer queue.
|
||||
*
|
||||
* Input Parameters:
|
||||
* dev - The structure of the network driver that caused the event
|
||||
* psock - Socket state structure
|
||||
* conn - The UDP connection of interest
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
@ -157,8 +155,7 @@ static uint32_t udp_inqueue_wrb_size(FAR struct udp_conn_s *conn)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void sendto_writebuffer_release(FAR struct socket *psock,
|
||||
FAR struct udp_conn_s *conn)
|
||||
static void sendto_writebuffer_release(FAR struct udp_conn_s *conn)
|
||||
{
|
||||
FAR struct udp_wrbuffer_s *wrb;
|
||||
int ret = OK;
|
||||
@ -200,7 +197,7 @@ static void sendto_writebuffer_release(FAR struct socket *psock,
|
||||
* the write buffer queue.
|
||||
*/
|
||||
|
||||
ret = sendto_next_transfer(psock, conn);
|
||||
ret = sendto_next_transfer(conn);
|
||||
}
|
||||
}
|
||||
while (wrb != NULL && ret < 0);
|
||||
@ -223,7 +220,7 @@ static void sendto_writebuffer_release(FAR struct socket *psock,
|
||||
*
|
||||
* Input Parameters:
|
||||
* dev - The structure of the network driver that caused the event
|
||||
* psock - Socket state structure
|
||||
* conn - The UDP connection of interest
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
@ -266,7 +263,6 @@ static inline void sendto_ipselect(FAR struct net_driver_s *dev,
|
||||
* the head of the write queue.
|
||||
*
|
||||
* Input Parameters:
|
||||
* psock - Socket state structure
|
||||
* conn - The UDP connection structure
|
||||
*
|
||||
* Returned Value:
|
||||
@ -274,8 +270,7 @@ static inline void sendto_ipselect(FAR struct net_driver_s *dev,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int sendto_next_transfer(FAR struct socket *psock,
|
||||
FAR struct udp_conn_s *conn)
|
||||
static int sendto_next_transfer(FAR struct udp_conn_s *conn)
|
||||
{
|
||||
FAR struct udp_wrbuffer_s *wrb;
|
||||
FAR struct net_driver_s *dev;
|
||||
@ -361,7 +356,7 @@ static int sendto_next_transfer(FAR struct socket *psock,
|
||||
/* Set up the callback in the connection */
|
||||
|
||||
conn->sndcb->flags = (UDP_POLL | NETDEV_DOWN);
|
||||
conn->sndcb->priv = (FAR void *)psock;
|
||||
conn->sndcb->priv = (FAR void *)conn;
|
||||
conn->sndcb->event = sendto_eventhandler;
|
||||
|
||||
/* Notify the device driver of the availability of TX data */
|
||||
@ -394,10 +389,9 @@ static uint16_t sendto_eventhandler(FAR struct net_driver_s *dev,
|
||||
FAR void *pvconn, FAR void *pvpriv,
|
||||
uint16_t flags)
|
||||
{
|
||||
FAR struct udp_conn_s *conn = (FAR struct udp_conn_s *)pvconn;
|
||||
FAR struct socket *psock = (FAR struct socket *)pvpriv;
|
||||
FAR struct udp_conn_s *conn = (FAR struct udp_conn_s *)pvpriv;
|
||||
|
||||
DEBUGASSERT(dev != NULL && psock != NULL);
|
||||
DEBUGASSERT(dev != NULL && conn != NULL);
|
||||
|
||||
ninfo("flags: %04x\n", flags);
|
||||
|
||||
@ -411,7 +405,7 @@ static uint16_t sendto_eventhandler(FAR struct net_driver_s *dev,
|
||||
* the next transfer.
|
||||
*/
|
||||
|
||||
sendto_writebuffer_release(psock, psock->s_conn);
|
||||
sendto_writebuffer_release(conn);
|
||||
return flags;
|
||||
}
|
||||
|
||||
@ -492,7 +486,7 @@ static uint16_t sendto_eventhandler(FAR struct net_driver_s *dev,
|
||||
* setup the next transfer.
|
||||
*/
|
||||
|
||||
sendto_writebuffer_release(psock, conn);
|
||||
sendto_writebuffer_release(conn);
|
||||
|
||||
/* Only one data can be sent by low level driver at once,
|
||||
* tell the caller stop polling the other connections.
|
||||
@ -826,7 +820,7 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf,
|
||||
* the write buffer queue.
|
||||
*/
|
||||
|
||||
ret = sendto_next_transfer(psock, conn);
|
||||
ret = sendto_next_transfer(conn);
|
||||
if (ret < 0)
|
||||
{
|
||||
sq_remlast(&conn->write_q);
|
||||
@ -859,7 +853,7 @@ errout_with_lock:
|
||||
* another means.
|
||||
*
|
||||
* Input Parameters:
|
||||
* psock An instance of the internal socket structure.
|
||||
* conn A reference to UDP connection structure.
|
||||
*
|
||||
* Returned Value:
|
||||
* OK
|
||||
@ -871,11 +865,11 @@ errout_with_lock:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_udp_cansend(FAR struct socket *psock)
|
||||
int psock_udp_cansend(FAR struct udp_conn_s *conn)
|
||||
{
|
||||
/* Verify that we received a valid socket */
|
||||
|
||||
if (psock == NULL || psock->s_conn == NULL)
|
||||
if (conn == NULL)
|
||||
{
|
||||
nerr("ERROR: Invalid socket\n");
|
||||
return -EBADF;
|
||||
|
@ -510,7 +510,7 @@ errout_with_lock:
|
||||
* write occurs first.
|
||||
*
|
||||
* Input Parameters:
|
||||
* psock An instance of the internal socket structure.
|
||||
* conn A reference to UDP connection structure.
|
||||
*
|
||||
* Returned Value:
|
||||
* OK (Always can send).
|
||||
@ -520,7 +520,7 @@ errout_with_lock:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int psock_udp_cansend(FAR struct socket *psock)
|
||||
int psock_udp_cansend(FAR struct udp_conn_s *conn)
|
||||
{
|
||||
return OK;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user