mirror of
https://github.com/espressif/openthread.git
synced 2026-07-30 23:57: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:
@@ -114,7 +114,7 @@ class Cert_5_3_6_RouterIdMask(thread_cert.TestCase):
|
||||
# 5
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
@@ -84,7 +84,7 @@ class Cert_5_5_2_LeaderReboot(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[ROUTER].get_state(), 'leader')
|
||||
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'router')
|
||||
|
||||
addrs = self.nodes[ED].get_addrs()
|
||||
|
||||
@@ -114,7 +114,7 @@ class Cert_5_5_3_SplitMergeChildren(thread_cert.TestCase):
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
|
||||
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'router')
|
||||
|
||||
self.simulator.go(30)
|
||||
|
||||
@@ -102,7 +102,7 @@ class Cert_5_5_4_SplitMergeRouters(thread_cert.TestCase):
|
||||
self.simulator.go(150)
|
||||
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(50)
|
||||
self.simulator.go(50 + config.LEADER_RESET_DELAY)
|
||||
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'router')
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ class Cert_5_5_7_SplitMergeThreeWay(thread_cert.TestCase):
|
||||
self.simulator.go(140)
|
||||
|
||||
self.nodes[LEADER1].start()
|
||||
self.simulator.go(30)
|
||||
self.simulator.go(30 + config.LEADER_RESET_DELAY)
|
||||
|
||||
addrs = self.nodes[LEADER1].get_addrs()
|
||||
for addr in addrs:
|
||||
|
||||
@@ -143,7 +143,7 @@ class Cert_7_1_6_BorderRouterAsLeader(thread_cert.TestCase):
|
||||
self.simulator.go(720)
|
||||
|
||||
self.nodes[ROUTER_1].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[ROUTER_1].get_state(), 'router')
|
||||
self.collect_rloc16s()
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ class Cert_9_2_15_PendingPartition(thread_cert.TestCase):
|
||||
self.simulator.go(100)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
self.simulator.go(100)
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ class Cert_9_2_16_ActivePendingPartition(thread_cert.TestCase):
|
||||
self.simulator.go(100)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_network_name(), NETWORK_NAME_FINAL)
|
||||
|
||||
@@ -127,6 +127,7 @@ PANID = 0xface
|
||||
|
||||
LEADER_STARTUP_DELAY = 12
|
||||
ROUTER_STARTUP_DELAY = 10
|
||||
ED_STARTUP_DELAY = 5
|
||||
BORDER_ROUTER_STARTUP_DELAY = 20
|
||||
MAX_NEIGHBOR_AGE = 100
|
||||
INFINITE_COST_TIMEOUT = 90
|
||||
@@ -153,6 +154,13 @@ PACKET_VERIFICATION_NONE = 0
|
||||
PACKET_VERIFICATION_DEFAULT = 1
|
||||
PACKET_VERIFICATION_TREL = 2
|
||||
|
||||
# After leader reset it may retransmit link request 6 times with max 5.5s interval
|
||||
LEADER_RESET_DELAY = 41
|
||||
# After router reset it may retransmit link request 3 times with max 5.5s interval
|
||||
ROUTER_RESET_DELAY = 23
|
||||
MLE_MAX_CRITICAL_TRANSMISSION_COUNT = 6
|
||||
MLE_MAX_TRANSMISSION_COUNT = 3
|
||||
|
||||
|
||||
def create_default_network_data_prefix_sub_tlvs_factories():
|
||||
return {
|
||||
|
||||
@@ -145,10 +145,13 @@ class TestDetach(thread_cert.TestCase):
|
||||
self.assertEqual(leader.get_state(), 'disabled')
|
||||
|
||||
leader.start()
|
||||
self.simulator.go(config.LEADER_STARTUP_DELAY)
|
||||
# leader didn't become leader after the last start(), so it re-syncs in a non-critical manner thus taking ROUTER_RESET_DELAY to recover
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY / 2)
|
||||
self.assertEqual(leader.get_state(), 'detached')
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY / 2)
|
||||
self.assertEqual(leader.get_state(), 'leader')
|
||||
router1.start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY)
|
||||
self.assertEqual(router1.get_state(), 'router')
|
||||
|
||||
leader.thread_stop()
|
||||
|
||||
@@ -128,7 +128,7 @@ class TestHistoryTracker(thread_cert.TestCase):
|
||||
# Start leader and child
|
||||
|
||||
leader.start()
|
||||
self.simulator.go(SHORT_WAIT * 2)
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
self.assertEqual(leader.get_state(), 'leader')
|
||||
|
||||
child.start()
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Copyright (c) 2023, The OpenThread Authors.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import copy
|
||||
import unittest
|
||||
|
||||
import command
|
||||
import config
|
||||
import mle
|
||||
import thread_cert
|
||||
from pktverify.consts import MLE_PARENT_REQUEST, MLE_LINK_REQUEST, MLE_LINK_ACCEPT, MLE_LINK_ACCEPT_AND_REQUEST, SOURCE_ADDRESS_TLV, CHALLENGE_TLV, RESPONSE_TLV, LINK_LAYER_FRAME_COUNTER_TLV, ROUTE64_TLV, ADDRESS16_TLV, LEADER_DATA_TLV, TLV_REQUEST_TLV, VERSION_TLV
|
||||
from pktverify.packet_verifier import PacketVerifier
|
||||
from pktverify.null_field import nullField
|
||||
|
||||
DUT_LEADER = 1
|
||||
DUT_ROUTER1 = 2
|
||||
|
||||
# Test Purpose and Description:
|
||||
# -----------------------------
|
||||
# The purpose of this test case is to show that when the Leader is rebooted, it sends MLE_MAX_CRITICAL_TRANSMISSION_COUNT MLE link request packets if no response is received.
|
||||
#
|
||||
# Test Topology:
|
||||
# -------------
|
||||
# Leader
|
||||
# |
|
||||
# Router
|
||||
#
|
||||
# DUT Types:
|
||||
# ----------
|
||||
# Leader
|
||||
# Router
|
||||
|
||||
|
||||
class Test_LeaderRebootMultipleLinkRequest(thread_cert.TestCase):
|
||||
#USE_MESSAGE_FACTORY = False
|
||||
|
||||
TOPOLOGY = {
|
||||
DUT_LEADER: {
|
||||
'name': 'LEADER',
|
||||
'mode': 'rdn',
|
||||
'allowlist': [DUT_ROUTER1]
|
||||
},
|
||||
DUT_ROUTER1: {
|
||||
'name': 'ROUTER',
|
||||
'mode': 'rdn',
|
||||
'allowlist': [DUT_LEADER]
|
||||
},
|
||||
}
|
||||
|
||||
def _setUpLeader(self):
|
||||
self.nodes[DUT_LEADER].add_allowlist(self.nodes[DUT_ROUTER1].get_addr64())
|
||||
self.nodes[DUT_LEADER].enable_allowlist()
|
||||
|
||||
def test(self):
|
||||
self.nodes[DUT_LEADER].start()
|
||||
self.simulator.go(config.LEADER_STARTUP_DELAY)
|
||||
self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')
|
||||
|
||||
self.nodes[DUT_ROUTER1].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
|
||||
|
||||
leader_rloc = self.nodes[DUT_LEADER].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
|
||||
leader_rloc16 = self.nodes[DUT_LEADER].get_addr16()
|
||||
self.nodes[DUT_LEADER].reset()
|
||||
self.assertFalse(self.nodes[DUT_ROUTER1].ping(leader_rloc))
|
||||
self._setUpLeader()
|
||||
|
||||
# Router1 will not reply to leader's link request
|
||||
self.nodes[DUT_ROUTER1].clear_allowlist()
|
||||
|
||||
self.nodes[DUT_LEADER].start()
|
||||
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
|
||||
def verify(self, pv):
|
||||
pkts = pv.pkts
|
||||
pv.summary.show()
|
||||
|
||||
LEADER = pv.vars['LEADER']
|
||||
ROUTER = pv.vars['ROUTER']
|
||||
|
||||
# Verify topology is formed correctly.
|
||||
pv.verify_attached('ROUTER', 'LEADER')
|
||||
|
||||
# The DUT MUST send properly formatted MLE Advertisements with
|
||||
# an IP Hop Limit of 255 to the Link-Local All Nodes multicast
|
||||
# address (FF02::1).
|
||||
# The following TLVs MUST be present in the MLE Advertisements:
|
||||
# - Leader Data TLV
|
||||
# - Route64 TLV
|
||||
# - Source Address TLV
|
||||
with pkts.save_index():
|
||||
pkts.filter_wpan_src64(LEADER).\
|
||||
filter_mle_advertisement('Leader').\
|
||||
must_next()
|
||||
pkts.filter_wpan_src64(ROUTER).\
|
||||
filter_mle_advertisement('Router').\
|
||||
must_next()
|
||||
|
||||
pkts.filter_ping_request().\
|
||||
filter_wpan_src64(ROUTER).\
|
||||
must_next()
|
||||
|
||||
# The Leader MUST send MLE_MAX_CRITICAL_TRANSMISSION_COUNT multicast Link Request
|
||||
# The following TLVs MUST be present in the Link Request:
|
||||
# - Challenge TLV
|
||||
# - Version TLV
|
||||
# - TLV Request TLV: Address16 TLV, Route64 TLV
|
||||
for i in range(0, config.MLE_MAX_CRITICAL_TRANSMISSION_COUNT):
|
||||
pkts.filter_wpan_src64(LEADER).\
|
||||
filter_LLARMA().\
|
||||
filter_mle_cmd(MLE_LINK_REQUEST).\
|
||||
filter(lambda p: {
|
||||
CHALLENGE_TLV,
|
||||
VERSION_TLV,
|
||||
TLV_REQUEST_TLV,
|
||||
ADDRESS16_TLV,
|
||||
ROUTE64_TLV
|
||||
} <= set(p.mle.tlv.type) and\
|
||||
p.mle.tlv.addr16 is nullField and\
|
||||
p.mle.tlv.route64.id_mask is nullField
|
||||
).\
|
||||
must_next()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,176 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Copyright (c) 2023, The OpenThread Authors.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import copy
|
||||
import unittest
|
||||
|
||||
import command
|
||||
import config
|
||||
import mle
|
||||
import thread_cert
|
||||
from pktverify.consts import MLE_PARENT_REQUEST, MLE_LINK_REQUEST, MLE_LINK_ACCEPT, MLE_LINK_ACCEPT_AND_REQUEST, SOURCE_ADDRESS_TLV, CHALLENGE_TLV, RESPONSE_TLV, LINK_LAYER_FRAME_COUNTER_TLV, ROUTE64_TLV, ADDRESS16_TLV, LEADER_DATA_TLV, TLV_REQUEST_TLV, VERSION_TLV
|
||||
from pktverify.packet_verifier import PacketVerifier
|
||||
from pktverify.null_field import nullField
|
||||
|
||||
LEADER = 1
|
||||
DUT_ROUTER = 2
|
||||
MED1 = 3
|
||||
MED2 = 4
|
||||
MED3 = 5
|
||||
MED4 = 6
|
||||
MED5 = 7
|
||||
MED6 = 8
|
||||
|
||||
# Test Purpose and Description:
|
||||
# -----------------------------
|
||||
# The purpose of this test case is to show that when a router with > 5 children is rebooted, it sends MLE_MAX_CRITICAL_TRANSMISSION_COUNT MLE link request packets if no response is received.
|
||||
#
|
||||
# Test Topology:
|
||||
# -------------
|
||||
# Leader
|
||||
# |
|
||||
# Router ------------------------+
|
||||
# | | | | | |
|
||||
# MED1 MED2 MED3 MED4 MED5 MED6
|
||||
#
|
||||
# DUT Types:
|
||||
# ----------
|
||||
# Router
|
||||
|
||||
|
||||
class Test_LeaderRebootMultipleLinkRequest(thread_cert.TestCase):
|
||||
#USE_MESSAGE_FACTORY = False
|
||||
|
||||
TOPOLOGY = {
|
||||
LEADER: {
|
||||
'name': 'LEADER',
|
||||
'mode': 'rdn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
DUT_ROUTER: {
|
||||
'name': 'ROUTER',
|
||||
'mode': 'rdn',
|
||||
'allowlist': [LEADER, MED1, MED2, MED3, MED4, MED5, MED6]
|
||||
},
|
||||
MED1: {
|
||||
'name': 'MED1',
|
||||
'mode': 'rn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
MED2: {
|
||||
'name': 'MED2',
|
||||
'mode': 'rn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
MED3: {
|
||||
'name': 'MED3',
|
||||
'mode': 'rn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
MED4: {
|
||||
'name': 'MED4',
|
||||
'mode': 'rn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
MED5: {
|
||||
'name': 'MED5',
|
||||
'mode': 'rn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
MED6: {
|
||||
'name': 'MED6',
|
||||
'mode': 'rn',
|
||||
'allowlist': [DUT_ROUTER]
|
||||
},
|
||||
}
|
||||
|
||||
def test(self):
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(config.LEADER_STARTUP_DELAY)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
|
||||
|
||||
self.nodes[DUT_ROUTER].start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
self.assertEqual(self.nodes[DUT_ROUTER].get_state(), 'router')
|
||||
|
||||
for medid in range(MED1, MED6 + 1):
|
||||
self.nodes[medid].start()
|
||||
self.simulator.go(config.ED_STARTUP_DELAY)
|
||||
self.assertEqual(self.nodes[medid].get_state(), 'child')
|
||||
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
self.nodes[DUT_ROUTER].reset()
|
||||
# Leader will not reply to router's link request
|
||||
self.nodes[LEADER].clear_allowlist()
|
||||
|
||||
self.nodes[DUT_ROUTER].start()
|
||||
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
|
||||
def verify(self, pv):
|
||||
pkts = pv.pkts
|
||||
pv.summary.show()
|
||||
|
||||
LEADER = pv.vars['LEADER']
|
||||
ROUTER = pv.vars['ROUTER']
|
||||
|
||||
# Verify topology is formed correctly.
|
||||
pv.verify_attached('ROUTER', 'LEADER')
|
||||
for i in range(1, 7):
|
||||
pv.verify_attached('MED%d' % i, 'ROUTER', 'MTD')
|
||||
|
||||
pkts.filter_wpan_src64(ROUTER).\
|
||||
filter_mle_advertisement('Router').\
|
||||
must_next()
|
||||
|
||||
# The router MUST send MLE_MAX_CRITICAL_TRANSMISSION_COUNT multicast Link Request
|
||||
# The following TLVs MUST be present in the Link Request:
|
||||
# - Challenge TLV
|
||||
# - Version TLV
|
||||
# - TLV Request TLV: Address16 TLV, Route64 TLV
|
||||
for i in range(0, config.MLE_MAX_CRITICAL_TRANSMISSION_COUNT):
|
||||
pkts.filter_wpan_src64(ROUTER).\
|
||||
filter_LLARMA().\
|
||||
filter_mle_cmd(MLE_LINK_REQUEST).\
|
||||
filter(lambda p: {
|
||||
CHALLENGE_TLV,
|
||||
VERSION_TLV,
|
||||
TLV_REQUEST_TLV,
|
||||
ADDRESS16_TLV,
|
||||
ROUTE64_TLV
|
||||
} <= set(p.mle.tlv.type) and\
|
||||
p.mle.tlv.addr16 is nullField and\
|
||||
p.mle.tlv.route64.id_mask is nullField
|
||||
).\
|
||||
must_next()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -63,7 +63,7 @@ class Test_SetMlIid(thread_cert.TestCase):
|
||||
self.nodes[LEADER].reset()
|
||||
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(config.LEADER_STARTUP_DELAY)
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
|
||||
|
||||
# Ensure ML-IID is persistent after reset.
|
||||
|
||||
@@ -144,7 +144,7 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX)
|
||||
self.nodes[BBR_1].enable_backbone_router()
|
||||
self.nodes[BBR_1].start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
WAIT_TIME = config.ROUTER_RESET_DELAY
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_1].get_state(), 'router')
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
@@ -229,7 +229,7 @@ class TestBackboneRouterService(thread_cert.TestCase):
|
||||
self.nodes[BBR_2].enable_backbone_router()
|
||||
self.nodes[BBR_2].interface_up()
|
||||
self.nodes[BBR_2].thread_start()
|
||||
WAIT_TIME = WAIT_ATTACH + ROUTER_SELECTION_JITTER
|
||||
WAIT_TIME = config.ROUTER_RESET_DELAY
|
||||
self.simulator.go(WAIT_TIME)
|
||||
self.assertEqual(self.nodes[BBR_2].get_state(), 'router')
|
||||
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
|
||||
|
||||
@@ -125,7 +125,7 @@ class SSED_CslTransmission(thread_cert.TestCase):
|
||||
|
||||
# Check if SSED is able to resynchronize with the parent after it is gone longer than the timeout
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(config.LEADER_STARTUP_DELAY)
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
self.nodes[SSED_1].set_csl_timeout(8)
|
||||
self.nodes[SSED_1].set_timeout(10)
|
||||
self.simulator.go(2)
|
||||
@@ -133,7 +133,7 @@ class SSED_CslTransmission(thread_cert.TestCase):
|
||||
self.simulator.go(25)
|
||||
self.flush_all()
|
||||
self.nodes[LEADER].start()
|
||||
self.simulator.go(config.LEADER_STARTUP_DELAY)
|
||||
self.simulator.go(config.LEADER_RESET_DELAY)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SSED_1].get_state(), 'child')
|
||||
|
||||
@@ -838,6 +838,7 @@ class TestMulticastListenerRegistration(thread_cert.TestCase):
|
||||
# Turn off Router 1.1 and turn on Router 1.2
|
||||
self.nodes[ROUTER_1_1].stop()
|
||||
self.nodes[ROUTER_1_2].start()
|
||||
self.simulator.go(config.ROUTER_RESET_DELAY)
|
||||
for id in [FED_1, MED_1, SED_1]:
|
||||
self.simulator.go(config.DEFAULT_CHILD_TIMEOUT + WAIT_REDUNDANCE)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user