mirror of
https://github.com/espressif/openthread.git
synced 2026-08-21 18:09:52 +00:00
[posix] handle dynamic infra if status (#6186)
This commit includes below changes: - handles dynamic infrastructure interface status changes. The Routing Manager will be started if the infra interface status turns to be RUNNING and a valid link-local address is present. Otherwise, the Routing Manager will be stopped. - changes the default status of the Routing Manager from enabled to disabled and it is initially enabled for the posix platform. - the posix implementation now doesn't require the presence of the link-local address at initialization stage. In this case, the Routing Manager will not be started before a link-local address is added to the infra interface. - add CI tests for the new behavior.
This commit is contained in:
@@ -255,6 +255,60 @@ class SingleBorderRouter(thread_cert.TestCase):
|
||||
self.assertTrue(self.nodes[HOST].ping(self.nodes[ROUTER1].get_ip6_address(config.ADDRESS_TYPE.OMR)[0],
|
||||
backbone=True))
|
||||
|
||||
#
|
||||
# Case 4. The Routing Manager should be stopped if the infra interface went down.
|
||||
#
|
||||
|
||||
self.nodes[BR1].disable_ether()
|
||||
|
||||
self.simulator.go(10)
|
||||
self.collect_ipaddrs()
|
||||
|
||||
logging.info("BR1 addrs: %r", self.nodes[BR1].get_addrs())
|
||||
logging.info("ROUTER1 addrs: %r", self.nodes[ROUTER1].get_addrs())
|
||||
logging.info("HOST addrs: %r", self.nodes[HOST].get_addrs())
|
||||
|
||||
self.assertTrue(len(self.nodes[BR1].get_prefixes()) == 0)
|
||||
self.assertTrue(len(self.nodes[ROUTER1].get_prefixes()) == 0)
|
||||
self.assertTrue(len(self.nodes[BR1].get_routes()) == 0)
|
||||
self.assertTrue(len(self.nodes[ROUTER1].get_routes()) == 0)
|
||||
self.assertTrue(len(self.nodes[BR1].get_ip6_address(config.ADDRESS_TYPE.OMR)) == 0)
|
||||
self.assertTrue(len(self.nodes[ROUTER1].get_ip6_address(config.ADDRESS_TYPE.OMR)) == 0)
|
||||
|
||||
self.nodes[BR1].enable_ether()
|
||||
|
||||
# It takes around 10 seconds to start sending RA messages.
|
||||
self.simulator.go(15)
|
||||
self.collect_ipaddrs()
|
||||
|
||||
logging.info("BR1 addrs: %r", self.nodes[BR1].get_addrs())
|
||||
logging.info("ROUTER1 addrs: %r", self.nodes[ROUTER1].get_addrs())
|
||||
logging.info("HOST addrs: %r", self.nodes[HOST].get_addrs())
|
||||
|
||||
self.assertTrue(len(self.nodes[BR1].get_prefixes()) == 1)
|
||||
self.assertTrue(len(self.nodes[ROUTER1].get_prefixes()) == 1)
|
||||
self.assertTrue(len(self.nodes[BR1].get_routes()) == 1)
|
||||
self.assertTrue(len(self.nodes[ROUTER1].get_routes()) == 1)
|
||||
|
||||
# The same local OMR and on-link prefix should be re-registered.
|
||||
self.assertEqual(omr_prefix, self.nodes[BR1].get_prefixes()[0])
|
||||
self.assertEqual(omr_prefix, self.nodes[ROUTER1].get_prefixes()[0])
|
||||
self.assertEqual(external_route, self.nodes[BR1].get_routes()[0])
|
||||
self.assertEqual(external_route, self.nodes[ROUTER1].get_routes()[0])
|
||||
|
||||
self.assertTrue(len(self.nodes[BR1].get_ip6_address(config.ADDRESS_TYPE.OMR)) == 1)
|
||||
self.assertTrue(len(self.nodes[ROUTER1].get_ip6_address(config.ADDRESS_TYPE.OMR)) == 1)
|
||||
self.assertTrue(len(self.nodes[HOST].get_ip6_address(config.ADDRESS_TYPE.ONLINK_ULA)) == 1)
|
||||
|
||||
self.assertEqual(br1_omr_address, self.nodes[BR1].get_ip6_address(config.ADDRESS_TYPE.OMR)[0])
|
||||
self.assertEqual(router1_omr_address, self.nodes[ROUTER1].get_ip6_address(config.ADDRESS_TYPE.OMR)[0])
|
||||
self.assertEqual(host_ula_address, self.nodes[HOST].get_ip6_address(config.ADDRESS_TYPE.ONLINK_ULA)[0])
|
||||
|
||||
# Router1 can ping to/from the Host on infra link.
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(self.nodes[HOST].get_ip6_address(config.ADDRESS_TYPE.ONLINK_ULA)[0]))
|
||||
self.assertTrue(self.nodes[HOST].ping(self.nodes[ROUTER1].get_ip6_address(config.ADDRESS_TYPE.OMR)[0],
|
||||
backbone=True))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -2592,6 +2592,18 @@ class LinuxHost():
|
||||
PING_RESPONSE_PATTERN = re.compile(r'\d+ bytes from .*:.*')
|
||||
ETH_DEV = config.BACKBONE_IFNAME
|
||||
|
||||
def enable_ether(self):
|
||||
"""Enable the ethernet interface.
|
||||
"""
|
||||
|
||||
self.bash(f'ifconfig {self.ETH_DEV} up')
|
||||
|
||||
def disable_ether(self):
|
||||
"""Disable the ethernet interface.
|
||||
"""
|
||||
|
||||
self.bash(f'ifconfig {self.ETH_DEV} down')
|
||||
|
||||
def get_ether_addrs(self):
|
||||
output = self.bash(f'ip -6 addr list dev {self.ETH_DEV}')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user