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

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

commit 2d0c316bf87ffc8cfdfa1fd8a34eba01c9c577b5
Author: raiden00pl <[email protected]>
AuthorDate: Thu Oct 22 16:59:22 2026 +0200

    drivers/wireless/ieee802154/mrf24j40: fix the TX header length
    
    The header length counted a source PAN ID whenever PAN ID compression
    was off, even without a source address, and never with compression on
    and no destination address.  The radio ignores the field without
    security (datasheet 3.12.1), with security it ends the clear header.
    
    Assisted-by: Claude Code
    Signed-off-by: raiden00pl <[email protected]>
---
 drivers/wireless/ieee802154/mrf24j40/mrf24j40.c | 27 ++++++++++++++-----------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/drivers/wireless/ieee802154/mrf24j40/mrf24j40.c 
b/drivers/wireless/ieee802154/mrf24j40/mrf24j40.c
index 4c2851c9aa4..8c3e28fdf7b 100644
--- a/drivers/wireless/ieee802154/mrf24j40/mrf24j40.c
+++ b/drivers/wireless/ieee802154/mrf24j40/mrf24j40.c
@@ -332,7 +332,8 @@ void mrf24j40_setup_fifo(FAR struct mrf24j40_radio_s *dev,
                          uint32_t fifo_addr)
 {
   uint16_t frame_ctrl;
-  uint16_t addrmode;
+  uint16_t daddrmode;
+  uint16_t saddrmode;
   int hlen = 3; /* Include frame control and seq number */
   int i;
 
@@ -341,31 +342,33 @@ void mrf24j40_setup_fifo(FAR struct mrf24j40_radio_s *dev,
   frame_ctrl = buf[0];
   frame_ctrl |= (buf[1] << 8);
 
-  addrmode = (frame_ctrl & IEEE802154_FRAMECTRL_DADDR) >>
-             IEEE802154_FRAMECTRL_SHIFT_DADDR;
+  daddrmode = (frame_ctrl & IEEE802154_FRAMECTRL_DADDR) >>
+              IEEE802154_FRAMECTRL_SHIFT_DADDR;
 
-  if (addrmode == IEEE802154_ADDRMODE_SHORT)
+  if (daddrmode == IEEE802154_ADDRMODE_SHORT)
     {
       hlen += 2 + 2; /* Destination PAN + shortaddr */
     }
-  else if (addrmode == IEEE802154_ADDRMODE_EXTENDED)
+  else if (daddrmode == IEEE802154_ADDRMODE_EXTENDED)
     {
       hlen += 2 + 8; /* Destination PAN + extaddr */
     }
 
-  if (!(frame_ctrl & IEEE802154_FRAMECTRL_PANIDCOMP))
+  saddrmode = (frame_ctrl & IEEE802154_FRAMECTRL_SADDR) >>
+              IEEE802154_FRAMECTRL_SHIFT_SADDR;
+
+  if (saddrmode != IEEE802154_ADDRMODE_NONE &&
+      (daddrmode == IEEE802154_ADDRMODE_NONE ||
+       !(frame_ctrl & IEEE802154_FRAMECTRL_PANIDCOMP)))
     {
-      hlen += 2; /* No PAN compression, source PAN is different from dest PAN 
*/
+      hlen += 2; /* Source PAN, compressed only with both addresses */
     }
 
-  addrmode = (frame_ctrl & IEEE802154_FRAMECTRL_SADDR) >>
-             IEEE802154_FRAMECTRL_SHIFT_SADDR;
-
-  if (addrmode == IEEE802154_ADDRMODE_SHORT)
+  if (saddrmode == IEEE802154_ADDRMODE_SHORT)
     {
       hlen += 2; /* Source saddr */
     }
-  else if (addrmode == IEEE802154_ADDRMODE_EXTENDED)
+  else if (saddrmode == IEEE802154_ADDRMODE_EXTENDED)
     {
       hlen += 8; /* Ext saddr */
     }

Reply via email to