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)

Reply via email to