mirror of
https://github.com/apache/nuttx.git
synced 2026-05-26 10:46:28 +08:00
net/devif_send: replace all block send to nonblock mode
Signed-off-by: chao an <anchao@xiaomi.com>
This commit is contained in:
committed by
Petro Karashchenko
parent
c44f87eb1a
commit
11de08de27
@@ -107,6 +107,11 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
/* Copy the packet data into the device packet buffer and send it */
|
||||
|
||||
devif_can_send(dev, pstate->snd_buffer, pstate->snd_buflen);
|
||||
if (dev->d_sndlen == 0)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
pstate->snd_sent = pstate->snd_buflen;
|
||||
if (pstate->pr_msglen > 0) /* concat cmsg data after packet */
|
||||
{
|
||||
|
||||
@@ -70,9 +70,22 @@ void devif_can_send(FAR struct net_driver_s *dev, FAR const void *buf,
|
||||
* bytes to send
|
||||
*/
|
||||
|
||||
dev->d_sndlen = iob_copyin(dev->d_iob, buf, len, 0, false) == len ?
|
||||
len : 0;
|
||||
dev->d_len = dev->d_sndlen;
|
||||
if (len <= iob_navail(false) * CONFIG_IOB_BUFSIZE)
|
||||
{
|
||||
dev->d_sndlen = iob_trycopyin(dev->d_iob, buf, len, 0, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->d_sndlen = 0;
|
||||
}
|
||||
|
||||
if (dev->d_sndlen != len)
|
||||
{
|
||||
netdev_iob_release(dev);
|
||||
dev->d_sndlen = 0;
|
||||
}
|
||||
|
||||
dev->d_len = dev->d_sndlen;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET_CAN */
|
||||
|
||||
@@ -77,6 +77,12 @@ void devif_iob_send(FAR struct net_driver_s *dev, FAR struct iob_s *iob,
|
||||
|
||||
if (dev->d_iob != NULL)
|
||||
{
|
||||
if (len > iob_navail(false) * CONFIG_IOB_BUFSIZE)
|
||||
{
|
||||
dev->d_sndlen = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Skip the l3/l4 offset before append */
|
||||
|
||||
iob_update_pktlen(dev->d_iob, target_offset);
|
||||
@@ -98,9 +104,9 @@ void devif_iob_send(FAR struct net_driver_s *dev, FAR struct iob_s *iob,
|
||||
copyin = (len > iob->io_len - offset) ?
|
||||
iob->io_len - offset : len;
|
||||
|
||||
ret = iob_copyin(dev->d_iob, iob->io_data +
|
||||
iob->io_offset + offset,
|
||||
copyin, target_offset, false);
|
||||
ret = iob_trycopyin(dev->d_iob, iob->io_data +
|
||||
iob->io_offset + offset,
|
||||
copyin, target_offset, false);
|
||||
if (ret != copyin)
|
||||
{
|
||||
netdev_iob_release(dev);
|
||||
|
||||
@@ -70,9 +70,22 @@ void devif_pkt_send(FAR struct net_driver_s *dev, FAR const void *buf,
|
||||
* bytes to send
|
||||
*/
|
||||
|
||||
dev->d_sndlen = iob_copyin(dev->d_iob, buf, len, 0, false) == len ?
|
||||
len : 0;
|
||||
dev->d_len = dev->d_sndlen;
|
||||
if (len <= iob_navail(false) * CONFIG_IOB_BUFSIZE)
|
||||
{
|
||||
dev->d_sndlen = iob_trycopyin(dev->d_iob, buf, len, 0, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->d_sndlen = 0;
|
||||
}
|
||||
|
||||
if (dev->d_sndlen != len)
|
||||
{
|
||||
netdev_iob_release(dev);
|
||||
dev->d_sndlen = 0;
|
||||
}
|
||||
|
||||
dev->d_len = dev->d_sndlen;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET_PKT */
|
||||
|
||||
+14
-2
@@ -82,6 +82,18 @@ void devif_send(FAR struct net_driver_s *dev, FAR const void *buf,
|
||||
|
||||
/* Copy in iob to target device buffer */
|
||||
|
||||
dev->d_sndlen = iob_copyin(dev->d_iob, buf, len, offset, false) == len ?
|
||||
len : 0;
|
||||
if (len <= iob_navail(false) * CONFIG_IOB_BUFSIZE)
|
||||
{
|
||||
dev->d_sndlen = iob_trycopyin(dev->d_iob, buf, len, offset, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->d_sndlen = 0;
|
||||
}
|
||||
|
||||
if (dev->d_sndlen != len)
|
||||
{
|
||||
netdev_iob_release(dev);
|
||||
dev->d_sndlen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,6 +106,11 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
/* Copy the packet data into the device packet buffer and send it */
|
||||
|
||||
devif_pkt_send(dev, pstate->snd_buffer, pstate->snd_buflen);
|
||||
if (dev->d_sndlen == 0)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
pstate->snd_sent = pstate->snd_buflen;
|
||||
|
||||
/* Make sure no ARP request overwrites this ARP request. This
|
||||
|
||||
@@ -598,6 +598,10 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
devif_iob_send(dev, TCP_WBIOB(wrb), sndlen,
|
||||
0, tcpip_hdrsize(conn));
|
||||
if (dev->d_sndlen == 0)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
/* Reset the retransmission timer. */
|
||||
|
||||
@@ -885,6 +889,10 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
devif_iob_send(dev, TCP_WBIOB(wrb), sndlen,
|
||||
TCP_WBSENT(wrb), tcpip_hdrsize(conn));
|
||||
if (dev->d_sndlen == 0)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
/* Remember how much data we send out now so that we know
|
||||
* when everything has been acknowledged. Just increment
|
||||
|
||||
@@ -410,6 +410,10 @@ static uint16_t tcpsend_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
devif_send(dev, &pstate->snd_buffer[pstate->snd_sent],
|
||||
sndlen, tcpip_hdrsize(conn));
|
||||
if (dev->d_sndlen == 0)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
/* Update the amount of data sent (but not necessarily ACKed) */
|
||||
|
||||
|
||||
@@ -206,6 +206,11 @@ static uint16_t sendto_eventhandler(FAR struct net_driver_s *dev,
|
||||
|
||||
devif_send(dev, pstate->st_buffer,
|
||||
pstate->st_buflen, udpip_hdrsize(pstate->st_conn));
|
||||
if (dev->d_sndlen == 0)
|
||||
{
|
||||
return flags;
|
||||
}
|
||||
|
||||
pstate->st_sndlen = pstate->st_buflen;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user