[link-quality] define LinkQuality enumeration (#7673)

This commit adds `LinkQuality` enumeration which represents the
2-bit [0-3] link quality value
This commit is contained in:
Abtin Keshavarzian
2022-05-09 14:17:33 -07:00
committed by GitHub
parent b76e524f7f
commit 8714ec10bb
9 changed files with 79 additions and 59 deletions
+1 -1
View File
@@ -288,7 +288,7 @@ uint8_t otLinkConvertRssToLinkQuality(otInstance *aInstance, int8_t aRss)
int8_t otLinkConvertLinkQualityToRss(otInstance *aInstance, uint8_t aLinkQuality)
{
return LinkQualityInfo::ConvertLinkQualityToRss(AsCoreType(aInstance).Get<Mac::Mac>().GetNoiseFloor(),
aLinkQuality);
static_cast<LinkQuality>(aLinkQuality));
}
#if OPENTHREAD_CONFIG_MAC_RETRY_SUCCESS_HISTOGRAM_ENABLE
+13 -13
View File
@@ -131,7 +131,7 @@ void LqiAverager::Add(uint8_t aLqi)
void LinkQualityInfo::Clear(void)
{
mRssAverager.Clear();
SetLinkQuality(0);
SetLinkQuality(kLinkQuality0);
mLastRss = OT_RADIO_RSSI_INVALID;
mFrameErrorRate.Clear();
@@ -186,31 +186,31 @@ uint8_t LinkQualityInfo::ConvertRssToLinkMargin(int8_t aNoiseFloor, int8_t aRss)
return static_cast<uint8_t>(linkMargin);
}
uint8_t LinkQualityInfo::ConvertLinkMarginToLinkQuality(uint8_t aLinkMargin)
LinkQuality LinkQualityInfo::ConvertLinkMarginToLinkQuality(uint8_t aLinkMargin)
{
return CalculateLinkQuality(aLinkMargin, kNoLinkQuality);
}
uint8_t LinkQualityInfo::ConvertRssToLinkQuality(int8_t aNoiseFloor, int8_t aRss)
LinkQuality LinkQualityInfo::ConvertRssToLinkQuality(int8_t aNoiseFloor, int8_t aRss)
{
return ConvertLinkMarginToLinkQuality(ConvertRssToLinkMargin(aNoiseFloor, aRss));
}
int8_t LinkQualityInfo::ConvertLinkQualityToRss(int8_t aNoiseFloor, uint8_t aLinkQuality)
int8_t LinkQualityInfo::ConvertLinkQualityToRss(int8_t aNoiseFloor, LinkQuality aLinkQuality)
{
int8_t linkmargin = 0;
switch (aLinkQuality)
{
case 3:
case kLinkQuality3:
linkmargin = kLinkQuality3LinkMargin;
break;
case 2:
case kLinkQuality2:
linkmargin = kLinkQuality2LinkMargin;
break;
case 1:
case kLinkQuality1:
linkmargin = kLinkQuality1LinkMargin;
break;
@@ -222,7 +222,7 @@ int8_t LinkQualityInfo::ConvertLinkQualityToRss(int8_t aNoiseFloor, uint8_t aLin
return linkmargin + aNoiseFloor;
}
uint8_t LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLastLinkQuality)
LinkQuality LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLastLinkQuality)
{
// Static private method to calculate the link quality from a given
// link margin while taking into account the last link quality
@@ -230,8 +230,8 @@ uint8_t LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLast
// there is no previous value for link quality, the constant
// kNoLinkQuality should be passed as the second argument.
uint8_t threshold1, threshold2, threshold3;
uint8_t linkQuality = 0;
uint8_t threshold1, threshold2, threshold3;
LinkQuality linkQuality = kLinkQuality0;
threshold1 = kThreshold1;
threshold2 = kThreshold2;
@@ -262,15 +262,15 @@ uint8_t LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLast
if (aLinkMargin > threshold3)
{
linkQuality = 3;
linkQuality = kLinkQuality3;
}
else if (aLinkMargin > threshold2)
{
linkQuality = 2;
linkQuality = kLinkQuality2;
}
else if (aLinkMargin > threshold1)
{
linkQuality = 1;
linkQuality = kLinkQuality1;
}
return linkQuality;
+22 -7
View File
@@ -226,6 +226,21 @@ private:
uint8_t mCount; // Number of LQI values added to averager so far.
};
/**
* This enumeration represents the link quality constants.
*
* Link Quality is an integer in [0, 3]. A higher link quality indicates a more usable link, with 0 indicating that the
* link is non-existent or unusable.
*
*/
enum LinkQuality : uint8_t
{
kLinkQuality0 = 0, ///< Link quality 0 (non-existent link)
kLinkQuality1 = 1, ///< Link quality 1
kLinkQuality2 = 2, ///< Link quality 2
kLinkQuality3 = 3, ///< Link quality 3
};
/**
* This class encapsulates/stores all relevant information about quality of a link, including average received signal
* strength (RSS), last RSS, link margin, and link quality.
@@ -312,7 +327,7 @@ public:
* @returns The current link quality value (value 0-3 as per Thread specification).
*
*/
uint8_t GetLinkQuality(void) const { return mLinkQuality; }
LinkQuality GetLinkQuality(void) const { return mLinkQuality; }
/**
* Returns the most recent RSS value.
@@ -391,7 +406,7 @@ public:
* @returns The link quality value (0-3).
*
*/
static uint8_t ConvertLinkMarginToLinkQuality(uint8_t aLinkMargin);
static LinkQuality ConvertLinkMarginToLinkQuality(uint8_t aLinkMargin);
/**
* This method converts a received signal strength value to a link quality value.
@@ -402,7 +417,7 @@ public:
* @returns The link quality value (0-3).
*
*/
static uint8_t ConvertRssToLinkQuality(int8_t aNoiseFloor, int8_t aRss);
static LinkQuality ConvertRssToLinkQuality(int8_t aNoiseFloor, int8_t aRss);
/**
* This method converts a link quality value to a typical received signal strength value.
@@ -415,7 +430,7 @@ public:
* @returns The typical platform RSSI.
*
*/
static int8_t ConvertLinkQualityToRss(int8_t aNoiseFloor, uint8_t aLinkQuality);
static int8_t ConvertLinkQualityToRss(int8_t aNoiseFloor, LinkQuality aLinkQuality);
private:
// Constants for obtaining link quality from link margin:
@@ -432,12 +447,12 @@ private:
static constexpr uint8_t kNoLinkQuality = 0xff; // Indicate that there is no previous/last link quality.
void SetLinkQuality(uint8_t aLinkQuality) { mLinkQuality = aLinkQuality; }
void SetLinkQuality(LinkQuality aLinkQuality) { mLinkQuality = aLinkQuality; }
static uint8_t CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLastLinkQuality);
static LinkQuality CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLastLinkQuality);
RssAverager mRssAverager;
uint8_t mLinkQuality;
LinkQuality mLinkQuality;
int8_t mLastRss;
SuccessRateTracker mFrameErrorRate;
+7 -9
View File
@@ -1769,8 +1769,8 @@ void Mle::HandleAttachTimer(Timer &aTimer)
bool Mle::HasAcceptableParentCandidate(void) const
{
bool hasAcceptableParent = false;
uint8_t linkQuality;
bool hasAcceptableParent = false;
LinkQuality linkQuality;
VerifyOrExit(mParentCandidate.IsStateParentResponse());
@@ -1786,7 +1786,7 @@ bool Mle::HasAcceptableParentCandidate(void) const
// candidate and forward to REED stage to potentially find a
// better parent.
linkQuality = OT_MIN(mParentCandidate.GetLinkInfo().GetLinkQuality(), mParentCandidate.GetLinkQualityOut());
VerifyOrExit(linkQuality == 3);
VerifyOrExit(linkQuality == kLinkQuality3);
break;
case kAttachStateParentRequestReed:
@@ -3398,7 +3398,7 @@ exit:
}
bool Mle::IsBetterParent(uint16_t aRloc16,
uint8_t aLinkQuality,
LinkQuality aLinkQuality,
uint8_t aLinkMargin,
const ConnectivityTlv &aConnectivityTlv,
uint8_t aVersion,
@@ -3407,10 +3407,8 @@ bool Mle::IsBetterParent(uint16_t aRloc16,
{
bool rval = false;
uint8_t candidateLinkQualityIn = mParentCandidate.GetLinkInfo().GetLinkQuality();
uint8_t candidateTwoWayLinkQuality = (candidateLinkQualityIn < mParentCandidate.GetLinkQualityOut())
? candidateLinkQualityIn
: mParentCandidate.GetLinkQualityOut();
LinkQuality candidateLinkQualityIn = mParentCandidate.GetLinkInfo().GetLinkQuality();
LinkQuality candidateTwoWayLinkQuality = OT_MIN(candidateLinkQualityIn, mParentCandidate.GetLinkQualityOut());
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
uint64_t candidateCslMetric = 0;
uint64_t cslMetric = 0;
@@ -3498,7 +3496,7 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo)
LeaderData leaderData;
uint8_t linkMarginFromTlv;
uint8_t linkMargin;
uint8_t linkQuality;
LinkQuality linkQuality;
ConnectivityTlv connectivity;
uint32_t linkFrameCounter;
uint32_t mleFrameCounter;
+1 -1
View File
@@ -1811,7 +1811,7 @@ private:
bool HasAcceptableParentCandidate(void) const;
bool IsBetterParent(uint16_t aRloc16,
uint8_t aLinkQuality,
LinkQuality aLinkQuality,
uint8_t aLinkMargin,
const ConnectivityTlv &aConnectivityTlv,
uint8_t aVersion,
+21 -15
View File
@@ -1602,12 +1602,12 @@ exit:
bool MleRouter::UpdateLinkQualityOut(const RouteTlv &aRoute, Router &aNeighbor, bool &aResetAdvInterval)
{
bool changed = false;
uint8_t linkQuality;
uint8_t myRouterId;
uint8_t myRouteCount;
uint8_t oldLinkCost;
Router *nextHop;
bool changed = false;
LinkQuality linkQuality;
uint8_t myRouterId;
uint8_t myRouteCount;
uint8_t oldLinkCost;
Router * nextHop;
myRouterId = RouterIdFromRloc16(GetRloc16());
VerifyOrExit(aRoute.IsRouterIdSet(myRouterId));
@@ -4017,15 +4017,18 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
case kRoleChild:
switch (mParent.GetLinkInfo().GetLinkQuality())
{
case 1:
case kLinkQuality0:
break;
case kLinkQuality1:
aTlv.SetLinkQuality1(aTlv.GetLinkQuality1() + 1);
break;
case 2:
case kLinkQuality2:
aTlv.SetLinkQuality2(aTlv.GetLinkQuality2() + 1);
break;
case 3:
case kLinkQuality3:
aTlv.SetLinkQuality3(aTlv.GetLinkQuality3() + 1);
break;
}
@@ -4055,7 +4058,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
for (Router &router : Get<RouterTable>().Iterate())
{
uint8_t linkQuality;
LinkQuality linkQuality;
if (router.GetRloc16() == GetRloc16())
{
@@ -4078,15 +4081,18 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
switch (linkQuality)
{
case 1:
case kLinkQuality0:
break;
case kLinkQuality1:
aTlv.SetLinkQuality1(aTlv.GetLinkQuality1() + 1);
break;
case 2:
case kLinkQuality2:
aTlv.SetLinkQuality2(aTlv.GetLinkQuality2() + 1);
break;
case 3:
case kLinkQuality3:
aTlv.SetLinkQuality3(aTlv.GetLinkQuality3() + 1);
break;
}
@@ -4208,8 +4214,8 @@ void MleRouter::FillRouteTlv(RouteTlv &aTlv, Neighbor *aNeighbor)
if (router.GetRloc16() == GetRloc16())
{
aTlv.SetLinkQualityIn(routerCount, 0);
aTlv.SetLinkQualityOut(routerCount, 0);
aTlv.SetLinkQualityIn(routerCount, kLinkQuality0);
aTlv.SetLinkQualityOut(routerCount, kLinkQuality0);
aTlv.SetRouteCost(routerCount, 1);
}
else
+11 -10
View File
@@ -360,9 +360,9 @@ public:
* @returns The Link Quality In value for a given Router index.
*
*/
uint8_t GetLinkQualityIn(uint8_t aRouterIndex) const
LinkQuality GetLinkQualityIn(uint8_t aRouterIndex) const
{
return (mRouteData[aRouterIndex] & kLinkQualityInMask) >> kLinkQualityInOffset;
return static_cast<LinkQuality>((mRouteData[aRouterIndex] & kLinkQualityInMask) >> kLinkQualityInOffset);
}
/**
@@ -372,7 +372,7 @@ public:
* @param[in] aLinkQuality The Link Quality In value for a given Router index.
*
*/
void SetLinkQualityIn(uint8_t aRouterIndex, uint8_t aLinkQuality)
void SetLinkQualityIn(uint8_t aRouterIndex, LinkQuality aLinkQuality)
{
mRouteData[aRouterIndex] = (mRouteData[aRouterIndex] & ~kLinkQualityInMask) |
((aLinkQuality << kLinkQualityInOffset) & kLinkQualityInMask);
@@ -386,9 +386,9 @@ public:
* @returns The Link Quality Out value for a given Router index.
*
*/
uint8_t GetLinkQualityOut(uint8_t aRouterIndex) const
LinkQuality GetLinkQualityOut(uint8_t aRouterIndex) const
{
return (mRouteData[aRouterIndex] & kLinkQualityOutMask) >> kLinkQualityOutOffset;
return static_cast<LinkQuality>((mRouteData[aRouterIndex] & kLinkQualityOutMask) >> kLinkQualityOutOffset);
}
/**
@@ -398,7 +398,7 @@ public:
* @param[in] aLinkQuality The Link Quality Out value for a given Router index.
*
*/
void SetLinkQualityOut(uint8_t aRouterIndex, uint8_t aLinkQuality)
void SetLinkQualityOut(uint8_t aRouterIndex, LinkQuality aLinkQuality)
{
mRouteData[aRouterIndex] = (mRouteData[aRouterIndex] & ~kLinkQualityOutMask) |
((aLinkQuality << kLinkQualityOutOffset) & kLinkQualityOutMask);
@@ -600,11 +600,12 @@ public:
* @returns The Link Quality Out value for a given Router index.
*
*/
uint8_t GetLinkQualityOut(uint8_t aRouterIndex) const
LinkQuality GetLinkQualityOut(uint8_t aRouterIndex) const
{
int offset = ((aRouterIndex & 1) ? kOddEntryOffset : 0);
return (mRouteData[aRouterIndex + aRouterIndex / 2] & (kLinkQualityOutMask >> offset)) >>
(kLinkQualityOutOffset - offset);
return static_cast<LinkQuality>(
(mRouteData[aRouterIndex + aRouterIndex / 2] & (kLinkQualityOutMask >> offset)) >>
(kLinkQualityOutOffset - offset));
}
/**
@@ -614,7 +615,7 @@ public:
* @param[in] aLinkQuality The Link Quality Out value for a given Router index.
*
*/
void SetLinkQualityOut(uint8_t aRouterIndex, uint8_t aLinkQuality)
void SetLinkQualityOut(uint8_t aRouterIndex, LinkQuality aLinkQuality)
{
int offset = ((aRouterIndex & 1) ? kOddEntryOffset : 0);
mRouteData[aRouterIndex + aRouterIndex / 2] =
+1 -1
View File
@@ -323,7 +323,7 @@ exit:
void RouterTable::RemoveRouterLink(Router &aRouter)
{
aRouter.SetLinkQualityOut(0);
aRouter.SetLinkQualityOut(kLinkQuality0);
aRouter.SetLastHeard(TimerMilli::GetNow());
for (Router *cur = GetFirstEntry(); cur != nullptr; cur = GetNextEntry(cur))
+2 -2
View File
@@ -1397,7 +1397,7 @@ public:
* @returns The link quality out value for this router.
*
*/
uint8_t GetLinkQualityOut(void) const { return mLinkQualityOut; }
LinkQuality GetLinkQualityOut(void) const { return static_cast<LinkQuality>(mLinkQualityOut); }
/**
* This method sets the link quality out value for this router.
@@ -1405,7 +1405,7 @@ public:
* @param[in] aLinkQuality The link quality out value for this router.
*
*/
void SetLinkQualityOut(uint8_t aLinkQuality) { mLinkQualityOut = aLinkQuality; }
void SetLinkQualityOut(LinkQuality aLinkQuality) { mLinkQualityOut = aLinkQuality; }
/**
* This method get the route cost to this router.