mirror of
https://github.com/espressif/openthread.git
synced 2026-08-14 06:37:46 +00:00
[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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -549,8 +549,6 @@ private:
|
||||
void HandleTimer(void);
|
||||
void HandleJoinerExpirationTimer(void);
|
||||
|
||||
void UpdateJoinerExpirationTimer(void);
|
||||
|
||||
static void HandleMgmtCommissionerSetResponse(void *aContext,
|
||||
otMessage *aMessage,
|
||||
const otMessageInfo *aMessageInfo,
|
||||
|
||||
Reference in New Issue
Block a user