THCI: provide updateRouterStatus() support (#1009)

Extend FTD child to process Route TLV from parent or valid neighbor
This commit is contained in:
rongli
2016-11-24 20:19:56 -08:00
committed by Jonathan Hui
parent 46be5b4f57
commit ac26b8760e
3 changed files with 24 additions and 10 deletions
+1 -1
View File
@@ -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)
+11 -5
View File
@@ -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();
+12 -4
View File
@@ -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