Have router make two separate attempts to reconnect to current partition. (#1276)

This commit is contained in:
Jonathan Hui
2017-02-09 11:05:35 -08:00
committed by GitHub
parent d50d62ca5b
commit efc4599d62
15 changed files with 50 additions and 40 deletions
+3 -2
View File
@@ -691,8 +691,9 @@ typedef struct otExternalRouteConfig
typedef enum otMleAttachFilter
{
kMleAttachAnyPartition = 0, ///< Attach to any Thread partition.
kMleAttachSamePartition = 1, ///< Attach to the same Thread partition.
kMleAttachBetterPartition = 2, ///< Attach to a better (i.e. higher weight/partition id) Thread partition.
kMleAttachSamePartition1 = 1, ///< Attach to the same Thread partition (attempt 1).
kMleAttachSamePartition2 = 2, ///< Attach to the same Thread partition (attempt 2).
kMleAttachBetterPartition = 3, ///< Attach to a better (i.e. higher weight/partition id) Thread partition.
} otMleAttachFilter;
/**
+1 -1
View File
@@ -2100,7 +2100,7 @@ void Interpreter::ProcessState(int argc, char *argv[])
}
else if (strcmp(argv[0], "child") == 0)
{
SuccessOrExit(error = otBecomeChild(mInstance, kMleAttachSamePartition));
SuccessOrExit(error = otBecomeChild(mInstance, kMleAttachSamePartition1));
}
else if (strcmp(argv[0], "router") == 0)
{
+28 -20
View File
@@ -1268,7 +1268,6 @@ void Mle::HandleParentRequestTimer(void)
mParentRequestState = kParentRequestRouter;
mParentCandidate.mState = Neighbor::kStateInvalid;
SendParentRequest();
mParentRequestTimer.Start(kParentRequestRouterTimeout);
break;
case kParentRequestRouter:
@@ -1278,13 +1277,13 @@ void Mle::HandleParentRequestTimer(void)
{
SendChildIdRequest();
mParentRequestState = kChildIdRequest;
mParentRequestTimer.Start(kParentRequestChildTimeout);
}
else
{
SendParentRequest();
}
mParentRequestTimer.Start(kParentRequestChildTimeout);
break;
case kParentRequestChild:
@@ -1346,7 +1345,12 @@ void Mle::HandleParentRequestTimer(void)
break;
case kMleAttachSamePartition:
case kMleAttachSamePartition1:
mParentRequestState = kParentIdle;
BecomeChild(kMleAttachSamePartition2);
break;
case kMleAttachSamePartition2:
mParentRequestState = kParentIdle;
BecomeChild(kMleAttachAnyPartition);
break;
@@ -1401,17 +1405,13 @@ ThreadError Mle::SendParentRequest(void)
mParentRequest.mChallenge[i] = static_cast<uint8_t>(otPlatRandomGet());
}
VerifyOrExit((message = NewMleMessage()) != NULL, ;);
SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentRequest));
SuccessOrExit(error = AppendMode(*message, mDeviceMode));
SuccessOrExit(error = AppendChallenge(*message, mParentRequest.mChallenge, sizeof(mParentRequest.mChallenge)));
switch (mParentRequestState)
{
case kParentRequestRouter:
scanMask = ScanMaskTlv::kRouterFlag;
if (mParentRequestMode == kMleAttachSamePartition)
if (mParentRequestMode == kMleAttachSamePartition1 ||
mParentRequestMode == kMleAttachSamePartition2)
{
scanMask |= ScanMaskTlv::kEndDeviceFlag;
}
@@ -1427,6 +1427,10 @@ ThreadError Mle::SendParentRequest(void)
break;
}
VerifyOrExit((message = NewMleMessage()) != NULL, ;);
SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentRequest));
SuccessOrExit(error = AppendMode(*message, mDeviceMode));
SuccessOrExit(error = AppendChallenge(*message, mParentRequest.mChallenge, sizeof(mParentRequest.mChallenge)));
SuccessOrExit(error = AppendScanMask(*message, scanMask));
SuccessOrExit(error = AppendVersion(*message));
@@ -1435,23 +1439,26 @@ ThreadError Mle::SendParentRequest(void)
destination.mFields.m16[7] = HostSwap16(0x0002);
SuccessOrExit(error = SendMessage(*message, destination));
switch (mParentRequestState)
if ((scanMask & ScanMaskTlv::kEndDeviceFlag) == 0)
{
case kParentRequestRouter:
otLogInfoMle("Sent parent request to routers");
break;
case kParentRequestChild:
}
else
{
otLogInfoMle("Sent parent request to all devices");
break;
default:
assert(false);
break;
}
exit:
if ((scanMask & ScanMaskTlv::kEndDeviceFlag) == 0)
{
mParentRequestTimer.Start(kParentRequestRouterTimeout);
}
else
{
mParentRequestTimer.Start(kParentRequestChildTimeout);
}
if (error != kThreadError_None && message != NULL)
{
message->Free();
@@ -2435,7 +2442,8 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
VerifyOrExit(leaderData.GetPartitionId() != mLeaderData.GetPartitionId() || diff > 0,);
break;
case kMleAttachSamePartition:
case kMleAttachSamePartition1:
case kMleAttachSamePartition2:
VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId(), ;);
VerifyOrExit(diff > 0 ||
(diff == 0 && mNetif.GetMle().GetLeaderAge() < mNetif.GetMle().GetNetworkIdTimeout()), ;);
+2 -2
View File
@@ -57,8 +57,8 @@ enum
{
kVersion = 2, ///< MLE Version
kUdpPort = 19788, ///< MLE UDP Port
kParentRequestRouterTimeout = 1000, ///< Router Request timeout
kParentRequestChildTimeout = 2000, ///< End Device Request timeout
kParentRequestRouterTimeout = 750, ///< Router Request timeout
kParentRequestChildTimeout = 1250, ///< End Device Request timeout
kParentResponseMaxDelayRouters = 500, ///< Maximum delay for response for Parent Request sent to routers only
kParentResponseMaxDelayAll = 1000, ///< Maximum delay for response for Parent Request sent to all devices
kMaxResponseDelay = 1000, ///< Maximum delay before responding to a multicast request
+4 -3
View File
@@ -341,7 +341,8 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter)
switch (aFilter)
{
case kMleAttachSamePartition:
case kMleAttachSamePartition1:
case kMleAttachSamePartition2:
// downgrade
if (GetActiveRouterCount() > mRouterDowngradeThreshold)
@@ -1756,13 +1757,13 @@ void MleRouter::HandleStateUpdateTimer(void)
if (GetLeaderAge() >= mNetworkIdTimeout)
{
BecomeChild(kMleAttachSamePartition);
BecomeChild(kMleAttachSamePartition1);
}
if (routerStateUpdate && GetActiveRouterCount() > mRouterDowngradeThreshold)
{
// downgrade to REED
BecomeChild(kMleAttachSamePartition);
BecomeChild(kMleAttachSamePartition1);
}
break;
@@ -96,7 +96,7 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
self.nodes[ROUTER2].set_network_id_timeout(110)
self.nodes[LEADER].stop()
time.sleep(130)
time.sleep(140)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
@@ -152,7 +152,7 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
# 5 - Router1
# Router1 make two attempts to reconnect to its current Partition.
for _ in range(2):
for _ in range(4):
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
msg.assertSentWithHopLimit(255)
msg.assertSentToDestinationAddress("ff02::2")
@@ -96,7 +96,7 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
self.nodes[ROUTER2].set_network_id_timeout(200)
self.nodes[LEADER].stop()
time.sleep(210)
time.sleep(220)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER1].get_addr16(), rloc16)
@@ -151,7 +151,7 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
# 5 - Router1
# Router1 make two attempts to reconnect to its current Partition.
for _ in range(2):
for _ in range(4):
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
msg.assertSentWithHopLimit(255)
msg.assertSentToDestinationAddress("ff02::2")
@@ -134,7 +134,7 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
addrs = self.nodes[ROUTER3].get_addrs()
self.nodes[ROUTER3].stop()
time.sleep(130)
time.sleep(140)
for addr in addrs:
if addr[0:4] != 'fe80':
@@ -79,7 +79,7 @@ class Cert_5_5_2_LeaderReboot(unittest.TestCase):
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].stop()
time.sleep(130)
time.sleep(140)
self.assertEqual(self.nodes[ROUTER].get_state(), 'leader')
self.nodes[LEADER].start()
@@ -117,7 +117,7 @@ class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
self.nodes[ED1].add_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].add_whitelist(self.nodes[ED1].get_addr64())
time.sleep(130)
time.sleep(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
@@ -92,7 +92,7 @@ class Cert_5_5_7_SplitMergeThreeWay(unittest.TestCase):
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
self.nodes[LEADER1].stop()
time.sleep(130)
time.sleep(140)
self.nodes[LEADER1].start()
time.sleep(30)
@@ -109,7 +109,7 @@ class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
self.assertTrue(self.nodes[LEADER1].ping(addr))
self.nodes[ROUTER3].stop()
time.sleep(130)
time.sleep(140)
self.nodes[ROUTER3].start()
time.sleep(60)
@@ -78,7 +78,7 @@ class Cert_6_2_1_NewPartition(unittest.TestCase):
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].stop()
time.sleep(130)
time.sleep(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'leader')
self.assertEqual(self.nodes[ED].get_state(), 'child')
@@ -93,7 +93,7 @@ class Cert_6_2_2_NewPartition(unittest.TestCase):
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].stop()
time.sleep(130)
time.sleep(140)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ED].get_state(), 'child')
@@ -108,7 +108,7 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
self.nodes[LEADER].remove_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].remove_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(130)
time.sleep(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')