diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 1ea22a13a..d248a29c6 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1801,6 +1801,7 @@ private: void HandleTimer(void); Error HandleChildUpdateResponse(uint32_t aTimeout); void HandleStop(void); + bool IsDetaching(void) const { return mState == kDetaching; } private: static constexpr uint32_t kTimeout = 1000; diff --git a/src/core/thread/mle_ftd.cpp b/src/core/thread/mle_ftd.cpp index 8aa72a42f..86698a9b6 100644 --- a/src/core/thread/mle_ftd.cpp +++ b/src/core/thread/mle_ftd.cpp @@ -1404,6 +1404,8 @@ void Mle::HandleParentRequest(RxInfo &aRxInfo) VerifyOrExit(IsRouterEligible()); VerifyOrExit(!IsDetached() && !IsAttaching()); + VerifyOrExit(!mDetacher.IsDetaching()); + VerifyOrExit(mRouterTable.GetLeaderAge() < mNetworkIdTimeout, error = kErrorDrop); VerifyOrExit(mRouterTable.GetPathCostToLeader() < kMaxRouteCost, error = kErrorDrop); @@ -2205,6 +2207,8 @@ void Mle::HandleChildUpdateRequestOnParent(RxInfo &aRxInfo) Log(kMessageReceive, kTypeChildUpdateRequestOfChild, aRxInfo.mMessageInfo.GetPeerAddr()); + VerifyOrExit(!mDetacher.IsDetaching()); + SuccessOrExit(error = aRxInfo.mMessage.ReadModeTlv(mode)); switch (aRxInfo.mMessage.ReadChallengeTlv(challenge))