mirror of
https://github.com/espressif/openthread.git
synced 2026-07-27 06:17:47 +00:00
[mle] simplify tracking of registered DUA address by child (#9137)
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user