diff --git a/src/core/thread/link_metrics.cpp b/src/core/thread/link_metrics.cpp index a703ab689..6afb8daa5 100644 --- a/src/core/thread/link_metrics.cpp +++ b/src/core/thread/link_metrics.cpp @@ -67,11 +67,10 @@ Error LinkMetrics::Query(const Ip6::Address &aDestination, uint8_t aSeriesId, co static const uint8_t kTlvs[] = {Mle::Tlv::kLinkMetricsReport}; Error error; - Neighbor *neighbor = GetNeighborFromLinkLocalAddr(aDestination); + Neighbor *neighbor; QueryInfo info; - VerifyOrExit(neighbor != nullptr, error = kErrorUnknownNeighbor); - VerifyOrExit(neighbor->IsThreadVersion1p2OrHigher(), error = kErrorNotCapable); + SuccessOrExit(error = FindNeighbor(aDestination, neighbor)); info.Clear(); info.mSeriesId = aSeriesId; @@ -98,13 +97,12 @@ Error LinkMetrics::SendMgmtRequestForwardTrackingSeries(const Ip6::Address &aDes const SeriesFlags & aSeriesFlags, const Metrics * aMetrics) { - Error error = kErrorNone; - Neighbor * neighbor = GetNeighborFromLinkLocalAddr(aDestination); + Error error; + Neighbor * neighbor; uint8_t typeIdCount = 0; FwdProbingRegSubTlv fwdProbingSubTlv; - VerifyOrExit(neighbor != nullptr, error = kErrorUnknownNeighbor); - VerifyOrExit(neighbor->IsThreadVersion1p2OrHigher(), error = kErrorNotCapable); + SuccessOrExit(error = FindNeighbor(aDestination, neighbor)); VerifyOrExit(aSeriesId > kQueryIdSingleProbe, error = kErrorInvalidArgs); @@ -130,13 +128,12 @@ Error LinkMetrics::SendMgmtRequestEnhAckProbing(const Ip6::Address &aDestination const EnhAckFlags aEnhAckFlags, const Metrics * aMetrics) { - Error error = kErrorNone; - Neighbor * neighbor = GetNeighborFromLinkLocalAddr(aDestination); + Error error; + Neighbor * neighbor; uint8_t typeIdCount = 0; EnhAckConfigSubTlv enhAckConfigSubTlv; - VerifyOrExit(neighbor != nullptr, error = kErrorUnknownNeighbor); - VerifyOrExit(neighbor->IsThreadVersion1p2OrHigher(), error = kErrorNotCapable); + SuccessOrExit(error = FindNeighbor(aDestination, neighbor)); if (aEnhAckFlags == kEnhAckClear) { @@ -173,12 +170,11 @@ exit: Error LinkMetrics::SendLinkProbe(const Ip6::Address &aDestination, uint8_t aSeriesId, uint8_t aLength) { - Error error = kErrorNone; + Error error; uint8_t buf[kLinkProbeMaxLen]; - Neighbor *neighbor = GetNeighborFromLinkLocalAddr(aDestination); + Neighbor *neighbor; - VerifyOrExit(neighbor != nullptr, error = kErrorUnknownNeighbor); - VerifyOrExit(neighbor->IsThreadVersion1p2OrHigher(), error = kErrorNotCapable); + SuccessOrExit(error = FindNeighbor(aDestination, neighbor)); VerifyOrExit(aLength <= LinkMetrics::kLinkProbeMaxLen && aSeriesId != kQueryIdSingleProbe && aSeriesId != kSeriesIdAllSeries, @@ -668,17 +664,24 @@ exit: } #endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE -Neighbor *LinkMetrics::GetNeighborFromLinkLocalAddr(const Ip6::Address &aDestination) +Error LinkMetrics::FindNeighbor(const Ip6::Address &aDestination, Neighbor *&aNeighbor) const { - Neighbor * neighbor = nullptr; + Error error = kErrorUnknownNeighbor; Mac::Address macAddress; + aNeighbor = nullptr; + VerifyOrExit(aDestination.IsLinkLocal()); aDestination.GetIid().ConvertToMacAddress(macAddress); - neighbor = Get().FindNeighbor(macAddress); + + aNeighbor = Get().FindNeighbor(macAddress); + VerifyOrExit(aNeighbor != nullptr); + + VerifyOrExit(aNeighbor->GetVersion() >= kThreadVersion1p2, error = kErrorNotCapable); + error = kErrorNone; exit: - return neighbor; + return error; } Error LinkMetrics::ReadTypeIdsFromMessage(const Message &aMessage, diff --git a/src/core/thread/link_metrics.hpp b/src/core/thread/link_metrics.hpp index 966a01b1f..daefc780f 100644 --- a/src/core/thread/link_metrics.hpp +++ b/src/core/thread/link_metrics.hpp @@ -307,7 +307,7 @@ private: Status ConfigureEnhAckProbing(EnhAckFlags aEnhAckFlags, const Metrics &aMetrics, Neighbor &aNeighbor); - Neighbor *GetNeighborFromLinkLocalAddr(const Ip6::Address &aDestination); + Error FindNeighbor(const Ip6::Address &aDestination, Neighbor *&aNeighbor) const; static Error ReadTypeIdsFromMessage(const Message &aMessage, uint16_t aStartOffset,