Mesh_forwarder: Copy the payload into message before ipv6 filter check (#511)

This commit changes the steps in `mesh_forwarder` so we check the
ipv6 filter (security) check after payload is copied into the message
buffer. This helps the IPv6 filter to pass along the TCP packets with
unsecure dst port(s) properly.
This commit is contained in:
Abtin Keshavarzian
2016-09-01 18:09:16 -07:00
committed by Jonathan Hui
parent 2d914a1cc0
commit 1ef2165866
+14 -12
View File
@@ -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)