diff --git a/src/core/thread/dua_manager.cpp b/src/core/thread/dua_manager.cpp index 0b423e1ed..15f8b5469 100644 --- a/src/core/thread/dua_manager.cpp +++ b/src/core/thread/dua_manager.cpp @@ -758,12 +758,11 @@ exit: } } -void DuaManager::UpdateChildDomainUnicastAddress(const Child &aChild, Mle::ChildDuaState aState) +void DuaManager::HandleChildDuaAddressEvent(const Child &aChild, ChildDuaAddressEvent aEvent) { uint16_t childIndex = Get().GetChildIndex(aChild); - if ((aState == Mle::ChildDuaState::kRemoved || aState == Mle::ChildDuaState::kChanged) && - mChildDuaMask.Get(childIndex)) + if ((aEvent == kAddressRemoved || aEvent == kAddressChanged) && mChildDuaMask.Get(childIndex)) { // Abort on going proxy DUA.req for this child if (mChildIndexDuaRegistering == childIndex) @@ -775,8 +774,8 @@ void DuaManager::UpdateChildDomainUnicastAddress(const Child &aChild, Mle::Child mChildDuaRegisteredMask.Set(childIndex, false); } - if (aState == Mle::ChildDuaState::kAdded || aState == Mle::ChildDuaState::kChanged || - (aState == Mle::ChildDuaState::kUnchanged && !mChildDuaMask.Get(childIndex))) + if (aEvent == kAddressAdded || aEvent == kAddressChanged || + (aEvent == kAddressUnchanged && !mChildDuaMask.Get(childIndex))) { if (mChildDuaMask == mChildDuaRegisteredMask) { diff --git a/src/core/thread/dua_manager.hpp b/src/core/thread/dua_manager.hpp index 5746a8af5..995e0f8d6 100644 --- a/src/core/thread/dua_manager.hpp +++ b/src/core/thread/dua_manager.hpp @@ -171,7 +171,26 @@ public: #endif #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - void UpdateChildDomainUnicastAddress(const Child &aChild, Mle::ChildDuaState aState); + /** + * Events related to a Child DUA address. + * + */ + enum ChildDuaAddressEvent : uint8_t + { + kAddressAdded, ///< A new DUA registered by the Child via Address Registration. + kAddressChanged, ///< A different DUA registered by the Child via Address Registration. + kAddressRemoved, ///< DUA registered by the Child is removed and not in Address Registration. + kAddressUnchanged, ///< The Child registers the same DUA again. + }; + + /** + * Handles Child DUA address event. + * + * @param[in] aChild A child. + * @param[in] aEvent The DUA address event for @p aChild. + * + */ + void HandleChildDuaAddressEvent(const Child &aChild, ChildDuaAddressEvent aEvent); #endif private: diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 417c1c57b..64f737edc 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -1797,9 +1797,9 @@ Error MleRouter::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild) uint8_t count = 0; uint8_t storedCount = 0; #if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - Ip6::Address oldDua; - const Ip6::Address *oldDuaPtr = nullptr; - bool hasDua = false; + bool hasOldDua = false; + bool hasNewDua = false; + Ip6::Address oldDua; #endif #if OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE Ip6::Address oldMlrRegisteredAddresses[kMaxChildIpAddresses - 1]; @@ -1811,9 +1811,14 @@ Error MleRouter::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild) endOffset = offset + length; #if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - if ((oldDuaPtr = aChild.GetDomainUnicastAddress()) != nullptr) { - oldDua = *oldDuaPtr; + const Ip6::Address *duaAddress = aChild.GetDomainUnicastAddress(); + + if (duaAddress != nullptr) + { + oldDua = *duaAddress; + hasOldDua = true; + } } #endif @@ -1897,41 +1902,43 @@ Error MleRouter::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild) if (error == kErrorNone) { storedCount++; - -#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - if (Get().IsDomainUnicast(address)) - { - hasDua = true; - - if (oldDuaPtr != nullptr) - { - Get().UpdateChildDomainUnicastAddress( - aChild, oldDua != address ? ChildDuaState::kChanged : ChildDuaState::kUnchanged); - } - else - { - Get().UpdateChildDomainUnicastAddress(aChild, ChildDuaState::kAdded); - } - } -#endif - LogInfo("Child 0x%04x IPv6 address[%u]=%s", aChild.GetRloc16(), storedCount, address.ToString().AsCString()); } else { -#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - if (Get().IsDomainUnicast(address)) - { - // if not able to store DUA, then assume child does not have one - hasDua = false; - } -#endif - LogWarn("Error %s adding IPv6 address %s to child 0x%04x", ErrorToString(error), address.ToString().AsCString(), aChild.GetRloc16()); } +#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE + if (Get().IsDomainUnicast(address)) + { + if (error == kErrorNone) + { + DuaManager::ChildDuaAddressEvent event; + + hasNewDua = true; + + if (hasOldDua) + { + event = (oldDua != address) ? DuaManager::kAddressChanged : DuaManager::kAddressUnchanged; + } + else + { + event = DuaManager::kAddressAdded; + } + + Get().HandleChildDuaAddressEvent(aChild, event); + } + else + { + // if not able to store DUA, then assume child does not have one + hasNewDua = false; + } + } +#endif + if (address.IsMulticast()) { continue; @@ -1961,10 +1968,9 @@ Error MleRouter::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild) Get().RemoveEntryForAddress(address); } #if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - // Dua is removed - if (oldDuaPtr != nullptr && !hasDua) + if (hasOldDua && !hasNewDua) { - Get().UpdateChildDomainUnicastAddress(aChild, ChildDuaState::kRemoved); + Get().HandleChildDuaAddressEvent(aChild, DuaManager::kAddressRemoved); } #endif diff --git a/src/core/thread/mle_types.hpp b/src/core/thread/mle_types.hpp index 9255991ae..1edc8279d 100644 --- a/src/core/thread/mle_types.hpp +++ b/src/core/thread/mle_types.hpp @@ -232,22 +232,6 @@ enum LeaderStartMode : uint8_t kRestoringLeaderRoleAfterReset, ///< Restoring leader role after reset. }; -#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 - -/** - * State change of Child's DUA - * - */ -enum class ChildDuaState : uint8_t -{ - kAdded, ///< A new DUA registered by the Child via Address Registration. - kChanged, ///< A different DUA registered by the Child via Address Registration. - kRemoved, ///< DUA registered by the Child is removed and not in Address Registration. - kUnchanged, ///< The Child registers the same DUA again. -}; - -#endif // OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 - /** * Represents a MLE device mode. * diff --git a/src/core/thread/neighbor_table.cpp b/src/core/thread/neighbor_table.cpp index 9355473bb..46ab1c790 100644 --- a/src/core/thread/neighbor_table.cpp +++ b/src/core/thread/neighbor_table.cpp @@ -305,8 +305,8 @@ void NeighborTable::Signal(Event aEvent, const Neighbor &aNeighbor) case kChildRemoved: Get().Signal(kEventThreadChildRemoved); #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE - Get().UpdateChildDomainUnicastAddress(static_cast(aNeighbor), - Mle::ChildDuaState::kRemoved); + Get().HandleChildDuaAddressEvent(static_cast(aNeighbor), + DuaManager::kAddressRemoved); #endif break;