diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index b9ce121e0..3d6a1cdb2 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -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(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(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 diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index eb0994003..de4fc514a 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -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. * diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 1995fafad..d6c8ecf6d 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -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; }