mirror of
https://github.com/espressif/openthread.git
synced 2026-08-03 09:27:47 +00:00
[tmf] add overloads of SendMessage accepting OwnedPtr<Message> (#12217)
This change introduces new overloads for `Coap::SendMessage()` that accept an `OwnedPtr<Message>`, transferring ownership of the message to the CoAP layer upon being called. The modules `BorderAgent` and `Commissioner` are updated to use this new method. The use of `OwnedPtr<Message>` simplifies the message allocation and cleanup. This removes the need for manual clean up calls(e.g., `FreeMessageOnError()`) and makes the code safer.
This commit is contained in:
@@ -372,11 +372,40 @@ Error CoapBase::SendMessage(Message &aMessage,
|
||||
#endif
|
||||
}
|
||||
|
||||
Error CoapBase::SendMessage(OwnedPtr<Message> aMessage,
|
||||
const Ip6::MessageInfo &aMessageInfo,
|
||||
ResponseHandler aHandler,
|
||||
void *aContext)
|
||||
{
|
||||
Error error;
|
||||
|
||||
OT_ASSERT(aMessage != nullptr);
|
||||
|
||||
SuccessOrExit(error = SendMessage(*aMessage, aMessageInfo, aHandler, aContext));
|
||||
aMessage.Release();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Error CoapBase::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
return SendMessage(aMessage, aMessageInfo, nullptr, nullptr);
|
||||
}
|
||||
|
||||
Error CoapBase::SendMessage(OwnedPtr<Message> aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
Error error;
|
||||
|
||||
OT_ASSERT(aMessage != nullptr);
|
||||
|
||||
SuccessOrExit(error = SendMessage(*aMessage, aMessageInfo));
|
||||
aMessage.Release();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Error CoapBase::SendReset(Message &aRequest, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
return SendEmptyMessage(kTypeReset, aRequest, aMessageInfo);
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "common/locator.hpp"
|
||||
#include "common/message.hpp"
|
||||
#include "common/non_copyable.hpp"
|
||||
#include "common/owned_ptr.hpp"
|
||||
#include "common/timer.hpp"
|
||||
#include "net/ip6.hpp"
|
||||
#include "net/netif.hpp"
|
||||
@@ -596,6 +597,7 @@ public:
|
||||
* @retval kErrorNoBufs Insufficient buffers available to send the CoAP message.
|
||||
*/
|
||||
Error SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const TxParameters &aTxParameters);
|
||||
|
||||
/**
|
||||
* Sends a CoAP message with default transmission parameters.
|
||||
*
|
||||
@@ -614,6 +616,27 @@ public:
|
||||
ResponseHandler aHandler,
|
||||
void *aContext);
|
||||
|
||||
/**
|
||||
* Sends a CoAP message with default transmission parameters.
|
||||
*
|
||||
* If Message ID was not set in the header (equal to 0), this method will assign unique Message ID to the message.
|
||||
*
|
||||
* This flavor of `SendMessage()` accepts an `OwnedPtr<Message>` and therefore takes ownership of the passed-in
|
||||
* message.
|
||||
*
|
||||
* @param[in] aMessage An `OwnedPtr` to the message to send.
|
||||
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
|
||||
* @param[in] aHandler A function pointer that shall be called on response reception or time-out.
|
||||
* @param[in] aContext A pointer to arbitrary context information.
|
||||
*
|
||||
* @retval kErrorNone Successfully sent CoAP message.
|
||||
* @retval kErrorNoBufs Insufficient buffers available to send the CoAP response.
|
||||
*/
|
||||
Error SendMessage(OwnedPtr<Message> aMessage,
|
||||
const Ip6::MessageInfo &aMessageInfo,
|
||||
ResponseHandler aHandler,
|
||||
void *aContext);
|
||||
|
||||
/**
|
||||
* Sends a CoAP message with default transmission parameters.
|
||||
*
|
||||
@@ -627,6 +650,22 @@ public:
|
||||
*/
|
||||
Error SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
/**
|
||||
* Sends a CoAP message with default transmission parameters.
|
||||
*
|
||||
* If Message ID was not set in the header (equal to 0), this method will assign unique Message ID to the message.
|
||||
*
|
||||
* This flavor of `SendMessage()` accepts an `OwnedPtr<Message>` and therefore takes ownership of the passed-in
|
||||
* message.
|
||||
*
|
||||
* @param[in] aMessage An `OwnedPtr` to the message to send.
|
||||
* @param[in] aMessageInfo A reference to the message info associated with @p aMessage.
|
||||
*
|
||||
* @retval kErrorNone Successfully sent CoAP message.
|
||||
* @retval kErrorNoBufs Insufficient buffers available to send the CoAP response.
|
||||
*/
|
||||
Error SendMessage(OwnedPtr<Message> aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
/**
|
||||
* Sends a CoAP reset message.
|
||||
*
|
||||
|
||||
@@ -497,8 +497,7 @@ Error Manager::EvictActiveCommissioner(void)
|
||||
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
|
||||
messageInfo.SetSockPortToTmf();
|
||||
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo));
|
||||
message.Release();
|
||||
error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo);
|
||||
|
||||
exit:
|
||||
return error;
|
||||
@@ -695,10 +694,8 @@ Error Manager::CoapDtlsSession::ForwardToLeader(const Coap::Message &aMessage
|
||||
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
|
||||
messageInfo.SetSockPortToTmf();
|
||||
|
||||
// On success the message ownership is transferred.
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo, HandleLeaderResponseToFwdTmf,
|
||||
forwardContext.Get()));
|
||||
message.Release();
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo,
|
||||
HandleLeaderResponseToFwdTmf, forwardContext.Get()));
|
||||
|
||||
// Release the ownership of `forwardContext` since `SendMessage()`
|
||||
// will own it. We take back ownership when the callback
|
||||
@@ -982,9 +979,7 @@ void Manager::CoapDtlsSession::HandleTmfRelayTx(Coap::Message &aMessage)
|
||||
messageInfo.SetSockAddrToRlocPeerAddrTo(joinerRouterRloc);
|
||||
messageInfo.SetSockPortToTmf();
|
||||
|
||||
// On success the message ownership is transferred.
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo));
|
||||
message.Release();
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo));
|
||||
|
||||
LogInfo("Forward %s to joiner router 0x%04x", UriToString<kUriRelayTx>(), joinerRouterRloc);
|
||||
|
||||
|
||||
@@ -603,12 +603,12 @@ void Commissioner::HandleJoinerExpirationTimer(void)
|
||||
|
||||
Error Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, uint8_t aLength)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Coap::Message *message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Tlv tlv;
|
||||
Error error = kErrorNone;
|
||||
OwnedPtr<Coap::Message> message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Tlv tlv;
|
||||
|
||||
message = Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriCommissionerGet);
|
||||
message.Reset(Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriCommissionerGet));
|
||||
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
|
||||
|
||||
if (aLength > 0)
|
||||
@@ -620,13 +620,12 @@ Error Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, uint8_t
|
||||
}
|
||||
|
||||
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo,
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo,
|
||||
Commissioner::HandleMgmtCommissionerGetResponse, this));
|
||||
|
||||
LogInfo("Sent %s to leader", UriToString<kUriCommissionerGet>());
|
||||
|
||||
exit:
|
||||
FreeMessageOnError(message, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -643,11 +642,11 @@ Error Commissioner::SendMgmtCommissionerSetRequest(const CommissioningDataset &a
|
||||
const uint8_t *aTlvs,
|
||||
uint8_t aLength)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Coap::Message *message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Error error = kErrorNone;
|
||||
OwnedPtr<Coap::Message> message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
|
||||
message = Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriCommissionerSet);
|
||||
message.Reset(Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriCommissionerSet));
|
||||
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
|
||||
|
||||
if (aDataset.IsLocatorSet())
|
||||
@@ -678,13 +677,12 @@ Error Commissioner::SendMgmtCommissionerSetRequest(const CommissioningDataset &a
|
||||
}
|
||||
|
||||
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo,
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo,
|
||||
Commissioner::HandleMgmtCommissionerSetResponse, this));
|
||||
|
||||
LogInfo("Sent %s to leader", UriToString<kUriCommissionerSet>());
|
||||
|
||||
exit:
|
||||
FreeMessageOnError(message, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -706,25 +704,24 @@ exit:
|
||||
|
||||
Error Commissioner::SendPetition(void)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Coap::Message *message = nullptr;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Error error = kErrorNone;
|
||||
OwnedPtr<Coap::Message> message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
|
||||
mTransmitAttempts++;
|
||||
|
||||
message = Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriLeaderPetition);
|
||||
message.Reset(Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriLeaderPetition));
|
||||
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
|
||||
|
||||
SuccessOrExit(error = Tlv::Append<CommissionerIdTlv>(*message, mCommissionerId));
|
||||
|
||||
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
|
||||
SuccessOrExit(
|
||||
error = Get<Tmf::Agent>().SendMessage(*message, messageInfo, Commissioner::HandleLeaderPetitionResponse, this));
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo,
|
||||
Commissioner::HandleLeaderPetitionResponse, this));
|
||||
|
||||
LogInfo("Sent %s", UriToString<kUriLeaderPetition>());
|
||||
|
||||
exit:
|
||||
FreeMessageOnError(message, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -779,11 +776,11 @@ void Commissioner::SendKeepAlive(void) { SendKeepAlive(mSessionId); }
|
||||
|
||||
void Commissioner::SendKeepAlive(uint16_t aSessionId)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Coap::Message *message = nullptr;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Error error = kErrorNone;
|
||||
OwnedPtr<Coap::Message> message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
|
||||
message = Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriLeaderKeepAlive);
|
||||
message.Reset(Get<Tmf::Agent>().NewPriorityConfirmablePostMessage(kUriLeaderKeepAlive));
|
||||
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
|
||||
|
||||
SuccessOrExit(
|
||||
@@ -792,13 +789,12 @@ void Commissioner::SendKeepAlive(uint16_t aSessionId)
|
||||
SuccessOrExit(error = Tlv::Append<CommissionerSessionIdTlv>(*message, aSessionId));
|
||||
|
||||
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo,
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo,
|
||||
Commissioner::HandleLeaderKeepAliveResponse, this));
|
||||
|
||||
LogInfo("Sent %s", UriToString<kUriLeaderKeepAlive>());
|
||||
|
||||
exit:
|
||||
FreeMessageOnError(message, error);
|
||||
LogWarnOnError(error, "send keep alive");
|
||||
}
|
||||
|
||||
@@ -996,15 +992,15 @@ Error Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo
|
||||
{
|
||||
OT_UNUSED_VARIABLE(aMessageInfo);
|
||||
|
||||
Error error = kErrorNone;
|
||||
ExtendedTlv tlv;
|
||||
Coap::Message *message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Kek kek;
|
||||
Error error = kErrorNone;
|
||||
ExtendedTlv tlv;
|
||||
OwnedPtr<Coap::Message> message;
|
||||
Tmf::MessageInfo messageInfo(GetInstance());
|
||||
Kek kek;
|
||||
|
||||
Get<KeyManager>().ExtractKek(kek);
|
||||
|
||||
message = Get<Tmf::Agent>().NewPriorityNonConfirmablePostMessage(kUriRelayTx);
|
||||
message.Reset(Get<Tmf::Agent>().NewPriorityNonConfirmablePostMessage(kUriRelayTx));
|
||||
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
|
||||
|
||||
SuccessOrExit(error = Tlv::Append<JoinerUdpPortTlv>(*message, mJoinerPort));
|
||||
@@ -1023,12 +1019,11 @@ Error Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo
|
||||
|
||||
messageInfo.SetSockAddrToRlocPeerAddrTo(mJoinerRloc);
|
||||
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo));
|
||||
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(message.PassOwnership(), messageInfo));
|
||||
|
||||
aMessage.Free();
|
||||
|
||||
exit:
|
||||
FreeMessageOnError(message, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user