[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:
Marek Porwisz
2022-10-07 17:50:39 -07:00
committed by GitHub
parent 2b726ef29f
commit b0266bc00e
2 changed files with 20 additions and 13 deletions
+16 -12
View File
@@ -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;
+4 -1
View File
@@ -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.