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
