mirror of
https://github.com/espressif/openthread.git
synced 2026-08-17 07:59:51 +00:00
[ip6] fix packets not being forwarded outside of Thread (#8102)
Two changes made together broke fragmented packets handling: Some time ago forwarding packets outside of thread was limited to 1280 bytes Recently forwarding IP packet fragments was disabled. This makes it not forward packet fragments nor fully assembled packets. According to later change author this was to prevent packets from being handled twice. To fix this, forwarding of IP fragments was restored and instead forwarding of reassembled frames was disabled regardless of the frame size. This approach should save the need of fragmenting already reassembled packets to fit into the OPENTHREAD_CONFIG_IP6_MAX_DATAGRAM_LENGTH. Signed-off-by: Marek Porwisz <[email protected]>
This commit is contained in:
+16
-12
@@ -786,7 +786,7 @@ Error Ip6::HandleFragment(Message &aMessage, MessageOrigin aOrigin, MessageInfo
|
||||
|
||||
mReassemblyList.Dequeue(*message);
|
||||
|
||||
IgnoreError(HandleDatagram(*message, aOrigin, aMessageInfo.mLinkInfo));
|
||||
IgnoreError(HandleDatagram(*message, aOrigin, aMessageInfo.mLinkInfo, /* aIsReassembled */ true));
|
||||
}
|
||||
|
||||
exit:
|
||||
@@ -914,10 +914,8 @@ Error Ip6::HandleExtensionHeaders(Message & aMessage,
|
||||
break;
|
||||
|
||||
case kProtoFragment:
|
||||
#if !OPENTHREAD_CONFIG_IP6_FRAGMENTATION_ENABLE
|
||||
IgnoreError(ProcessReceiveCallback(aMessage, aOrigin, aMessageInfo, aNextHeader,
|
||||
/* aAllowReceiveFilter */ false, Message::kCopyToUse));
|
||||
#endif
|
||||
SuccessOrExit(error = HandleFragment(aMessage, aOrigin, aMessageInfo));
|
||||
break;
|
||||
|
||||
@@ -1026,7 +1024,7 @@ Error Ip6::ProcessReceiveCallback(Message & aMessage,
|
||||
|
||||
VerifyOrExit(mReceiveIp6DatagramCallback != nullptr, error = kErrorNoRoute);
|
||||
|
||||
// Do not forward reassembled IPv6 packets.
|
||||
// Do not forward IPv6 packets that exceed kMinimalMtu.
|
||||
VerifyOrExit(aMessage.GetLength() <= kMinimalMtu, error = kErrorDrop);
|
||||
|
||||
if (mIsReceiveIp6FilterEnabled && aAllowReceiveFilter)
|
||||
@@ -1147,7 +1145,7 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Error Ip6::HandleDatagram(Message &aMessage, MessageOrigin aOrigin, const void *aLinkMessageInfo)
|
||||
Error Ip6::HandleDatagram(Message &aMessage, MessageOrigin aOrigin, const void *aLinkMessageInfo, bool aIsReassembled)
|
||||
{
|
||||
Error error;
|
||||
MessageInfo messageInfo;
|
||||
@@ -1226,6 +1224,11 @@ start:
|
||||
}
|
||||
}
|
||||
|
||||
// never forward reassembled frames as they were already delivered as fragments
|
||||
if (aIsReassembled)
|
||||
{
|
||||
forwardHost = false;
|
||||
}
|
||||
aMessage.SetOffset(sizeof(header));
|
||||
|
||||
// process IPv6 Extension Headers
|
||||
@@ -1242,15 +1245,16 @@ start:
|
||||
Get<MeshForwarder>().LogMessage(MeshForwarder::kMessageReceive, aMessage);
|
||||
goto start;
|
||||
}
|
||||
|
||||
error = ProcessReceiveCallback(aMessage, aOrigin, messageInfo, nextHeader,
|
||||
/* aAllowReceiveFilter */ !forwardHost, Message::kCopyToUse);
|
||||
|
||||
if ((error == kErrorNone || error == kErrorNoRoute) && forwardHost)
|
||||
if (!aIsReassembled)
|
||||
{
|
||||
forwardHost = false;
|
||||
}
|
||||
error = ProcessReceiveCallback(aMessage, aOrigin, messageInfo, nextHeader,
|
||||
/* aAllowReceiveFilter */ !forwardHost, Message::kCopyToUse);
|
||||
|
||||
if ((error == kErrorNone || error == kErrorNoRoute) && forwardHost)
|
||||
{
|
||||
forwardHost = false;
|
||||
}
|
||||
}
|
||||
error = HandlePayload(header, aMessage, messageInfo, nextHeader,
|
||||
(forwardThread || forwardHost ? Message::kCopyToUse : Message::kTakeCustody));
|
||||
shouldFreeMessage = forwardThread || forwardHost;
|
||||
|
||||
@@ -227,7 +227,10 @@ public:
|
||||
* @retval kErrorParse Encountered a malformed header when processing the message.
|
||||
*
|
||||
*/
|
||||
Error HandleDatagram(Message &aMessage, MessageOrigin aOrigin, const void *aLinkMessageInfo = nullptr);
|
||||
Error HandleDatagram(Message & aMessage,
|
||||
MessageOrigin aOrigin,
|
||||
const void * aLinkMessageInfo = nullptr,
|
||||
bool aIsReassembled = false);
|
||||
|
||||
/**
|
||||
* This method registers a callback to provide received raw IPv6 datagrams.
|
||||
|
||||
Reference in New Issue
Block a user