From 0d5f41dcc4709cb491e6014dc86537ba3a515448 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 4 Jun 2024 13:04:53 -0700 Subject: [PATCH] [mle] minor enhancements to `HandleParentResponse()` (#10331) This commit contains minor enhancements to `HandleParentResponse()`: - Variable name `linkMarginOut` is used for the Link Margin TLV value included in the response from the parent candidate. This is used to `SetLinkQualityOut()`. - `twoWayLinkMargin` variable name is now used to show the two-way link margin. - `IsBetterParent()` is updated to calculate the two-way link quality for the new parent candidate from the two-way link margin (instead of getting it as a parameter). --- src/core/thread/mle.cpp | 26 +++++++++++--------------- src/core/thread/mle.hpp | 3 +-- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 0a0c7fa03..2d9e88656 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -3058,17 +3058,15 @@ exit: } bool Mle::IsBetterParent(uint16_t aRloc16, - LinkQuality aLinkQuality, - uint8_t aLinkMargin, + uint8_t aTwoWayLinkMargin, const ConnectivityTlv &aConnectivityTlv, uint16_t aVersion, const Mac::CslAccuracy &aCslAccuracy) { - int rval; - LinkQuality candidateTwoWayLinkQuality = mParentCandidate.GetTwoWayLinkQuality(); + int rval; // Mesh Impacting Criteria - rval = ThreeWayCompare(aLinkQuality, candidateTwoWayLinkQuality); + rval = ThreeWayCompare(LinkQualityForLinkMargin(aTwoWayLinkMargin), mParentCandidate.GetTwoWayLinkQuality()); VerifyOrExit(rval == 0); rval = ThreeWayCompare(IsActiveRouter(aRloc16), IsActiveRouter(mParentCandidate.GetRloc16())); @@ -3114,7 +3112,7 @@ bool Mle::IsBetterParent(uint16_t aRloc16, OT_UNUSED_VARIABLE(aCslAccuracy); #endif - rval = ThreeWayCompare(aLinkMargin, mParentCandidate.mLinkMargin); + rval = ThreeWayCompare(aTwoWayLinkMargin, mParentCandidate.mLinkMargin); exit: return (rval > 0); @@ -3127,9 +3125,8 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo) uint16_t version; uint16_t sourceAddress; LeaderData leaderData; - uint8_t linkMarginFromTlv; - uint8_t linkMargin; - LinkQuality linkQuality; + uint8_t linkMarginOut; + uint8_t twoWayLinkMargin; ConnectivityTlv connectivityTlv; uint32_t linkFrameCounter; uint32_t mleFrameCounter; @@ -3156,9 +3153,8 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo) SuccessOrExit(error = aRxInfo.mMessage.ReadLeaderDataTlv(leaderData)); - SuccessOrExit(error = Tlv::Find(aRxInfo.mMessage, linkMarginFromTlv)); - linkMargin = Min(Get().ComputeLinkMargin(rss), linkMarginFromTlv); - linkQuality = LinkQualityForLinkMargin(linkMargin); + SuccessOrExit(error = Tlv::Find(aRxInfo.mMessage, linkMarginOut)); + twoWayLinkMargin = Min(Get().ComputeLinkMargin(rss), linkMarginOut); SuccessOrExit(error = Tlv::FindTlv(aRxInfo.mMessage, connectivityTlv)); VerifyOrExit(connectivityTlv.IsValid(), error = kErrorParse); @@ -3254,7 +3250,7 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo) // Only consider better parents if the partitions are the same if (compare == 0) { - VerifyOrExit(IsBetterParent(sourceAddress, linkQuality, linkMargin, connectivityTlv, version, cslAccuracy)); + VerifyOrExit(IsBetterParent(sourceAddress, twoWayLinkMargin, connectivityTlv, version, cslAccuracy)); } } @@ -3290,7 +3286,7 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo) mParentCandidate.SetVersion(version); mParentCandidate.SetDeviceMode(DeviceMode(DeviceMode::kModeFullThreadDevice | DeviceMode::kModeRxOnWhenIdle | DeviceMode::kModeFullNetworkData)); - mParentCandidate.SetLinkQualityOut(LinkQualityForLinkMargin(linkMarginFromTlv)); + mParentCandidate.SetLinkQualityOut(LinkQualityForLinkMargin(linkMarginOut)); mParentCandidate.SetState(Neighbor::kStateParentResponse); mParentCandidate.SetKeySequence(aRxInfo.mKeySequence); mParentCandidate.SetLeaderCost(connectivityTlv.GetLeaderCost()); @@ -3306,7 +3302,7 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo) mParentCandidate.mSedDatagramCount = connectivityTlv.GetSedDatagramCount(); mParentCandidate.mLeaderData = leaderData; mParentCandidate.mIsSingleton = connectivityTlv.IsSingleton(); - mParentCandidate.mLinkMargin = linkMargin; + mParentCandidate.mLinkMargin = twoWayLinkMargin; exit: LogProcessError(kTypeParentResponse, error); diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index aa52e8895..b6bd2335a 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -1291,8 +1291,7 @@ private: bool HasAcceptableParentCandidate(void) const; Error DetermineParentRequestType(ParentRequestType &aType) const; bool IsBetterParent(uint16_t aRloc16, - LinkQuality aLinkQuality, - uint8_t aLinkMargin, + uint8_t aTwoWayLinkMargin, const ConnectivityTlv &aConnectivityTlv, uint16_t aVersion, const Mac::CslAccuracy &aCslAccuracy);