From 8fc67f3104d72e098370990dda84ea94dde10544 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 3 Jun 2024 13:37:35 -0700 Subject: [PATCH] [meshcop] update `Timestamp::AdvanceRandomTicks()` (#10320) This commit updates `Timestamp::AdvanceRandomTicks()` to ensure that the seconds value is incremented only if the ticks value overflows. --- src/core/meshcop/dataset_updater.cpp | 1 + src/core/meshcop/timestamp.cpp | 5 +++-- src/core/meshcop/timestamp.hpp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/core/meshcop/dataset_updater.cpp b/src/core/meshcop/dataset_updater.cpp index d6d03991f..c59ffacbd 100644 --- a/src/core/meshcop/dataset_updater.cpp +++ b/src/core/meshcop/dataset_updater.cpp @@ -95,6 +95,7 @@ Error DatasetUpdater::RequestUpdate(Dataset &aDataset, UpdaterCallback aCallback else { pendingTimestamp.Clear(); + pendingTimestamp.SetSeconds(1); } pendingTimestamp.AdvanceRandomTicks(); diff --git a/src/core/meshcop/timestamp.cpp b/src/core/meshcop/timestamp.cpp index c0f356eb2..5ed659413 100644 --- a/src/core/meshcop/timestamp.cpp +++ b/src/core/meshcop/timestamp.cpp @@ -99,10 +99,11 @@ void Timestamp::AdvanceRandomTicks(void) { uint16_t ticks = GetTicks(); - ticks += Random::NonCrypto::GetUint32InRange(1, kMaxRandomTicks); + ticks += Random::NonCrypto::GetUint32InRange(1, kMaxTicks + 1); - if (ticks & (kTicksMask >> kTicksOffset)) + if (ticks > kMaxTicks) { + ticks -= (kMaxTicks + 1); SetSeconds(GetSeconds() + 1); } diff --git a/src/core/meshcop/timestamp.hpp b/src/core/meshcop/timestamp.hpp index d4f8e471f..6dabe1960 100644 --- a/src/core/meshcop/timestamp.hpp +++ b/src/core/meshcop/timestamp.hpp @@ -179,9 +179,9 @@ public: private: static constexpr uint8_t kTicksOffset = 1; static constexpr uint16_t kTicksMask = 0x7fff << kTicksOffset; - static constexpr uint16_t kMaxRandomTicks = 0x7fff; static constexpr uint8_t kAuthoritativeOffset = 0; static constexpr uint16_t kAuthoritativeMask = 1 << kAuthoritativeOffset; + static constexpr uint16_t kMaxTicks = 0x7fff; uint16_t mSeconds16; // bits 32-47 uint32_t mSeconds32; // bits 0-31