[mle] simplify tracking of registered DUA address by child (#9137)

diff --git a/src/core/thread/dua_manager.cpp b/src/core/thread/dua_manager.cpp
index 0b423e1..15f8b54 100644
--- a/src/core/thread/dua_manager.cpp
+++ b/src/core/thread/dua_manager.cpp
@@ -758,12 +758,11 @@
     }
 }
 
-void DuaManager::UpdateChildDomainUnicastAddress(const Child &aChild, Mle::ChildDuaState aState)
+void DuaManager::HandleChildDuaAddressEvent(const Child &aChild, ChildDuaAddressEvent aEvent)
 {
     uint16_t childIndex = Get<ChildTable>().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 @@
         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 5746a8a..995e0f8 100644
--- a/src/core/thread/dua_manager.hpp
+++ b/src/core/thread/dua_manager.hpp
@@ -171,7 +171,26 @@
 #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 417c1c5..64f737e 100644
--- a/src/core/thread/mle_router.cpp
+++ b/src/core/thread/mle_router.cpp
@@ -1797,9 +1797,9 @@
     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 @@
     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 @@
         if (error == kErrorNone)
         {
             storedCount++;
-
-#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
-            if (Get<BackboneRouter::Leader>().IsDomainUnicast(address))
-            {
-                hasDua = true;
-
-                if (oldDuaPtr != nullptr)
-                {
-                    Get<DuaManager>().UpdateChildDomainUnicastAddress(
-                        aChild, oldDua != address ? ChildDuaState::kChanged : ChildDuaState::kUnchanged);
-                }
-                else
-                {
-                    Get<DuaManager>().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<BackboneRouter::Leader>().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<BackboneRouter::Leader>().IsDomainUnicast(address))
+        {
+            if (error == kErrorNone)
+            {
+                DuaManager::ChildDuaAddressEvent event;
+
+                hasNewDua = true;
+
+                if (hasOldDua)
+                {
+                    event = (oldDua != address) ? DuaManager::kAddressChanged : DuaManager::kAddressUnchanged;
+                }
+                else
+                {
+                    event = DuaManager::kAddressAdded;
+                }
+
+                Get<DuaManager>().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 @@
         Get<AddressResolver>().RemoveEntryForAddress(address);
     }
 #if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
-    // Dua is removed
-    if (oldDuaPtr != nullptr && !hasDua)
+    if (hasOldDua && !hasNewDua)
     {
-        Get<DuaManager>().UpdateChildDomainUnicastAddress(aChild, ChildDuaState::kRemoved);
+        Get<DuaManager>().HandleChildDuaAddressEvent(aChild, DuaManager::kAddressRemoved);
     }
 #endif
 
diff --git a/src/core/thread/mle_types.hpp b/src/core/thread/mle_types.hpp
index 9255991..1edc827 100644
--- a/src/core/thread/mle_types.hpp
+++ b/src/core/thread/mle_types.hpp
@@ -232,22 +232,6 @@
     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 9355473..46ab1c7 100644
--- a/src/core/thread/neighbor_table.cpp
+++ b/src/core/thread/neighbor_table.cpp
@@ -305,8 +305,8 @@
     case kChildRemoved:
         Get<Notifier>().Signal(kEventThreadChildRemoved);
 #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
-        Get<DuaManager>().UpdateChildDomainUnicastAddress(static_cast<const Child &>(aNeighbor),
-                                                          Mle::ChildDuaState::kRemoved);
+        Get<DuaManager>().HandleChildDuaAddressEvent(static_cast<const Child &>(aNeighbor),
+                                                     DuaManager::kAddressRemoved);
 #endif
         break;