mirror of
https://github.com/espressif/openthread.git
synced 2026-08-22 18:39:50 +00:00
Remove globals from link_quality.cpp.
This commit is contained in:
@@ -925,7 +925,7 @@ void Mac::ReceiveDoneTask(Frame *aFrame, ThreadError aError)
|
||||
|
||||
if (neighbor != NULL)
|
||||
{
|
||||
neighbor->mLinkInfo.AddRss(aFrame->mPower);
|
||||
neighbor->mLinkInfo.AddRss(mNoiseFloor, aFrame->mPower);
|
||||
}
|
||||
|
||||
switch (mState)
|
||||
|
||||
@@ -453,6 +453,14 @@ public:
|
||||
*/
|
||||
otMacCounters &GetCounters(void);
|
||||
|
||||
/**
|
||||
* This method returns the noise floor state.
|
||||
*
|
||||
* @returns A reference to the noise floor state.
|
||||
*
|
||||
*/
|
||||
LinkQualityInfo &GetNoiseFloor(void) { return mNoiseFloor; }
|
||||
|
||||
private:
|
||||
void GenerateNonce(const ExtAddress &aAddress, uint32_t aFrameCounter, uint8_t aSecurityLevel, uint8_t *aNonce);
|
||||
void NextOperation(void);
|
||||
@@ -518,6 +526,8 @@ private:
|
||||
ActiveScanHandler mActiveScanHandler;
|
||||
void *mActiveScanContext;
|
||||
|
||||
LinkQualityInfo mNoiseFloor;
|
||||
|
||||
otLinkPcapCallback mPcapCallback;
|
||||
void *mPcapCallbackContext;
|
||||
|
||||
|
||||
@@ -54,8 +54,6 @@ static const char *const kLinkQualityDecimalDigitsString[8] =
|
||||
|
||||
const char LinkQualityInfo::kUnknownRssString[] = "Unknown RSS";
|
||||
|
||||
static LinkQualityInfo sNoiseFloorAverage; // Store the noise floor average.
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
|
||||
LinkQualityInfo::LinkQualityInfo(void)
|
||||
@@ -70,7 +68,7 @@ void LinkQualityInfo::Clear(void)
|
||||
mLinkQuality = 0;
|
||||
}
|
||||
|
||||
void LinkQualityInfo::AddRss(int8_t anRss)
|
||||
void LinkQualityInfo::AddRss(LinkQualityInfo &aNoiseFloor, int8_t anRss)
|
||||
{
|
||||
uint16_t newValue;
|
||||
uint16_t oldAverage;
|
||||
@@ -114,7 +112,7 @@ void LinkQualityInfo::AddRss(int8_t anRss)
|
||||
mCount++;
|
||||
}
|
||||
|
||||
UpdateLinkQuality();
|
||||
UpdateLinkQuality(aNoiseFloor);
|
||||
}
|
||||
|
||||
int8_t LinkQualityInfo::GetAverageRss(void) const
|
||||
@@ -167,33 +165,33 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
uint8_t LinkQualityInfo::GetLinkMargin(void) const
|
||||
uint8_t LinkQualityInfo::GetLinkMargin(LinkQualityInfo &aNoiseFloor) const
|
||||
{
|
||||
return ConvertRssToLinkMargin(GetAverageRss());
|
||||
return ConvertRssToLinkMargin(aNoiseFloor, GetAverageRss());
|
||||
}
|
||||
|
||||
uint8_t LinkQualityInfo::GetLinkQuality(void)
|
||||
uint8_t LinkQualityInfo::GetLinkQuality(LinkQualityInfo &aNoiseFloor)
|
||||
{
|
||||
UpdateLinkQuality();
|
||||
UpdateLinkQuality(aNoiseFloor);
|
||||
|
||||
return mLinkQuality;
|
||||
}
|
||||
|
||||
void LinkQualityInfo::UpdateLinkQuality(void)
|
||||
void LinkQualityInfo::UpdateLinkQuality(LinkQualityInfo &aNoiseFloor)
|
||||
{
|
||||
if (mCount != 0)
|
||||
{
|
||||
mLinkQuality = CalculateLinkQuality(GetLinkMargin(), mLinkQuality);
|
||||
mLinkQuality = CalculateLinkQuality(GetLinkMargin(aNoiseFloor), mLinkQuality);
|
||||
}
|
||||
else
|
||||
{
|
||||
mLinkQuality = CalculateLinkQuality(GetLinkMargin(), kNoLastLinkQualityValue);
|
||||
mLinkQuality = CalculateLinkQuality(GetLinkMargin(aNoiseFloor), kNoLastLinkQualityValue);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t LinkQualityInfo::ConvertRssToLinkMargin(int8_t anRss)
|
||||
uint8_t LinkQualityInfo::ConvertRssToLinkMargin(LinkQualityInfo &aNoiseFloor, int8_t anRss)
|
||||
{
|
||||
int8_t linkMargin = anRss - GetAverageNoiseFloor();
|
||||
int8_t linkMargin = anRss - GetAverageNoiseFloor(aNoiseFloor);
|
||||
|
||||
if (linkMargin < 0 || anRss == kUnknownRss)
|
||||
{
|
||||
@@ -208,9 +206,9 @@ uint8_t LinkQualityInfo::ConvertLinkMarginToLinkQuality(uint8_t aLinkMargin)
|
||||
return CalculateLinkQuality(aLinkMargin, kNoLastLinkQualityValue);
|
||||
}
|
||||
|
||||
uint8_t LinkQualityInfo::ConvertRssToLinkQuality(int8_t anRss)
|
||||
uint8_t LinkQualityInfo::ConvertRssToLinkQuality(LinkQualityInfo &aNoiseFloor, int8_t anRss)
|
||||
{
|
||||
return ConvertLinkMarginToLinkQuality(ConvertRssToLinkMargin(anRss));
|
||||
return ConvertLinkMarginToLinkQuality(ConvertRssToLinkMargin(aNoiseFloor, anRss));
|
||||
}
|
||||
|
||||
uint8_t LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLastLinkQuality)
|
||||
@@ -261,9 +259,9 @@ uint8_t LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLast
|
||||
return linkQuality;
|
||||
}
|
||||
|
||||
int8_t GetAverageNoiseFloor(void)
|
||||
int8_t GetAverageNoiseFloor(LinkQualityInfo &aNoiseFloor)
|
||||
{
|
||||
int8_t averageNoiseFloor = sNoiseFloorAverage.GetAverageRss();
|
||||
int8_t averageNoiseFloor = aNoiseFloor.GetAverageRss();
|
||||
|
||||
if (averageNoiseFloor == LinkQualityInfo::kUnknownRss)
|
||||
{
|
||||
@@ -273,14 +271,14 @@ int8_t GetAverageNoiseFloor(void)
|
||||
return averageNoiseFloor;
|
||||
}
|
||||
|
||||
void AddNoiseFloor(int8_t aNoiseFloor)
|
||||
void AddNoiseFloor(LinkQualityInfo &aNoiseFloor, int8_t aNoise)
|
||||
{
|
||||
sNoiseFloorAverage.AddRss(aNoiseFloor);
|
||||
aNoiseFloor.AddRss(aNoiseFloor, aNoise);
|
||||
}
|
||||
|
||||
void ClearNoiseFloorAverage(void)
|
||||
void ClearNoiseFloorAverage(LinkQualityInfo &aNoiseFloor)
|
||||
{
|
||||
sNoiseFloorAverage.Clear();
|
||||
aNoiseFloor.Clear();
|
||||
}
|
||||
|
||||
} // namespace Thread
|
||||
|
||||
@@ -76,10 +76,11 @@ public:
|
||||
/**
|
||||
* This method adds a new received signal strength (RSS) value to the average.
|
||||
*
|
||||
* @param[in] anRss A new received signal strength value (in dBm) to be added to the average.
|
||||
* @param[in] aNoiseFloor A reference to the noise floor state.
|
||||
* @param[in] anRss A new received signal strength value (in dBm) to be added to the average.
|
||||
*
|
||||
*/
|
||||
void AddRss(int8_t anRss);
|
||||
void AddRss(LinkQualityInfo &aNoiseFloor, int8_t anRss);
|
||||
|
||||
/**
|
||||
* This method returns the current average signal strength value.
|
||||
@@ -115,10 +116,12 @@ public:
|
||||
* This method returns the link margin. The link margin is calculated using the link's current average received
|
||||
* signal strength (RSS) and average noise floor.
|
||||
*
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
*
|
||||
* @returns Link margin derived from average received signal strength and average noise floor.
|
||||
*
|
||||
*/
|
||||
uint8_t GetLinkMargin(void) const;
|
||||
uint8_t GetLinkMargin(LinkQualityInfo &aNoiseFloor) const;
|
||||
|
||||
/**
|
||||
* Returns the current one-way link quality value. The link quality value is a number 0-3.
|
||||
@@ -131,19 +134,22 @@ public:
|
||||
* frequent changes, a hysteresis of 2 dB is applied when determining the link quality. For example, the average
|
||||
* link margin must be at least 12 dB to change a quality 1 link to a quality 2 link.
|
||||
*
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
*
|
||||
* @returns The current link quality value (value 0-3 as per Thread specification).
|
||||
*/
|
||||
uint8_t GetLinkQuality(void);
|
||||
uint8_t GetLinkQuality(LinkQualityInfo &aNoiseFloor);
|
||||
|
||||
/**
|
||||
* This method converts a received signal strength value to a link margin value.
|
||||
*
|
||||
* @param[in] anRss The received signal strength value (in dBm).
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
* @param[in] anRss The received signal strength value (in dBm).
|
||||
*
|
||||
* @returns The link margin value.
|
||||
*
|
||||
*/
|
||||
static uint8_t ConvertRssToLinkMargin(int8_t anRss);
|
||||
static uint8_t ConvertRssToLinkMargin(LinkQualityInfo &aNoiseFloor, int8_t anRss);
|
||||
|
||||
/**
|
||||
* This method converts a link margin value to a link quality value.
|
||||
@@ -158,12 +164,13 @@ public:
|
||||
/**
|
||||
* This method converts a received signal strength value to a link quality value.
|
||||
*
|
||||
* @param[in] anRss The received signal strength value (in dBm).
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
* @param[in] anRss The received signal strength value (in dBm).
|
||||
*
|
||||
* @returns The link quality value (0-3).
|
||||
*
|
||||
*/
|
||||
static uint8_t ConvertRssToLinkQuality(int8_t anRss);
|
||||
static uint8_t ConvertRssToLinkQuality(LinkQualityInfo &aNoiseFloor, int8_t anRss);
|
||||
|
||||
private:
|
||||
enum
|
||||
@@ -193,7 +200,7 @@ private:
|
||||
/* Private method to update the mLinkQuality value. This is called when a new RSS value is added to average
|
||||
* or when GetLinkQuality() is invoked.
|
||||
*/
|
||||
void UpdateLinkQuality(void);
|
||||
void UpdateLinkQuality(LinkQualityInfo &aNoiseFloor);
|
||||
|
||||
/* Static private method to calculate the link quality from a given link margin while taking into account the last
|
||||
* link quality value and adding the hysteresis value to the thresholds. If there is no previous value for link
|
||||
@@ -214,23 +221,28 @@ private:
|
||||
/**
|
||||
* This function returns the current average noise floor level (in dBm).
|
||||
*
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
*
|
||||
* @returns The current average noise floor level (in dBm).
|
||||
*/
|
||||
int8_t GetAverageNoiseFloor(void);
|
||||
int8_t GetAverageNoiseFloor(LinkQualityInfo &aNoiseFloor);
|
||||
|
||||
/**
|
||||
* This method adds a new noise floor value (in dBm) to the running average.
|
||||
*
|
||||
* @param[in] aNoiseFloor A new noise floor value (in dBm) to be added to the average.
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
* @param[in] aNoise A new noise floor value (in dBm) to be added to the average.
|
||||
*
|
||||
*/
|
||||
void AddNoiseFloor(int8_t aNoiseFloor);
|
||||
void AddNoiseFloor(LinkQualityInfo &aNoiseFloor, int8_t aNoise);
|
||||
|
||||
/**
|
||||
* This method clears the current average noise floor value.
|
||||
*
|
||||
* @param[in] aNoiseFloor A reference to the noise state.
|
||||
*
|
||||
*/
|
||||
void ClearNoiseFloorAverage(void);
|
||||
void ClearNoiseFloorAverage(LinkQualityInfo &aNoiseFloor);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -1809,7 +1809,7 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkMargin, sizeof(linkMarginTlv), linkMarginTlv));
|
||||
VerifyOrExit(linkMarginTlv.IsValid(), error = kThreadError_Parse);
|
||||
|
||||
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(threadMessageInfo->mRss);
|
||||
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
|
||||
if (linkMargin > linkMarginTlv.GetLinkMargin())
|
||||
{
|
||||
@@ -1889,7 +1889,7 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
|
||||
mParent.mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter();
|
||||
mParent.mMode = ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData;
|
||||
mParent.mLinkInfo.Clear();
|
||||
mParent.mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
mParent.mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
mParent.mState = Neighbor::kStateValid;
|
||||
mParent.mKeySequence = aKeySequence;
|
||||
|
||||
|
||||
@@ -641,7 +641,7 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes
|
||||
|
||||
memcpy(&neighbor->mMacAddr, &macAddr, sizeof(neighbor->mMacAddr));
|
||||
neighbor->mLinkInfo.Clear();
|
||||
neighbor->mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
neighbor->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
neighbor->mState = Neighbor::kStateLinkRequest;
|
||||
}
|
||||
else
|
||||
@@ -695,7 +695,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig
|
||||
SuccessOrExit(error = AppendMleFrameCounter(*message));
|
||||
|
||||
// always append a link margin, regardless of whether or not it was requested
|
||||
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(threadMessageInfo->mRss);
|
||||
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
|
||||
// add for certification testing
|
||||
if (isAssignLinkQuality &&
|
||||
@@ -930,7 +930,7 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess
|
||||
neighbor->mLastHeard = Timer::GetNow();
|
||||
neighbor->mMode = ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData;
|
||||
neighbor->mLinkInfo.Clear();
|
||||
neighbor->mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
neighbor->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
neighbor->mState = Neighbor::kStateValid;
|
||||
neighbor->mKeySequence = aKeySequence;
|
||||
|
||||
@@ -1070,7 +1070,7 @@ uint8_t MleRouter::GetLinkCost(uint8_t aRouterId)
|
||||
mRouters[aRouterId].mState == Neighbor::kStateValid,
|
||||
rval = kMaxRouteCost);
|
||||
|
||||
rval = mRouters[aRouterId].mLinkInfo.GetLinkQuality();
|
||||
rval = mRouters[aRouterId].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
|
||||
|
||||
if (rval > mRouters[aRouterId].mLinkQualityOut)
|
||||
{
|
||||
@@ -1359,7 +1359,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
|
||||
{
|
||||
memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr));
|
||||
router->mLinkInfo.Clear();
|
||||
router->mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
router->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
router->mState = Neighbor::kStateLinkRequest;
|
||||
SendLinkRequest(router);
|
||||
ExitNow(error = kThreadError_NoRoute);
|
||||
@@ -1385,7 +1385,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
|
||||
{
|
||||
memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr));
|
||||
router->mLinkInfo.Clear();
|
||||
router->mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
router->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
router->mState = Neighbor::kStateLinkRequest;
|
||||
router->mDataRequest = false;
|
||||
SendLinkRequest(router);
|
||||
@@ -1522,7 +1522,7 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId)
|
||||
}
|
||||
|
||||
otLogDebgMle("%x: %x %d %d %d %d\n", GetRloc16(i), GetRloc16(mRouters[i].mNextHop),
|
||||
mRouters[i].mCost, GetLinkCost(i), mRouters[i].mLinkInfo.GetLinkQuality(),
|
||||
mRouters[i].mCost, GetLinkCost(i), mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()),
|
||||
mRouters[i].mLinkQualityOut);
|
||||
}
|
||||
|
||||
@@ -1591,7 +1591,7 @@ ThreadError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::M
|
||||
// MAC Address
|
||||
memcpy(&child->mMacAddr, &macAddr, sizeof(child->mMacAddr));
|
||||
child->mLinkInfo.Clear();
|
||||
child->mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
child->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
child->mState = Neighbor::kStateParentRequest;
|
||||
child->mDataRequest = false;
|
||||
|
||||
@@ -1731,7 +1731,7 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha
|
||||
}
|
||||
else
|
||||
{
|
||||
SuccessOrExit(error = AppendLinkMargin(*message, aChild->mLinkInfo.GetLinkMargin()));
|
||||
SuccessOrExit(error = AppendLinkMargin(*message, aChild->mLinkInfo.GetLinkMargin(mMac.GetNoiseFloor())));
|
||||
}
|
||||
|
||||
SuccessOrExit(error = AppendConnectivity(*message));
|
||||
@@ -1885,7 +1885,7 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6::
|
||||
child->mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter();
|
||||
child->mKeySequence = aKeySequence;
|
||||
child->mMode = mode.GetMode();
|
||||
child->mLinkInfo.AddRss(threadMessageInfo->mRss);
|
||||
child->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
|
||||
child->mTimeout = timeout.GetTimeout();
|
||||
|
||||
if (mode.GetMode() & ModeTlv::kModeFullNetworkData)
|
||||
@@ -2719,7 +2719,7 @@ void MleRouter::GetChildInfo(Child &aChild, otChildInfo &aChildInfo)
|
||||
aChildInfo.mChildId = GetChildId(aChild.mValid.mRloc16);
|
||||
aChildInfo.mNetworkDataVersion = aChild.mNetworkDataVersion;
|
||||
aChildInfo.mAge = Timer::MsecToSec(Timer::GetNow() - aChild.mLastHeard);
|
||||
aChildInfo.mLinkQualityIn = aChild.mLinkInfo.GetLinkQuality();
|
||||
aChildInfo.mLinkQualityIn = aChild.mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
|
||||
aChildInfo.mAverageRssi = aChild.mLinkInfo.GetAverageRss();
|
||||
|
||||
aChildInfo.mRxOnWhenIdle = (aChild.mMode & ModeTlv::kModeRxOnWhenIdle) != 0;
|
||||
@@ -2752,7 +2752,7 @@ ThreadError MleRouter::GetRouterInfo(uint16_t aRouterId, otRouterInfo &aRouterIn
|
||||
aRouterInfo.mNextHop = mRouters[routerId].mNextHop;
|
||||
aRouterInfo.mLinkEstablished = mRouters[routerId].mState == Neighbor::kStateValid;
|
||||
aRouterInfo.mPathCost = mRouters[routerId].mCost;
|
||||
aRouterInfo.mLinkQualityIn = mRouters[routerId].mLinkInfo.GetLinkQuality();
|
||||
aRouterInfo.mLinkQualityIn = mRouters[routerId].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
|
||||
aRouterInfo.mLinkQualityOut = mRouters[routerId].mLinkQualityOut;
|
||||
aRouterInfo.mAge = static_cast<uint8_t>(Timer::MsecToSec(Timer::GetNow() - mRouters[routerId].mLastHeard));
|
||||
|
||||
@@ -3277,7 +3277,7 @@ ThreadError MleRouter::AppendConnectivity(Message &aMessage)
|
||||
break;
|
||||
|
||||
case kDeviceStateChild:
|
||||
switch (mParent.mLinkInfo.GetLinkQuality())
|
||||
switch (mParent.mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()))
|
||||
{
|
||||
case 1:
|
||||
tlv.SetLinkQuality1(tlv.GetLinkQuality1() + 1);
|
||||
@@ -3292,7 +3292,7 @@ ThreadError MleRouter::AppendConnectivity(Message &aMessage)
|
||||
break;
|
||||
}
|
||||
|
||||
cost += LqiToCost(mParent.mLinkInfo.GetLinkQuality());
|
||||
cost += LqiToCost(mParent.mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()));
|
||||
break;
|
||||
|
||||
case kDeviceStateRouter:
|
||||
@@ -3318,7 +3318,7 @@ ThreadError MleRouter::AppendConnectivity(Message &aMessage)
|
||||
continue;
|
||||
}
|
||||
|
||||
lqi = mRouters[i].mLinkInfo.GetLinkQuality();
|
||||
lqi = mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
|
||||
|
||||
if (lqi > mRouters[i].mLinkQualityOut)
|
||||
{
|
||||
@@ -3447,7 +3447,7 @@ ThreadError MleRouter::AppendRoute(Message &aMessage)
|
||||
}
|
||||
else
|
||||
{
|
||||
tlv.SetLinkQualityIn(routeCount, mRouters[i].mLinkInfo.GetLinkQuality());
|
||||
tlv.SetLinkQualityIn(routeCount, mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,8 @@ struct RssTestData
|
||||
uint8_t mExpectedLinkQuality; // Expected final link quality value.
|
||||
};
|
||||
|
||||
static LinkQualityInfo sNoiseFloor;
|
||||
|
||||
// Checks the encoded average RSS value to match the value from GetAverageRss().
|
||||
void VerifyEncodedRssValue(LinkQualityInfo &aLinkInfo)
|
||||
{
|
||||
@@ -92,7 +94,8 @@ void PrintOutcome(LinkQualityInfo &aLinkInfo)
|
||||
"TestLinkQualityInfo failed - GetAverageRssAsString() failed.");
|
||||
|
||||
printf("AveRss = %-4d, \"%-14s\", ", aLinkInfo.GetAverageRss(), stringBuf);
|
||||
printf("LinkMargin = %-4d, LinkQuality = %d", aLinkInfo.GetLinkMargin(), aLinkInfo.GetLinkQuality());
|
||||
printf("LinkMargin = %-4d, LinkQuality = %d", aLinkInfo.GetLinkMargin(sNoiseFloor),
|
||||
aLinkInfo.GetLinkQuality(sNoiseFloor));
|
||||
|
||||
// This test-case succeeded.
|
||||
printf(" -> PASS\n");
|
||||
@@ -113,7 +116,7 @@ void TestLinkQualityData(RssTestData anRssData)
|
||||
rss = anRssData.mRssList[i];
|
||||
min = MIN_RSS(rss, min);
|
||||
max = MAX_RSS(rss, max);
|
||||
linkInfo.AddRss(rss);
|
||||
linkInfo.AddRss(sNoiseFloor, rss);
|
||||
ave = linkInfo.GetAverageRss();
|
||||
VerifyOrQuit(ave >= min,
|
||||
"TestLinkQualityInfo failed - GetAverageRss() is smaller than min value.");
|
||||
@@ -124,7 +127,7 @@ void TestLinkQualityData(RssTestData anRssData)
|
||||
PrintOutcome(linkInfo);
|
||||
}
|
||||
|
||||
VerifyOrQuit(linkInfo.GetLinkQuality() == anRssData.mExpectedLinkQuality,
|
||||
VerifyOrQuit(linkInfo.GetLinkQuality(sNoiseFloor) == anRssData.mExpectedLinkQuality,
|
||||
"TestLinkQualityInfo failed - GetLinkQuality() is incorrect");
|
||||
}
|
||||
|
||||
@@ -142,7 +145,7 @@ void TestRssAveraging(void)
|
||||
printf("\nAfter Initialization: ");
|
||||
VerifyOrQuit(linkInfo.GetAverageRss() == LinkQualityInfo::kUnknownRss,
|
||||
"TestLinkQualityInfo failed - Inital value from GetAverageRss() is incorrect.");
|
||||
VerifyOrQuit(linkInfo.GetLinkMargin() == 0,
|
||||
VerifyOrQuit(linkInfo.GetLinkMargin(sNoiseFloor) == 0,
|
||||
"TestLinkQualityInfo failed - Inital value for link margin is incorrect.");
|
||||
VerifyEncodedRssValue(linkInfo);
|
||||
PrintOutcome(linkInfo);
|
||||
@@ -151,7 +154,7 @@ void TestRssAveraging(void)
|
||||
// Adding a single value
|
||||
rss = -70;
|
||||
printf("AddRss(%d): ", rss);
|
||||
linkInfo.AddRss(rss);
|
||||
linkInfo.AddRss(sNoiseFloor, rss);
|
||||
VerifyOrQuit(linkInfo.GetAverageRss() == rss,
|
||||
"TestLinkQualityInfo - GetAverageRss() failed after a single AddRss().");
|
||||
VerifyEncodedRssValue(linkInfo);
|
||||
@@ -164,7 +167,7 @@ void TestRssAveraging(void)
|
||||
linkInfo.Clear();
|
||||
VerifyOrQuit(linkInfo.GetAverageRss() == LinkQualityInfo::kUnknownRss,
|
||||
"TestLinkQualityInfo failed - GetAverageRss() after Clear() is incorrect.");
|
||||
VerifyOrQuit(linkInfo.GetLinkMargin() == 0,
|
||||
VerifyOrQuit(linkInfo.GetLinkMargin(sNoiseFloor) == 0,
|
||||
"TestLinkQualityInfo failed - link margin value after Clear() is incorrect.");
|
||||
VerifyEncodedRssValue(linkInfo);
|
||||
PrintOutcome(linkInfo);
|
||||
@@ -182,7 +185,7 @@ void TestRssAveraging(void)
|
||||
|
||||
for (i = 0; i < kNumRssAdds; i++)
|
||||
{
|
||||
linkInfo.AddRss(rss);
|
||||
linkInfo.AddRss(sNoiseFloor, rss);
|
||||
VerifyOrQuit(linkInfo.GetAverageRss() == rss,
|
||||
"TestLinkQualityInfo failed - GetAverageRss() returned incorrect value.");
|
||||
VerifyEncodedRssValue(linkInfo);
|
||||
@@ -210,8 +213,8 @@ void TestRssAveraging(void)
|
||||
|
||||
rss2 = rssValues[k];
|
||||
linkInfo.Clear();
|
||||
linkInfo.AddRss(rss);
|
||||
linkInfo.AddRss(rss2);
|
||||
linkInfo.AddRss(sNoiseFloor, rss);
|
||||
linkInfo.AddRss(sNoiseFloor, rss2);
|
||||
printf("AddRss(%4d), AddRss(%4d): ", rss, rss2);
|
||||
VerifyOrQuit(linkInfo.GetAverageRss() == ((rss + rss2) >> 1),
|
||||
"TestLinkQualityInfo failed - GetAverageRss() returned incorrect value.");
|
||||
@@ -241,10 +244,10 @@ void TestRssAveraging(void)
|
||||
|
||||
for (i = 0; i < kNumRssAdds; i++)
|
||||
{
|
||||
linkInfo.AddRss(rss);
|
||||
linkInfo.AddRss(sNoiseFloor, rss);
|
||||
}
|
||||
|
||||
linkInfo.AddRss(rss2);
|
||||
linkInfo.AddRss(sNoiseFloor, rss2);
|
||||
printf("AddRss(%4d) %d times, AddRss(%4d): ", rss, kNumRssAdds, rss2);
|
||||
ave = linkInfo.GetAverageRss();
|
||||
VerifyOrQuit(ave >= MIN_RSS(rss, rss2),
|
||||
@@ -277,8 +280,8 @@ void TestRssAveraging(void)
|
||||
|
||||
for (i = 0; i < kNumRssAdds; i++)
|
||||
{
|
||||
linkInfo.AddRss(rss);
|
||||
linkInfo.AddRss(rss2);
|
||||
linkInfo.AddRss(sNoiseFloor, rss);
|
||||
linkInfo.AddRss(sNoiseFloor, rss2);
|
||||
ave = linkInfo.GetAverageRss();
|
||||
VerifyOrQuit(ave >= MIN_RSS(rss, rss2),
|
||||
"TestLinkQualityInfo failed - GetAverageRss() is smaller than min value.");
|
||||
|
||||
Reference in New Issue
Block a user