[mle] delay to send announce for FTD (#2521)

This commit is contained in:
rongli
2018-02-03 06:54:57 +00:00
committed by Jonathan Hui
parent 10f6c4f0cd
commit d0c983f0a4
5 changed files with 47 additions and 7 deletions
+19 -7
View File
@@ -644,13 +644,8 @@ otError Mle::SetStateChild(uint16_t aRloc16)
netif.GetIp6().SetForwardingEnabled(false); netif.GetIp6().SetForwardingEnabled(false);
netif.GetIp6().GetMpl().SetTimerExpirations(kMplChildDataMessageTimerExpirations); netif.GetIp6().GetMpl().SetTimerExpirations(kMplChildDataMessageTimerExpirations);
// Once the Thread device receives the new Active Commissioning Dataset, the device MUST // send announce after attached if needed
// transmit its own Announce messages on the channel it was on prior to the attachment. InformPreviousChannel();
if (mPreviousPanId != Mac::kPanIdBroadcast)
{
mPreviousPanId = Mac::kPanIdBroadcast;
netif.GetAnnounceBeginServer().SendAnnounce(1 << mPreviousChannel);
}
#if OPENTHREAD_CONFIG_ENABLE_PERIODIC_PARENT_SEARCH #if OPENTHREAD_CONFIG_ENABLE_PERIODIC_PARENT_SEARCH
UpdateParentSearchState(); UpdateParentSearchState();
@@ -665,6 +660,23 @@ otError Mle::SetStateChild(uint16_t aRloc16)
return OT_ERROR_NONE; return OT_ERROR_NONE;
} }
void Mle::InformPreviousChannel(void)
{
VerifyOrExit(mPreviousPanId != Mac::kPanIdBroadcast);
VerifyOrExit(mRole == OT_DEVICE_ROLE_CHILD || mRole == OT_DEVICE_ROLE_ROUTER);
if ((mDeviceMode & ModeTlv::kModeFFD) == 0 ||
mRole == OT_DEVICE_ROLE_ROUTER ||
GetNetif().GetMle().GetRouterSelectionJitterTimeout() == 0)
{
mPreviousPanId = Mac::kPanIdBroadcast;
GetNetif().GetAnnounceBeginServer().SendAnnounce(1 << mPreviousChannel);
}
exit:
return;
}
otError Mle::SetTimeout(uint32_t aTimeout) otError Mle::SetTimeout(uint32_t aTimeout)
{ {
VerifyOrExit(mTimeout != aTimeout); VerifyOrExit(mTimeout != aTimeout);
+10
View File
@@ -1360,6 +1360,16 @@ protected:
*/ */
void LogMleMessage(const char *aLogMessage, const Ip6::Address &aAddress, uint16_t aRloc) const; void LogMleMessage(const char *aLogMessage, const Ip6::Address &aAddress, uint16_t aRloc) const;
/**
* This method triggers MLE Announce on previous channel after the Thread device successfully
* attaches and receives the new Active Commissioning Dataset if needed.
*
* MTD would send Announce immediately after attached.
* FTD would delay to send Announce after tried to become Router or decided to stay in REED role.
*
*/
void InformPreviousChannel(void);
LeaderDataTlv mLeaderData; ///< Last received Leader Data TLV. LeaderDataTlv mLeaderData; ///< Last received Leader Data TLV.
bool mRetrieveNewNetworkData; ///< Indicating new Network Data is needed if set. bool mRetrieveNewNetworkData; ///< Indicating new Network Data is needed if set.
+9
View File
@@ -1871,6 +1871,11 @@ void MleRouter::HandleStateUpdateTimer(void)
// upgrade to Router // upgrade to Router
BecomeRouter(ThreadStatusTlv::kTooFewRouters); BecomeRouter(ThreadStatusTlv::kTooFewRouters);
} }
else
{
// send announce after decided to stay in REED if needed
InformPreviousChannel();
}
if (!mAdvertiseTimer.IsRunning()) if (!mAdvertiseTimer.IsRunning())
{ {
@@ -4360,6 +4365,10 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe
} }
exit: exit:
// send announce after received address solicit reply if needed
InformPreviousChannel();
return; return;
} }
+8
View File
@@ -301,6 +301,14 @@ public:
*/ */
otError SetRouterSelectionJitter(uint8_t aRouterJitter); otError SetRouterSelectionJitter(uint8_t aRouterJitter);
/**
* This method returns the current router selection jitter timeout value.
*
* @returns The current router selection jitter timeout value.
*
*/
uint8_t GetRouterSelectionJitterTimeout(void) { return mRouterSelectionJitterTimeout; }
/** /**
* This method returns the current Router ID Sequence value. * This method returns the current Router ID Sequence value.
* *
+1
View File
@@ -59,6 +59,7 @@ public:
uint8_t GetActiveRouterCount(void) const { return 0; } uint8_t GetActiveRouterCount(void) const { return 0; }
uint8_t GetActiveNeighborRouterCount(void) const { return 0; } uint8_t GetActiveNeighborRouterCount(void) const { return 0; }
uint8_t GetRouterSelectionJitterTimeout(void) { return 0; }
uint32_t GetLeaderAge(void) const { return 0; } uint32_t GetLeaderAge(void) const { return 0; }