mirror of
https://github.com/espressif/openthread.git
synced 2026-08-01 16:47:47 +00:00
THCI: provide updateRouterStatus() support (#1009)
Extend FTD child to process Route TLV from parent or valid neighbor
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user