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

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

commit b2db3a6430953164fd9faa5f427d9d095afbb412
Author: Zhe Weng <[email protected]>
AuthorDate: Tue Jan 14 17:02:57 2025 +0800

    net/netdev: Add netdev_iob_replace_l2 for netdev to avoid misuse
    
    And fix wrong `d_len` for IOBs from `upper->txq` in TX.
    
    Signed-off-by: Zhe Weng <[email protected]>
---
 drivers/net/netdev_upperhalf.c | 11 ++---------
 include/nuttx/net/netdev.h     |  6 ++++--
 net/netdev/netdev_iob.c        | 29 ++++++++++++++++++++++++++++-
 3 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/drivers/net/netdev_upperhalf.c b/drivers/net/netdev_upperhalf.c
index afcdc600df1..76ec08128cf 100644
--- a/drivers/net/netdev_upperhalf.c
+++ b/drivers/net/netdev_upperhalf.c
@@ -182,15 +182,8 @@ static void netpkt_put(FAR struct net_driver_s *dev, FAR 
netpkt_t *pkt,
 
   DEBUGASSERT(dev && pkt);
 
-  /* TODO: Using netdev_iob_release instead of netdev_iob_replace now,
-   *       because netdev_iob_replace sets d_len = L3_LEN and d_buf,
-   *       but we don't want these changes.
-   */
-
   atomic_fetch_add(&upper->lower->quota[type], 1);
-  netdev_iob_release(dev);
-  dev->d_iob = pkt;
-  dev->d_len = netpkt_getdatalen(upper->lower, pkt);
+  netdev_iob_replace_l2(dev, pkt);
 }
 
 /****************************************************************************
@@ -344,7 +337,7 @@ static int netdev_upper_tx(FAR struct net_driver_s *dev)
     {
       /* Put the packet back to the device */
 
-      netdev_iob_replace(dev, iob_remove_queue(&upper->txq));
+      netdev_iob_replace_l2(dev, iob_remove_queue(&upper->txq));
       return netdev_upper_txpoll(dev);
     }
 #endif
diff --git a/include/nuttx/net/netdev.h b/include/nuttx/net/netdev.h
index ba346fa274f..c69e670d3fb 100644
--- a/include/nuttx/net/netdev.h
+++ b/include/nuttx/net/netdev.h
@@ -1160,10 +1160,10 @@ void netdev_iob_prepare_dynamic(FAR struct net_driver_s 
*dev, uint16_t size);
 #endif
 
 /****************************************************************************
- * Name: netdev_iob_replace
+ * Name: netdev_iob_replace / netdev_iob_replace_l2
  *
  * Description:
- *   Replace buffer resources for a given NIC
+ *   Replace IOB for a given NIC, used by net stack (l3-4) / net driver (l2).
  *
  * Assumptions:
  *   The caller has locked the network and new iob is prepared with
@@ -1172,6 +1172,8 @@ void netdev_iob_prepare_dynamic(FAR struct net_driver_s 
*dev, uint16_t size);
  ****************************************************************************/
 
 void netdev_iob_replace(FAR struct net_driver_s *dev, FAR struct iob_s *iob);
+void netdev_iob_replace_l2(FAR struct net_driver_s *dev,
+                           FAR struct iob_s *iob);
 
 /****************************************************************************
  * Name: netdev_iob_clear
diff --git a/net/netdev/netdev_iob.c b/net/netdev/netdev_iob.c
index bdaee0118da..67cc57f088b 100644
--- a/net/netdev/netdev_iob.c
+++ b/net/netdev/netdev_iob.c
@@ -127,7 +127,8 @@ void netdev_iob_prepare_dynamic(FAR struct net_driver_s 
*dev, uint16_t size)
  * Name: netdev_iob_replace
  *
  * Description:
- *   Replace buffer resources for a given NIC
+ *   Replace buffer resources for a given NIC, used by net stack for L3/L4
+ * and set d_buf to l2 (for legacy drivers using d_buf).
  *
  * Assumptions:
  *   The caller has locked the network and new iob is prepared with
@@ -148,6 +149,32 @@ void netdev_iob_replace(FAR struct net_driver_s *dev, FAR 
struct iob_s *iob)
   dev->d_len = iob->io_pktlen;
 }
 
+/****************************************************************************
+ * Name: netdev_iob_replace_l2
+ *
+ * Description:
+ *   Replace buffer resources for a given NIC, used by L2 (net drivers) and
+ * set d_len to l2, keep d_buf as NULL.
+ *
+ * Assumptions:
+ *   The caller has locked the network and new iob is prepared with
+ *   l2 gruard size as offset.
+ *
+ ****************************************************************************/
+
+void netdev_iob_replace_l2(FAR struct net_driver_s *dev,
+                           FAR struct iob_s *iob)
+{
+  /* Release previous buffer */
+
+  netdev_iob_release(dev);
+
+  /* Set new buffer */
+
+  dev->d_iob = iob;
+  dev->d_len = iob->io_pktlen + NET_LL_HDRLEN(dev);
+}
+
 /****************************************************************************
  * Name: netdev_iob_clear
  *

Reply via email to