[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:
Abtin Keshavarzian
2023-01-25 21:33:29 -08:00
committed by GitHub
parent 8b1d0a9d5a
commit abbf38570d
6 changed files with 23 additions and 57 deletions
+3 -2
View File
@@ -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;
+9 -22
View File
@@ -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();
+1 -4
View File
@@ -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);
+2 -6
View File
@@ -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);
+3 -17
View File
@@ -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)
+5 -6
View File
@@ -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());