[routing-manager] handle deprecated OMR prefix (#7703)

This commit enhances routing-manager to avoid using deprecated
(i.e. P_preferred=false) OMR prefixes as the winning OMR prefix, but
still sends RA RIO for the deprecating OMR prefixes.
This commit is contained in:
Simon Lin
2022-05-23 11:07:40 -07:00
committed by GitHub
parent c319046599
commit 65c6f39300
4 changed files with 36 additions and 15 deletions
+9 -8
View File
@@ -401,11 +401,14 @@ void RoutingManager::EvaluateOmrPrefix(OmrPrefixArray &aNewOmrPrefixes)
continue;
}
if (electedOmrPrefix == nullptr || onMeshPrefixConfig.mPreference > electedOmrPrefixPreference ||
(onMeshPrefixConfig.mPreference == electedOmrPrefixPreference && prefix < *electedOmrPrefix))
if (onMeshPrefixConfig.mPreferred)
{
electedOmrPrefix = aNewOmrPrefixes.Back();
electedOmrPrefixPreference = onMeshPrefixConfig.mPreference;
if (electedOmrPrefix == nullptr || onMeshPrefixConfig.mPreference > electedOmrPrefixPreference ||
(onMeshPrefixConfig.mPreference == electedOmrPrefixPreference && prefix < *electedOmrPrefix))
{
electedOmrPrefix = aNewOmrPrefixes.Back();
electedOmrPrefixPreference = onMeshPrefixConfig.mPreference;
}
}
if (prefix == mLocalOmrPrefix)
@@ -416,9 +419,9 @@ void RoutingManager::EvaluateOmrPrefix(OmrPrefixArray &aNewOmrPrefixes)
// Decide if we need to add or remove our local OMR prefix.
if (aNewOmrPrefixes.IsEmpty())
if (electedOmrPrefix == nullptr)
{
LogInfo("EvaluateOmrPrefix: No valid OMR prefixes found in Thread network");
LogInfo("EvaluateOmrPrefix: No preferred OMR prefixes found in Thread network");
if (PublishLocalOmrPrefix() == kErrorNone)
{
@@ -430,8 +433,6 @@ void RoutingManager::EvaluateOmrPrefix(OmrPrefixArray &aNewOmrPrefixes)
}
else
{
OT_ASSERT(electedOmrPrefix != nullptr);
if (*electedOmrPrefix == mLocalOmrPrefix)
{
IgnoreError(PublishLocalOmrPrefix());
@@ -31,6 +31,8 @@ import unittest
import config
import thread_cert
from pktverify.consts import ICMPV6_RA_OPT_TYPE_RIO
from pktverify.packet_verifier import PacketVerifier
# Test description:
# The purpose of this test case is to verify that BR can handle manually added OMR prefixes properly.
@@ -89,6 +91,28 @@ class ManualOmrsPrefix(thread_cert.TestCase):
self._test_manual_omr_prefix('2002::/64', 'pars', expect_withdraw=False)
# Add a smaller but invalid OMR prefix (P_stable = 0). Verify BR_1 does not withdraw its OMR prefix.
self._test_manual_omr_prefix('2003::/64', 'paro', expect_withdraw=False)
# Add a deprecating OMR prefix (P_preferred = 0). Verify BR_1 does not withdraw its OMR prefix.
self._test_manual_omr_prefix('2004::/64', 'aros', expect_withdraw=False)
self.collect_ipaddrs()
self.collect_extra_vars(BR_1_OMR_PREFIX=br1.get_br_omr_prefix())
def verify(self, pv: PacketVerifier):
pkts = pv.pkts
pv.summary.show()
BR_1_ETH = pv.vars['BR_1_ETH']
BR_1_OMR_PREFIX = pv.vars['BR_1_OMR_PREFIX']
assert BR_1_OMR_PREFIX.endswith('::/64')
BR_1_OMR_PREFIX = BR_1_OMR_PREFIX[:-3]
# Filter all ICMPv6 RA messages advertised by BR_1
ra_pkts = pkts.filter_eth_src(BR_1_ETH).filter_icmpv6_nd_ra()
# Verify BR_1 sends RA RIO for both BR OMR prefix and deprecating OMR prefix (i.e. 2004::/64)
ra_pkts.filter(lambda p: ICMPV6_RA_OPT_TYPE_RIO in p.icmpv6.opt.type and '2004::' in p.icmpv6.opt.prefix and
BR_1_OMR_PREFIX in p.icmpv6.opt.prefix).must_next()
def _test_manual_omr_prefix(self, prefix, flags, expect_withdraw, prf='med'):
br1 = self.nodes[BR_1]
@@ -397,6 +397,8 @@ ICMPV6_TYPE_PARAMETER_PROBLEM = 4
ICMPV6_TYPE_ECHO_REQUEST = 128
ICMPV6_TYPE_ECHO_REPLY = 129
ICMPV6_RA_OPT_TYPE_RIO = 24
THREAD_ALLOWED_ICMPV6_TYPES = [
ICMPV6_TYPE_DESTINATION_UNREACHABLE,
ICMPV6_TYPE_PACKET_TO_BIG,
@@ -477,13 +477,7 @@ _LAYER_FIELDS = {
'icmpv6.opt.route_lifetime': _auto,
'icmpv6.opt.route_info.flag.route_preference': _auto,
'icmpv6.opt.route_info.flag.reserved': _auto,
'icmpv6.opt.prefix.valid_lifetime': _auto,
'icmpv6.opt.prefix.preferred_lifetime': _auto,
'icmpv6.opt.prefix.length': _list(_auto),
'icmpv6.opt.prefix.flag.reserved': _auto,
'icmpv6.opt.prefix.flag.r': _auto,
'icmpv6.opt.prefix.flag.l': _auto,
'icmpv6.opt.prefix.flag.a': _auto,
'icmpv6.opt.prefix': _list(_ipv6_addr),
'icmpv6.opt.length': _list(_auto),
'icmpv6.opt.reserved': _str,
'icmpv6.nd.ra.router_lifetime': _auto,