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 */