From abbf38570d613160863e0311bcc38afd7bb9a58a Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 25 Jan 2023 21:33:29 -0800 Subject: [PATCH] [core] use `AppendBytesFromMessage()` to copy bytes between messages (#8686) This commit updates multiple core modules to use the `Message` helper method `AppendBytesFromMessage()` to append bytes read from one message at a given offset and length to the end of another message. --- src/core/common/message.cpp | 5 +++-- src/core/meshcop/border_agent.cpp | 31 +++++++++--------------------- src/core/meshcop/commissioner.cpp | 5 +---- src/core/meshcop/joiner_router.cpp | 8 ++------ src/core/net/dns_client.cpp | 20 +++---------------- src/core/net/icmp6.cpp | 11 +++++------ 6 files changed, 23 insertions(+), 57 deletions(-) diff --git a/src/core/common/message.cpp b/src/core/common/message.cpp index 872242da1..5986a73d0 100644 --- a/src/core/common/message.cpp +++ b/src/core/common/message.cpp @@ -40,6 +40,7 @@ #include "common/instance.hpp" #include "common/locator_getters.hpp" #include "common/log.hpp" +#include "common/num_utils.hpp" #include "common/numeric_limits.hpp" #include "net/checksum.hpp" #include "net/ip6.hpp" @@ -678,10 +679,10 @@ Message *Message::Clone(uint16_t aLength) const Settings settings(IsLinkSecurityEnabled() ? kWithLinkSecurity : kNoLinkSecurity, GetPriority()); uint16_t offset; + aLength = Min(GetLength(), aLength); messageCopy = GetMessagePool()->Allocate(GetType(), GetReserved(), settings); VerifyOrExit(messageCopy != nullptr, error = kErrorNoBufs); - SuccessOrExit(error = messageCopy->SetLength(aLength)); - CopyTo(0, 0, aLength, *messageCopy); + SuccessOrExit(error = messageCopy->AppendBytesFromMessage(*this, 0, aLength)); // Copy selected message information. offset = GetOffset() < aLength ? GetOffset() : aLength; diff --git a/src/core/meshcop/border_agent.cpp b/src/core/meshcop/border_agent.cpp index f34e45b93..dc066484a 100644 --- a/src/core/meshcop/border_agent.cpp +++ b/src/core/meshcop/border_agent.cpp @@ -272,8 +272,7 @@ template <> void BorderAgent::HandleTmf(Coap::Message &aMessage, co VerifyOrExit(udpEncapHeader.GetSourcePort() > 0 && udpEncapHeader.GetDestinationPort() > 0, error = kErrorDrop); VerifyOrExit((message = Get().NewMessage(0)) != nullptr, error = kErrorNoBufs); - SuccessOrExit(error = message->SetLength(length)); - aMessage.CopyTo(/* aSroOffset */ offset, /* aDestOffset */ 0, length, /* aDestMsg */ *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, offset, length)); messageInfo.SetSockPort(udpEncapHeader.GetSourcePort()); messageInfo.SetSockAddr(mCommissionerAloc.GetAddress()); @@ -312,7 +311,6 @@ bool BorderAgent::HandleUdpReceive(const Message &aMessage, const Ip6::MessageIn { ExtendedTlv extTlv; UdpEncapsulationTlvHeader udpEncapHeader; - uint16_t offset; uint16_t udpLength = aMessage.GetLength() - aMessage.GetOffset(); extTlv.SetType(Tlv::kUdpEncapsulation); @@ -322,11 +320,7 @@ bool BorderAgent::HandleUdpReceive(const Message &aMessage, const Ip6::MessageIn udpEncapHeader.SetSourcePort(aMessageInfo.GetPeerPort()); udpEncapHeader.SetDestinationPort(aMessageInfo.GetSockPort()); SuccessOrExit(error = message->Append(udpEncapHeader)); - - offset = message->GetLength(); - SuccessOrExit(error = message->SetLength(offset + udpLength)); - aMessage.CopyTo(/* aSrcOffset */ aMessage.GetOffset(), /* aDestOffset */ offset, udpLength, - /* aDestMsg */ *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, aMessage.GetOffset(), udpLength)); } SuccessOrExit(error = Tlv::Append(*message, aMessageInfo.GetPeerAddr())); @@ -368,13 +362,10 @@ exit: Error BorderAgent::ForwardToCommissioner(Coap::Message &aForwardMessage, const Message &aMessage) { - Error error = kErrorNone; - uint16_t offset = 0; - - offset = aForwardMessage.GetLength(); - SuccessOrExit(error = aForwardMessage.SetLength(offset + aMessage.GetLength() - aMessage.GetOffset())); - aMessage.CopyTo(aMessage.GetOffset(), offset, aMessage.GetLength() - aMessage.GetOffset(), aForwardMessage); + Error error; + SuccessOrExit(error = aForwardMessage.AppendBytesFromMessage(aMessage, aMessage.GetOffset(), + aMessage.GetLength() - aMessage.GetOffset())); SuccessOrExit(error = Get().SendMessage(aForwardMessage, Get().GetMessageInfo())); @@ -443,7 +434,6 @@ template <> void BorderAgent::HandleTmf(Coap::Message &aMessage, co uint16_t joinerRouterRloc; Coap::Message *message = nullptr; Tmf::MessageInfo messageInfo(GetInstance()); - uint16_t offset = 0; VerifyOrExit(mState != kStateStopped); @@ -454,9 +444,8 @@ template <> void BorderAgent::HandleTmf(Coap::Message &aMessage, co message = Get().NewPriorityNonConfirmablePostMessage(kUriRelayTx); VerifyOrExit(message != nullptr, error = kErrorNoBufs); - offset = message->GetLength(); - SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength() - aMessage.GetOffset())); - aMessage.CopyTo(aMessage.GetOffset(), offset, aMessage.GetLength() - aMessage.GetOffset(), *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, aMessage.GetOffset(), + aMessage.GetLength() - aMessage.GetOffset())); messageInfo.SetSockAddrToRlocPeerAddrTo(joinerRouterRloc); messageInfo.SetSockPortToTmf(); @@ -476,7 +465,6 @@ Error BorderAgent::ForwardToLeader(const Coap::Message &aMessage, const Ip6::Mes ForwardContext *forwardContext = nullptr; Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message *message = nullptr; - uint16_t offset = 0; bool petition = false; bool separate = false; @@ -508,9 +496,8 @@ Error BorderAgent::ForwardToLeader(const Coap::Message &aMessage, const Ip6::Mes message = Get().NewPriorityConfirmablePostMessage(aUri); VerifyOrExit(message != nullptr, error = kErrorNoBufs); - offset = message->GetLength(); - SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength() - aMessage.GetOffset())); - aMessage.CopyTo(aMessage.GetOffset(), offset, aMessage.GetLength() - aMessage.GetOffset(), *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, aMessage.GetOffset(), + aMessage.GetLength() - aMessage.GetOffset())); SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); messageInfo.SetSockPortToTmf(); diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 0bec1213d..9c3ecb8ec 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -1116,7 +1116,6 @@ Error Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo Error error = kErrorNone; ExtendedTlv tlv; Coap::Message *message; - uint16_t offset; Tmf::MessageInfo messageInfo(GetInstance()); Kek kek; @@ -1137,9 +1136,7 @@ Error Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo tlv.SetType(Tlv::kJoinerDtlsEncapsulation); tlv.SetLength(aMessage.GetLength()); SuccessOrExit(error = message->Append(tlv)); - offset = message->GetLength(); - SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength())); - aMessage.CopyTo(0, offset, aMessage.GetLength(), *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, 0, aMessage.GetLength())); messageInfo.SetSockAddrToRlocPeerAddrTo(mJoinerRloc); diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index c42ce66e0..04741e0ff 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -134,7 +134,6 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a Tmf::MessageInfo messageInfo(GetInstance()); ExtendedTlv tlv; uint16_t borderAgentRloc; - uint16_t offset; LogInfo("JoinerRouter::HandleUdpReceive"); @@ -150,9 +149,7 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a tlv.SetType(Tlv::kJoinerDtlsEncapsulation); tlv.SetLength(aMessage.GetLength() - aMessage.GetOffset()); SuccessOrExit(error = message->Append(tlv)); - offset = message->GetLength(); - SuccessOrExit(error = message->SetLength(offset + tlv.GetLength())); - aMessage.CopyTo(aMessage.GetOffset(), offset, tlv.GetLength(), *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, aMessage.GetOffset(), tlv.GetLength())); messageInfo.SetSockAddrToRlocPeerAddrTo(borderAgentRloc); @@ -189,8 +186,7 @@ template <> void JoinerRouter::HandleTmf(Coap::Message &aMessage, c VerifyOrExit((message = mSocket.NewMessage(0, settings)) != nullptr, error = kErrorNoBufs); - SuccessOrExit(error = message->SetLength(length)); - aMessage.CopyTo(offset, 0, length, *message); + SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, offset, length)); messageInfo.GetPeerAddr().SetToLinkLocalAddress(joinerIid); messageInfo.SetPeerPort(joinerPort); diff --git a/src/core/net/dns_client.cpp b/src/core/net/dns_client.cpp index 471a9cded..b2062a5fb 100644 --- a/src/core/net/dns_client.cpp +++ b/src/core/net/dns_client.cpp @@ -833,24 +833,10 @@ exit: Error Client::AppendNameFromQuery(const Query &aQuery, Message &aMessage) { - Error error = kErrorNone; - uint16_t offset; - uint16_t length; + // The name is encoded and included after the `Info` in `aQuery` + // starting at `kNameOffsetInQuery`. - // The name is encoded and included after the `Info` in `aQuery`. We - // first calculate the encoded length of the name, then grow the - // message, and finally copy the encoded name bytes from `aQuery` - // into `aMessage`. - - length = aQuery.GetLength() - kNameOffsetInQuery; - - offset = aMessage.GetLength(); - SuccessOrExit(error = aMessage.SetLength(offset + length)); - - aQuery.CopyTo(/* aSourceOffset */ kNameOffsetInQuery, /* aDestOffset */ offset, length, aMessage); - -exit: - return error; + return aMessage.AppendBytesFromMessage(aQuery, kNameOffsetInQuery, aQuery.GetLength() - kNameOffsetInQuery); } void Client::FinalizeQuery(Query &aQuery, Error aError) diff --git a/src/core/net/icmp6.cpp b/src/core/net/icmp6.cpp index 76b679393..5b5e648f3 100644 --- a/src/core/net/icmp6.cpp +++ b/src/core/net/icmp6.cpp @@ -182,7 +182,7 @@ Error Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMess Header icmp6Header; Message *replyMessage = nullptr; MessageInfo replyMessageInfo; - uint16_t payloadLength; + uint16_t dataOffset; // always handle Echo Request destined for RLOC or ALOC VerifyOrExit(ShouldHandleEchoRequest(aMessageInfo) || aMessageInfo.GetSockAddr().GetIid().IsLocator()); @@ -198,12 +198,11 @@ Error Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMess ExitNow(); } - payloadLength = aRequestMessage.GetLength() - aRequestMessage.GetOffset() - Header::kDataFieldOffset; - SuccessOrExit(error = replyMessage->SetLength(Header::kDataFieldOffset + payloadLength)); + dataOffset = aRequestMessage.GetOffset() + Header::kDataFieldOffset; - replyMessage->WriteBytes(0, &icmp6Header, Header::kDataFieldOffset); - aRequestMessage.CopyTo(aRequestMessage.GetOffset() + Header::kDataFieldOffset, Header::kDataFieldOffset, - payloadLength, *replyMessage); + SuccessOrExit(error = replyMessage->AppendBytes(&icmp6Header, Header::kDataFieldOffset)); + SuccessOrExit(error = replyMessage->AppendBytesFromMessage(aRequestMessage, dataOffset, + aRequestMessage.GetLength() - dataOffset)); replyMessageInfo.SetPeerAddr(aMessageInfo.GetPeerAddr());