[ip6] combine `PassToHost()` calls in `Ip6::HandleDatagram()` (#8908)
This commit simplifies `Ip6::HandleDatagram()` by combining the
two places where we call `PassToHost()` into one. It simplifies
how we perform the three actions `receive`, `forwardHost`, and
`forwardThread`.
diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp
index e94f2b8..b7e7699 100644
--- a/src/core/net/ip6.cpp
+++ b/src/core/net/ip6.cpp
@@ -1201,56 +1201,38 @@
}
}
- // Never forward reassembled frames as they were already delivered
- // as fragments.
- if (aIsReassembled)
- {
- forwardHost = false;
- }
-
aMessage.SetOffset(sizeof(header));
// Process IPv6 Extension Headers
nextHeader = static_cast<uint8_t>(header.GetNextHeader());
SuccessOrExit(error = HandleExtensionHeaders(aMessage, aOrigin, messageInfo, header, nextHeader, receive));
- // Process IPv6 Payload
- if (receive)
+ if (receive && (nextHeader == kProtoIp6))
{
- if (nextHeader == kProtoIp6)
- {
- // Remove encapsulating header and start over.
- aMessage.RemoveHeader(aMessage.GetOffset());
- Get<MeshForwarder>().LogMessage(MeshForwarder::kMessageReceive, aMessage);
- goto start;
- }
-
- if (!aIsReassembled)
- {
- error = PassToHost(aMessage, aOrigin, messageInfo, nextHeader,
- /* aApplyFilter */ !forwardHost, Message::kCopyToUse);
-
- if ((error == kErrorNone || error == kErrorNoRoute) && forwardHost)
- {
- forwardHost = false;
- }
- }
-
- error = HandlePayload(header, aMessage, messageInfo, nextHeader,
- (forwardThread || forwardHost ? Message::kCopyToUse : Message::kTakeCustody));
-
- // Need to free the message if we did not pass its
- // ownership in the call to `HandlePayload()`
- shouldFreeMessage = forwardThread || forwardHost;
+ // Remove encapsulating header and start over.
+ aMessage.RemoveHeader(aMessage.GetOffset());
+ Get<MeshForwarder>().LogMessage(MeshForwarder::kMessageReceive, aMessage);
+ goto start;
}
- if (forwardHost)
+ if ((forwardHost || receive) && !aIsReassembled)
{
- error = PassToHost(aMessage, aOrigin, messageInfo, nextHeader, /* aApplyFilter */ false,
- forwardThread ? Message::kCopyToUse : Message::kTakeCustody);
+ error = PassToHost(aMessage, aOrigin, messageInfo, nextHeader,
+ /* aApplyFilter */ !forwardHost,
+ (receive || forwardThread) ? Message::kCopyToUse : Message::kTakeCustody);
// Need to free the message if we did not pass its
// ownership in the call to `PassToHost()`
+ shouldFreeMessage = (receive || forwardThread);
+ }
+
+ if (receive)
+ {
+ error = HandlePayload(header, aMessage, messageInfo, nextHeader,
+ forwardThread ? Message::kCopyToUse : Message::kTakeCustody);
+
+ // Need to free the message if we did not pass its
+ // ownership in the call to `HandlePayload()`
shouldFreeMessage = forwardThread;
}