diff --git a/src/core/net/icmp6.cpp b/src/core/net/icmp6.cpp index 3dba7ca96..b47e21e87 100644 --- a/src/core/net/icmp6.cpp +++ b/src/core/net/icmp6.cpp @@ -153,7 +153,7 @@ exit: return error; } -bool Icmp::ShouldHandleEchoRequest(const MessageInfo &aMessageInfo) +bool Icmp::ShouldHandleEchoRequest(const Address &aAddress) { bool rval = false; @@ -163,16 +163,16 @@ bool Icmp::ShouldHandleEchoRequest(const MessageInfo &aMessageInfo) rval = false; break; case OT_ICMP6_ECHO_HANDLER_UNICAST_ONLY: - rval = !aMessageInfo.GetSockAddr().IsMulticast(); + rval = !aAddress.IsMulticast(); break; case OT_ICMP6_ECHO_HANDLER_MULTICAST_ONLY: - rval = aMessageInfo.GetSockAddr().IsMulticast(); + rval = aAddress.IsMulticast(); break; case OT_ICMP6_ECHO_HANDLER_ALL: rval = true; break; case OT_ICMP6_ECHO_HANDLER_RLOC_ALOC_ONLY: - rval = aMessageInfo.GetSockAddr().GetIid().IsLocator(); + rval = aAddress.GetIid().IsLocator(); break; } @@ -187,7 +187,7 @@ Error Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMess MessageInfo replyMessageInfo; uint16_t dataOffset; - VerifyOrExit(ShouldHandleEchoRequest(aMessageInfo)); + VerifyOrExit(ShouldHandleEchoRequest(aMessageInfo.GetSockAddr())); LogInfo("Received Echo Request"); diff --git a/src/core/net/icmp6.hpp b/src/core/net/icmp6.hpp index ae5239a99..48dc6ccf9 100644 --- a/src/core/net/icmp6.hpp +++ b/src/core/net/icmp6.hpp @@ -331,11 +331,13 @@ public: /** * Indicates whether or not the ICMPv6 Echo Request should be handled. * + * @param[in] aAddress The ICMPv6 destination IPv6 address. + * * @retval TRUE if OpenThread should respond with an ICMPv6 Echo Reply. * @retval FALSE if OpenThread should not respond with an ICMPv6 Echo Reply. * */ - bool ShouldHandleEchoRequest(const MessageInfo &aMessageInfo); + bool ShouldHandleEchoRequest(const Address &aAddress); /** * Returns the ICMPv6 Echo sequence number. diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 2d3b1922b..4ac19ec76 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -526,7 +526,7 @@ exit: return error; } -Error Ip6::HandleOptions(Message &aMessage, Header &aHeader, bool &aReceive) +Error Ip6::HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceive) { Error error = kErrorNone; HopByHopHeader hbhHeader; @@ -824,8 +824,7 @@ exit: #endif // OPENTHREAD_CONFIG_IP6_FRAGMENTATION_ENABLE Error Ip6::HandleExtensionHeaders(OwnedPtr &aMessagePtr, - MessageInfo &aMessageInfo, - Header &aHeader, + const Header &aHeader, uint8_t &aNextHeader, bool &aReceive) { @@ -844,7 +843,7 @@ Error Ip6::HandleExtensionHeaders(OwnedPtr &aMessagePtr, break; case kProtoFragment: - IgnoreError(PassToHost(aMessagePtr, aMessageInfo, aNextHeader, + IgnoreError(PassToHost(aMessagePtr, aHeader, aNextHeader, /* aApplyFilter */ false, aReceive, Message::kCopyToUse)); SuccessOrExit(error = HandleFragment(*aMessagePtr)); break; @@ -889,18 +888,20 @@ Error Ip6::TakeOrCopyMessagePtr(OwnedPtr &aTargetPtr, return (aTargetPtr != nullptr) ? kErrorNone : kErrorNoBufs; } -Error Ip6::HandlePayload(Header &aIp6Header, - OwnedPtr &aMessagePtr, - MessageInfo &aMessageInfo, - uint8_t aIpProto, - Message::Ownership aMessageOwnership) +Error Ip6::Receive(Header &aIp6Header, + OwnedPtr &aMessagePtr, + uint8_t aIpProto, + Message::Ownership aMessageOwnership) { -#if !OPENTHREAD_CONFIG_TCP_ENABLE - OT_UNUSED_VARIABLE(aIp6Header); -#endif - Error error = kErrorNone; OwnedPtr messagePtr; + MessageInfo messageInfo; + + messageInfo.Clear(); + messageInfo.SetPeerAddr(aIp6Header.GetSource()); + messageInfo.SetSockAddr(aIp6Header.GetDestination()); + messageInfo.SetHopLimit(aIp6Header.GetHopLimit()); + messageInfo.SetEcn(aIp6Header.GetEcn()); switch (aIpProto) { @@ -921,15 +922,15 @@ Error Ip6::HandlePayload(Header &aIp6Header, { #if OPENTHREAD_CONFIG_TCP_ENABLE case kProtoTcp: - error = mTcp.HandleMessage(aIp6Header, *messagePtr, aMessageInfo); + error = mTcp.HandleMessage(aIp6Header, *messagePtr, messageInfo); break; #endif case kProtoUdp: - error = mUdp.HandleMessage(*messagePtr, aMessageInfo); + error = mUdp.HandleMessage(*messagePtr, messageInfo); break; case kProtoIcmp6: - error = mIcmp.HandleMessage(*messagePtr, aMessageInfo); + error = mIcmp.HandleMessage(*messagePtr, messageInfo); break; default: @@ -942,7 +943,7 @@ exit: } Error Ip6::PassToHost(OwnedPtr &aMessagePtr, - const MessageInfo &aMessageInfo, + const Header &aHeader, uint8_t aIpProto, bool aApplyFilter, bool aReceive, @@ -965,7 +966,7 @@ Error Ip6::PassToHost(OwnedPtr &aMessagePtr, // If the sender used mesh-local address as source, do not pass to // host unless this message is intended for this device itself. - if (Get().IsMeshLocalAddress(aMessageInfo.GetPeerAddr())) + if (Get().IsMeshLocalAddress(aHeader.GetSource())) { VerifyOrExit(aReceive, error = kErrorDrop); } @@ -975,7 +976,7 @@ Error Ip6::PassToHost(OwnedPtr &aMessagePtr, switch (aIpProto) { case kProtoIcmp6: - if (mIcmp.ShouldHandleEchoRequest(aMessageInfo)) + if (mIcmp.ShouldHandleEchoRequest(aHeader.GetDestination())) { Icmp::Header icmp; @@ -1045,9 +1046,8 @@ Error Ip6::PassToHost(OwnedPtr &aMessagePtr, // For a multicast packet sent from link-local/mesh-local address to scope larger // than realm-local, set the hop limit to 1 before sending to host, so this packet // will not be forwarded by host. - if (aMessageInfo.GetSockAddr().IsMulticastLargerThanRealmLocal() && - (aMessageInfo.GetPeerAddr().IsLinkLocalUnicast() || - (Get().IsMeshLocalAddress(aMessageInfo.GetPeerAddr())))) + if (aHeader.GetDestination().IsMulticastLargerThanRealmLocal() && + (aHeader.GetSource().IsLinkLocalUnicast() || (Get().IsMeshLocalAddress(aHeader.GetSource())))) { messagePtr->Write(Header::kHopLimitFieldOffset, 1); } @@ -1099,13 +1099,12 @@ exit: Error Ip6::HandleDatagram(OwnedPtr aMessagePtr, bool aIsReassembled) { - Error error; - MessageInfo messageInfo; - Header header; - bool receive; - bool forwardThread; - bool forwardHost; - uint8_t nextHeader; + Error error; + Header header; + bool receive; + bool forwardThread; + bool forwardHost; + uint8_t nextHeader; receive = false; forwardThread = false; @@ -1113,12 +1112,6 @@ Error Ip6::HandleDatagram(OwnedPtr aMessagePtr, bool aIsReassembled) SuccessOrExit(error = header.ParseFrom(*aMessagePtr)); - messageInfo.Clear(); - messageInfo.SetPeerAddr(header.GetSource()); - messageInfo.SetSockAddr(header.GetDestination()); - messageInfo.SetHopLimit(header.GetHopLimit()); - messageInfo.SetEcn(header.GetEcn()); - // Determine `forwardThread`, `forwardHost` and `receive` // based on the destination address. @@ -1181,7 +1174,7 @@ Error Ip6::HandleDatagram(OwnedPtr aMessagePtr, bool aIsReassembled) // Process IPv6 Extension Headers nextHeader = static_cast(header.GetNextHeader()); - SuccessOrExit(error = HandleExtensionHeaders(aMessagePtr, messageInfo, header, nextHeader, receive)); + SuccessOrExit(error = HandleExtensionHeaders(aMessagePtr, header, nextHeader, receive)); if (receive && (nextHeader == kProtoIp6)) { @@ -1209,15 +1202,14 @@ Error Ip6::HandleDatagram(OwnedPtr aMessagePtr, bool aIsReassembled) if ((forwardHost || receive) && !aIsReassembled) { - error = PassToHost(aMessagePtr, messageInfo, nextHeader, + error = PassToHost(aMessagePtr, header, nextHeader, /* aApplyFilter */ !forwardHost, receive, (receive || forwardThread) ? Message::kCopyToUse : Message::kTakeCustody); } if (receive) { - error = HandlePayload(header, aMessagePtr, messageInfo, nextHeader, - forwardThread ? Message::kCopyToUse : Message::kTakeCustody); + error = Receive(header, aMessagePtr, nextHeader, forwardThread ? Message::kCopyToUse : Message::kTakeCustody); } if (forwardThread) diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index 03414ec32..c63c49f20 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -384,14 +384,13 @@ private: void EnqueueDatagram(Message &aMessage); void HandleSendQueue(void); Error PassToHost(OwnedPtr &aMessagePtr, - const MessageInfo &aMessageInfo, + const Header &aHeader, uint8_t aIpProto, bool aApplyFilter, bool aReceive, Message::Ownership aMessageOwnership); Error HandleExtensionHeaders(OwnedPtr &aMessagePtr, - MessageInfo &aMessageInfo, - Header &aHeader, + const Header &aHeader, uint8_t &aNextHeader, bool &aReceive); Error FragmentDatagram(Message &aMessage, uint8_t aIpProto); @@ -407,12 +406,11 @@ private: Error PrepareMulticastToLargerThanRealmLocal(Message &aMessage, const Header &aHeader); Error InsertMplOption(Message &aMessage, Header &aHeader); Error RemoveMplOption(Message &aMessage); - Error HandleOptions(Message &aMessage, Header &aHeader, bool &aReceive); - Error HandlePayload(Header &aIp6Header, - OwnedPtr &aMessagePtr, - MessageInfo &aMessageInfo, - uint8_t aIpProto, - Message::Ownership aMessageOwnership); + Error HandleOptions(Message &aMessage, const Header &aHeader, bool &aReceive); + Error Receive(Header &aIp6Header, + OwnedPtr &aMessagePtr, + uint8_t aIpProto, + Message::Ownership aMessageOwnership); bool IsOnLink(const Address &aAddress) const; Error RouteLookup(const Address &aSource, const Address &aDestination) const; #if OPENTHREAD_CONFIG_IP6_BR_COUNTERS_ENABLE