mirror of
https://github.com/espressif/openthread.git
synced 2026-10-02 22:07:36 +00:00
Handle Network Data updates via netif handler to coalesce message transmissions. (#444)
This commit is contained in:
+28
-23
@@ -940,27 +940,44 @@ void Mle::HandleNetifStateChanged(uint32_t aFlags, void *aContext)
|
||||
|
||||
void Mle::HandleNetifStateChanged(uint32_t aFlags)
|
||||
{
|
||||
VerifyOrExit((aFlags & (OT_IP6_ADDRESS_ADDED | OT_IP6_ADDRESS_REMOVED)) != 0, ;);
|
||||
bool sendChildUpdateRequest = false;
|
||||
|
||||
if (!mNetif.IsUnicastAddress(mMeshLocal64.GetAddress()))
|
||||
if ((aFlags & (OT_IP6_ADDRESS_ADDED | OT_IP6_ADDRESS_REMOVED)) != 0)
|
||||
{
|
||||
// Mesh Local EID was removed, choose a new one and add it back
|
||||
for (int i = 8; i < 16; i++)
|
||||
if (!mNetif.IsUnicastAddress(mMeshLocal64.GetAddress()))
|
||||
{
|
||||
mMeshLocal64.GetAddress().mFields.m8[i] = static_cast<uint8_t>(otPlatRandomGet());
|
||||
// Mesh Local EID was removed, choose a new one and add it back
|
||||
for (int i = 8; i < 16; i++)
|
||||
{
|
||||
mMeshLocal64.GetAddress().mFields.m8[i] = static_cast<uint8_t>(otPlatRandomGet());
|
||||
}
|
||||
|
||||
mNetif.AddUnicastAddress(mMeshLocal64);
|
||||
mNetif.SetStateChangedFlags(OT_IP6_ML_ADDR_CHANGED);
|
||||
}
|
||||
|
||||
mNetif.AddUnicastAddress(mMeshLocal64);
|
||||
mNetif.SetStateChangedFlags(OT_IP6_ML_ADDR_CHANGED);
|
||||
if (mDeviceState == kDeviceStateChild && (mDeviceMode & ModeTlv::kModeFFD) == 0)
|
||||
{
|
||||
sendChildUpdateRequest = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mDeviceState == kDeviceStateChild && (mDeviceMode & ModeTlv::kModeFFD) == 0)
|
||||
if ((aFlags & OT_THREAD_NETDATA_UPDATED) != 0)
|
||||
{
|
||||
if (mDeviceMode & ModeTlv::kModeFFD)
|
||||
{
|
||||
mMleRouter.HandleNetworkDataUpdateRouter();
|
||||
}
|
||||
else
|
||||
{
|
||||
sendChildUpdateRequest = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (sendChildUpdateRequest)
|
||||
{
|
||||
SendChildUpdateRequest();
|
||||
}
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
void Mle::HandleParentRequestTimer(void *aContext)
|
||||
@@ -2385,17 +2402,5 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
void Mle::HandleNetworkDataUpdate(void)
|
||||
{
|
||||
if (mDeviceMode & ModeTlv::kModeFFD)
|
||||
{
|
||||
mMleRouter.HandleNetworkDataUpdateRouter();
|
||||
}
|
||||
else
|
||||
{
|
||||
SendChildUpdateRequest();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Mle
|
||||
} // namespace Thread
|
||||
|
||||
@@ -587,12 +587,6 @@ public:
|
||||
*/
|
||||
const Ip6::Address *GetMeshLocal64(void) const;
|
||||
|
||||
/**
|
||||
* This method notifies MLE that the Network Data has changed.
|
||||
*
|
||||
*/
|
||||
void HandleNetworkDataUpdate(void);
|
||||
|
||||
/**
|
||||
* This method returns the Router ID of the Leader.
|
||||
*
|
||||
|
||||
@@ -435,7 +435,6 @@ void Leader::SetNetworkData(uint8_t aVersion, uint8_t aStableVersion, bool aStab
|
||||
|
||||
otDumpDebgNetData("set network data", mTlvs, mLength);
|
||||
|
||||
mMle.HandleNetworkDataUpdate();
|
||||
mNetif.SetStateChangedFlags(OT_THREAD_NETDATA_UPDATED);
|
||||
}
|
||||
|
||||
@@ -455,7 +454,6 @@ void Leader::RemoveBorderRouter(uint16_t aRloc16)
|
||||
mStableVersion++;
|
||||
}
|
||||
|
||||
mMle.HandleNetworkDataUpdate();
|
||||
mNetif.SetStateChangedFlags(OT_THREAD_NETDATA_UPDATED);
|
||||
|
||||
exit:
|
||||
@@ -694,7 +692,6 @@ ThreadError Leader::RegisterNetworkData(uint16_t aRloc16, uint8_t *aTlvs, uint8_
|
||||
}
|
||||
}
|
||||
|
||||
mMle.HandleNetworkDataUpdate();
|
||||
mNetif.SetStateChangedFlags(OT_THREAD_NETDATA_UPDATED);
|
||||
|
||||
exit:
|
||||
@@ -881,7 +878,7 @@ ThreadError Leader::FreeContext(uint8_t aContextId)
|
||||
mContextUsed &= ~(1 << aContextId);
|
||||
mVersion++;
|
||||
mStableVersion++;
|
||||
mMle.HandleNetworkDataUpdate();
|
||||
mNetif.SetStateChangedFlags(OT_THREAD_NETDATA_UPDATED);
|
||||
return kThreadError_None;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user