From ba5ebc729644cda12927efc367d99cc1546eeacc Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 14 Apr 2022 09:26:43 -0700 Subject: [PATCH] [tmf] add `Tmf::MessageInfo` (#7589) This commit adds `Tmf::MessageInfo` which is a sub-class of the `Ip6::MessageInfo` class intended for use when sending TMF messages. The peer port number is by default set to the TMF port from the constructor. This class also provides helper methods for commonly used patterns, e.g., source or `SockAddr` set to device's RLOC address and/or the destination or `PeerAddr` set to leader ALOC or RLOC, or a given address. --- src/core/meshcop/announce_begin_client.cpp | 6 +- src/core/meshcop/border_agent.cpp | 17 ++--- src/core/meshcop/commissioner.cpp | 31 +++------ src/core/meshcop/dataset_manager.cpp | 23 +++---- src/core/meshcop/energy_scan_client.cpp | 6 +- src/core/meshcop/joiner_router.cpp | 7 +- src/core/meshcop/meshcop_leader.cpp | 6 +- src/core/meshcop/panid_query_client.cpp | 6 +- src/core/thread/address_resolver.cpp | 22 ++---- src/core/thread/anycast_locator.cpp | 6 +- src/core/thread/dua_manager.cpp | 11 ++- src/core/thread/energy_scan_server.cpp | 7 +- src/core/thread/mle_router.cpp | 14 ++-- src/core/thread/mlr_manager.cpp | 5 +- src/core/thread/network_data.cpp | 6 +- src/core/thread/network_diagnostic.cpp | 15 ++-- src/core/thread/panid_query_server.cpp | 7 +- src/core/thread/tmf.cpp | 42 ++++++++++++ src/core/thread/tmf.hpp | 79 ++++++++++++++++++++++ 19 files changed, 189 insertions(+), 127 deletions(-) diff --git a/src/core/meshcop/announce_begin_client.cpp b/src/core/meshcop/announce_begin_client.cpp index 29b7cdbe8..b1bb69999 100644 --- a/src/core/meshcop/announce_begin_client.cpp +++ b/src/core/meshcop/announce_begin_client.cpp @@ -62,7 +62,7 @@ Error AnnounceBeginClient::SendRequest(uint32_t aChannelMask, { Error error = kErrorNone; MeshCoP::ChannelMaskTlv channelMask; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message = nullptr; VerifyOrExit(Get().IsActive(), error = kErrorInvalidState); @@ -81,9 +81,7 @@ Error AnnounceBeginClient::SendRequest(uint32_t aChannelMask, SuccessOrExit(error = Tlv::Append(*message, aCount)); SuccessOrExit(error = Tlv::Append(*message, aPeriod)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(aAddress); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(aAddress); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/meshcop/border_agent.cpp b/src/core/meshcop/border_agent.cpp index ac8596c92..8bde4b8ee 100644 --- a/src/core/meshcop/border_agent.cpp +++ b/src/core/meshcop/border_agent.cpp @@ -456,7 +456,7 @@ void BorderAgent::HandleRelayTransmit(const Coap::Message &aMessage) Error error = kErrorNone; uint16_t joinerRouterRloc; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); uint16_t offset = 0; VerifyOrExit(aMessage.IsNonConfirmablePostRequest()); @@ -472,11 +472,8 @@ void BorderAgent::HandleRelayTransmit(const Coap::Message &aMessage) SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength() - aMessage.GetOffset())); aMessage.CopyTo(aMessage.GetOffset(), offset, aMessage.GetLength() - aMessage.GetOffset(), *message); - messageInfo.SetSockPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetPeerAddr(Get().GetMeshLocal16()); - messageInfo.GetPeerAddr().GetIid().SetLocator(joinerRouterRloc); + messageInfo.SetSockAddrToRlocPeerAddrTo(joinerRouterRloc); + messageInfo.SetSockPortToTmf(); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); @@ -495,7 +492,7 @@ Error BorderAgent::ForwardToLeader(const Coap::Message & aMessage, { Error error = kErrorNone; ForwardContext * forwardContext = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message = nullptr; uint16_t offset = 0; @@ -523,10 +520,8 @@ Error BorderAgent::ForwardToLeader(const Coap::Message & aMessage, SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength() - aMessage.GetOffset())); aMessage.CopyTo(aMessage.GetOffset(), offset, aMessage.GetLength() - aMessage.GetOffset(), *message); - SuccessOrExit(error = Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetSockPort(Tmf::kUdpPort); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); + messageInfo.SetSockPortToTmf(); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, HandleCoapResponse, forwardContext)); diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 86db0fe24..500041bf0 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -686,7 +686,7 @@ Error Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, uint8_t { Error error = kErrorNone; Coap::Message * message; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); MeshCoP::Tlv tlv; VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -706,9 +706,7 @@ Error Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, uint8_t SuccessOrExit(error = message->AppendBytes(aTlvs, aLength)); } - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - SuccessOrExit(error = Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, Commissioner::HandleMgmtCommissionerGetResponse, this)); @@ -745,7 +743,7 @@ Error Commissioner::SendMgmtCommissionerSetRequest(const Dataset &aDataset, cons { Error error = kErrorNone; Coap::Message * message; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -779,9 +777,7 @@ Error Commissioner::SendMgmtCommissionerSetRequest(const Dataset &aDataset, cons SuccessOrExit(error = message->AppendBytes(aTlvs, aLength)); } - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - SuccessOrExit(error = Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, Commissioner::HandleMgmtCommissionerSetResponse, this)); @@ -818,7 +814,7 @@ Error Commissioner::SendPetition(void) { Error error = kErrorNone; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); CommissionerIdTlv commissionerId; mTransmitAttempts++; @@ -833,9 +829,7 @@ Error Commissioner::SendPetition(void) SuccessOrExit(error = commissionerId.AppendTo(*message)); - SuccessOrExit(error = Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit( error = Get().SendMessage(*message, messageInfo, Commissioner::HandleLeaderPetitionResponse, this)); @@ -916,7 +910,7 @@ void Commissioner::SendKeepAlive(uint16_t aSessionId) { Error error = kErrorNone; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -928,9 +922,7 @@ void Commissioner::SendKeepAlive(uint16_t aSessionId) SuccessOrExit(error = Tlv::Append(*message, aSessionId)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - SuccessOrExit(error = Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, Commissioner::HandleLeaderKeepAliveResponse, this)); @@ -1154,7 +1146,7 @@ Error Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo ExtendedTlv tlv; Coap::Message * message; uint16_t offset; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Kek kek; VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -1181,10 +1173,7 @@ Error Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo SuccessOrExit(error = message->SetLength(offset + aMessage.GetLength())); aMessage.CopyTo(0, offset, aMessage.GetLength(), *message); - messageInfo.SetPeerAddr(Get().GetMeshLocal16()); - messageInfo.GetPeerAddr().GetIid().SetLocator(mJoinerRloc); - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + messageInfo.SetSockAddrToRlocPeerAddrTo(mJoinerRloc); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 54536223a..b1e46eb99 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -255,7 +255,7 @@ void DatasetManager::SendSet(void) { Error error; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Dataset dataset; VerifyOrExit(!mMgmtPending, error = kErrorBusy); @@ -287,9 +287,7 @@ void DatasetManager::SendSet(void) IgnoreError(Read(dataset)); SuccessOrExit(error = message->AppendBytes(dataset.GetBytes(), dataset.GetSize())); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - IgnoreError(Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); + IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit( error = Get().SendMessage(*message, messageInfo, &DatasetManager::HandleMgmtSetResponse, this)); @@ -483,7 +481,7 @@ Error DatasetManager::SendSetRequest(const Dataset::Info & aDatasetInfo, { Error error = kErrorNone; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit(!mMgmtPending, error = kErrorBusy); @@ -526,9 +524,7 @@ Error DatasetManager::SendSetRequest(const Dataset::Info & aDatasetInfo, SuccessOrExit(error = message->AppendBytes(aTlvs, aLength)); } - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - IgnoreError(Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); + IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, HandleMgmtSetResponse, this)); mMgmtSetCallback = aCallback; @@ -549,7 +545,7 @@ Error DatasetManager::SendGetRequest(const Dataset::Components &aDatasetComponen { Error error = kErrorNone; Coap::Message * message; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Tlv tlv; uint8_t datasetTlvs[kMaxDatasetTlvs]; uint8_t length; @@ -643,17 +639,14 @@ Error DatasetManager::SendGetRequest(const Dataset::Components &aDatasetComponen } } + IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); + if (aAddress != nullptr) { + // Use leader ALOC if `aAddress` is `nullptr`. messageInfo.SetPeerAddr(AsCoreType(aAddress)); } - else - { - IgnoreError(Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - } - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("sent dataset get request"); diff --git a/src/core/meshcop/energy_scan_client.cpp b/src/core/meshcop/energy_scan_client.cpp index 9c178ba7d..09e8fbdd1 100644 --- a/src/core/meshcop/energy_scan_client.cpp +++ b/src/core/meshcop/energy_scan_client.cpp @@ -71,7 +71,7 @@ Error EnergyScanClient::SendQuery(uint32_t aChannelMas { Error error = kErrorNone; MeshCoP::ChannelMaskTlv channelMask; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message = nullptr; VerifyOrExit(Get().IsActive(), error = kErrorInvalidState); @@ -91,9 +91,7 @@ Error EnergyScanClient::SendQuery(uint32_t aChannelMas SuccessOrExit(error = Tlv::Append(*message, aPeriod)); SuccessOrExit(error = Tlv::Append(*message, aScanDuration)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(aAddress); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(aAddress); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("sent query"); diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index 26d2102bf..a298b7e42 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -133,7 +133,7 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a { Error error; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); ExtendedTlv tlv; uint16_t borderAgentRloc; uint16_t offset; @@ -158,10 +158,7 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a SuccessOrExit(error = message->SetLength(offset + tlv.GetLength())); aMessage.CopyTo(aMessage.GetOffset(), offset, tlv.GetLength(), *message); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(Get().GetMeshLocal16()); - messageInfo.GetPeerAddr().GetIid().SetLocator(borderAgentRloc); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(borderAgentRloc); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/meshcop/meshcop_leader.cpp b/src/core/meshcop/meshcop_leader.cpp index f1f6a9f92..efd0914fd 100644 --- a/src/core/meshcop/meshcop_leader.cpp +++ b/src/core/meshcop/meshcop_leader.cpp @@ -230,16 +230,14 @@ exit: void Leader::SendDatasetChanged(const Ip6::Address &aAddress) { Error error = kErrorNone; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message; VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); SuccessOrExit(error = message->InitAsConfirmablePost(UriPath::kDatasetChanged)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(aAddress); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(aAddress); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("sent dataset changed"); diff --git a/src/core/meshcop/panid_query_client.cpp b/src/core/meshcop/panid_query_client.cpp index 50b9a0322..7bacc80c0 100644 --- a/src/core/meshcop/panid_query_client.cpp +++ b/src/core/meshcop/panid_query_client.cpp @@ -68,7 +68,7 @@ Error PanIdQueryClient::SendQuery(uint16_t aPanId, { Error error = kErrorNone; MeshCoP::ChannelMaskTlv channelMask; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message = nullptr; VerifyOrExit(Get().IsActive(), error = kErrorInvalidState); @@ -86,9 +86,7 @@ Error PanIdQueryClient::SendQuery(uint16_t aPanId, SuccessOrExit(error = Tlv::Append(*message, aPanId)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(aAddress); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(aAddress); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("sent panid query"); diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index 14cbfe62f..190b2a463 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -558,7 +558,7 @@ Error AddressResolver::SendAddressQuery(const Ip6::Address &aEid) { Error error; Coap::Message * message; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -568,10 +568,7 @@ Error AddressResolver::SendAddressQuery(const Ip6::Address &aEid) SuccessOrExit(error = Tlv::Append(*message, aEid)); - messageInfo.GetPeerAddr().SetToRealmLocalAllRoutersMulticast(); - - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); @@ -676,7 +673,7 @@ void AddressResolver::SendAddressError(const Ip6::Address & aTarget, { Error error; Coap::Message * message; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewMessage()) != nullptr, error = kErrorNoBufs); @@ -689,16 +686,13 @@ void AddressResolver::SendAddressError(const Ip6::Address & aTarget, if (aDestination == nullptr) { - messageInfo.GetPeerAddr().SetToRealmLocalAllRoutersMulticast(); + messageInfo.SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(); } else { - messageInfo.SetPeerAddr(*aDestination); + messageInfo.SetSockAddrToRlocPeerAddrTo(*aDestination); } - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); - SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("Sending address error for target %s", aTarget.ToString().AsCString()); @@ -852,7 +846,7 @@ void AddressResolver::SendAddressQueryResponse(const Ip6::Address & a { Error error; Coap::Message * message; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -869,9 +863,7 @@ void AddressResolver::SendAddressQueryResponse(const Ip6::Address & a SuccessOrExit(error = Tlv::Append(*message, *aLastTransactionTime)); } - messageInfo.SetPeerAddr(aDestination); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(aDestination); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/thread/anycast_locator.cpp b/src/core/thread/anycast_locator.cpp index fc703d29a..703ef4a61 100644 --- a/src/core/thread/anycast_locator.cpp +++ b/src/core/thread/anycast_locator.cpp @@ -62,7 +62,7 @@ Error AnycastLocator::Locate(const Ip6::Address &aAnycastAddress, Callback aCall { Error error = kErrorNone; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((aCallback != nullptr) && Get().IsAnycastLocator(aAnycastAddress), error = kErrorInvalidArgs); @@ -78,9 +78,7 @@ Error AnycastLocator::Locate(const Ip6::Address &aAnycastAddress, Callback aCall IgnoreError(Get().AbortTransaction(HandleResponse, this)); } - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(aAnycastAddress); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(aAnycastAddress); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, HandleResponse, this)); diff --git a/src/core/thread/dua_manager.cpp b/src/core/thread/dua_manager.cpp index 57789bd67..819a22d6a 100644 --- a/src/core/thread/dua_manager.cpp +++ b/src/core/thread/dua_manager.cpp @@ -424,7 +424,7 @@ void DuaManager::PerformNextRegistration(void) Error error = kErrorNone; Mle::MleRouter & mle = Get(); Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Ip6::Address dua; VerifyOrExit(mle.IsAttached(), error = kErrorInvalidState); @@ -517,8 +517,7 @@ void DuaManager::PerformNextRegistration(void) Get().GetServer16()); } - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + messageInfo.SetSockAddrToRloc(); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, &DuaManager::HandleDuaResponse, this)); @@ -726,7 +725,7 @@ void DuaManager::SendAddressNotification(Ip6::Address & aAddress, const Child & aChild) { Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Error error; VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -737,9 +736,7 @@ void DuaManager::SendAddressNotification(Ip6::Address & aAddress, SuccessOrExit(error = Tlv::Append(*message, aStatus)); SuccessOrExit(error = Tlv::Append(*message, aAddress)); - messageInfo.GetPeerAddr().SetToRoutingLocator(Get().GetMeshLocalPrefix(), aChild.GetRloc16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + messageInfo.SetSockAddrToRlocPeerAddrTo(aChild.GetRloc16()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/thread/energy_scan_server.cpp b/src/core/thread/energy_scan_server.cpp index 4bd56de14..1a48ee1b4 100644 --- a/src/core/thread/energy_scan_server.cpp +++ b/src/core/thread/energy_scan_server.cpp @@ -174,7 +174,7 @@ void EnergyScanServer::SendReport(void) Error error = kErrorNone; MeshCoP::ChannelMaskTlv channelMask; MeshCoP::EnergyListTlv energyList; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message; VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -191,9 +191,8 @@ void EnergyScanServer::SendReport(void) SuccessOrExit(error = message->Append(energyList)); SuccessOrExit(error = message->AppendBytes(mScanResults, mScanResultsLength)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(mCommissioner); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(mCommissioner); + SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("sent scan results"); diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 5bfcb6ccf..9485e6369 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -3630,7 +3630,7 @@ exit: Error MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus) { Error error = kErrorNone; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message = nullptr; VerifyOrExit(!mAddressSolicitPending); @@ -3653,9 +3653,7 @@ Error MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus) SuccessOrExit(error = AppendXtalAccuracy(*message)); #endif - SuccessOrExit(error = GetLeaderAddress(messageInfo.GetPeerAddr())); - messageInfo.SetSockAddr(GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderRloc()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, &HandleAddressSolicitResponse, this)); mAddressSolicitPending = true; @@ -3670,7 +3668,7 @@ exit: void MleRouter::SendAddressRelease(void) { Error error = kErrorNone; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message; VerifyOrExit((message = Get().NewMessage()) != nullptr, error = kErrorNoBufs); @@ -3679,12 +3677,10 @@ void MleRouter::SendAddressRelease(void) SuccessOrExit(error = message->SetPayloadMarker()); SuccessOrExit(error = Tlv::Append(*message, Rloc16FromRouterId(mRouterId))); - SuccessOrExit(error = Tlv::Append(*message, Get().GetExtAddress())); - messageInfo.SetSockAddr(GetMeshLocal16()); - SuccessOrExit(error = GetLeaderAddress(messageInfo.GetPeerAddr())); - messageInfo.SetPeerPort(Tmf::kUdpPort); + SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderRloc()); + SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); Log(kMessageSend, kTypeAddressRelease, messageInfo.GetPeerAddr()); diff --git a/src/core/thread/mlr_manager.cpp b/src/core/thread/mlr_manager.cpp index 47bfc6b07..a5d77ca6b 100644 --- a/src/core/thread/mlr_manager.cpp +++ b/src/core/thread/mlr_manager.cpp @@ -399,7 +399,7 @@ Error MlrManager::SendMulticastListenerRegistrationMessage(const otIp6Address * Error error = kErrorNone; Mle::MleRouter & mle = Get(); Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Ip6AddressesTlv addressesTlv; VerifyOrExit(Get().HasPrimary(), error = kErrorInvalidState); @@ -444,8 +444,7 @@ Error MlrManager::SendMulticastListenerRegistrationMessage(const otIp6Address * Get().GetServer16()); } - messageInfo.SetPeerPort(Tmf::kUdpPort); - messageInfo.SetSockAddr(mle.GetMeshLocal16()); + messageInfo.SetSockAddrToRloc(); error = Get().SendMessage(*message, messageInfo, aResponseHandler, aResponseContext); diff --git a/src/core/thread/network_data.cpp b/src/core/thread/network_data.cpp index 3f6a5f07e..a2e876ed9 100644 --- a/src/core/thread/network_data.cpp +++ b/src/core/thread/network_data.cpp @@ -642,7 +642,7 @@ Error NetworkData::SendServerDataNotification(uint16_t aRloc16, { Error error = kErrorNone; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewMessage()) != nullptr, error = kErrorNoBufs); @@ -663,9 +663,7 @@ Error NetworkData::SendServerDataNotification(uint16_t aRloc16, SuccessOrExit(error = Tlv::Append(*message, aRloc16)); } - IgnoreError(Get().GetLeaderAloc(messageInfo.GetPeerAddr())); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerPort(Tmf::kUdpPort); + IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, aHandler, aContext)); LogInfo("Sent server data notification"); diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 862ddab80..9be76c499 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -81,7 +81,7 @@ Error NetworkDiagnostic::SendDiagnosticGet(const Ip6::Address & aDesti { Error error; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); otCoapResponseHandler handler = nullptr; VerifyOrExit((message = Get().NewMessage()) != nullptr, error = kErrorNoBufs); @@ -113,11 +113,10 @@ Error NetworkDiagnostic::SendDiagnosticGet(const Ip6::Address & aDesti } else { - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + messageInfo.SetSockAddrToRloc(); } messageInfo.SetPeerAddr(aDestination); - messageInfo.SetPeerPort(Tmf::kUdpPort); SuccessOrExit(error = Get().SendMessage(*message, messageInfo, handler, this)); @@ -467,7 +466,7 @@ void NetworkDiagnostic::HandleDiagnosticGetQuery(Coap::Message &aMessage, const Error error = kErrorNone; Coap::Message * message = nullptr; NetworkDiagnosticTlv networkDiagnosticTlv; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit(aMessage.IsPostRequest(), error = kErrorDrop); @@ -501,11 +500,10 @@ void NetworkDiagnostic::HandleDiagnosticGetQuery(Coap::Message &aMessage, const } else { - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + messageInfo.SetSockAddrToRloc(); } messageInfo.SetPeerAddr(aMessageInfo.GetPeerAddr()); - messageInfo.SetPeerPort(Tmf::kUdpPort); SuccessOrExit(error = FillRequestedTlvs(aMessage, *message, networkDiagnosticTlv)); @@ -561,7 +559,7 @@ Error NetworkDiagnostic::SendDiagnosticReset(const Ip6::Address &aDestination, { Error error; Coap::Message * message = nullptr; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); VerifyOrExit((message = Get().NewMessage()) != nullptr, error = kErrorNoBufs); @@ -583,11 +581,10 @@ Error NetworkDiagnostic::SendDiagnosticReset(const Ip6::Address &aDestination, } else { - messageInfo.SetSockAddr(Get().GetMeshLocal16()); + messageInfo.SetSockAddrToRloc(); } messageInfo.SetPeerAddr(aDestination); - messageInfo.SetPeerPort(Tmf::kUdpPort); SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); diff --git a/src/core/thread/panid_query_server.cpp b/src/core/thread/panid_query_server.cpp index 92415097e..adac814e3 100644 --- a/src/core/thread/panid_query_server.cpp +++ b/src/core/thread/panid_query_server.cpp @@ -114,7 +114,7 @@ void PanIdQueryServer::SendConflict(void) { Error error = kErrorNone; MeshCoP::ChannelMaskTlv channelMask; - Ip6::MessageInfo messageInfo; + Tmf::MessageInfo messageInfo(GetInstance()); Coap::Message * message; VerifyOrExit((message = Get().NewPriorityMessage()) != nullptr, error = kErrorNoBufs); @@ -128,9 +128,8 @@ void PanIdQueryServer::SendConflict(void) SuccessOrExit(error = Tlv::Append(*message, mPanId)); - messageInfo.SetSockAddr(Get().GetMeshLocal16()); - messageInfo.SetPeerAddr(mCommissioner); - messageInfo.SetPeerPort(Tmf::kUdpPort); + messageInfo.SetSockAddrToRlocPeerAddrTo(mCommissioner); + SuccessOrExit(error = Get().SendMessage(*message, messageInfo)); LogInfo("sent panid conflict"); diff --git a/src/core/thread/tmf.cpp b/src/core/thread/tmf.cpp index 7dc5ea406..4cf831f5e 100644 --- a/src/core/thread/tmf.cpp +++ b/src/core/thread/tmf.cpp @@ -38,6 +38,48 @@ namespace ot { namespace Tmf { +//---------------------------------------------------------------------------------------------------------------------- +// MessageInfo + +void MessageInfo::SetSockAddrToRloc(void) +{ + SetSockAddr(Get().GetMeshLocal16()); +} + +Error MessageInfo::SetSockAddrToRlocPeerAddrToLeaderAloc(void) +{ + SetSockAddrToRloc(); + return Get().GetLeaderAloc(GetPeerAddr()); +} + +Error MessageInfo::SetSockAddrToRlocPeerAddrToLeaderRloc(void) +{ + SetSockAddrToRloc(); + return Get().GetLeaderAddress(GetPeerAddr()); +} + +void MessageInfo::SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(void) +{ + SetSockAddrToRloc(); + GetPeerAddr().SetToRealmLocalAllRoutersMulticast(); +} + +void MessageInfo::SetSockAddrToRlocPeerAddrTo(uint16_t aRloc16) +{ + SetSockAddrToRloc(); + SetPeerAddr(Get().GetMeshLocal16()); + GetPeerAddr().GetIid().SetLocator(aRloc16); +} + +void MessageInfo::SetSockAddrToRlocPeerAddrTo(const Ip6::Address &aPeerAddress) +{ + SetSockAddrToRloc(); + SetPeerAddr(aPeerAddress); +} + +//---------------------------------------------------------------------------------------------------------------------- +// Agent + Error Agent::Start(void) { return Coap::Start(kUdpPort, OT_NETIF_THREAD); diff --git a/src/core/thread/tmf.hpp b/src/core/thread/tmf.hpp index 738f665e7..8d1ba9aeb 100644 --- a/src/core/thread/tmf.hpp +++ b/src/core/thread/tmf.hpp @@ -37,12 +37,91 @@ #include "openthread-core-config.h" #include "coap/coap.hpp" +#include "common/locator.hpp" namespace ot { namespace Tmf { constexpr uint16_t kUdpPort = 61631; ///< TMF UDP Port +/** + * This class represents message information for a TMF message. + * + * This is sub-class of `Ip6::MessageInfo` intended for use when sending TMF messages. + * + */ +class MessageInfo : public InstanceLocator, public Ip6::MessageInfo +{ +public: + /** + * This constructor initializes the `MessageInfo`. + * + * The peer port is set to `Tmf::kUdpPort` and all other properties are cleared (set to zero). + * + * @param[in] aInstance The OpenThread instance. + * + */ + explicit MessageInfo(Instance &aInstance) + : InstanceLocator(aInstance) + { + SetPeerPort(kUdpPort); + } + + /** + * This method sets the local socket port to TMF port. + * + */ + void SetSockPortToTmf(void) { SetSockPort(kUdpPort); } + + /** + * This method sets the local socket address to mesh-local RLOC address. + * + */ + void SetSockAddrToRloc(void); + + /** + * This method sets the local socket address to RLOC address and the peer socket address to leader ALOC. + * + * @retval kErrorNone Successfully set the addresses. + * @retval kErrorDetached Cannot set leader ALOC since device is currently detached. + * + */ + Error SetSockAddrToRlocPeerAddrToLeaderAloc(void); + + /** + * This method sets the local socket address to RLOC address and the peer socket address to leader RLOC. + * + * @retval kErrorNone Successfully set the addresses. + * @retval kErrorDetached Cannot set leader RLOC since device is currently detached. + * + */ + Error SetSockAddrToRlocPeerAddrToLeaderRloc(void); + + /** + * This method sets the local socket address to RLOC address and the peer socket address to realm-local all + * routers multicast address. + * + */ + void SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(void); + + /** + * This method sets the local socket address to RLOC address and the peer socket address to a router RLOC based on + * a given RLOC16. + * + * @param[in] aRloc16 The RLOC16 to use for peer address. + * + */ + void SetSockAddrToRlocPeerAddrTo(uint16_t aRloc16); + + /** + * This method sets the local socket address to RLOC address and the peer socket address to a given address. + * + * @param[in] aPeerAddress The peer address. + * + */ + void SetSockAddrToRlocPeerAddrTo(const Ip6::Address &aPeerAddress); +}; + /** * This class implements functionality of the Thread TMF agent. *