diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 5f90b3235..ce351401c 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -1302,9 +1302,6 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, datagramLength); VerifyOrExit(headerLength > 0, error = kThreadError_NoBufs); - // Security Check - VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); - aFrame += headerLength; aFrameLength -= headerLength; @@ -1314,6 +1311,13 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, message->SetDatagramTag(datagramTag); message->SetTimeout(kReassemblyTimeout); + // copy Fragment + message->Write(message->GetOffset(), aFrameLength, aFrame); + message->MoveOffset(aFrameLength); + + // Security Check + VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); + mReassemblyList.Enqueue(*message); if (!mReassemblyTimer.IsRunning()) @@ -1339,14 +1343,12 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, } VerifyOrExit(message != NULL, error = kThreadError_Drop); + + // copy Fragment + message->Write(message->GetOffset(), aFrameLength, aFrame); + message->MoveOffset(aFrameLength); } - assert(message != NULL); - - // copy Fragment - message->Write(message->GetOffset(), aFrameLength, aFrame); - message->MoveOffset(aFrameLength); - exit: if (error == kThreadError_None) @@ -1412,9 +1414,6 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength, headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, 0); VerifyOrExit(headerLength > 0, error = kThreadError_Drop); - // Security Check - VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); - aFrame += headerLength; aFrameLength -= headerLength; @@ -1425,6 +1424,9 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength, message->Write(message->GetOffset(), aFrameLength, aFrame); + // Security Check + VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); + exit: if (error == kThreadError_None)