Reset receive frame counters on master key change. (#1218)

This commit is contained in:
Jonathan Hui
2017-01-26 21:39:16 -08:00
committed by GitHub
parent aca6707479
commit 4cca4435cb
+29
View File
@@ -86,6 +86,9 @@ const uint8_t *KeyManager::GetMasterKey(uint8_t *aKeyLength) const
ThreadError KeyManager::SetMasterKey(const void *aKey, uint8_t aKeyLength)
{
ThreadError error = kThreadError_None;
Router *routers;
Child *children;
uint8_t num;
VerifyOrExit(aKeyLength <= sizeof(mMasterKey), error = kThreadError_InvalidArgs);
VerifyOrExit((mMasterKeyLength != aKeyLength) || (memcmp(mMasterKey, aKey, aKeyLength) != 0), ;);
@@ -95,6 +98,32 @@ ThreadError KeyManager::SetMasterKey(const void *aKey, uint8_t aKeyLength)
mKeySequence = 0;
ComputeKey(mKeySequence, mKey);
// reset parent frame counters
routers = mNetif.GetMle().GetParent();
routers->mKeySequence = 0;
routers->mValid.mLinkFrameCounter = 0;
routers->mValid.mMleFrameCounter = 0;
// reset router frame counters
routers = mNetif.GetMle().GetRouters(&num);
for (uint8_t i = 0; i < num; i++)
{
routers[i].mKeySequence = 0;
routers[i].mValid.mLinkFrameCounter = 0;
routers[i].mValid.mMleFrameCounter = 0;
}
// reset child frame counters
children = mNetif.GetMle().GetChildren(&num);
for (uint8_t i = 0; i < num; i++)
{
children[i].mKeySequence = 0;
children[i].mValid.mLinkFrameCounter = 0;
children[i].mValid.mMleFrameCounter = 0;
}
mNetif.SetStateChangedFlags(OT_NET_KEY_SEQUENCE_COUNTER);
exit: