diff --git a/src/core/common/random.hpp b/src/core/common/random.hpp index 01d597cbc..95af16e92 100644 --- a/src/core/common/random.hpp +++ b/src/core/common/random.hpp @@ -146,6 +146,22 @@ inline void FillBuffer(uint8_t *aBuffer, uint16_t aSize) } } +/** + * This function adds a random jitter within a given range to a given value. + * + * @param[in] aValue A value to which the random jitter is added. + * @param[in] aJitter Maximum jitter. Random jitter is selected from the range `[-aJitter, aJitter]`. + * + * @returns The given value with an added random jitter. + * + */ +inline uint32_t AddJitter(uint32_t aValue, uint16_t aJitter) +{ + aJitter = (aJitter <= aValue) ? aJitter : static_cast(aValue); + + return aValue + GetUint32InRange(0, 2 * aJitter + 1) - aJitter; +} + /** * @} * diff --git a/src/core/utils/channel_monitor.cpp b/src/core/utils/channel_monitor.cpp index 9efae0c8e..856e92692 100644 --- a/src/core/utils/channel_monitor.cpp +++ b/src/core/utils/channel_monitor.cpp @@ -104,29 +104,6 @@ exit: return occupancy; } -void ChannelMonitor::RestartTimer(void) -{ - uint16_t interval = kTimerInterval; - int16_t jitter; - - jitter = static_cast(Random::GetUint16InRange(0, 2 * kMaxJitterInterval)) - kMaxJitterInterval; - - if (jitter >= kTimerInterval) - { - jitter = kTimerInterval - 1; - } - - if (jitter <= -kTimerInterval) - { - jitter = -kTimerInterval + 1; - } - - interval += jitter; - mTimer.StartAt(mTimer.GetFireTime(), interval); - - otLogDebgUtil(GetInstance(), "ChannelMonitor: Timer interval %u, jitter %d", interval, jitter); -} - void ChannelMonitor::HandleTimer(Timer &aTimer) { aTimer.GetOwner().HandleTimer(); @@ -136,7 +113,8 @@ void ChannelMonitor::HandleTimer(void) { GetInstance().Get().EnergyScan(mScanChannelMasks[mChannelMaskIndex], 0, &ChannelMonitor::HandleEnergyScanResult, this); - RestartTimer(); + + mTimer.StartAt(mTimer.GetFireTime(), Random::AddJitter(kTimerInterval, kMaxJitterInterval)); } void ChannelMonitor::HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult) diff --git a/src/core/utils/channel_monitor.hpp b/src/core/utils/channel_monitor.hpp index cdabaded2..ea3574487 100644 --- a/src/core/utils/channel_monitor.hpp +++ b/src/core/utils/channel_monitor.hpp @@ -194,7 +194,6 @@ private: kMaxOccupancy = 0xffff, }; - void RestartTimer(void); static void HandleTimer(Timer &aTimer); void HandleTimer(void); static void HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult);