From ac26b8760ea0541efcfb913491093edc120f997d Mon Sep 17 00:00:00 2001 From: rongli Date: Fri, 25 Nov 2016 12:19:56 +0800 Subject: [PATCH] THCI: provide updateRouterStatus() support (#1009) Extend FTD child to process Route TLV from parent or valid neighbor --- src/core/openthread.cpp | 2 +- src/core/thread/mle_router.cpp | 16 +++++++++++----- tools/harness-thci/ARM.py | 16 ++++++++++++---- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 03399ca1a..f98702b8f 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -614,7 +614,7 @@ ThreadError otBecomeChild(otInstance *aInstance, otMleAttachFilter aFilter) ThreadError otBecomeRouter(otInstance *aInstance) { - return aInstance->mThreadNetif.GetMle().BecomeRouter(ThreadStatusTlv::kTooFewRouters); + return aInstance->mThreadNetif.GetMle().BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); } ThreadError otBecomeLeader(otInstance *aInstance) diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 6c73809e2..6bc23aa05 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -209,7 +209,7 @@ ThreadError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus) VerifyOrExit(mDeviceState != kDeviceStateDisabled, error = kThreadError_InvalidState); VerifyOrExit(mDeviceState != kDeviceStateRouter, error = kThreadError_None); - VerifyOrExit(mRouterRoleEnabled && (mDeviceMode & ModeTlv::kModeFFD), error = kThreadError_NotCapable); + VerifyOrExit(IsRouterRoleEnabled(), error = kThreadError_NotCapable); for (int i = 0; i <= kMaxRouterId; i++) { @@ -250,7 +250,7 @@ ThreadError MleRouter::BecomeLeader(void) VerifyOrExit(mDeviceState != kDeviceStateDisabled, error = kThreadError_InvalidState); VerifyOrExit(mDeviceState != kDeviceStateLeader, error = kThreadError_None); - VerifyOrExit(mRouterRoleEnabled && (mDeviceMode & ModeTlv::kModeFFD), error = kThreadError_NotCapable); + VerifyOrExit(IsRouterRoleEnabled(), error = kThreadError_NotCapable); for (int i = 0; i <= kMaxRouterId; i++) { @@ -1308,7 +1308,12 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M break; case kDeviceStateChild: - processRouteTlv = (sourceAddress.GetRloc16() == mParent.mValid.mRloc16); + if ((sourceAddress.GetRloc16() == mParent.mValid.mRloc16) || + (router->mState == Neighbor::kStateValid)) + { + processRouteTlv = true; + } + break; case kDeviceStateRouter: @@ -1330,8 +1335,9 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M ExitNow(); case kDeviceStateChild: - if (mRouterSelectionJitterTimeout == 0 && + if ((sourceAddress.GetRloc16() == mParent.mValid.mRloc16 || router->mState == Neighbor::kStateValid) && (mDeviceMode & ModeTlv::kModeFFD) && + (mRouterSelectionJitterTimeout == 0) && (GetActiveRouterCount() < mRouterUpgradeThreshold)) { mRouterSelectionJitterTimeout = (otPlatRandomGet() % mRouterSelectionJitter) + 1; @@ -1376,7 +1382,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M } } } - else if (router->mState != Neighbor::kStateValid) + else if ((mDeviceMode & ModeTlv::kModeFFD) && (router->mState != Neighbor::kStateValid)) { memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr)); router->mLinkInfo.Clear(); diff --git a/tools/harness-thci/ARM.py b/tools/harness-thci/ARM.py index 85a56035a..05f19cf30 100644 --- a/tools/harness-thci/ARM.py +++ b/tools/harness-thci/ARM.py @@ -992,16 +992,12 @@ class ARM(IThci): print 'join as leader' mode = 'rsdn' if self.AutoDUTEnable is False: - # set ROUTER_UPGRADE_THRESHOLD - self.__setRouterUpgradeThreshold(32) # set ROUTER_DOWNGRADE_THRESHOLD self.__setRouterDowngradeThreshold(33) elif eRoleId == Thread_Device_Role.Router: print 'join as router' mode = 'rsdn' if self.AutoDUTEnable is False: - # set ROUTER_UPGRADE_THRESHOLD - self.__setRouterUpgradeThreshold(33) # set ROUTER_DOWNGRADE_THRESHOLD self.__setRouterDowngradeThreshold(33) elif eRoleId == Thread_Device_Role.SED: @@ -2486,7 +2482,19 @@ class ARM(IThci): return True def updateRouterStatus(self): + """force update to router as if there is child id request""" print '%s call updateRouterStatus' % self.port + cmd = 'state' + while state = self.__sendCommand(cmd)[0]: + if state == 'detached': + continue + elif state == 'child': + break + else: + return False + + cmd = 'state router' + return self.__sendCommand(cmd)[0] == 'Done' def setRouterThresholdValues(self, upgradeThreshold, downgradeThreshold): print '%s call setRouterThresholdValues' % self.port