diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index edf3d8e52..b1def2d1a 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -858,8 +858,7 @@ template <> void Commissioner::HandleTmf(Coap::Msg &aMsg) aMsg.mMessage.SetOffset(offsetRange.GetOffset()); SuccessOrExit(error = aMsg.mMessage.SetLength(offsetRange.GetEndOffset())); - joinerMessageInfo.SetPeerAddr(Get().GetMeshLocalEid()); - joinerMessageInfo.GetPeerAddr().SetIid(mJoinerIid); + Get().ComposeMeshLocalAddress(mJoinerIid, joinerMessageInfo.GetPeerAddr()); joinerMessageInfo.SetPeerPort(mJoinerPort); Get().HandleReceive(aMsg.mMessage, joinerMessageInfo); diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index f659a8be4..f81ea0af5 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -123,8 +123,7 @@ Error AddressResolver::GetNextCacheEntry(EntryInfo &aInfo, Iterator &aIterator) VerifyOrExit(entry->IsLastTransactionTimeValid()); aInfo.mLastTransTime = entry->GetLastTransactionTime(); - AsCoreType(&aInfo.mMeshLocalEid).SetPrefix(Get().GetMeshLocalPrefix()); - AsCoreType(&aInfo.mMeshLocalEid).SetIid(entry->GetMeshLocalIid()); + Get().ComposeMeshLocalAddress(entry->GetMeshLocalIid(), AsCoreType(&aInfo.mMeshLocalEid)); ExitNow(); } diff --git a/src/core/thread/child.cpp b/src/core/thread/child.cpp index 0c0d404e0..a39c45bd7 100644 --- a/src/core/thread/child.cpp +++ b/src/core/thread/child.cpp @@ -110,8 +110,7 @@ Error Child::GetMeshLocalIp6Address(Ip6::Address &aAddress) const VerifyOrExit(!mMeshLocalIid.IsUnspecified(), error = kErrorNotFound); - aAddress.SetPrefix(Get().GetMeshLocalPrefix()); - aAddress.SetIid(mMeshLocalIid); + Get().ComposeMeshLocalAddress(mMeshLocalIid, aAddress); exit: return error; diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 7a06fcbe1..bb0b9034c 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -902,6 +902,12 @@ void Mle::ComposeServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const ComposeAloc(Aloc16::FromServiceId(aServiceId), aAddress); } +void Mle::ComposeMeshLocalAddress(const Ip6::InterfaceIdentifier &aIid, Ip6::Address &aAddress) const +{ + aAddress.SetPrefix(mMeshLocalPrefix); + aAddress.SetIid(aIid); +} + const LeaderData &Mle::GetLeaderData(void) { mLeaderData.SetDataVersion(Get().GetVersion(NetworkData::kFullSet)); diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 5326c433e..86bd50964 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -611,6 +611,14 @@ public: */ void ComposeServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const; + /** + * Composes a Mesh-Local IPv6 Address from a given Interface Identifier. + * + * @param[in] aIid The Interface Identifier to use. + * @param[out] aAddress A reference to the IPv6 Address to populate. + */ + void ComposeMeshLocalAddress(const Ip6::InterfaceIdentifier &aIid, Ip6::Address &aAddress) const; + /** * Returns the most recently received Leader Data. * diff --git a/tests/unit/test_child.cpp b/tests/unit/test_child.cpp index d71d09d96..3d3c93491 100644 --- a/tests/unit/test_child.cpp +++ b/tests/unit/test_child.cpp @@ -123,9 +123,7 @@ void TestChildIp6Address(void) numAddresses = 0; // First addresses uses the mesh local prefix (mesh-local address). - addresses[numAddresses] = sInstance->Get().GetMeshLocalEid(); - addresses[numAddresses].SetIid(meshLocalIid); - + sInstance->Get().ComposeMeshLocalAddress(meshLocalIid, addresses[numAddresses]); numAddresses++; for (const char *ip6Address : ip6Addresses)