mirror of
https://github.com/espressif/openthread.git
synced 2026-09-24 18:07:36 +00:00
Have router make two separate attempts to reconnect to current partition. (#1276)
This commit is contained in:
@@ -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
@@ -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
@@ -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()), ;);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user