This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 5a9530855c3d01ee25ca26f107e0e39a59582040
Author: p-szafonimateusz <p-szafonimate...@xiaomi.com>
AuthorDate: Tue Jun 10 12:37:42 2025 +0200

    drivers/net/{e1000|igc}: drop TX packets if TX ring is full
    
    drop TX packets if TX ring is full, so we don't overwrite
    not handled TX descriptors
    
    Signed-off-by: p-szafonimateusz <p-szafonimate...@xiaomi.com>
---
 drivers/net/e1000.c | 18 +++++++++++++-----
 drivers/net/igc.c   | 18 +++++++++++++-----
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c
index 0a00c3de1c..85ab64dc2a 100644
--- a/drivers/net/e1000.c
+++ b/drivers/net/e1000.c
@@ -561,10 +561,11 @@ static void e1000_rxclean(FAR struct e1000_driver_s *priv)
 static int e1000_transmit(FAR struct netdev_lowerhalf_s *dev,
                           FAR netpkt_t *pkt)
 {
-  FAR struct e1000_driver_s *priv = (FAR struct e1000_driver_s *)dev;
-  uint64_t                   pa   = 0;
-  int                        desc = priv->tx_now;
-  size_t                     len  = netpkt_getdatalen(dev, pkt);
+  FAR struct e1000_driver_s *priv    = (FAR struct e1000_driver_s *)dev;
+  uint64_t                   pa      = 0;
+  int                        desc    = priv->tx_now;
+  size_t                     len     = netpkt_getdatalen(dev, pkt);
+  size_t                     tx_next = (priv->tx_now + 1) % E1000_TX_DESC;
 
   ninfo("transmit\n");
 
@@ -581,13 +582,20 @@ static int e1000_transmit(FAR struct netdev_lowerhalf_s 
*dev,
       return -ENETDOWN;
     }
 
+  /* Drop packet if ring full */
+
+  if (tx_next == priv->tx_done)
+    {
+      return -ENOMEM;
+    }
+
   /* Store TX packet reference */
 
   priv->tx_pkt[priv->tx_now] = pkt;
 
   /* Prepare next TX descriptor */
 
-  priv->tx_now = (priv->tx_now + 1) % E1000_TX_DESC;
+  priv->tx_now = tx_next;
 
   /* Setup TX descriptor */
 
diff --git a/drivers/net/igc.c b/drivers/net/igc.c
index 763bd18c5e..74e072ee4b 100644
--- a/drivers/net/igc.c
+++ b/drivers/net/igc.c
@@ -515,10 +515,11 @@ static void igc_rxclean(FAR struct igc_driver_s *priv)
 static int igc_transmit(FAR struct netdev_lowerhalf_s *dev,
                           FAR netpkt_t *pkt)
 {
-  FAR struct igc_driver_s *priv = (FAR struct igc_driver_s *)dev;
-  uint64_t                 pa   = 0;
-  int                      desc = priv->tx_now;
-  size_t                   len  = netpkt_getdatalen(dev, pkt);
+  FAR struct igc_driver_s *priv    = (FAR struct igc_driver_s *)dev;
+  uint64_t                 pa      = 0;
+  int                      desc    = priv->tx_now;
+  size_t                   len     = netpkt_getdatalen(dev, pkt);
+  size_t                   tx_next = (priv->tx_now + 1) % IGC_TX_DESC;
 
   ninfo("transmit\n");
 
@@ -535,13 +536,20 @@ static int igc_transmit(FAR struct netdev_lowerhalf_s 
*dev,
       return -ENETDOWN;
     }
 
+  /* Drop packet if ring full */
+
+  if (tx_next == priv->tx_done)
+    {
+      return -ENOMEM;
+    }
+
   /* Store TX packet reference */
 
   priv->tx_pkt[priv->tx_now] = pkt;
 
   /* Prepare next TX descriptor */
 
-  priv->tx_now = (priv->tx_now + 1) % IGC_TX_DESC;
+  priv->tx_now = tx_next;
 
   /* Setup TX descriptor */
 

Reply via email to