diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 0b07174c0..ca24fa41c 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -75,10 +75,24 @@ void ThreadLinkInfo::SetFrom(const Mac::RxFrame &aFrame) mIsDstPanIdBroadcast = (dstPanId == Mac::kPanIdBroadcast); } - mChannel = aFrame.GetChannel(); - mRss = aFrame.GetRssi(); - mLqi = aFrame.GetLqi(); - mLinkSecurity = aFrame.GetSecurityEnabled(); + if (aFrame.GetSecurityEnabled()) + { + uint8_t keyIdMode; + + // MAC Frame Security was already validated at the MAC + // layer. As a result, `GetKeyIdMode()` will never return + // failure here. + IgnoreError(aFrame.GetKeyIdMode(keyIdMode)); + + mLinkSecurity = (keyIdMode == Mac::Frame::kKeyIdMode0) || (keyIdMode == Mac::Frame::kKeyIdMode1); + } + else + { + mLinkSecurity = false; + } + mChannel = aFrame.GetChannel(); + mRss = aFrame.GetRssi(); + mLqi = aFrame.GetLqi(); #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE if (aFrame.GetTimeIe() != nullptr) {