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 16ffd4d3d48d576a159f5ec8414acdb108019aad Author: raiden00pl <[email protected]> AuthorDate: Thu Oct 22 16:16:56 2026 +0200 arch/arm/nrf52,nrf53,nrf54l: accept the frames the third-level filter accepts Beacons were dropped as soon as macPANId was set, frames to the broadcast PAN ID were dropped, and frames without destination address were dropped on the PAN coordinator too. Filter them as IEEE 802.15.4-2003 7.5.6.2 requires. Assisted-by: Claude Code Signed-off-by: raiden00pl <[email protected]> --- arch/arm/src/nrf52/nrf52_ieee802154_radio.c | 29 ++++++++++++++++++++++----- arch/arm/src/nrf53/nrf53_ieee802154_radio.c | 29 ++++++++++++++++++++++----- arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c | 29 ++++++++++++++++++++++----- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_radio.c b/arch/arm/src/nrf52/nrf52_ieee802154_radio.c index 35cc8dd3592..ff436222083 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154_radio.c +++ b/arch/arm/src/nrf52/nrf52_ieee802154_radio.c @@ -464,12 +464,15 @@ static bool nrf52_radioi8_filter(struct nrf52_radioi8_dev_s *dev) return true; } - /* Beacon frame */ + /* Beacon frame, the source PAN ID must match macPANId unless macPANId + * is the broadcast PAN ID (IEEE 802.15.4-2003 7.5.6.2) + */ - if (((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_BEACON) && - IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, &dev->state.addr.panid)) + if ((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_BEACON) { - return true; + return IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, + dev->state.addr.panid) || + IEEE802154_PANIDCMP(&rx[3], dev->state.addr.panid); } /* Get destination address */ @@ -493,14 +496,30 @@ static bool nrf52_radioi8_filter(struct nrf52_radioi8_dev_s *dev) } } - /* PAN ID match */ + /* The destination PAN ID must match macPANId or be the broadcast PAN + * ID + */ if (!IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, dev->state.addr.panid) && + !IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, addr.panid) && !IEEE802154_PANIDCMP(addr.panid, &dev->state.addr.panid)) { return false; } + /* Only source addressing fields in a data or MAC command frame, for + * the PAN coordinator of the source PAN + */ + + if (addr.mode == IEEE802154_ADDRMODE_NONE) + { + return ((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_DATA || + (*fc & IEEE802154_FRAMECTRL_FTYPE) == + IEEE802154_FRAME_COMMAND) && + dev->state.devmode == NRF52_DEVMODE_PANCOORD && + IEEE802154_PANIDCMP(&rx[3], dev->state.addr.panid); + } + /* Destination address match */ if (addr.mode == IEEE802154_ADDRMODE_SHORT) diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c index 91f54f0d21f..169529ef36d 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c +++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c @@ -464,12 +464,15 @@ static bool nrf53_radioi8_filter(struct nrf53_radioi8_dev_s *dev) return true; } - /* Beacon frame */ + /* Beacon frame, the source PAN ID must match macPANId unless macPANId + * is the broadcast PAN ID (IEEE 802.15.4-2003 7.5.6.2) + */ - if (((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_BEACON) && - IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, &dev->state.addr.panid)) + if ((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_BEACON) { - return true; + return IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, + dev->state.addr.panid) || + IEEE802154_PANIDCMP(&rx[3], dev->state.addr.panid); } /* Get destination address */ @@ -493,14 +496,30 @@ static bool nrf53_radioi8_filter(struct nrf53_radioi8_dev_s *dev) } } - /* PAN ID match */ + /* The destination PAN ID must match macPANId or be the broadcast PAN + * ID + */ if (!IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, dev->state.addr.panid) && + !IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, addr.panid) && !IEEE802154_PANIDCMP(addr.panid, &dev->state.addr.panid)) { return false; } + /* Only source addressing fields in a data or MAC command frame, for + * the PAN coordinator of the source PAN + */ + + if (addr.mode == IEEE802154_ADDRMODE_NONE) + { + return ((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_DATA || + (*fc & IEEE802154_FRAMECTRL_FTYPE) == + IEEE802154_FRAME_COMMAND) && + dev->state.devmode == NRF53_DEVMODE_PANCOORD && + IEEE802154_PANIDCMP(&rx[3], dev->state.addr.panid); + } + /* Destination address match */ if (addr.mode == IEEE802154_ADDRMODE_SHORT) diff --git a/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c b/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c index b3e43e2c57b..8bef3542f82 100644 --- a/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c +++ b/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c @@ -444,12 +444,15 @@ static bool nrf54l_radioi8_filter(struct nrf54l_radioi8_dev_s *dev) return true; } - /* Beacon frame */ + /* Beacon frame, the source PAN ID must match macPANId unless macPANId + * is the broadcast PAN ID (IEEE 802.15.4-2003 7.5.6.2) + */ - if (((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_BEACON) && - IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, &dev->state.addr.panid)) + if ((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_BEACON) { - return true; + return IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, + dev->state.addr.panid) || + IEEE802154_PANIDCMP(&rx[3], dev->state.addr.panid); } /* Get destination address */ @@ -473,14 +476,30 @@ static bool nrf54l_radioi8_filter(struct nrf54l_radioi8_dev_s *dev) } } - /* PAN ID match */ + /* The destination PAN ID must match macPANId or be the broadcast PAN + * ID + */ if (!IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, dev->state.addr.panid) && + !IEEE802154_PANIDCMP(IEEE802154_PANID_UNSPEC, addr.panid) && !IEEE802154_PANIDCMP(addr.panid, &dev->state.addr.panid)) { return false; } + /* Only source addressing fields in a data or MAC command frame, for + * the PAN coordinator of the source PAN + */ + + if (addr.mode == IEEE802154_ADDRMODE_NONE) + { + return ((*fc & IEEE802154_FRAMECTRL_FTYPE) == IEEE802154_FRAME_DATA || + (*fc & IEEE802154_FRAMECTRL_FTYPE) == + IEEE802154_FRAME_COMMAND) && + dev->state.devmode == NRF54L_DEVMODE_PANCOORD && + IEEE802154_PANIDCMP(&rx[3], dev->state.addr.panid); + } + /* Destination address match */ if (addr.mode == IEEE802154_ADDRMODE_SHORT)
