mirror of
https://github.com/espressif/openthread.git
synced 2026-08-01 16:47:47 +00:00
[mle] retransmit link request after router reset (#8704)
According to Thread 1.3.0 Section 4.7.1.3, router synchronization after reset requires the multicast link request message to be retransmitted until a response is received, or the maximum transmission limit has been reached. If the router was a leader or had more than 5 children prior to reset, it MUST be retransmitted as a critical message. Each multicast retransmission of an MLE Message on a TL1 or TL2 Link must be delayed by MLE_MULTICAST_RETRANSMISSION_DELAY multiplied by a random value between 0.9 and 1.1 with a resolution of at least 1 ms. This commit implements the above requirement. With this requirement, in the cases when a router is reset and there is no other router to respond to the link request then it takes longer time for the router to join thread network. Thus some test cases are modified to allow longer router sync time in such cases.
This commit is contained in:
@@ -820,7 +820,7 @@ void VerifyPrefixTable(const OnLinkPrefix *aOnLinkPrefixes,
|
||||
VerifyOrQuit(routePrefixCount == aNumRoutePrefixes);
|
||||
}
|
||||
|
||||
void InitTest(bool aEnablBorderRouting = false)
|
||||
void InitTest(bool aEnablBorderRouting = false, bool aAfterReset = false)
|
||||
{
|
||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// Initialize OT instance.
|
||||
@@ -828,6 +828,12 @@ void InitTest(bool aEnablBorderRouting = false)
|
||||
sNow = 0;
|
||||
sInstance = static_cast<Instance *>(testInitInstance());
|
||||
|
||||
uint32_t delay = 10000;
|
||||
if (aAfterReset)
|
||||
{
|
||||
delay += 26000; // leader reset sync delay
|
||||
}
|
||||
|
||||
memset(&sRadioTxFrame, 0, sizeof(sRadioTxFrame));
|
||||
sRadioTxFrame.mPsdu = sRadioTxFramePsdu;
|
||||
|
||||
@@ -846,7 +852,7 @@ void InitTest(bool aEnablBorderRouting = false)
|
||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// Ensure device starts as leader.
|
||||
|
||||
AdvanceTime(10000);
|
||||
AdvanceTime(delay);
|
||||
|
||||
VerifyOrQuit(otThreadGetDeviceRole(sInstance) == OT_DEVICE_ROLE_LEADER);
|
||||
|
||||
@@ -2543,7 +2549,7 @@ void TestSavedOnLinkPrefixes(void)
|
||||
|
||||
testFreeInstance(sInstance);
|
||||
|
||||
InitTest(/* aEnablBorderRouting */ true);
|
||||
InitTest(/* aEnablBorderRouting */ true, /* aAfterReset */ true);
|
||||
|
||||
SuccessOrQuit(sInstance->Get<BorderRouter::RoutingManager>().SetEnabled(true));
|
||||
|
||||
@@ -2581,7 +2587,7 @@ void TestSavedOnLinkPrefixes(void)
|
||||
|
||||
testFreeInstance(sInstance);
|
||||
|
||||
InitTest(/* aEnablBorderRouting */ true);
|
||||
InitTest(/* aEnablBorderRouting */ true, /* aAfterReset */ true);
|
||||
|
||||
sExpectedPio = kPioAdvertisingLocalOnLink;
|
||||
|
||||
@@ -2627,7 +2633,7 @@ void TestSavedOnLinkPrefixes(void)
|
||||
|
||||
testFreeInstance(sInstance);
|
||||
|
||||
InitTest();
|
||||
InitTest(/* aEnablBorderRouting */ false, /* aAfterReset */ true);
|
||||
|
||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// Start Routing Manager.
|
||||
@@ -2678,7 +2684,7 @@ void TestSavedOnLinkPrefixes(void)
|
||||
Log("Disabling and re-enabling OT Instance again");
|
||||
|
||||
testFreeInstance(sInstance);
|
||||
InitTest();
|
||||
InitTest(/* aEnablBorderRouting */ false, /* aAfterReset */ true);
|
||||
|
||||
SuccessOrQuit(sInstance->Get<BorderRouter::RoutingManager>().SetEnabled(true));
|
||||
AdvanceTime(100);
|
||||
|
||||
Reference in New Issue
Block a user