From 1b20bc130b85192da17479e4e9f866d36b598774 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 22 Aug 2017 20:54:04 -0700 Subject: [PATCH] [network-data] fix bug in external route lookup (#2127) This commit changes the external route lookup logic to ensure that if an external route prefix is registered by multiple routers (at same priority level) within the thread network, during route/destination lookup on a device which has registered this external route, the router itself is selected/preferred over other routers. This addresses an issue where a message destined for the external address can be passed back and forth between routers. --- src/core/thread/network_data_leader.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 0575d19b9..e7232916f 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -327,7 +327,9 @@ otError LeaderBase::ExternalRouteLookup(uint8_t aDomainId, const Ip6::Address &a if (rvalRoute == NULL || entry->GetPreference() > rvalRoute->GetPreference() || (entry->GetPreference() == rvalRoute->GetPreference() && - netif.GetMle().GetCost(entry->GetRloc()) < netif.GetMle().GetCost(rvalRoute->GetRloc()))) + (entry->GetRloc() == netif.GetMle().GetRloc16() || + (rvalRoute->GetRloc() != netif.GetMle().GetRloc16() && + netif.GetMle().GetCost(entry->GetRloc()) < netif.GetMle().GetCost(rvalRoute->GetRloc()))))) { rvalRoute = entry; rval_plen = static_cast(plen);