This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 11de08de27 net/devif_send: replace all block send to nonblock mode
11de08de27 is described below
commit 11de08de2751c0b339b48682205b039f91dc464c
Author: chao an <[email protected]>
AuthorDate: Wed Dec 7 17:44:09 2022 +0800
net/devif_send: replace all block send to nonblock mode
Signed-off-by: chao an <[email protected]>
---
net/can/can_sendmsg.c | 5 +++++
net/devif/devif_cansend.c | 19 ++++++++++++++++---
net/devif/devif_iobsend.c | 12 +++++++++---
net/devif/devif_pktsend.c | 19 ++++++++++++++++---
net/devif/devif_send.c | 16 ++++++++++++++--
net/pkt/pkt_sendmsg.c | 5 +++++
net/tcp/tcp_send_buffered.c | 8 ++++++++
net/tcp/tcp_send_unbuffered.c | 4 ++++
net/udp/udp_sendto_unbuffered.c | 5 +++++
9 files changed, 82 insertions(+), 11 deletions(-)
diff --git a/net/can/can_sendmsg.c b/net/can/can_sendmsg.c
index 3686e19d92..c07742639a 100644
--- a/net/can/can_sendmsg.c
+++ b/net/can/can_sendmsg.c
@@ -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 */
{
diff --git a/net/devif/devif_cansend.c b/net/devif/devif_cansend.c
index 5807fdf773..9d80dda3c3 100644
--- a/net/devif/devif_cansend.c
+++ b/net/devif/devif_cansend.c
@@ -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 */
diff --git a/net/devif/devif_iobsend.c b/net/devif/devif_iobsend.c
index 96bf272749..c63b2df864 100644
--- a/net/devif/devif_iobsend.c
+++ b/net/devif/devif_iobsend.c
@@ -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);
diff --git a/net/devif/devif_pktsend.c b/net/devif/devif_pktsend.c
index 7b3982c81b..28f8e8308e 100644
--- a/net/devif/devif_pktsend.c
+++ b/net/devif/devif_pktsend.c
@@ -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 */
diff --git a/net/devif/devif_send.c b/net/devif/devif_send.c
index bfb963e84c..5e076d0ff8 100644
--- a/net/devif/devif_send.c
+++ b/net/devif/devif_send.c
@@ -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;
+ }
}
diff --git a/net/pkt/pkt_sendmsg.c b/net/pkt/pkt_sendmsg.c
index 4179030d4a..1e1a500077 100644
--- a/net/pkt/pkt_sendmsg.c
+++ b/net/pkt/pkt_sendmsg.c
@@ -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
diff --git a/net/tcp/tcp_send_buffered.c b/net/tcp/tcp_send_buffered.c
index 6925c25c1d..ad44230f65 100644
--- a/net/tcp/tcp_send_buffered.c
+++ b/net/tcp/tcp_send_buffered.c
@@ -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
diff --git a/net/tcp/tcp_send_unbuffered.c b/net/tcp/tcp_send_unbuffered.c
index 8ddcee4404..a74a822690 100644
--- a/net/tcp/tcp_send_unbuffered.c
+++ b/net/tcp/tcp_send_unbuffered.c
@@ -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) */
diff --git a/net/udp/udp_sendto_unbuffered.c b/net/udp/udp_sendto_unbuffered.c
index 0ab154189e..ae629bc91d 100644
--- a/net/udp/udp_sendto_unbuffered.c
+++ b/net/udp/udp_sendto_unbuffered.c
@@ -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;
}