[backbone-router] backbone TMF enhancements (#5660)

This commit enhances Backbone TMF:

- Subscribe Backbone TMF on multicast addresses on the Backbone
  interface
  - All Network BBRs Multicast Address
  - All Domain BBRs Multicast Address

- Thread Netif no longer subscribe these two addresses, because BBR
  Multicast Addresses are only defined for the Backbone Link in Thread
  Spec 9.4.8.1

- Make sure backbone messages are using link local src addresses
  - Verify src addr for b/bmr messages
This commit is contained in:
Simon Lin
2020-10-23 08:48:54 -07:00
committed by GitHub
parent f83d1ff999
commit e00e5b3d70
17 changed files with 283 additions and 57 deletions
@@ -147,6 +147,7 @@ class BBR_5_11_01(thread_cert.TestCase):
pkts.filter_eth_src(PBBR_ETH).filter_coap_request('/b/bmr').must_next().must_verify(f"""
thread_meshcop.tlv.ipv6_addr == ['{MA1}']
and thread_bl.tlv.timeout == {MLR_TIMEOUT}
and ipv6.src.is_link_local
""")
# Router registers MA2 with default timeout
@@ -158,6 +159,7 @@ class BBR_5_11_01(thread_cert.TestCase):
pkts.filter_eth_src(PBBR_ETH).filter_coap_request('/b/bmr').must_next().must_verify(f"""
thread_meshcop.tlv.ipv6_addr == ['{MA2}']
and thread_bl.tlv.timeout == {MLR_TIMEOUT}
and ipv6.src.is_link_local
""")
# Commissioner registers MA3 with deafult timeout
@@ -169,6 +171,7 @@ class BBR_5_11_01(thread_cert.TestCase):
pkts.filter_eth_src(PBBR_ETH).filter_coap_request('/b/bmr').must_next().must_verify(f"""
thread_meshcop.tlv.ipv6_addr == ['{MA3}']
and thread_bl.tlv.timeout == {MLR_TIMEOUT}
and ipv6.src.is_link_local
""")
# Commissioner registers MA4 with custom timeout
@@ -180,6 +183,7 @@ class BBR_5_11_01(thread_cert.TestCase):
pkts.filter_eth_src(PBBR_ETH).filter_coap_request('/b/bmr').must_next().must_verify(f"""
thread_meshcop.tlv.ipv6_addr == ['{MA4}']
and thread_bl.tlv.timeout == {CUSTOM_MLR_TIMEOUT}
and ipv6.src.is_link_local
""")
# Commissioner unregisters MA5
@@ -190,6 +194,7 @@ class BBR_5_11_01(thread_cert.TestCase):
# Verify PBBR not sends `/b/bmr` on the Backbone link for MA5.
pkts.filter_eth_src(PBBR_ETH).filter_coap_request('/b/bmr').filter(f"""
thread_meshcop.tlv.ipv6_addr == ['{MA5}']
and ipv6.src.is_link_local
""").must_not_next()
@@ -108,13 +108,10 @@ class TestBackboneRouterService(thread_cert.TestCase):
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
self.simulator.go(WAIT_TIME)
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
assert not self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX)
WAIT_TIME = WAIT_REDUNDANCE
self.simulator.go(WAIT_TIME)
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
# 2) Reset BBR_1 and bring it back soon.
# Verify that it restores Primary State with sequence number
@@ -175,9 +172,6 @@ class TestBackboneRouterService(thread_cert.TestCase):
self.simulator.go(WAIT_TIME)
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Disabled')
assert not self.nodes[BBR_2].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
assert not self.nodes[BBR_2].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
# Enable Backbone function, it will stay at Secondary state as
# there is Primary Backbone Router already.
# Here removes the Domain Prefix before enabling backbone function
@@ -242,9 +236,6 @@ class TestBackboneRouterService(thread_cert.TestCase):
self.simulator.go(WAIT_TIME)
self.assertEqual(self.nodes[BBR_2].get_backbone_router_state(), 'Secondary')
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
# 6a) Check the uniqueness of DUA by comparing the one in above 4a).
bbr2_dua2 = self.nodes[BBR_2].get_addr(config.DOMAIN_PREFIX)
assert bbr2_dua == bbr2_dua2, 'Error: Unexpected different DUA ({} v.s. {})'.format(bbr2_dua, bbr2_dua2)
@@ -166,13 +166,10 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
self.simulator.go(WAIT_TIME)
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
assert not self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX, 'prosD')
WAIT_TIME = WAIT_REDUNDANCE
self.simulator.go(WAIT_TIME)
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
self.simulator.set_lowpan_context(context_id, config.DOMAIN_PREFIX)
domain_prefix_cid = context_id
@@ -190,13 +190,10 @@ class TestDomainUnicastAddressRegistration(thread_cert.TestCase):
WAIT_TIME = BBR_REGISTRATION_JITTER + WAIT_REDUNDANCE
self.simulator.go(WAIT_TIME)
self.assertEqual(self.nodes[BBR_1].get_backbone_router_state(), 'Primary')
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_NETWORK_BBRS_ADDRESS)
assert not self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX, 'prosD')
WAIT_TIME = WAIT_REDUNDANCE
self.simulator.go(WAIT_TIME)
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
self.simulator.set_lowpan_context(context_id, config.DOMAIN_PREFIX)
domain_prefix_cid = context_id
@@ -102,7 +102,6 @@ class TestDomainUnicastAddress(thread_cert.TestCase):
self.nodes[BBR_1].set_domain_prefix(config.DOMAIN_PREFIX, 'prosD')
self.simulator.go(WAIT_REDUNDANCE)
assert self.nodes[BBR_1].has_ipmaddr(config.ALL_DOMAIN_BBRS_ADDRESS)
# 2) Bring up ROUTER_1
self.nodes[ROUTER].start()