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 5e911cf460af20af0da9816b41b0c2e6104458bd
Author: raiden00pl <[email protected]>
AuthorDate: Thu Oct 22 16:40:43 2026 +0200

    arch/arm/nrf52,nrf53,nrf54l: number every beacon the radio sends
    
    The MAC leaves the beacon sequence number to the radio, so a beacon
    queued like a normal frame went out with a zero sequence number.  Keep
    macBSN in the radio state from the reset, random as the PIB default,
    and set it in every beacon frame, queued or periodic.
    
    Assisted-by: Claude Code
    Signed-off-by: raiden00pl <[email protected]>
---
 arch/arm/src/nrf52/nrf52_ieee802154.c         | 7 +++++--
 arch/arm/src/nrf52/nrf52_ieee802154_radio.c   | 8 ++++++++
 arch/arm/src/nrf52/nrf52_ieee802154_radio.h   | 2 +-
 arch/arm/src/nrf53/nrf53_ieee802154.c         | 7 +++++--
 arch/arm/src/nrf53/nrf53_ieee802154_radio.c   | 8 ++++++++
 arch/arm/src/nrf53/nrf53_ieee802154_radio.h   | 2 +-
 arch/arm/src/nrf54l/nrf54l_ieee802154.c       | 7 +++++--
 arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c | 8 ++++++++
 arch/arm/src/nrf54l/nrf54l_ieee802154_radio.h | 2 +-
 9 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/arch/arm/src/nrf52/nrf52_ieee802154.c 
b/arch/arm/src/nrf52/nrf52_ieee802154.c
index 6930c4b70e0..de8eec5a0ba 100644
--- a/arch/arm/src/nrf52/nrf52_ieee802154.c
+++ b/arch/arm/src/nrf52/nrf52_ieee802154.c
@@ -334,6 +334,10 @@ static int nrf52_radioi8_reset(struct ieee802154_radio_s 
*radio)
       goto errout;
     }
 
+  /* macBSN starts from a random value */
+
+  dev->radio->state.bsn = rand();
+
   /* Reset TIMER */
 
   dev->tim->ops->reset(dev);
@@ -745,11 +749,10 @@ nrf52_radioi8_beaconstart(struct ieee802154_radio_s 
*radio,
       ret = dev->rtc->ops->setup(dev, &dev->state.sf);
       if (ret == OK)
         {
-          /* Setup beacon transmission, macBSN starts from a random value */
+          /* Setup beacon transmission */
 
           dev->radio->ops->beacon_setup(dev, beacon->bf_data,
                                         beacon->bf_len);
-          dev->radio->state.bsn = rand();
 
           /* Slotted CSMA-CA in the CAP */
 
diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_radio.c 
b/arch/arm/src/nrf52/nrf52_ieee802154_radio.c
index 14eb9929760..001911f4bb8 100644
--- a/arch/arm/src/nrf52/nrf52_ieee802154_radio.c
+++ b/arch/arm/src/nrf52/nrf52_ieee802154_radio.c
@@ -1090,6 +1090,14 @@ static void nrf52_radioi8_norm_setup(struct 
nrf52_radioi8_dev_s *dev,
 
   memcpy(&dev->radio->txbuf[1], &frame->io_data[0], frame->io_len);
 
+  /* The radio numbers the beacons (macBSN) */
+
+  if ((frame->io_data[0] & IEEE802154_FRAMECTRL_FTYPE) ==
+      IEEE802154_FRAME_BEACON)
+    {
+      dev->radio->txbuf[3] = dev->radio->state.bsn++;
+    }
+
   /* Setup buffer */
 
   nrf52_radioi8_norm_setup_buf(dev, dev->radio->txbuf, csma);
diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_radio.h 
b/arch/arm/src/nrf52/nrf52_ieee802154_radio.h
index b1f9a1af9ff..0d6a1f948b9 100644
--- a/arch/arm/src/nrf52/nrf52_ieee802154_radio.h
+++ b/arch/arm/src/nrf52/nrf52_ieee802154_radio.h
@@ -117,6 +117,7 @@ struct nrf52_radioi8_radio_data_s
   bool     csma_busy;           /* CSMA-CA transaction in progress */
   bool     csma_paused;         /* Slotted CSMA-CA waits for the next CAP */
   bool     slotted;             /* Slotted CSMA-CA */
+  uint8_t  bsn;                 /* macBSN, the beacon sequence number */
 
   /* Radio configuration */
 
@@ -131,7 +132,6 @@ struct nrf52_radioi8_radio_data_s
   bool     sftrack;             /* Device tracks the beacons */
   bool     ble;                 /* Battery life extension */
   bool     beacon_pending;      /* A beacon waits for the radio */
-  uint8_t  bsn;                 /* macBSN, the beacon sequence number */
   uint8_t  backoffs;            /* Backoff periods before the next CCA */
   uint32_t boundary;            /* Backoff period boundary of the next step */
 #endif
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154.c 
b/arch/arm/src/nrf53/nrf53_ieee802154.c
index 87fc55bfe28..8c04c817996 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154.c
+++ b/arch/arm/src/nrf53/nrf53_ieee802154.c
@@ -334,6 +334,10 @@ static int nrf53_radioi8_reset(struct ieee802154_radio_s 
*radio)
       goto errout;
     }
 
+  /* macBSN starts from a random value */
+
+  dev->radio->state.bsn = rand();
+
   /* Reset TIMER */
 
   dev->tim->ops->reset(dev);
@@ -745,11 +749,10 @@ nrf53_radioi8_beaconstart(struct ieee802154_radio_s 
*radio,
       ret = dev->rtc->ops->setup(dev, &dev->state.sf);
       if (ret == OK)
         {
-          /* Setup beacon transmission, macBSN starts from a random value */
+          /* Setup beacon transmission */
 
           dev->radio->ops->beacon_setup(dev, beacon->bf_data,
                                         beacon->bf_len);
-          dev->radio->state.bsn = rand();
 
           /* Slotted CSMA-CA in the CAP */
 
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c 
b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c
index f79fc14e360..ec1adb97e31 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c
@@ -1090,6 +1090,14 @@ static void nrf53_radioi8_norm_setup(struct 
nrf53_radioi8_dev_s *dev,
 
   memcpy(&dev->radio->txbuf[1], &frame->io_data[0], frame->io_len);
 
+  /* The radio numbers the beacons (macBSN) */
+
+  if ((frame->io_data[0] & IEEE802154_FRAMECTRL_FTYPE) ==
+      IEEE802154_FRAME_BEACON)
+    {
+      dev->radio->txbuf[3] = dev->radio->state.bsn++;
+    }
+
   /* Setup buffer */
 
   nrf53_radioi8_norm_setup_buf(dev, dev->radio->txbuf, csma);
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.h 
b/arch/arm/src/nrf53/nrf53_ieee802154_radio.h
index f12061e0918..b20897bcb43 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.h
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.h
@@ -117,6 +117,7 @@ struct nrf53_radioi8_radio_data_s
   bool     csma_busy;           /* CSMA-CA transaction in progress */
   bool     csma_paused;         /* Slotted CSMA-CA waits for the next CAP */
   bool     slotted;             /* Slotted CSMA-CA */
+  uint8_t  bsn;                 /* macBSN, the beacon sequence number */
 
   /* Radio configuration */
 
@@ -131,7 +132,6 @@ struct nrf53_radioi8_radio_data_s
   bool     sftrack;             /* Device tracks the beacons */
   bool     ble;                 /* Battery life extension */
   bool     beacon_pending;      /* A beacon waits for the radio */
-  uint8_t  bsn;                 /* macBSN, the beacon sequence number */
   uint8_t  backoffs;            /* Backoff periods before the next CCA */
   uint32_t boundary;            /* Backoff period boundary of the next step */
 #endif
diff --git a/arch/arm/src/nrf54l/nrf54l_ieee802154.c 
b/arch/arm/src/nrf54l/nrf54l_ieee802154.c
index 08180ca3de2..2061b2c25dd 100644
--- a/arch/arm/src/nrf54l/nrf54l_ieee802154.c
+++ b/arch/arm/src/nrf54l/nrf54l_ieee802154.c
@@ -334,6 +334,10 @@ static int nrf54l_radioi8_reset(struct ieee802154_radio_s 
*radio)
       goto errout;
     }
 
+  /* macBSN starts from a random value */
+
+  dev->radio->state.bsn = rand();
+
   /* Reset TIMER */
 
   dev->tim->ops->reset(dev);
@@ -745,11 +749,10 @@ nrf54l_radioi8_beaconstart(struct ieee802154_radio_s 
*radio,
       ret = dev->rtc->ops->setup(dev, &dev->state.sf);
       if (ret == OK)
         {
-          /* Setup beacon transmission, macBSN starts from a random value */
+          /* Setup beacon transmission */
 
           dev->radio->ops->beacon_setup(dev, beacon->bf_data,
                                         beacon->bf_len);
-          dev->radio->state.bsn = rand();
 
           /* Slotted CSMA-CA in the CAP */
 
diff --git a/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c 
b/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c
index bce002efad2..6259773a409 100644
--- a/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c
+++ b/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.c
@@ -1086,6 +1086,14 @@ static void nrf54l_radioi8_norm_setup(struct 
nrf54l_radioi8_dev_s *dev,
 
   memcpy(&dev->radio->txbuf[1], &frame->io_data[0], frame->io_len);
 
+  /* The radio numbers the beacons (macBSN) */
+
+  if ((frame->io_data[0] & IEEE802154_FRAMECTRL_FTYPE) ==
+      IEEE802154_FRAME_BEACON)
+    {
+      dev->radio->txbuf[3] = dev->radio->state.bsn++;
+    }
+
   /* Setup buffer */
 
   nrf54l_radioi8_norm_setup_buf(dev, dev->radio->txbuf, csma);
diff --git a/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.h 
b/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.h
index c248fc0061d..8fac1a60e32 100644
--- a/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.h
+++ b/arch/arm/src/nrf54l/nrf54l_ieee802154_radio.h
@@ -117,6 +117,7 @@ struct nrf54l_radioi8_radio_data_s
   bool     csma_busy;           /* CSMA-CA transaction in progress */
   bool     csma_paused;         /* Slotted CSMA-CA waits for the next CAP */
   bool     slotted;             /* Slotted CSMA-CA */
+  uint8_t  bsn;                 /* macBSN, the beacon sequence number */
 
   /* Radio configuration */
 
@@ -131,7 +132,6 @@ struct nrf54l_radioi8_radio_data_s
   bool     sftrack;             /* Device tracks the beacons */
   bool     ble;                 /* Battery life extension */
   bool     beacon_pending;      /* A beacon waits for the radio */
-  uint8_t  bsn;                 /* macBSN, the beacon sequence number */
   uint8_t  backoffs;            /* Backoff periods before the next CCA */
   uint32_t boundary;            /* Backoff period boundary of the next step */
 #endif

Reply via email to