[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.
This commit is contained in:
Jonathan Hui
2020-09-21 08:49:19 -07:00
committed by GitHub
parent 0683f78e17
commit efde29d3ed
+24 -17
View File
@@ -1891,30 +1891,37 @@ void Mac::HandleReceivedFrame(RxFrame *aFrame, otError aError)
if (aFrame->GetSecurityEnabled()) if (aFrame->GetSecurityEnabled())
{ {
switch (neighbor->GetState()) uint8_t keyIdMode;
IgnoreError(aFrame->GetKeyIdMode(keyIdMode));
if (keyIdMode == Frame::kKeyIdMode1)
{ {
case Neighbor::kStateValid: switch (neighbor->GetState())
break; {
case Neighbor::kStateValid:
break;
case Neighbor::kStateRestored: case Neighbor::kStateRestored:
case Neighbor::kStateChildUpdateRequest: case Neighbor::kStateChildUpdateRequest:
// Only accept a "MAC Data Request" frame from a child being restored. // Only accept a "MAC Data Request" frame from a child being restored.
VerifyOrExit(aFrame->IsDataRequestCommand(), error = OT_ERROR_DROP); VerifyOrExit(aFrame->IsDataRequestCommand(), error = OT_ERROR_DROP);
break; break;
default: default:
ExitNow(error = OT_ERROR_UNKNOWN_NEIGHBOR); ExitNow(error = OT_ERROR_UNKNOWN_NEIGHBOR);
} }
#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 && OPENTHREAD_FTD #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 // From Thread 1.2, MAC Data Frame can also act as keep-alive message if child supports
if (aFrame->GetType() == Frame::kFcfFrameData && !neighbor->IsRxOnWhenIdle() && if (aFrame->GetType() == Frame::kFcfFrameData && !neighbor->IsRxOnWhenIdle() &&
neighbor->IsEnhancedKeepAliveSupported()) neighbor->IsEnhancedKeepAliveSupported())
{ {
neighbor->SetLastHeard(TimerMilli::GetNow()); neighbor->SetLastHeard(TimerMilli::GetNow());
} }
#endif #endif
}
} }
} }