diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 877059984..6d9958f7f 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1727,21 +1727,6 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa (mDeviceMode & ModeTlv::kModeFullNetworkData) == 0, networkData.GetNetworkData(), networkData.GetLength()); - // Route - if ((Tlv::GetTlv(aMessage, Tlv::kRoute, sizeof(route), route) == kThreadError_None) && - (mDeviceMode & ModeTlv::kModeFFD)) - { - SuccessOrExit(error = mMleRouter.ProcessRouteTlv(route)); - - for (int i = 0; i < kMaxRouterId; i++) - { - if (route.IsRouterIdSet(i)) - { - numRouters++; - } - } - } - // Parent Attach Success mParentRequestTimer.Stop(); @@ -1760,9 +1745,24 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa mParent.mValid.mRloc16 = sourceAddress.GetRloc16(); SuccessOrExit(error = SetStateChild(shortAddress.GetRloc16())); - if ((mDeviceMode & ModeTlv::kModeFFD) && (numRouters < mMleRouter.GetRouterUpgradeThreshold())) + // Route + if ((Tlv::GetTlv(aMessage, Tlv::kRoute, sizeof(route), route) == kThreadError_None) && + (mDeviceMode & ModeTlv::kModeFFD)) { - mMleRouter.BecomeRouter(); + SuccessOrExit(error = mMleRouter.ProcessRouteTlv(route)); + + for (int i = 0; i < kMaxRouterId; i++) + { + if (route.IsRouterIdSet(i)) + { + numRouters++; + } + } + + if ((mDeviceMode & ModeTlv::kModeFFD) && (numRouters < mMleRouter.GetRouterUpgradeThreshold())) + { + mMleRouter.BecomeRouter(); + } } exit: diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 3f2cb2bd1..d34eb2db1 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -1073,7 +1073,7 @@ ThreadError MleRouter::ProcessRouteTlv(const RouteTlv &aRoute) bool old; // check for newer route data - if (diff > 0 || mDeviceState == kDeviceStateDetached) + if (diff > 0 || mDeviceState == kDeviceStateDetached || mDeviceState == kDeviceStateChild) { mRouterIdSequence = aRoute.GetRouterIdSequence(); mRouterIdSequenceLastUpdated = Timer::GetNow();