[commissioner] simplify and fix scheduling of expiration timer (#9262)

This commit simplifies scheduling of `mJoinerExpirationTimer` by using
`FireAtIfEarlier()` when adding or updating a `Joiner` entry instead
of recalculating the fire time. When a `Joiner` entry is removed, we
keep the timer unchanged and let it be rescheduled when the currently
scheduled timer expires. The next expiration time is determined in
`HandleJoinerExpirationTimer()`, which ensures that all expiration
times are strictly after `now` and avoids any potential issue with
the order of comparison between `now` and `next` being
`now.GetDistantFuture()`.
This commit is contained in:
Abtin Keshavarzian
2023-07-10 09:25:45 -07:00
committed by GitHub
parent 8bc25042ba
commit ad6545a5de
2 changed files with 8 additions and 29 deletions
+8 -27
View File
@@ -273,8 +273,6 @@ void Commissioner::RemoveJoinerEntry(Commissioner::Joiner &aJoiner)
mActiveJoiner = nullptr;
}
UpdateJoinerExpirationTimer();
SendCommissionerSet();
LogJoinerEntry("Removed", joinerCopy);
@@ -481,7 +479,7 @@ Error Commissioner::AddJoiner(const Mac::ExtAddress *aEui64,
joiner->mExpirationTime = TimerMilli::GetNow() + Time::SecToMsec(aTimeout);
UpdateJoinerExpirationTimer();
mJoinerExpirationTimer.FireAtIfEarlier(joiner->mExpirationTime);
SendCommissionerSet();
@@ -577,7 +575,7 @@ void Commissioner::RemoveJoiner(Joiner &aJoiner, uint32_t aDelay)
if (aJoiner.mExpirationTime > newExpirationTime)
{
aJoiner.mExpirationTime = newExpirationTime;
UpdateJoinerExpirationTimer();
mJoinerExpirationTimer.FireAtIfEarlier(newExpirationTime);
}
}
else
@@ -629,7 +627,8 @@ void Commissioner::HandleTimer(void)
void Commissioner::HandleJoinerExpirationTimer(void)
{
TimeMilli now = TimerMilli::GetNow();
TimeMilli now = TimerMilli::GetNow();
TimeMilli next = now.GetDistantFuture();
for (Joiner &joiner : mJoiners)
{
@@ -643,33 +642,15 @@ void Commissioner::HandleJoinerExpirationTimer(void)
LogDebg("removing joiner due to timeout or successfully joined");
RemoveJoinerEntry(joiner);
}
}
UpdateJoinerExpirationTimer();
}
void Commissioner::UpdateJoinerExpirationTimer(void)
{
TimeMilli now = TimerMilli::GetNow();
TimeMilli next = now.GetDistantFuture();
for (Joiner &joiner : mJoiners)
{
if (joiner.mType == Joiner::kTypeUnused)
else
{
continue;
next = Min(joiner.mExpirationTime, next);
}
next = Min(next, Max(now, joiner.mExpirationTime));
}
if (next < now.GetDistantFuture())
if (next != now.GetDistantFuture())
{
mJoinerExpirationTimer.FireAt(next);
}
else
{
mJoinerExpirationTimer.Stop();
mJoinerExpirationTimer.FireAtIfEarlier(next);
}
}
-2
View File
@@ -549,8 +549,6 @@ private:
void HandleTimer(void);
void HandleJoinerExpirationTimer(void);
void UpdateJoinerExpirationTimer(void);
static void HandleMgmtCommissionerSetResponse(void *aContext,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,