mirror of
https://github.com/espressif/openthread.git
synced 2026-10-05 23:37:38 +00:00
[mle] updates to advertise timer management (#2478)
This commit fixes the following issues: 1. The advertise timer is no longer stopped when sending an Address Solicit message. This ensures that a REED continues to send MLE Advertisements. 2. The advertise timer is always started after becoming a child, even when the router upgrade threshold is not yet met. This ensures that a REED will start sending MLE Advertisements.
This commit is contained in:
@@ -243,7 +243,6 @@ otError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus)
|
||||
|
||||
otLogInfoMle(GetInstance(), "Attempt to become router");
|
||||
|
||||
mAdvertiseTimer.Stop();
|
||||
netif.GetMeshForwarder().SetRxOnWhenIdle(true);
|
||||
mRouterSelectionJitterTimeout = 0;
|
||||
|
||||
@@ -293,7 +292,6 @@ otError MleRouter::BecomeLeader(void)
|
||||
SetRouterId(routerId);
|
||||
|
||||
router->SetExtAddress(netif.GetMac().GetExtAddress());
|
||||
mAdvertiseTimer.Stop();
|
||||
|
||||
if (mFixedLeaderPartitionId != 0)
|
||||
{
|
||||
@@ -332,8 +330,6 @@ otError MleRouter::HandleDetachStart(void)
|
||||
{
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
GetNetif().GetAddressResolver().Clear();
|
||||
|
||||
for (int i = 0; i <= kMaxRouterId; i++)
|
||||
{
|
||||
mRouters[i].SetState(Neighbor::kStateInvalid);
|
||||
@@ -426,6 +422,7 @@ otError MleRouter::SetStateRouter(uint16_t aRloc16)
|
||||
mParentRequestState = kParentIdle;
|
||||
mParentRequestTimer.Stop();
|
||||
mChildUpdateRequestTimer.Stop();
|
||||
mAdvertiseTimer.Stop();
|
||||
ResetAdvertiseInterval();
|
||||
|
||||
netif.SubscribeAllRoutersMulticast();
|
||||
@@ -474,6 +471,7 @@ otError MleRouter::SetStateLeader(uint16_t aRloc16)
|
||||
mParentRequestState = kParentIdle;
|
||||
mParentRequestTimer.Stop();
|
||||
mChildUpdateRequestTimer.Stop();
|
||||
mAdvertiseTimer.Stop();
|
||||
ResetAdvertiseInterval();
|
||||
AddLeaderAloc();
|
||||
|
||||
@@ -560,6 +558,12 @@ otError MleRouter::SendAdvertisement(void)
|
||||
// indicates a Router role (i.e. a Child ID equal to zero).
|
||||
VerifyOrExit(mParentRequestState == kParentIdle);
|
||||
|
||||
// Suppress MLE Advertisements when transitioning to the router role.
|
||||
//
|
||||
// When trying to attach to a new partition, sending out advertisements as a REED can cause already-attached
|
||||
// children to detach.
|
||||
VerifyOrExit(!mAddressSolicitPending);
|
||||
|
||||
VerifyOrExit((message = NewMleMessage()) != NULL, error = OT_ERROR_NO_BUFS);
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandAdvertisement));
|
||||
SuccessOrExit(error = AppendSourceAddress(*message));
|
||||
@@ -1859,7 +1863,8 @@ void MleRouter::HandleStateUpdateTimer(void)
|
||||
// upgrade to Router
|
||||
BecomeRouter(ThreadStatusTlv::kTooFewRouters);
|
||||
}
|
||||
else if (!mAdvertiseTimer.IsRunning())
|
||||
|
||||
if (!mAdvertiseTimer.IsRunning())
|
||||
{
|
||||
SendAdvertisement();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user