[sub-mac] check key-id to match in SignalFrameCounterUsed() (#8978)

This commit ensures to check that `KeyId` on a frame matches the
current `mKeyId` from `SignalFrameCounterUsed()`. This addresses
corner-case situation where on key sequence change, an ongoing frame
tx or enhanced ack to a received frame, can be processed  after the
`mKeyId` change.
This commit is contained in:
Abtin Keshavarzian
2023-04-20 17:42:58 -07:00
committed by GitHub
parent 658179fa93
commit 2a93eeabce
2 changed files with 10 additions and 5 deletions
+9 -4
View File
@@ -285,7 +285,7 @@ void SubMac::HandleReceiveDone(RxFrame *aFrame, Error aError)
if (!ShouldHandleTransmitSecurity() && aFrame != nullptr && aFrame->mInfo.mRxInfo.mAckedWithSecEnhAck)
{
SignalFrameCounterUsed(aFrame->mInfo.mRxInfo.mAckFrameCounter);
SignalFrameCounterUsed(aFrame->mInfo.mRxInfo.mAckFrameCounter, aFrame->mInfo.mRxInfo.mAckKeyId);
}
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
@@ -390,7 +390,7 @@ void SubMac::ProcessTransmitSecurity(void)
uint32_t frameCounter = GetFrameCounter();
mTransmitFrame.SetFrameCounter(frameCounter);
SignalFrameCounterUsed(frameCounter);
SignalFrameCounterUsed(frameCounter, mKeyId);
}
extAddress = &GetExtAddress();
@@ -642,6 +642,7 @@ exit:
void SubMac::SignalFrameCounterUsedOnTxDone(const TxFrame &aFrame)
{
uint8_t keyIdMode;
uint8_t keyId;
uint32_t frameCounter;
bool allowError = false;
@@ -666,7 +667,9 @@ void SubMac::SignalFrameCounterUsedOnTxDone(const TxFrame &aFrame)
VerifyOrExit(keyIdMode == Frame::kKeyIdMode1);
VerifyOrExit(aFrame.GetFrameCounter(frameCounter) == kErrorNone, OT_ASSERT(allowError));
SignalFrameCounterUsed(frameCounter);
VerifyOrExit(aFrame.GetKeyId(keyId) == kErrorNone, OT_ASSERT(allowError));
SignalFrameCounterUsed(frameCounter, keyId);
exit:
return;
@@ -961,8 +964,10 @@ exit:
return;
}
void SubMac::SignalFrameCounterUsed(uint32_t aFrameCounter)
void SubMac::SignalFrameCounterUsed(uint32_t aFrameCounter, uint8_t aKeyId)
{
VerifyOrExit(aKeyId == mKeyId);
mCallbacks.FrameCounterUsed(aFrameCounter);
// It not always guaranteed that this method is invoked in order
+1 -1
View File
@@ -604,7 +604,7 @@ private:
bool ShouldHandleTransmitTargetTime(void) const;
void ProcessTransmitSecurity(void);
void SignalFrameCounterUsed(uint32_t aFrameCounter);
void SignalFrameCounterUsed(uint32_t aFrameCounter, uint8_t aKeyId);
void StartCsmaBackoff(void);
void StartTimerForBackoff(uint8_t aBackoffExponent);
void BeginTransmit(void);