From 20efc8dd1a4a9aa395b2f4f50d362976bba0dc2a Mon Sep 17 00:00:00 2001 From: rongli Date: Fri, 12 May 2017 10:30:24 +0800 Subject: [PATCH] Fix routing cost comparison issue when chosing BR (#1759) * Fix routing cost comparison issue when chosing BR * remove extra space * update for comments --- src/core/thread/mle_router.cpp | 20 ++++++++++++++++++++ src/core/thread/mle_router_ftd.hpp | 10 ++++++++++ src/core/thread/mle_router_mtd.hpp | 1 + src/core/thread/network_data_leader.cpp | 5 ++--- tests/scripts/thread-cert/node_cli.py | 2 +- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index ed95dcb3e..ee38550f5 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -3376,6 +3376,26 @@ exit: return rval; } +uint8_t MleRouter::GetCost(uint16_t aRloc16) +{ + uint8_t routerId = GetRouterId(aRloc16); + uint8_t cost = GetLinkCost(routerId); + Router *router = GetRouter(routerId); + uint8_t routeCost; + + VerifyOrExit(router != NULL && GetRouter(router->GetNextHop()) != NULL); + + routeCost = GetRouteCost(aRloc16) + GetLinkCost(GetRouter(routerId)->GetNextHop()); + + if (cost > routeCost) + { + cost = routeCost; + } + +exit: + return cost; +} + uint8_t MleRouter::GetRouteCost(uint16_t aRloc16) const { uint8_t rval = kMaxRouteCost; diff --git a/src/core/thread/mle_router_ftd.hpp b/src/core/thread/mle_router_ftd.hpp index a72d1d65d..8f459b1ef 100644 --- a/src/core/thread/mle_router_ftd.hpp +++ b/src/core/thread/mle_router_ftd.hpp @@ -264,6 +264,16 @@ public: */ uint8_t GetLinkCost(uint8_t aRouterId); + /** + * This method returns the minimum cost to the given router. + * + * @param[in] aRloc16 The short address of the given router. + * + * @returns The minimum cost to the given router (via direct link or forwarding). + * + */ + uint8_t GetCost(uint16_t aRloc16); + /** * This method returns the ROUTER_SELECTION_JITTER value. * diff --git a/src/core/thread/mle_router_mtd.hpp b/src/core/thread/mle_router_mtd.hpp index d313a49c8..ad5ffc94f 100644 --- a/src/core/thread/mle_router_mtd.hpp +++ b/src/core/thread/mle_router_mtd.hpp @@ -69,6 +69,7 @@ public: uint8_t GetRouteCost(uint16_t) const { return 0; } uint8_t GetLinkCost(uint16_t) { return 0; } + uint8_t GetCost(uint16_t) { return 0; } uint8_t GetRouterIdSequence(void) const { return 0; } diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index b62ae3d24..b4e4cd2fb 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -329,8 +329,7 @@ ThreadError LeaderBase::ExternalRouteLookup(uint8_t aDomainId, const Ip6::Addres if (rvalRoute == NULL || entry->GetPreference() > rvalRoute->GetPreference() || (entry->GetPreference() == rvalRoute->GetPreference() && - mNetif.GetMle().GetRouteCost(entry->GetRloc()) < - mNetif.GetMle().GetRouteCost(rvalRoute->GetRloc()))) + mNetif.GetMle().GetCost(entry->GetRloc()) < mNetif.GetMle().GetCost(rvalRoute->GetRloc()))) { rvalRoute = entry; rval_plen = static_cast(plen); @@ -387,7 +386,7 @@ ThreadError LeaderBase::DefaultRouteLookup(PrefixTlv &aPrefix, uint16_t *aRloc16 if (route == NULL || entry->GetPreference() > route->GetPreference() || (entry->GetPreference() == route->GetPreference() && - mNetif.GetMle().GetRouteCost(entry->GetRloc()) < mNetif.GetMle().GetRouteCost(route->GetRloc()))) + mNetif.GetMle().GetCost(entry->GetRloc()) < mNetif.GetMle().GetCost(route->GetRloc()))) { route = entry; } diff --git a/tests/scripts/thread-cert/node_cli.py b/tests/scripts/thread-cert/node_cli.py index 3590bc250..27a8af1d3 100644 --- a/tests/scripts/thread-cert/node_cli.py +++ b/tests/scripts/thread-cert/node_cli.py @@ -382,7 +382,7 @@ class otCli: self.pexpect.expect('Done') def remove_prefix(self, prefix): - cmd = ' prefix remove ' + prefix + cmd = 'prefix remove ' + prefix self.send_command(cmd) self.pexpect.expect('Done')