[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;