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