[message] add clone methods to MessageAllocator (#12704)

This commit adds `CloneMessage()`, `CloneMessageWithoutFooter()`,
and `CloneMessageWithout<Footer>()` methods to the `MessageAllocator`
class. These methods simplify creating copies of messages by
automatically applying the correct `kReservedHeader` size. It also
updates existing code in `CoapBase`, `Dns::Client`, `Sntp::Client`,
and `Mle` to utilize these new methods.

Additionally, this commit updates the `Clone()` method in `Message`
to be a template method, accepting a `CloneMode` to specify whether
the cloned message should retain the reserved header or have no
reserved header. The documentation for the clone methods has also
been updated to clarify which message fields are copied during the
cloning process.
This commit is contained in:
Abtin Keshavarzian
2026-03-23 15:42:16 -05:00
committed by GitHub
parent bb06821cea
commit 78ddbf7845
16 changed files with 133 additions and 63 deletions
+3 -3
View File
@@ -335,7 +335,7 @@ void InfraIf::SendUdp(const Ip6::Address &aSrcAddress,
if (aDestAddress.IsMulticast())
{
Message *loopbackMessage = aPayload.Clone();
Message *loopbackMessage = aPayload.Clone<kNoReservedHeader>();
VerifyOrQuit(loopbackMessage != nullptr);
Receive(GetNode(), *loopbackMessage);
@@ -396,7 +396,7 @@ void InfraIf::Receive(Node &aSrcNode, Message &aMessage)
if (headers.GetDestinationAddress().IsMulticast() || node.mInfraIf.HasAddress(headers.GetDestinationAddress()))
{
Mdns::AddressInfo senderAddress;
Message *payload = aMessage.Clone();
Message *payload = aMessage.Clone<kNoReservedHeader>();
VerifyOrQuit(payload != nullptr);
payload->RemoveHeader(sizeof(Ip6::Header) + sizeof(Ip6::Udp::Header));
@@ -432,7 +432,7 @@ void InfraIf::Receive(Node &aSrcNode, Message &aMessage)
VerifyOrExit(updatedHeader.GetHopLimit() > 1);
updatedHeader.SetHopLimit(updatedHeader.GetHopLimit() - 1);
messagePtr.Reset(aMessage.Clone());
messagePtr.Reset(aMessage.Clone<kNoReservedHeader>());
VerifyOrQuit(messagePtr != nullptr);
messagePtr->Write(0, updatedHeader);
+1 -1
View File
@@ -140,7 +140,7 @@ void Mdns::Receive(Instance &aInstance, Message &aMessage, bool aIsUnicast, cons
VerifyOrExit(aSenderAddress.mPort == kUdpPort);
}
message = aMessage.Clone();
message = aMessage.Clone<kNoReservedHeader>();
VerifyOrQuit(message != nullptr);
otPlatMdnsHandleReceive(&aInstance, message, aIsUnicast, &aSenderAddress);
+2 -2
View File
@@ -361,14 +361,14 @@ bool HandleResource(void *aContext, Uri aUri, Coap::Msg &aMsg)
SuccessOrQuit(Tlv::Find<MeshCoP::JoinerIidTlv>(aMsg.mMessage, joinerIid));
Log(" Received `RelayRx` from joiner - port:%u iid:%s", joinerPort, joinerIid.ToString().AsCString());
msgClone = aMsg.mMessage.Clone();
msgClone = aMsg.mMessage.Clone<kNoReservedHeader>();
VerifyOrQuit(msgClone != nullptr);
recvContext->mRelayRxMsgs.Enqueue(*msgClone);
break;
case kUriProxyRx:
Log(" Received `ProxyRx`");
msgClone = aMsg.mMessage.Clone();
msgClone = aMsg.mMessage.Clone<kNoReservedHeader>();
VerifyOrQuit(msgClone != nullptr);
recvContext->mProxyRxMsgs.Enqueue(*msgClone);
break;
+2 -2
View File
@@ -333,7 +333,7 @@ void TestDtlsSingleSession(void)
{
OwnedPtr<Message> msg(PrepareMessage(node0));
SuccessOrQuit(dtls0.Send(*msg->Clone()));
SuccessOrQuit(dtls0.Send(*msg->Clone<kNoReservedHeader>()));
nexus.AdvanceTime(100);
VerifyOrQuit(sDtlsLastReceive[node1.GetId()].GetLength() == msg->GetLength());
@@ -347,7 +347,7 @@ void TestDtlsSingleSession(void)
{
OwnedPtr<Message> msg(PrepareMessage(node1));
SuccessOrQuit(dtls1.Send(*msg->Clone()));
SuccessOrQuit(dtls1.Send(*msg->Clone<kNoReservedHeader>()));
nexus.AdvanceTime(100);
VerifyOrQuit(sDtlsLastReceive[node0.GetId()].GetLength() == msg->GetLength());
+1 -1
View File
@@ -218,7 +218,7 @@ void TestInPlaceAesCcmProcessing(void)
SuccessOrQuit(message->Append<uint8_t>(i & 0xff));
}
messageClone = message->Clone();
messageClone = message->Clone<kNoReservedHeader>();
VerifyOrQuit(messageClone != nullptr);
VerifyOrQuit(messageClone->GetLength() == msgLength);
+4 -4
View File
@@ -379,7 +379,7 @@ public:
message->SetOrigin(Message::kOriginHostUntrusted);
// Test 1: Default cloning
clone = message->Clone();
clone = message->Clone<kSameReservedHeader>();
VerifyOrQuit(clone != nullptr);
VerifyOrQuit(clone->GetLength() == message->GetLength());
@@ -397,7 +397,7 @@ public:
clone->Free();
// Test 2: Cloning with shorter length
clone = message->Clone(kLength / 2);
clone = message->Clone<kSameReservedHeader>(kLength / 2);
VerifyOrQuit(clone != nullptr);
VerifyOrQuit(clone->GetLength() == kLength / 2);
@@ -411,12 +411,12 @@ public:
// Test 3: Cloning with shorter length, offset change
message->SetOffset(80);
clone = message->Clone(kLength / 2);
clone = message->Clone<kNoReservedHeader>(kLength / 2);
VerifyOrQuit(clone != nullptr);
VerifyOrQuit(clone->GetLength() == kLength / 2);
VerifyOrQuit(clone->GetPriority() == message->GetPriority());
VerifyOrQuit(clone->GetReserved() == message->GetReserved());
VerifyOrQuit(clone->GetReserved() == 0);
VerifyOrQuit(clone->GetOffset() == 50); // Offset should be updated
VerifyOrQuit(clone->CompareBytes(0, buffer, kLength / 2));