diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index b429408dc..761ae63ff 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -1475,54 +1475,42 @@ void RoutingManager::RxRaTracker::RemoveOrDeprecateEntriesFromInactiveRouters(vo void RoutingManager::RxRaTracker::ScheduleStaleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli onLinkStaleTime = now; - TimeMilli staleTime = now.GetDistantFuture(); - bool foundOnLink = false; + NextFireTime staleTime; + TimeMilli onLinkStaleTime = staleTime.GetNow(); + bool foundOnLink = false; // For on-link prefixes, we consider stale time as when all on-link // prefixes become stale (the latest stale time) but for route // prefixes we consider the earliest stale time. - mStaleTimer.Stop(); - for (const Router &router : mRouters) { for (const OnLinkPrefix &entry : router.mOnLinkPrefixes) { if (!entry.IsDeprecated()) { - TimeMilli entryStaleTime = Max(now, entry.GetStaleTime()); - - onLinkStaleTime = Max(onLinkStaleTime, entryStaleTime); + onLinkStaleTime = Max(onLinkStaleTime, Max(staleTime.GetNow(), entry.GetStaleTime())); foundOnLink = true; } } for (const RoutePrefix &entry : router.mRoutePrefixes) { - TimeMilli entryStaleTime = Max(now, entry.GetStaleTime()); - - staleTime = Min(staleTime, entryStaleTime); + staleTime.UpdateIfEarlier(entry.GetStaleTime()); } } if (foundOnLink) { - staleTime = Min(staleTime, onLinkStaleTime); + staleTime.UpdateIfEarlier(onLinkStaleTime); } if (mLocalRaHeader.IsValid()) { - TimeMilli raHeaderStaleTime = Max(now, mLocalRaHeaderUpdateTime + Time::SecToMsec(kRtrAdvStaleTime)); - - staleTime = Min(staleTime, raHeaderStaleTime); + staleTime.UpdateIfEarlier(mLocalRaHeaderUpdateTime + Time::SecToMsec(kRtrAdvStaleTime)); } - if (staleTime != now.GetDistantFuture()) - { - mStaleTimer.FireAt(staleTime); - } + mStaleTimer.FireAt(staleTime); } void RoutingManager::RxRaTracker::HandleStaleTimer(void) @@ -1545,13 +1533,13 @@ void RoutingManager::RxRaTracker::HandleExpirationTimer(void) { RemoveExpiredEnt void RoutingManager::RxRaTracker::RemoveExpiredEntries(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextExpireTime = now.GetDistantFuture(); - LifetimedPrefix::ExpirationChecker expirationChecker(now); - bool didRemove = false; + NextFireTime nextExpireTime; + bool didRemove = false; for (Router &router : mRouters) { + LifetimedPrefix::ExpirationChecker expirationChecker(nextExpireTime.GetNow()); + didRemove |= router.mOnLinkPrefixes.RemoveAndFreeAllMatching(expirationChecker); didRemove |= router.mRoutePrefixes.RemoveAndFreeAllMatching(expirationChecker); } @@ -1569,19 +1557,16 @@ void RoutingManager::RxRaTracker::RemoveExpiredEntries(void) { for (const OnLinkPrefix &entry : router.mOnLinkPrefixes) { - nextExpireTime = Min(nextExpireTime, entry.GetExpireTime()); + nextExpireTime.UpdateIfEarlier(entry.GetExpireTime()); } for (const RoutePrefix &entry : router.mRoutePrefixes) { - nextExpireTime = Min(nextExpireTime, entry.GetExpireTime()); + nextExpireTime.UpdateIfEarlier(entry.GetExpireTime()); } } - if (nextExpireTime != now.GetDistantFuture()) - { - mExpirationTimer.FireAt(nextExpireTime); - } + mExpirationTimer.FireAt(nextExpireTime); } void RoutingManager::RxRaTracker::SignalTableChanged(void) { mSignalTask.Post(); } @@ -1620,8 +1605,7 @@ void RoutingManager::RxRaTracker::UpdateRouterOnRx(Router &aRouter) void RoutingManager::RxRaTracker::HandleRouterTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; for (Router &router : mRouters) { @@ -1639,7 +1623,7 @@ void RoutingManager::RxRaTracker::HandleRouterTimer(void) continue; } - if (router.mTimeout <= now) + if (router.mTimeout <= nextTime.GetNow()) { router.mNsProbeCount++; @@ -1650,21 +1634,19 @@ void RoutingManager::RxRaTracker::HandleRouterTimer(void) continue; } - router.mTimeout = now + ((router.mNsProbeCount < Router::kMaxNsProbes) ? Router::kNsProbeRetryInterval + router.mTimeout = + nextTime.GetNow() + ((router.mNsProbeCount < Router::kMaxNsProbes) ? Router::kNsProbeRetryInterval : Router::kNsProbeTimeout); SendNeighborSolicitToRouter(router); } - nextTime = Min(nextTime, router.mTimeout); + nextTime.UpdateIfEarlier(router.mTimeout); } RemoveOrDeprecateEntriesFromInactiveRouters(); - if (nextTime != now.GetDistantFuture()) - { - mRouterTimer.FireAtIfEarlier(nextTime); - } + mRouterTimer.FireAt(nextTime); } void RoutingManager::RxRaTracker::SendNeighborSolicitToRouter(const Router &aRouter) @@ -2635,8 +2617,8 @@ void RoutingManager::OnLinkPrefixManager::SavePrefix(const Ip6::Prefix &aPrefix, void RoutingManager::OnLinkPrefixManager::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextExpireTime = now.GetDistantFuture(); + NextFireTime nextExpireTime; + Array expiredPrefixes; switch (GetState()) @@ -2646,27 +2628,27 @@ void RoutingManager::OnLinkPrefixManager::HandleTimer(void) case kPublishing: case kAdvertising: case kDeprecating: - if (now >= mExpireTime) + if (nextExpireTime.GetNow() >= mExpireTime) { IgnoreError(Get().RemoveBrOnLinkPrefix(mLocalPrefix)); SetState(kIdle); } else { - nextExpireTime = mExpireTime; + nextExpireTime.UpdateIfEarlier(mExpireTime); } break; } for (OldPrefix &entry : mOldLocalPrefixes) { - if (now >= entry.mExpireTime) + if (nextExpireTime.GetNow() >= entry.mExpireTime) { SuccessOrAssert(expiredPrefixes.PushBack(entry.mPrefix)); } else { - nextExpireTime = Min(nextExpireTime, entry.mExpireTime); + nextExpireTime.UpdateIfEarlier(entry.mExpireTime); } } @@ -2677,10 +2659,7 @@ void RoutingManager::OnLinkPrefixManager::HandleTimer(void) mOldLocalPrefixes.RemoveMatching(prefix); } - if (nextExpireTime != now.GetDistantFuture()) - { - mTimer.FireAtIfEarlier(nextExpireTime); - } + mTimer.FireAtIfEarlier(nextExpireTime); Get().mRoutePublisher.Evaluate(); } @@ -2782,9 +2761,8 @@ exit: Error RoutingManager::RioAdvertiser::AppendRios(RouterAdvert::TxMessage &aRaMessage) { - Error error = kErrorNone; - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + Error error = kErrorNone; + NextFireTime nextTime; RioPrefixArray oldPrefixes; NetworkData::Iterator iterator = NetworkData::kIteratorInit; NetworkData::OnMeshPrefixConfig prefixConfig; @@ -2867,7 +2845,7 @@ Error RoutingManager::RioAdvertiser::AppendRios(RouterAdvert::TxMessage &aRaMess if (prefix.mIsDeprecating) { - if (now >= prefix.mExpirationTime) + if (nextTime.GetNow() >= prefix.mExpirationTime) { SuccessOrExit(error = AppendRio(prefix.mPrefix, /* aRouteLifetime */ 0, aRaMessage)); continue; @@ -2876,7 +2854,7 @@ Error RoutingManager::RioAdvertiser::AppendRios(RouterAdvert::TxMessage &aRaMess else { prefix.mIsDeprecating = true; - prefix.mExpirationTime = now + kDeprecationTime; + prefix.mExpirationTime = nextTime.GetNow() + kDeprecationTime; } if (mPrefixes.PushBack(prefix) != kErrorNone) @@ -2885,7 +2863,7 @@ Error RoutingManager::RioAdvertiser::AppendRios(RouterAdvert::TxMessage &aRaMess SuccessOrExit(error = AppendRio(prefix.mPrefix, /* aRouteLifetime */ 0, aRaMessage)); } - nextTime = Min(nextTime, prefix.mExpirationTime); + nextTime.UpdateIfEarlier(prefix.mExpirationTime); } // Advertise all prefixes in `mPrefixes` @@ -2896,16 +2874,13 @@ Error RoutingManager::RioAdvertiser::AppendRios(RouterAdvert::TxMessage &aRaMess if (prefix.mIsDeprecating) { - lifetime = TimeMilli::MsecToSec(prefix.mExpirationTime - now); + lifetime = TimeMilli::MsecToSec(prefix.mExpirationTime - nextTime.GetNow()); } SuccessOrExit(error = AppendRio(prefix.mPrefix, lifetime, aRaMessage)); } - if (nextTime != now.GetDistantFuture()) - { - mTimer.FireAtIfEarlier(nextTime); - } + mTimer.FireAtIfEarlier(nextTime); exit: return error; diff --git a/src/core/coap/coap.cpp b/src/core/coap/coap.cpp index 6afd693a7..941f6086b 100644 --- a/src/core/coap/coap.cpp +++ b/src/core/coap/coap.cpp @@ -464,8 +464,7 @@ void CoapBase::HandleRetransmissionTimer(Timer &aTimer) void CoapBase::HandleRetransmissionTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; Metadata metadata; Ip6::MessageInfo messageInfo; @@ -473,7 +472,7 @@ void CoapBase::HandleRetransmissionTimer(void) { metadata.ReadFrom(message); - if (now >= metadata.mNextTimerShot) + if (nextTime.GetNow() >= metadata.mNextTimerShot) { #if OPENTHREAD_CONFIG_COAP_OBSERVE_API_ENABLE if (message.IsRequest() && metadata.mObserve && metadata.mAcknowledged) @@ -493,7 +492,7 @@ void CoapBase::HandleRetransmissionTimer(void) // Increment retransmission counter and timer. metadata.mRetransmissionsRemaining--; metadata.mRetransmissionTimeout *= 2; - metadata.mNextTimerShot = now + metadata.mRetransmissionTimeout; + metadata.mNextTimerShot = nextTime.GetNow() + metadata.mRetransmissionTimeout; metadata.UpdateIn(message); // Retransmit @@ -512,13 +511,10 @@ void CoapBase::HandleRetransmissionTimer(void) } } - nextTime = Min(nextTime, metadata.mNextTimerShot); + nextTime.UpdateIfEarlier(metadata.mNextTimerShot); } - if (nextTime < now.GetDistantFuture()) - { - mRetransmissionTimer.FireAt(nextTime); - } + mRetransmissionTimer.FireAt(nextTime); } void CoapBase::FinalizeCoapTransaction(Message &aRequest, @@ -1590,8 +1586,7 @@ void ResponsesQueue::HandleTimer(Timer &aTimer) void ResponsesQueue::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextDequeueTime = now.GetDistantFuture(); + NextFireTime nextDequeueTime; for (Message &message : mQueue) { @@ -1599,19 +1594,16 @@ void ResponsesQueue::HandleTimer(void) metadata.ReadFrom(message); - if (now >= metadata.mDequeueTime) + if (nextDequeueTime.GetNow() >= metadata.mDequeueTime) { DequeueResponse(message); continue; } - nextDequeueTime = Min(nextDequeueTime, metadata.mDequeueTime); + nextDequeueTime.UpdateIfEarlier(metadata.mDequeueTime); } - if (nextDequeueTime < now.GetDistantFuture()) - { - mTimer.FireAt(nextDequeueTime); - } + mTimer.FireAt(nextDequeueTime); } void ResponsesQueue::ResponseMetadata::ReadFrom(const Message &aMessage) diff --git a/src/core/common/timer.cpp b/src/core/common/timer.cpp index 5484f20d0..939989288 100644 --- a/src/core/common/timer.cpp +++ b/src/core/common/timer.cpp @@ -41,6 +41,25 @@ namespace ot { +//--------------------------------------------------------------------------------------------------------------------- +// `NextFireTime` + +NextFireTime::NextFireTime(void) + : NextFireTime(TimerMilli::GetNow()) +{ +} + +NextFireTime::NextFireTime(Time aNow) + : mNow(aNow) + , mNextTime(aNow.GetDistantFuture()) +{ +} + +void NextFireTime::UpdateIfEarlier(Time aTime) { mNextTime = Min(mNextTime, Max(mNow, aTime)); } + +//--------------------------------------------------------------------------------------------------------------------- +// `Timer` + const Timer::Scheduler::AlarmApi TimerMilli::Scheduler::sAlarmMilliApi = { &otPlatAlarmMilliStartAt, &otPlatAlarmMilliStop, @@ -77,6 +96,9 @@ bool Timer::DoesFireBefore(const Timer &aSecondTimer, Time aNow) const return retval; } +//--------------------------------------------------------------------------------------------------------------------- +// `TimerMilli` + void TimerMilli::Start(uint32_t aDelay) { StartAt(GetNow(), aDelay); } void TimerMilli::StartAt(TimeMilli aStartTime, uint32_t aDelay) @@ -91,6 +113,18 @@ void TimerMilli::FireAt(TimeMilli aFireTime) Get().Add(*this); } +void TimerMilli::FireAt(const NextFireTime &aNextFireTime) +{ + if (aNextFireTime.IsSet()) + { + FireAt(aNextFireTime.GetNextTime()); + } + else + { + Stop(); + } +} + void TimerMilli::FireAtIfEarlier(TimeMilli aFireTime) { if (!IsRunning() || (mFireTime > aFireTime)) @@ -99,10 +133,21 @@ void TimerMilli::FireAtIfEarlier(TimeMilli aFireTime) } } +void TimerMilli::FireAtIfEarlier(const NextFireTime &aNextFireTime) +{ + if (aNextFireTime.IsSet()) + { + FireAtIfEarlier(aNextFireTime.GetNextTime()); + } +} + void TimerMilli::Stop(void) { Get().Remove(*this); } void TimerMilli::RemoveAll(Instance &aInstance) { aInstance.Get().RemoveAll(); } +//--------------------------------------------------------------------------------------------------------------------- +// `Timer::Scheduler` + void Timer::Scheduler::Add(Timer &aTimer, const AlarmApi &aAlarmApi) { Timer *prev = nullptr; @@ -212,6 +257,9 @@ exit: return; } +//--------------------------------------------------------------------------------------------------------------------- +// `TimerMicro` + #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE const Timer::Scheduler::AlarmApi TimerMicro::Scheduler::sAlarmMicroApi = { &otPlatAlarmMicroStartAt, diff --git a/src/core/common/timer.hpp b/src/core/common/timer.hpp index 8eda380cf..02b944b70 100644 --- a/src/core/common/timer.hpp +++ b/src/core/common/timer.hpp @@ -61,6 +61,70 @@ namespace ot { * */ +/** + * Represents an object tracking the next fire time along with the current time (now). + * + */ +class NextFireTime +{ +public: + /** + * Initializes the `NextFireTime` with a given current time. + * + * @pram[in] aNow The current time. + * + */ + explicit NextFireTime(Time aNow); + + /** + * Initializes the `NextFireTime` using `TimerMilli::GetNow()` for current time. + * + */ + NextFireTime(void); + + /** + * Gets the current time (now) tracked by the `NextFireTime` object. + * + * @returns The current time. + * + */ + Time GetNow(void) const { return mNow; } + + /** + * Updates the tracked next fire time with a new given time only if it is earlier. + * + * If the given @p aTime is in the past relative to the tracked `GetNow()`, the `GetNow()` time is used instead. + * This ensures that the next fire time is never scheduled before the current time. + * + * @param[in] aTime The new time. + * + */ + void UpdateIfEarlier(Time aTime); + + /** + * Indicates whether or not next fire time is set. + * + * @retval TRUE The next fire time is set. + * @retval FALSE The next fire time is not set. + * + */ + bool IsSet(void) const { return (mNextTime != mNow.GetDistantFuture()); } + + /** + * Gets the next fire time. + * + * If the next fire time is not, `GetNow().GetDistantFuture()` will be returned. + * + * @returns The next fire time. + * + */ + Time GetNextTime(void) const { return mNextTime; } + +private: + Time mNow; + Time mNextTime; +}; + /** * Implements a timer. * @@ -220,7 +284,17 @@ public: void FireAt(TimeMilli aFireTime); /** - * This method (re-)schedules the timer with a given a fire time only if the timer is not running or the new given + * Schedules the timer to fire at a given fire time. + * + * Is @p aNextFireTime is not set, the timer is stopped. + * + * @param[in] aNextFireTime The fire time. + * + */ + void FireAt(const NextFireTime &aNextFireTime); + + /** + * Re-schedules the timer with a given a fire time only if the timer is not running or the new given * fire time is earlier than the current fire time. * * @param[in] aFireTime The fire time. @@ -228,6 +302,15 @@ public: */ void FireAtIfEarlier(TimeMilli aFireTime); + /** + * Re-schedules the timer with a given a fire time only if the timer is not running or the new given + * fire time is earlier than the current fire time. + * + * @param[in] aNextFireTime The fire time. + * + */ + void FireAtIfEarlier(const NextFireTime &aNextFireTime); + /** * Stops the timer. * diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 999d73224..bb09ebb24 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -598,8 +598,7 @@ void Commissioner::HandleTimer(void) void Commissioner::HandleJoinerExpirationTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli next = now.GetDistantFuture(); + NextFireTime nextTime; for (Joiner &joiner : mJoiners) { @@ -608,21 +607,18 @@ void Commissioner::HandleJoinerExpirationTimer(void) continue; } - if (joiner.mExpirationTime <= now) + if (joiner.mExpirationTime <= nextTime.GetNow()) { LogDebg("removing joiner due to timeout or successfully joined"); RemoveJoinerEntry(joiner); } else { - next = Min(joiner.mExpirationTime, next); + nextTime.UpdateIfEarlier(joiner.mExpirationTime); } } - if (next != now.GetDistantFuture()) - { - mJoinerExpirationTimer.FireAtIfEarlier(next); - } + mJoinerExpirationTimer.FireAtIfEarlier(nextTime); } Error Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, uint8_t aLength) diff --git a/src/core/net/dns_client.cpp b/src/core/net/dns_client.cpp index 95a87b7bf..61bdb1714 100644 --- a/src/core/net/dns_client.cpp +++ b/src/core/net/dns_client.cpp @@ -1496,9 +1496,8 @@ void Client::PrepareResponseAndFinalize(Query &aQuery, const Message &aResponseM void Client::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); - QueryInfo info; + NextFireTime nextTime; + QueryInfo info; #if OPENTHREAD_CONFIG_DNS_CLIENT_OVER_TCP_ENABLE bool hasTcpQuery = false; #endif @@ -1514,7 +1513,7 @@ void Client::HandleTimer(void) continue; } - if (now >= info.mRetransmissionTime) + if (nextTime.GetNow() >= info.mRetransmissionTime) { if (info.mTransmissionCount >= info.mConfig.GetMaxTxAttempts()) { @@ -1525,10 +1524,7 @@ void Client::HandleTimer(void) IgnoreError(SendQuery(*query, info, /* aUpdateTimer */ false)); } - if (nextTime > info.mRetransmissionTime) - { - nextTime = info.mRetransmissionTime; - } + nextTime.UpdateIfEarlier(info.mRetransmissionTime); #if OPENTHREAD_CONFIG_DNS_CLIENT_OVER_TCP_ENABLE if (info.mConfig.GetTransportProto() == QueryConfig::kDnsTransportTcp) @@ -1539,10 +1535,7 @@ void Client::HandleTimer(void) } } - if (nextTime < now.GetDistantFuture()) - { - mTimer.FireAt(nextTime); - } + mTimer.FireAt(nextTime); #if OPENTHREAD_CONFIG_DNS_CLIENT_OVER_TCP_ENABLE if (!hasTcpQuery && mTcpState != kTcpUninitialized) diff --git a/src/core/net/dnssd_server.cpp b/src/core/net/dnssd_server.cpp index 1bfc9f166..af24fe95e 100644 --- a/src/core/net/dnssd_server.cpp +++ b/src/core/net/dnssd_server.cpp @@ -1177,8 +1177,7 @@ Server::DnsQueryType Server::GetQueryTypeAndName(const otDnssdQuery *aQuery, Dns void Server::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextExpire = now.GetDistantFuture(); + NextFireTime nextExpire; for (ProxyQuery &query : mProxyQueries) { @@ -1186,13 +1185,13 @@ void Server::HandleTimer(void) info.ReadFrom(query); - if (info.mExpireTime <= now) + if (info.mExpireTime <= nextExpire.GetNow()) { Finalize(query, Header::kResponseSuccess); } else { - nextExpire = Min(nextExpire, info.mExpireTime); + nextExpire.UpdateIfEarlier(info.mExpireTime); } } @@ -1204,21 +1203,18 @@ void Server::HandleTimer(void) continue; } - if (query.GetExpireTime() <= now) + if (query.GetExpireTime() <= nextExpire.GetNow()) { otPlatDnsCancelUpstreamQuery(&GetInstance(), &query); } else { - nextExpire = Min(nextExpire, query.GetExpireTime()); + nextExpire.UpdateIfEarlier(query.GetExpireTime()); } } #endif - if (nextExpire != now.GetDistantFuture()) - { - mTimer.FireAtIfEarlier(nextExpire); - } + mTimer.FireAtIfEarlier(nextExpire); } void Server::Finalize(ProxyQuery &aQuery, ResponseCode aResponseCode) diff --git a/src/core/net/ip6_mpl.cpp b/src/core/net/ip6_mpl.cpp index 698c66f7a..7e18b39c6 100644 --- a/src/core/net/ip6_mpl.cpp +++ b/src/core/net/ip6_mpl.cpp @@ -383,8 +383,7 @@ exit: void Mpl::HandleRetransmissionTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; for (Message &message : mBufferedMessageSet) { @@ -394,9 +393,9 @@ void Mpl::HandleRetransmissionTimer(void) metadata.ReadFrom(message); - if (now < metadata.mTransmissionTime) + if (nextTime.GetNow() < metadata.mTransmissionTime) { - nextTime = Min(nextTime, metadata.mTransmissionTime); + nextTime.UpdateIfEarlier(metadata.mTransmissionTime); continue; } @@ -417,10 +416,10 @@ void Mpl::HandleRetransmissionTimer(void) if (metadata.mTransmissionCount < maxRetx) { - metadata.GenerateNextTransmissionTime(now, kDataMessageInterval); + metadata.GenerateNextTransmissionTime(nextTime.GetNow(), kDataMessageInterval); metadata.UpdateIn(message); - nextTime = Min(nextTime, metadata.mTransmissionTime); + nextTime.UpdateIfEarlier(metadata.mTransmissionTime); messageCopy = message.Clone(); } @@ -451,10 +450,7 @@ void Mpl::HandleRetransmissionTimer(void) } } - if (nextTime < now.GetDistantFuture()) - { - mRetransmissionTimer.FireAt(nextTime); - } + mRetransmissionTimer.FireAt(nextTime); } void Mpl::Metadata::ReadFrom(const Message &aMessage) diff --git a/src/core/net/sntp_client.cpp b/src/core/net/sntp_client.cpp index 7718b02ba..3950f49b1 100644 --- a/src/core/net/sntp_client.cpp +++ b/src/core/net/sntp_client.cpp @@ -227,8 +227,7 @@ void Client::FinalizeSntpTransaction(Message &aQuery, void Client::HandleRetransmissionTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; QueryMetadata queryMetadata; Ip6::MessageInfo messageInfo; @@ -236,7 +235,7 @@ void Client::HandleRetransmissionTimer(void) { queryMetadata.ReadFrom(message); - if (now >= queryMetadata.mTransmissionTime) + if (nextTime.GetNow() >= queryMetadata.mTransmissionTime) { if (queryMetadata.mRetransmissionCount >= kMaxRetransmit) { @@ -247,7 +246,7 @@ void Client::HandleRetransmissionTimer(void) // Increment retransmission counter and timer. queryMetadata.mRetransmissionCount++; - queryMetadata.mTransmissionTime = now + kResponseTimeout; + queryMetadata.mTransmissionTime = nextTime.GetNow() + kResponseTimeout; queryMetadata.UpdateIn(message); // Retransmit @@ -258,13 +257,10 @@ void Client::HandleRetransmissionTimer(void) SendCopy(message, messageInfo); } - nextTime = Min(nextTime, queryMetadata.mTransmissionTime); + nextTime.UpdateIfEarlier(queryMetadata.mTransmissionTime); } - if (nextTime < now.GetDistantFuture()) - { - mRetransmissionTimer.FireAt(nextTime); - } + mRetransmissionTimer.FireAt(nextTime); } void Client::HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo) diff --git a/src/core/net/srp_advertising_proxy.cpp b/src/core/net/srp_advertising_proxy.cpp index 8a2451d1f..c8acc6f70 100644 --- a/src/core/net/srp_advertising_proxy.cpp +++ b/src/core/net/srp_advertising_proxy.cpp @@ -1253,23 +1253,19 @@ exit: void AdvertisingProxy::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; OwningList expiredList; VerifyOrExit(mState == kStateRunning); - mAdvInfoList.RemoveAllMatching(AdvInfo::ExpirationChecker(now), expiredList); + mAdvInfoList.RemoveAllMatching(AdvInfo::ExpirationChecker(nextTime.GetNow()), expiredList); for (AdvInfo &adv : mAdvInfoList) { - nextTime = Min(adv.mExpireTime, nextTime); + nextTime.UpdateIfEarlier(adv.mExpireTime); } - if (nextTime != now.GetDistantFuture()) - { - mTimer.FireAtIfEarlier(nextTime); - } + mTimer.FireAtIfEarlier(nextTime); for (AdvInfo &adv : expiredList) { diff --git a/src/core/net/srp_client.cpp b/src/core/net/srp_client.cpp index fc4a417b5..da697968c 100644 --- a/src/core/net/srp_client.cpp +++ b/src/core/net/srp_client.cpp @@ -1795,9 +1795,8 @@ exit: void Client::UpdateState(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli earliestRenewTime = now.GetDistantFuture(); - bool shouldUpdate = false; + NextFireTime nextRenewTime; + bool shouldUpdate = false; VerifyOrExit((GetState() != kStateStopped) && (GetState() != kStatePaused)); VerifyOrExit(mHostInfo.GetName() != nullptr); @@ -1817,7 +1816,7 @@ void Client::UpdateState(void) break; case kRegistered: - if (now < mLeaseRenewTime) + if (nextRenewTime.GetNow() < mLeaseRenewTime) { break; } @@ -1864,14 +1863,14 @@ void Client::UpdateState(void) break; case kRegistered: - if (service.GetLeaseRenewTime() <= now) + if (service.GetLeaseRenewTime() <= nextRenewTime.GetNow()) { service.SetState(kToRefresh); shouldUpdate = true; } else { - earliestRenewTime = Min(earliestRenewTime, service.GetLeaseRenewTime()); + nextRenewTime.UpdateIfEarlier(service.GetLeaseRenewTime()); } break; @@ -1891,9 +1890,9 @@ void Client::UpdateState(void) ExitNow(); } - if ((GetState() == kStateUpdated) && (earliestRenewTime != now.GetDistantFuture())) + if (GetState() == kStateUpdated) { - mTimer.FireAt(earliestRenewTime); + mTimer.FireAt(nextRenewTime); } exit: diff --git a/src/core/net/srp_server.cpp b/src/core/net/srp_server.cpp index 635cbedb2..b3ea87b5d 100644 --- a/src/core/net/srp_server.cpp +++ b/src/core/net/srp_server.cpp @@ -1608,15 +1608,14 @@ exit: void Server::HandleLeaseTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli earliestExpireTime = now.GetDistantFuture(); - Host *nextHost; + NextFireTime nextExpireTime; + Host *nextHost; for (Host *host = mHosts.GetHead(); host != nullptr; host = nextHost) { nextHost = host->GetNext(); - if (host->GetKeyExpireTime() <= now) + if (host->GetKeyExpireTime() <= nextExpireTime.GetNow()) { LogInfo("KEY LEASE of host %s expired", host->GetFullName()); @@ -1629,7 +1628,7 @@ void Server::HandleLeaseTimer(void) Service *next; - earliestExpireTime = Min(earliestExpireTime, host->GetKeyExpireTime()); + nextExpireTime.UpdateIfEarlier(host->GetKeyExpireTime()); // Check if any service instance name expired. for (Service *service = host->mServices.GetHead(); service != nullptr; service = next) @@ -1638,18 +1637,18 @@ void Server::HandleLeaseTimer(void) OT_ASSERT(service->mIsDeleted); - if (service->GetKeyExpireTime() <= now) + if (service->GetKeyExpireTime() <= nextExpireTime.GetNow()) { service->Log(Service::kKeyLeaseExpired); host->RemoveService(service, kDeleteName, kNotifyServiceHandler); } else { - earliestExpireTime = Min(earliestExpireTime, service->GetKeyExpireTime()); + nextExpireTime.UpdateIfEarlier(service->GetKeyExpireTime()); } } } - else if (host->GetExpireTime() <= now) + else if (host->GetExpireTime() <= nextExpireTime.GetNow()) { LogInfo("LEASE of host %s expired", host->GetFullName()); @@ -1662,7 +1661,7 @@ void Server::HandleLeaseTimer(void) RemoveHost(host, kRetainName); - earliestExpireTime = Min(earliestExpireTime, host->GetKeyExpireTime()); + nextExpireTime.UpdateIfEarlier(host->GetKeyExpireTime()); } else { @@ -1672,13 +1671,13 @@ void Server::HandleLeaseTimer(void) OT_ASSERT(!host->IsDeleted()); - earliestExpireTime = Min(earliestExpireTime, host->GetExpireTime()); + nextExpireTime.UpdateIfEarlier(host->GetExpireTime()); for (Service *service = host->mServices.GetHead(); service != nullptr; service = next) { next = service->GetNext(); - if (service->GetKeyExpireTime() <= now) + if (service->GetKeyExpireTime() <= nextExpireTime.GetNow()) { service->Log(Service::kKeyLeaseExpired); host->RemoveService(service, kDeleteName, kNotifyServiceHandler); @@ -1686,38 +1685,25 @@ void Server::HandleLeaseTimer(void) else if (service->mIsDeleted) { // The service has been deleted but the name retains. - earliestExpireTime = Min(earliestExpireTime, service->GetKeyExpireTime()); + nextExpireTime.UpdateIfEarlier(service->GetKeyExpireTime()); } - else if (service->GetExpireTime() <= now) + else if (service->GetExpireTime() <= nextExpireTime.GetNow()) { service->Log(Service::kLeaseExpired); // The service is expired, delete it. host->RemoveService(service, kRetainName, kNotifyServiceHandler); - earliestExpireTime = Min(earliestExpireTime, service->GetKeyExpireTime()); + nextExpireTime.UpdateIfEarlier(service->GetKeyExpireTime()); } else { - earliestExpireTime = Min(earliestExpireTime, service->GetExpireTime()); + nextExpireTime.UpdateIfEarlier(service->GetExpireTime()); } } } } - if (earliestExpireTime != now.GetDistantFuture()) - { - OT_ASSERT(earliestExpireTime >= now); - if (!mLeaseTimer.IsRunning() || earliestExpireTime <= mLeaseTimer.GetFireTime()) - { - LogInfo("Lease timer is scheduled for %lu seconds", ToUlong(Time::MsecToSec(earliestExpireTime - now))); - mLeaseTimer.StartAt(earliestExpireTime, 0); - } - } - else - { - LogInfo("Lease timer is stopped"); - mLeaseTimer.Stop(); - } + mLeaseTimer.FireAtIfEarlier(nextExpireTime); } void Server::HandleOutstandingUpdatesTimer(void) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index b72db8fff..fc1c73c07 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1600,8 +1600,7 @@ exit: void Mle::HandleDelayedResponseTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextSendTime = now.GetDistantFuture(); + NextFireTime nextSendTime; for (Message &message : mDelayedResponses) { @@ -1609,9 +1608,9 @@ void Mle::HandleDelayedResponseTimer(void) metadata.ReadFrom(message); - if (now < metadata.mSendTime) + if (nextSendTime.GetNow() < metadata.mSendTime) { - nextSendTime = Min(nextSendTime, metadata.mSendTime); + nextSendTime.UpdateIfEarlier(metadata.mSendTime); } else { @@ -1620,10 +1619,7 @@ void Mle::HandleDelayedResponseTimer(void) } } - if (nextSendTime < now.GetDistantFuture()) - { - mDelayedResponseTimer.FireAt(nextSendTime); - } + mDelayedResponseTimer.FireAt(nextSendTime); } void Mle::SendDelayedResponse(TxMessage &aMessage, const DelayedResponseMetadata &aMetadata) diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 11803c693..9c2914706 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -1434,8 +1434,7 @@ void Leader::ContextIds::SetRemoveTime(uint8_t aId, TimeMilli aTime) void Leader::ContextIds::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; #if OPENTHREAD_CONFIG_BORDER_ROUTER_SIGNAL_NETWORK_DATA_FULL OT_ASSERT(!mIsClone); @@ -1448,21 +1447,18 @@ void Leader::ContextIds::HandleTimer(void) continue; } - if (now >= GetRemoveTime(id)) + if (nextTime.GetNow() >= GetRemoveTime(id)) { MarkAsUnallocated(id); Get().RemoveContext(id); } else { - nextTime = Min(nextTime, GetRemoveTime(id)); + nextTime.UpdateIfEarlier(GetRemoveTime(id)); } } - if (nextTime != now.GetDistantFuture()) - { - Get().mTimer.FireAt(nextTime); - } + Get().mTimer.FireAt(nextTime); } } // namespace NetworkData diff --git a/src/core/utils/slaac_address.cpp b/src/core/utils/slaac_address.cpp index 95478e3f0..c2d109c5c 100644 --- a/src/core/utils/slaac_address.cpp +++ b/src/core/utils/slaac_address.cpp @@ -359,8 +359,7 @@ exit: void Slaac::HandleTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); + NextFireTime nextTime; for (SlaacAddress &slaacAddr : mSlaacAddresses) { @@ -369,20 +368,17 @@ void Slaac::HandleTimer(void) continue; } - if (slaacAddr.GetExpirationTime() <= now) + if (slaacAddr.GetExpirationTime() <= nextTime.GetNow()) { RemoveAddress(slaacAddr); } else { - nextTime = Min(nextTime, slaacAddr.GetExpirationTime()); + nextTime.UpdateIfEarlier(slaacAddr.GetExpirationTime()); } } - if (nextTime != now.GetDistantFuture()) - { - mTimer.FireAtIfEarlier(nextTime); - } + mTimer.FireAtIfEarlier(nextTime); } Error Slaac::GenerateIid(Ip6::Netif::UnicastAddress &aAddress, uint8_t &aDadCounter) const