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

This commit is contained in:
Abtin Keshavarzian
2023-06-06 15:06:21 -07:00
committed by GitHub
parent 7e8f77b55e
commit 982057e095
5 changed files with 66 additions and 58 deletions
+4 -5
View File
@@ -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<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 @@ 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)
{
+20 -1
View File
@@ -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:
+40 -34
View File
@@ -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<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 @@ Error MleRouter::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild)
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
-16
View File
@@ -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.
*
+2 -2
View File
@@ -305,8 +305,8 @@ void NeighborTable::Signal(Event aEvent, const Neighbor &aNeighbor)
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;