[link-metrics] simplify AddReport() (#8042)

This commit simplifies the `LinkMetrics::AddReport()` method so that
when preparing the MLE Link Metrics Report TLV (and its sub-TLVs) we
determine the TLV length after all sub-TLVs are appended to the
message from the number of written bytes in the message (difference
between `aMessage.GetLength()` and initial offset of the TLV). This
allows to simplify methods `AppendReportSubTlvToMessage()` and
`AppendStatusSubTlvToMessage()` as well.
This commit is contained in:
Abtin Keshavarzian
2022-08-22 16:19:18 -07:00
committed by GitHub
parent e50be395e4
commit fdd0afacc5
2 changed files with 39 additions and 41 deletions
+37 -39
View File
@@ -201,19 +201,21 @@ Error LinkMetrics::AppendReport(Message &aMessage, const Message &aRequestMessag
Error error = kErrorNone;
Tlv tlv;
uint8_t queryId;
bool hasQueryId = false;
uint8_t length = 0;
uint16_t startOffset = aMessage.GetLength();
bool hasQueryId = false;
uint16_t length;
uint16_t offset;
uint16_t endOffset;
MetricsValues values;
values.Clear();
SuccessOrExit(error = Tlv::FindTlvValueOffset(aRequestMessage, Mle::Tlv::Type::kLinkMetricsQuery, offset,
endOffset)); // `endOffset` is used to store tlv length here
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Parse MLE Link Metrics Query TLV and its sub-TLVs from
// `aRequestMessage`.
endOffset = offset + endOffset;
SuccessOrExit(error = Tlv::FindTlvValueOffset(aRequestMessage, Mle::Tlv::Type::kLinkMetricsQuery, offset, length));
endOffset = offset + length;
while (offset < endOffset)
{
@@ -241,7 +243,11 @@ Error LinkMetrics::AppendReport(Message &aMessage, const Message &aRequestMessag
VerifyOrExit(hasQueryId, error = kErrorParse);
// Link Metrics Report TLV
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Append MLE Link Metrics Report TLV and its sub-TLVs to
// `aMessage`.
offset = aMessage.GetLength();
tlv.SetType(Mle::Tlv::kLinkMetricsReport);
SuccessOrExit(error = aMessage.Append(tlv));
@@ -256,7 +262,7 @@ Error LinkMetrics::AppendReport(Message &aMessage, const Message &aRequestMessag
// Linearly scale rss from [-130, 0] to [0, 255]
values.mRssiValue = (aRequestMessage.GetAverageRss() + 130) * 255 / 130;
SuccessOrExit(error = AppendReportSubTlvToMessage(aMessage, length, values));
SuccessOrExit(error = AppendReportSubTlvToMessage(aMessage, values));
}
else
{
@@ -264,11 +270,11 @@ Error LinkMetrics::AppendReport(Message &aMessage, const Message &aRequestMessag
if (seriesInfo == nullptr)
{
SuccessOrExit(error = AppendStatusSubTlvToMessage(aMessage, length, kStatusSeriesIdNotRecognized));
SuccessOrExit(error = AppendStatusSubTlvToMessage(aMessage, kStatusSeriesIdNotRecognized));
}
else if (seriesInfo->GetPduCount() == 0)
{
SuccessOrExit(error = AppendStatusSubTlvToMessage(aMessage, length, kStatusNoMatchingFramesReceived));
SuccessOrExit(error = AppendStatusSubTlvToMessage(aMessage, kStatusNoMatchingFramesReceived));
}
else
{
@@ -281,12 +287,14 @@ Error LinkMetrics::AppendReport(Message &aMessage, const Message &aRequestMessag
255 / 130;
// Linearly scale RSSI from [-130, 0] to [0, 255]
values.mRssiValue = (seriesInfo->GetAverageRss() + 130) * 255 / 130;
SuccessOrExit(error = AppendReportSubTlvToMessage(aMessage, length, values));
SuccessOrExit(error = AppendReportSubTlvToMessage(aMessage, values));
}
}
tlv.SetLength(length);
aMessage.Write(startOffset, tlv);
// Update the TLV length in message.
length = aMessage.GetLength() - offset - sizeof(Tlv);
tlv.SetLength(static_cast<uint8_t>(length));
aMessage.Write(offset, tlv);
exit:
LogDebg("AppendReport, error:%s", ErrorToString(error));
@@ -766,55 +774,46 @@ exit:
return error;
}
Error LinkMetrics::AppendReportSubTlvToMessage(Message &aMessage, uint8_t &aLength, const MetricsValues &aValues)
Error LinkMetrics::AppendReportSubTlvToMessage(Message &aMessage, const MetricsValues &aValues)
{
Error error = kErrorNone;
ReportSubTlv metric;
ReportSubTlv reportTlv;
aLength = 0;
reportTlv.Init();
// Link Metrics Report sub-TLVs
if (aValues.mMetrics.mPduCount)
{
metric.Init();
metric.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kPdu));
metric.SetMetricsValue32(aValues.mPduCountValue);
SuccessOrExit(error = aMessage.AppendBytes(&metric, metric.GetSize()));
aLength += metric.GetSize();
reportTlv.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kPdu));
reportTlv.SetMetricsValue32(aValues.mPduCountValue);
SuccessOrExit(error = reportTlv.AppendTo(aMessage));
}
if (aValues.mMetrics.mLqi)
{
metric.Init();
metric.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kLqi));
metric.SetMetricsValue8(aValues.mLqiValue);
SuccessOrExit(error = aMessage.AppendBytes(&metric, metric.GetSize()));
aLength += metric.GetSize();
reportTlv.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kLqi));
reportTlv.SetMetricsValue8(aValues.mLqiValue);
SuccessOrExit(error = reportTlv.AppendTo(aMessage));
}
if (aValues.mMetrics.mLinkMargin)
{
metric.Init();
metric.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kLinkMargin));
metric.SetMetricsValue8(aValues.mLinkMarginValue);
SuccessOrExit(error = aMessage.AppendBytes(&metric, metric.GetSize()));
aLength += metric.GetSize();
reportTlv.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kLinkMargin));
reportTlv.SetMetricsValue8(aValues.mLinkMarginValue);
SuccessOrExit(error = reportTlv.AppendTo(aMessage));
}
if (aValues.mMetrics.mRssi)
{
metric.Init();
metric.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kRssi));
metric.SetMetricsValue8(aValues.mRssiValue);
SuccessOrExit(error = aMessage.AppendBytes(&metric, metric.GetSize()));
aLength += metric.GetSize();
reportTlv.SetMetricsTypeId(TypeIdFlags(TypeIdFlags::kRssi));
reportTlv.SetMetricsValue8(aValues.mRssiValue);
SuccessOrExit(error = reportTlv.AppendTo(aMessage));
}
exit:
return error;
}
Error LinkMetrics::AppendStatusSubTlvToMessage(Message &aMessage, uint8_t &aLength, Status aStatus)
Error LinkMetrics::AppendStatusSubTlvToMessage(Message &aMessage, Status aStatus)
{
Error error = kErrorNone;
Tlv statusTlv;
@@ -823,7 +822,6 @@ Error LinkMetrics::AppendStatusSubTlvToMessage(Message &aMessage, uint8_t &aLeng
statusTlv.SetLength(sizeof(uint8_t));
SuccessOrExit(error = aMessage.AppendBytes(&statusTlv, sizeof(statusTlv)));
SuccessOrExit(error = aMessage.AppendBytes(&aStatus, sizeof(aStatus)));
aLength += statusTlv.GetSize();
exit:
return error;
+2 -2
View File
@@ -290,8 +290,8 @@ private:
uint16_t aStartPos,
uint16_t aEndPos,
Metrics & aMetrics);
static Error AppendReportSubTlvToMessage(Message &aMessage, uint8_t &aLength, const MetricsValues &aValues);
static Error AppendStatusSubTlvToMessage(Message &aMessage, uint8_t &aLength, Status aStatus);
static Error AppendReportSubTlvToMessage(Message &aMessage, const MetricsValues &aValues);
static Error AppendStatusSubTlvToMessage(Message &aMessage, Status aStatus);
ReportCallback mReportCallback;
void * mReportCallbackContext;