mirror of
https://github.com/espressif/openthread.git
synced 2026-08-04 01:47:47 +00:00
[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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -272,8 +272,7 @@ template <> void BorderAgent::HandleTmf<kUriProxyTx>(Coap::Message &aMessage, co
|
||||
VerifyOrExit(udpEncapHeader.GetSourcePort() > 0 && udpEncapHeader.GetDestinationPort() > 0, error = kErrorDrop);
|
||||
|
||||
VerifyOrExit((message = Get<Ip6::Udp>().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<Ip6AddressTlv>(*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<Tmf::SecureAgent>().SendMessage(aForwardMessage, Get<Tmf::SecureAgent>().GetMessageInfo()));
|
||||
|
||||
@@ -443,7 +434,6 @@ template <> void BorderAgent::HandleTmf<kUriRelayTx>(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<kUriRelayTx>(Coap::Message &aMessage, co
|
||||
message = Get<Tmf::Agent>().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<Tmf::Agent>().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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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<kUriRelayTx>(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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user