From efde29d3edf5a0a5d4d79cdaaafba70bace58277 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Mon, 21 Sep 2020 08:49:19 -0700 Subject: [PATCH] [mac] only apply neighbor check when key id mode is 1 (#5550) Allows receiving a Joiner Entrust message even after the device has been commissioned. --- src/core/mac/mac.cpp | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 4d1cfa761..3a7a5e03b 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -1891,30 +1891,37 @@ void Mac::HandleReceivedFrame(RxFrame *aFrame, otError aError) if (aFrame->GetSecurityEnabled()) { - switch (neighbor->GetState()) + uint8_t keyIdMode; + + IgnoreError(aFrame->GetKeyIdMode(keyIdMode)); + + if (keyIdMode == Frame::kKeyIdMode1) { - case Neighbor::kStateValid: - break; + switch (neighbor->GetState()) + { + case Neighbor::kStateValid: + break; - case Neighbor::kStateRestored: - case Neighbor::kStateChildUpdateRequest: + case Neighbor::kStateRestored: + case Neighbor::kStateChildUpdateRequest: - // Only accept a "MAC Data Request" frame from a child being restored. - VerifyOrExit(aFrame->IsDataRequestCommand(), error = OT_ERROR_DROP); - break; + // Only accept a "MAC Data Request" frame from a child being restored. + VerifyOrExit(aFrame->IsDataRequestCommand(), error = OT_ERROR_DROP); + break; - default: - ExitNow(error = OT_ERROR_UNKNOWN_NEIGHBOR); - } + default: + ExitNow(error = OT_ERROR_UNKNOWN_NEIGHBOR); + } #if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 && OPENTHREAD_FTD - // From Thread 1.2, MAC Data Frame can also act as keep-alive message if child supports - if (aFrame->GetType() == Frame::kFcfFrameData && !neighbor->IsRxOnWhenIdle() && - neighbor->IsEnhancedKeepAliveSupported()) - { - neighbor->SetLastHeard(TimerMilli::GetNow()); - } + // From Thread 1.2, MAC Data Frame can also act as keep-alive message if child supports + if (aFrame->GetType() == Frame::kFcfFrameData && !neighbor->IsRxOnWhenIdle() && + neighbor->IsEnhancedKeepAliveSupported()) + { + neighbor->SetLastHeard(TimerMilli::GetNow()); + } #endif + } } }