[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:
Jonathan Hui
2018-01-16 02:29:36 +00:00
committed by GitHub
parent 0b59c2fcd0
commit 011a2d14c9
+10 -5
View File
@@ -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();