[timer] add NextFireTime class (#10295)

This commit introduces `NextFireTime`, a helper object for tracking
the next fire time along with the current time. It provides an
`UpdateIfEarlier(Time)` method to update the tracked next fire time
with a new given time only if it is earlier.

The `NextFireTime` class simplifies a common code pattern used across
modules to determine the earliest fire time when scheduling a timer.
It also ensures that the next fire time is never set before the
current time, improving code safety.
This commit is contained in:
Abtin Keshavarzian
2024-05-27 21:46:50 -07:00
committed by GitHub
parent ef10dec155
commit 10cff14788
15 changed files with 240 additions and 196 deletions
+35 -60
View File
@@ -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<Ip6::Prefix, kMaxOldPrefixes> 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<Settings>().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<RoutingManager>().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;
+9 -17
View File
@@ -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)
+48
View File
@@ -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<Scheduler>().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<Scheduler>().Remove(*this); }
void TimerMilli::RemoveAll(Instance &aInstance) { aInstance.Get<Scheduler>().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,
+84 -1
View File
@@ -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.
*
+4 -8
View File
@@ -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)
+5 -12
View File
@@ -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)
+6 -10
View File
@@ -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)
+6 -10
View File
@@ -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)
+5 -9
View File
@@ -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)
+4 -8
View File
@@ -1253,23 +1253,19 @@ exit:
void AdvertisingProxy::HandleTimer(void)
{
TimeMilli now = TimerMilli::GetNow();
TimeMilli nextTime = now.GetDistantFuture();
NextFireTime nextTime;
OwningList<AdvInfo> 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)
{
+7 -8
View File
@@ -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:
+15 -29
View File
@@ -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)
+4 -8
View File
@@ -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)
+4 -8
View File
@@ -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<Leader>().RemoveContext(id);
}
else
{
nextTime = Min(nextTime, GetRemoveTime(id));
nextTime.UpdateIfEarlier(GetRemoveTime(id));
}
}
if (nextTime != now.GetDistantFuture())
{
Get<Leader>().mTimer.FireAt(nextTime);
}
Get<Leader>().mTimer.FireAt(nextTime);
}
} // namespace NetworkData
+4 -8
View File
@@ -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