mirror of
https://github.com/espressif/openthread.git
synced 2026-08-20 01:19:51 +00:00
[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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user