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

Reply via email to