mirror of
https://github.com/espressif/openthread.git
synced 2026-09-05 08:40:06 +00:00
[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:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user