diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 2c6f304d5..894bd7e8c 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -1026,6 +1026,10 @@ const NetifUnicastAddress *Ip6::SelectSourceAddress(MessageInfo &aMessageInfo) rvalAddr = addr; rvalPrefixMatched = candidatePrefixMatched; } + else + { + continue; + } } else if (addr->GetScope() > rvalAddr->GetScope()) { @@ -1034,6 +1038,10 @@ const NetifUnicastAddress *Ip6::SelectSourceAddress(MessageInfo &aMessageInfo) rvalAddr = addr; rvalPrefixMatched = candidatePrefixMatched; } + else + { + continue; + } } else if ((rvalAddr->GetScope() == Address::kRealmLocalScope) && (addr->GetScope() == Address::kRealmLocalScope)) { @@ -1043,6 +1051,10 @@ const NetifUnicastAddress *Ip6::SelectSourceAddress(MessageInfo &aMessageInfo) rvalAddr = addr; rvalPrefixMatched = candidatePrefixMatched; } + else + { + continue; + } } else if (addr->mPreferred && !rvalAddr->mPreferred) { @@ -1058,6 +1070,16 @@ const NetifUnicastAddress *Ip6::SelectSourceAddress(MessageInfo &aMessageInfo) rvalAddr = addr; rvalPrefixMatched = candidatePrefixMatched; } + else + { + continue; + } + + // infer destination scope based on prefix match + if (rvalPrefixMatched >= rvalAddr->mPrefixLength) + { + destinationScope = rvalAddr->GetScope(); + } } exit: