mirror of
https://github.com/espressif/openthread.git
synced 2026-08-27 12:29:54 +00:00
[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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user