[mle] refactor MleRouter and Mle classes into a single Mle class (#11411)

This commit refactors the `Mle` modules and combines the `MleRouter`
and `Mle` classes into a single `Mle` class which now handles both
FTD and MTD functionalities.

The `MleRouter` and `Mle` classes were originally intended as
sub-classes, where the base class `Mle` would provide MTD and common
behaviors, and `MleRouter` would implement FTD-specific behaviors.
However, over the years and as new features were implemented, these
two classes became more intertwined, and the `Mle` class began to
include many FTD-related functions and interactions with `MleRouter`
private variables and methods.

This commit simplifies the code by combining the two into a single
class. The previous `mle_router.cpp` file is also renamed to
`mle_ftd.cpp` to indicate that it implements FTD-specific MLE
behaviors.
This commit is contained in:
Abtin Keshavarzian
2025-04-18 14:28:47 -07:00
committed by GitHub
parent f70749d21d
commit 0c1dfa0796
67 changed files with 1135 additions and 1255 deletions
+1 -2
View File
@@ -660,8 +660,7 @@ openthread_core_files = [
"thread/mesh_forwarder_mtd.cpp", "thread/mesh_forwarder_mtd.cpp",
"thread/mle.cpp", "thread/mle.cpp",
"thread/mle.hpp", "thread/mle.hpp",
"thread/mle_router.cpp", "thread/mle_ftd.cpp",
"thread/mle_router.hpp",
"thread/mle_tlvs.cpp", "thread/mle_tlvs.cpp",
"thread/mle_tlvs.hpp", "thread/mle_tlvs.hpp",
"thread/mle_types.cpp", "thread/mle_types.cpp",
+1 -1
View File
@@ -224,7 +224,7 @@ set(COMMON_SOURCES
thread/mesh_forwarder_ftd.cpp thread/mesh_forwarder_ftd.cpp
thread/mesh_forwarder_mtd.cpp thread/mesh_forwarder_mtd.cpp
thread/mle.cpp thread/mle.cpp
thread/mle_router.cpp thread/mle_ftd.cpp
thread/mle_tlvs.cpp thread/mle_tlvs.cpp
thread/mle_types.cpp thread/mle_types.cpp
thread/mlr_manager.cpp thread/mlr_manager.cpp
+1 -1
View File
@@ -266,7 +266,7 @@ void otIp6SetSlaacPrefixFilter(otInstance *aInstance, otIp6SlaacPrefixFilter aFi
otError otIp6SetMeshLocalIid(otInstance *aInstance, const otIp6InterfaceIdentifier *aIid) otError otIp6SetMeshLocalIid(otInstance *aInstance, const otIp6InterfaceIdentifier *aIid)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetMeshLocalIid(AsCoreType(aIid)); return AsCoreType(aInstance).Get<Mle::Mle>().SetMeshLocalIid(AsCoreType(aIid));
} }
#endif #endif
+8 -11
View File
@@ -69,7 +69,7 @@ otError otLinkSetChannel(otInstance *aInstance, uint8_t aChannel)
} }
#endif #endif
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
SuccessOrExit(error = instance.Get<Mac::Mac>().SetPanChannel(aChannel)); SuccessOrExit(error = instance.Get<Mac::Mac>().SetPanChannel(aChannel));
instance.Get<MeshCoP::ActiveDatasetManager>().Clear(); instance.Get<MeshCoP::ActiveDatasetManager>().Clear();
@@ -90,7 +90,7 @@ otError otLinkSetWakeupChannel(otInstance *aInstance, uint8_t aChannel)
Error error = kErrorNone; Error error = kErrorNone;
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
SuccessOrExit(error = instance.Get<Mac::Mac>().SetWakeupChannel(aChannel)); SuccessOrExit(error = instance.Get<Mac::Mac>().SetWakeupChannel(aChannel));
@@ -112,7 +112,7 @@ otError otLinkSetSupportedChannelMask(otInstance *aInstance, uint32_t aChannelMa
Error error = kErrorNone; Error error = kErrorNone;
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<Mac::Mac>().SetSupportedChannelMask(Mac::ChannelMask(aChannelMask)); instance.Get<Mac::Mac>().SetSupportedChannelMask(Mac::ChannelMask(aChannelMask));
@@ -130,11 +130,11 @@ otError otLinkSetExtendedAddress(otInstance *aInstance, const otExtAddress *aExt
Error error = kErrorNone; Error error = kErrorNone;
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<Mac::Mac>().SetExtAddress(AsCoreType(aExtAddress)); instance.Get<Mac::Mac>().SetExtAddress(AsCoreType(aExtAddress));
instance.Get<Mle::MleRouter>().UpdateLinkLocalAddress(); instance.Get<Mle::Mle>().UpdateLinkLocalAddress();
exit: exit:
return error; return error;
@@ -152,7 +152,7 @@ otError otLinkSetPanId(otInstance *aInstance, otPanId aPanId)
Error error = kErrorNone; Error error = kErrorNone;
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<Mac::Mac>().SetPanId(aPanId); instance.Get<Mac::Mac>().SetPanId(aPanId);
instance.Get<MeshCoP::ActiveDatasetManager>().Clear(); instance.Get<MeshCoP::ActiveDatasetManager>().Clear();
@@ -464,17 +464,14 @@ exit:
return error; return error;
} }
uint32_t otLinkGetCslTimeout(otInstance *aInstance) uint32_t otLinkGetCslTimeout(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::Mle>().GetCslTimeout(); }
{
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetCslTimeout();
}
otError otLinkSetCslTimeout(otInstance *aInstance, uint32_t aTimeout) otError otLinkSetCslTimeout(otInstance *aInstance, uint32_t aTimeout)
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(kMaxCslTimeout >= aTimeout, error = kErrorInvalidArgs); VerifyOrExit(kMaxCslTimeout >= aTimeout, error = kErrorInvalidArgs);
AsCoreType(aInstance).Get<Mle::MleRouter>().SetCslTimeout(aTimeout); AsCoreType(aInstance).Get<Mle::Mle>().SetCslTimeout(aTimeout);
exit: exit:
return error; return error;
+2 -2
View File
@@ -108,12 +108,12 @@ void otNetDataGetCommissioningDataset(otInstance *aInstance, otCommissioningData
uint8_t otNetDataGetVersion(otInstance *aInstance) uint8_t otNetDataGetVersion(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData().GetDataVersion(NetworkData::kFullSet); return AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderData().GetDataVersion(NetworkData::kFullSet);
} }
uint8_t otNetDataGetStableVersion(otInstance *aInstance) uint8_t otNetDataGetStableVersion(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData().GetDataVersion(NetworkData::kStableSubset); return AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderData().GetDataVersion(NetworkData::kStableSubset);
} }
otError otNetDataSteeringDataCheckJoiner(otInstance *aInstance, const otExtAddress *aEui64) otError otNetDataSteeringDataCheckJoiner(otInstance *aInstance, const otExtAddress *aEui64)
+2 -2
View File
@@ -52,7 +52,7 @@ otError otNetworkTimeSetSyncPeriod(otInstance *aInstance, uint16_t aTimeSyncPeri
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
AsCoreType(aInstance).Get<TimeSync>().SetTimeSyncPeriod(aTimeSyncPeriod); AsCoreType(aInstance).Get<TimeSync>().SetTimeSyncPeriod(aTimeSyncPeriod);
@@ -69,7 +69,7 @@ otError otNetworkTimeSetXtalThreshold(otInstance *aInstance, uint16_t aXtalThres
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
AsCoreType(aInstance).Get<TimeSync>().SetXtalThreshold(aXtalThreshold); AsCoreType(aInstance).Get<TimeSync>().SetXtalThreshold(aXtalThreshold);
+36 -45
View File
@@ -39,14 +39,11 @@
using namespace ot; using namespace ot;
uint32_t otThreadGetChildTimeout(otInstance *aInstance) uint32_t otThreadGetChildTimeout(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::Mle>().GetTimeout(); }
{
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetTimeout();
}
void otThreadSetChildTimeout(otInstance *aInstance, uint32_t aTimeout) void otThreadSetChildTimeout(otInstance *aInstance, uint32_t aTimeout)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetTimeout(aTimeout); AsCoreType(aInstance).Get<Mle::Mle>().SetTimeout(aTimeout);
} }
const otExtendedPanId *otThreadGetExtendedPanId(otInstance *aInstance) const otExtendedPanId *otThreadGetExtendedPanId(otInstance *aInstance)
@@ -60,7 +57,7 @@ otError otThreadSetExtendedPanId(otInstance *aInstance, const otExtendedPanId *a
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
const MeshCoP::ExtendedPanId &extPanId = AsCoreType(aExtendedPanId); const MeshCoP::ExtendedPanId &extPanId = AsCoreType(aExtendedPanId);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<MeshCoP::ExtendedPanIdManager>().SetExtPanId(extPanId); instance.Get<MeshCoP::ExtendedPanIdManager>().SetExtPanId(extPanId);
@@ -86,14 +83,14 @@ otLinkModeConfig otThreadGetLinkMode(otInstance *aInstance)
{ {
otLinkModeConfig config; otLinkModeConfig config;
AsCoreType(aInstance).Get<Mle::MleRouter>().GetDeviceMode().Get(config); AsCoreType(aInstance).Get<Mle::Mle>().GetDeviceMode().Get(config);
return config; return config;
} }
otError otThreadSetLinkMode(otInstance *aInstance, otLinkModeConfig aConfig) otError otThreadSetLinkMode(otInstance *aInstance, otLinkModeConfig aConfig)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetDeviceMode(Mle::DeviceMode(aConfig)); return AsCoreType(aInstance).Get<Mle::Mle>().SetDeviceMode(Mle::DeviceMode(aConfig));
} }
void otThreadGetNetworkKey(otInstance *aInstance, otNetworkKey *aNetworkKey) void otThreadGetNetworkKey(otInstance *aInstance, otNetworkKey *aNetworkKey)
@@ -113,7 +110,7 @@ otError otThreadSetNetworkKey(otInstance *aInstance, const otNetworkKey *aKey)
Error error = kErrorNone; Error error = kErrorNone;
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<KeyManager>().SetNetworkKey(AsCoreType(aKey)); instance.Get<KeyManager>().SetNetworkKey(AsCoreType(aKey));
@@ -132,7 +129,7 @@ otError otThreadSetNetworkKeyRef(otInstance *aInstance, otNetworkKeyRef aKeyRef)
VerifyOrExit(aKeyRef != 0, error = kErrorInvalidArgs); VerifyOrExit(aKeyRef != 0, error = kErrorInvalidArgs);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<KeyManager>().SetNetworkKeyRef((aKeyRef)); instance.Get<KeyManager>().SetNetworkKeyRef((aKeyRef));
instance.Get<MeshCoP::ActiveDatasetManager>().Clear(); instance.Get<MeshCoP::ActiveDatasetManager>().Clear();
@@ -145,26 +142,26 @@ exit:
const otIp6Address *otThreadGetRloc(otInstance *aInstance) const otIp6Address *otThreadGetRloc(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetMeshLocalRloc(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetMeshLocalRloc();
} }
const otIp6Address *otThreadGetMeshLocalEid(otInstance *aInstance) const otIp6Address *otThreadGetMeshLocalEid(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetMeshLocalEid(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetMeshLocalEid();
} }
const otMeshLocalPrefix *otThreadGetMeshLocalPrefix(otInstance *aInstance) const otMeshLocalPrefix *otThreadGetMeshLocalPrefix(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetMeshLocalPrefix(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetMeshLocalPrefix();
} }
otError otThreadSetMeshLocalPrefix(otInstance *aInstance, const otMeshLocalPrefix *aMeshLocalPrefix) otError otThreadSetMeshLocalPrefix(otInstance *aInstance, const otMeshLocalPrefix *aMeshLocalPrefix)
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
AsCoreType(aInstance).Get<Mle::MleRouter>().SetMeshLocalPrefix(AsCoreType(aMeshLocalPrefix)); AsCoreType(aInstance).Get<Mle::Mle>().SetMeshLocalPrefix(AsCoreType(aMeshLocalPrefix));
AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Clear(); AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Clear();
AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Clear(); AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Clear();
@@ -174,17 +171,17 @@ exit:
const otIp6Address *otThreadGetLinkLocalIp6Address(otInstance *aInstance) const otIp6Address *otThreadGetLinkLocalIp6Address(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetLinkLocalAddress(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetLinkLocalAddress();
} }
const otIp6Address *otThreadGetLinkLocalAllThreadNodesMulticastAddress(otInstance *aInstance) const otIp6Address *otThreadGetLinkLocalAllThreadNodesMulticastAddress(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetLinkLocalAllThreadNodesAddress(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetLinkLocalAllThreadNodesAddress();
} }
const otIp6Address *otThreadGetRealmLocalAllThreadNodesMulticastAddress(otInstance *aInstance) const otIp6Address *otThreadGetRealmLocalAllThreadNodesMulticastAddress(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetRealmLocalAllThreadNodesAddress(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetRealmLocalAllThreadNodesAddress();
} }
otError otThreadGetServiceAloc(otInstance *aInstance, uint8_t aServiceId, otIp6Address *aServiceAloc) otError otThreadGetServiceAloc(otInstance *aInstance, uint8_t aServiceId, otIp6Address *aServiceAloc)
@@ -207,7 +204,7 @@ otError otThreadSetNetworkName(otInstance *aInstance, const char *aNetworkName)
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
#if !OPENTHREAD_CONFIG_ALLOW_EMPTY_NETWORK_NAME #if !OPENTHREAD_CONFIG_ALLOW_EMPTY_NETWORK_NAME
// Thread interfaces support a zero length name internally for backwards compatibility, but new names // Thread interfaces support a zero length name internally for backwards compatibility, but new names
@@ -233,7 +230,7 @@ otError otThreadSetDomainName(otInstance *aInstance, const char *aDomainName)
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
error = AsCoreType(aInstance).Get<MeshCoP::NetworkNameManager>().SetDomainName(aDomainName); error = AsCoreType(aInstance).Get<MeshCoP::NetworkNameManager>().SetDomainName(aDomainName);
@@ -295,12 +292,9 @@ void otThreadSetKeySwitchGuardTime(otInstance *aInstance, uint16_t aKeySwitchGua
AsCoreType(aInstance).Get<KeyManager>().SetKeySwitchGuardTime(aKeySwitchGuardTime); AsCoreType(aInstance).Get<KeyManager>().SetKeySwitchGuardTime(aKeySwitchGuardTime);
} }
otError otThreadBecomeDetached(otInstance *aInstance) otError otThreadBecomeDetached(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::Mle>().BecomeDetached(); }
{
return AsCoreType(aInstance).Get<Mle::MleRouter>().BecomeDetached();
}
otError otThreadBecomeChild(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::MleRouter>().BecomeChild(); } otError otThreadBecomeChild(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::Mle>().BecomeChild(); }
otError otThreadGetNextNeighborInfo(otInstance *aInstance, otNeighborInfoIterator *aIterator, otNeighborInfo *aInfo) otError otThreadGetNextNeighborInfo(otInstance *aInstance, otNeighborInfoIterator *aIterator, otNeighborInfo *aInfo)
{ {
@@ -311,7 +305,7 @@ otError otThreadGetNextNeighborInfo(otInstance *aInstance, otNeighborInfoIterato
otDeviceRole otThreadGetDeviceRole(otInstance *aInstance) otDeviceRole otThreadGetDeviceRole(otInstance *aInstance)
{ {
return MapEnum(AsCoreType(aInstance).Get<Mle::MleRouter>().GetRole()); return MapEnum(AsCoreType(aInstance).Get<Mle::Mle>().GetRole());
} }
const char *otThreadDeviceRoleToString(otDeviceRole aRole) { return Mle::RoleToString(MapEnum(aRole)); } const char *otThreadDeviceRoleToString(otDeviceRole aRole) { return Mle::RoleToString(MapEnum(aRole)); }
@@ -322,29 +316,26 @@ otError otThreadGetLeaderData(otInstance *aInstance, otLeaderData *aLeaderData)
AssertPointerIsNotNull(aLeaderData); AssertPointerIsNotNull(aLeaderData);
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsAttached(), error = kErrorDetached); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsAttached(), error = kErrorDetached);
*aLeaderData = AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData(); *aLeaderData = AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderData();
exit: exit:
return error; return error;
} }
uint8_t otThreadGetLeaderRouterId(otInstance *aInstance) uint8_t otThreadGetLeaderRouterId(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderId(); }
{
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderId();
}
uint8_t otThreadGetLeaderWeight(otInstance *aInstance) uint8_t otThreadGetLeaderWeight(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData().GetWeighting(); return AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderData().GetWeighting();
} }
uint32_t otThreadGetPartitionId(otInstance *aInstance) uint32_t otThreadGetPartitionId(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderData().GetPartitionId(); return AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderData().GetPartitionId();
} }
uint16_t otThreadGetRloc16(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::MleRouter>().GetRloc16(); } uint16_t otThreadGetRloc16(otInstance *aInstance) { return AsCoreType(aInstance).Get<Mle::Mle>().GetRloc16(); }
otError otThreadGetParentInfo(otInstance *aInstance, otRouterInfo *aParentInfo) otError otThreadGetParentInfo(otInstance *aInstance, otRouterInfo *aParentInfo)
{ {
@@ -357,7 +348,7 @@ otError otThreadGetParentAverageRssi(otInstance *aInstance, int8_t *aParentRssi)
AssertPointerIsNotNull(aParentRssi); AssertPointerIsNotNull(aParentRssi);
*aParentRssi = AsCoreType(aInstance).Get<Mle::MleRouter>().GetParent().GetLinkInfo().GetAverageRss(); *aParentRssi = AsCoreType(aInstance).Get<Mle::Mle>().GetParent().GetLinkInfo().GetAverageRss();
VerifyOrExit(*aParentRssi != Radio::kInvalidRssi, error = kErrorFailed); VerifyOrExit(*aParentRssi != Radio::kInvalidRssi, error = kErrorFailed);
@@ -371,7 +362,7 @@ otError otThreadGetParentLastRssi(otInstance *aInstance, int8_t *aLastRssi)
AssertPointerIsNotNull(aLastRssi); AssertPointerIsNotNull(aLastRssi);
*aLastRssi = AsCoreType(aInstance).Get<Mle::MleRouter>().GetParent().GetLinkInfo().GetLastRss(); *aLastRssi = AsCoreType(aInstance).Get<Mle::Mle>().GetParent().GetLinkInfo().GetLastRss();
VerifyOrExit(*aLastRssi != Radio::kInvalidRssi, error = kErrorFailed); VerifyOrExit(*aLastRssi != Radio::kInvalidRssi, error = kErrorFailed);
@@ -390,11 +381,11 @@ otError otThreadSetEnabled(otInstance *aInstance, bool aEnabled)
if (aEnabled) if (aEnabled)
{ {
error = AsCoreType(aInstance).Get<Mle::MleRouter>().Start(); error = AsCoreType(aInstance).Get<Mle::Mle>().Start();
} }
else else
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().Stop(); AsCoreType(aInstance).Get<Mle::Mle>().Stop();
} }
return error; return error;
@@ -407,7 +398,7 @@ bool otThreadIsSingleton(otInstance *aInstance)
bool isSingleton = false; bool isSingleton = false;
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
isSingleton = AsCoreType(aInstance).Get<Mle::MleRouter>().IsSingleton(); isSingleton = AsCoreType(aInstance).Get<Mle::Mle>().IsSingleton();
#else #else
OT_UNUSED_VARIABLE(aInstance); OT_UNUSED_VARIABLE(aInstance);
#endif #endif
@@ -470,14 +461,14 @@ void otThreadResetTimeInQueueStat(otInstance *aInstance)
const otMleCounters *otThreadGetMleCounters(otInstance *aInstance) const otMleCounters *otThreadGetMleCounters(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetCounters(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetCounters();
} }
void otThreadResetMleCounters(otInstance *aInstance) { AsCoreType(aInstance).Get<Mle::MleRouter>().ResetCounters(); } void otThreadResetMleCounters(otInstance *aInstance) { AsCoreType(aInstance).Get<Mle::Mle>().ResetCounters(); }
uint32_t otThreadGetCurrentAttachDuration(otInstance *aInstance) uint32_t otThreadGetCurrentAttachDuration(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetCurrentAttachDuration(); return AsCoreType(aInstance).Get<Mle::Mle>().GetCurrentAttachDuration();
} }
#if OPENTHREAD_CONFIG_MLE_PARENT_RESPONSE_CALLBACK_API_ENABLE #if OPENTHREAD_CONFIG_MLE_PARENT_RESPONSE_CALLBACK_API_ENABLE
@@ -485,7 +476,7 @@ void otThreadRegisterParentResponseCallback(otInstance *aInst
otThreadParentResponseCallback aCallback, otThreadParentResponseCallback aCallback,
void *aContext) void *aContext)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().RegisterParentResponseStatsCallback(aCallback, aContext); AsCoreType(aInstance).Get<Mle::Mle>().RegisterParentResponseStatsCallback(aCallback, aContext);
} }
#endif #endif
@@ -506,7 +497,7 @@ bool otThreadIsAnycastLocateInProgress(otInstance *aInstance)
otError otThreadDetachGracefully(otInstance *aInstance, otDetachGracefullyCallback aCallback, void *aContext) otError otThreadDetachGracefully(otInstance *aInstance, otDetachGracefullyCallback aCallback, void *aContext)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().DetachGracefully(aCallback, aContext); return AsCoreType(aInstance).Get<Mle::Mle>().DetachGracefully(aCallback, aContext);
} }
#if OPENTHREAD_CONFIG_DYNAMIC_STORE_FRAME_AHEAD_COUNTER_ENABLE #if OPENTHREAD_CONFIG_DYNAMIC_STORE_FRAME_AHEAD_COUNTER_ENABLE
+32 -32
View File
@@ -51,62 +51,62 @@ otError otThreadSetMaxAllowedChildren(otInstance *aInstance, uint16_t aMaxChildr
uint8_t otThreadGetMaxChildIpAddresses(otInstance *aInstance) uint8_t otThreadGetMaxChildIpAddresses(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetMaxChildIpAddresses(); return AsCoreType(aInstance).Get<Mle::Mle>().GetMaxChildIpAddresses();
} }
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
otError otThreadSetMaxChildIpAddresses(otInstance *aInstance, uint8_t aMaxIpAddresses) otError otThreadSetMaxChildIpAddresses(otInstance *aInstance, uint8_t aMaxIpAddresses)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetMaxChildIpAddresses(aMaxIpAddresses); return AsCoreType(aInstance).Get<Mle::Mle>().SetMaxChildIpAddresses(aMaxIpAddresses);
} }
#endif #endif
bool otThreadIsRouterEligible(otInstance *aInstance) bool otThreadIsRouterEligible(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().IsRouterEligible(); return AsCoreType(aInstance).Get<Mle::Mle>().IsRouterEligible();
} }
otError otThreadSetRouterEligible(otInstance *aInstance, bool aEligible) otError otThreadSetRouterEligible(otInstance *aInstance, bool aEligible)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetRouterEligible(aEligible); return AsCoreType(aInstance).Get<Mle::Mle>().SetRouterEligible(aEligible);
} }
otError otThreadSetPreferredRouterId(otInstance *aInstance, uint8_t aRouterId) otError otThreadSetPreferredRouterId(otInstance *aInstance, uint8_t aRouterId)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetPreferredRouterId(aRouterId); return AsCoreType(aInstance).Get<Mle::Mle>().SetPreferredRouterId(aRouterId);
} }
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE #if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
const otDeviceProperties *otThreadGetDeviceProperties(otInstance *aInstance) const otDeviceProperties *otThreadGetDeviceProperties(otInstance *aInstance)
{ {
return &AsCoreType(aInstance).Get<Mle::MleRouter>().GetDeviceProperties(); return &AsCoreType(aInstance).Get<Mle::Mle>().GetDeviceProperties();
} }
void otThreadSetDeviceProperties(otInstance *aInstance, const otDeviceProperties *aDeviceProperties) void otThreadSetDeviceProperties(otInstance *aInstance, const otDeviceProperties *aDeviceProperties)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetDeviceProperties(AsCoreType(aDeviceProperties)); AsCoreType(aInstance).Get<Mle::Mle>().SetDeviceProperties(AsCoreType(aDeviceProperties));
} }
#endif #endif
uint8_t otThreadGetLocalLeaderWeight(otInstance *aInstance) uint8_t otThreadGetLocalLeaderWeight(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderWeight(); return AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderWeight();
} }
void otThreadSetLocalLeaderWeight(otInstance *aInstance, uint8_t aWeight) void otThreadSetLocalLeaderWeight(otInstance *aInstance, uint8_t aWeight)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetLeaderWeight(aWeight); AsCoreType(aInstance).Get<Mle::Mle>().SetLeaderWeight(aWeight);
} }
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
uint32_t otThreadGetPreferredLeaderPartitionId(otInstance *aInstance) uint32_t otThreadGetPreferredLeaderPartitionId(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetPreferredLeaderPartitionId(); return AsCoreType(aInstance).Get<Mle::Mle>().GetPreferredLeaderPartitionId();
} }
void otThreadSetPreferredLeaderPartitionId(otInstance *aInstance, uint32_t aPartitionId) void otThreadSetPreferredLeaderPartitionId(otInstance *aInstance, uint32_t aPartitionId)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetPreferredLeaderPartitionId(aPartitionId); AsCoreType(aInstance).Get<Mle::Mle>().SetPreferredLeaderPartitionId(aPartitionId);
} }
#endif #endif
@@ -134,32 +134,32 @@ void otThreadSetContextIdReuseDelay(otInstance *aInstance, uint32_t aDelay)
uint8_t otThreadGetNetworkIdTimeout(otInstance *aInstance) uint8_t otThreadGetNetworkIdTimeout(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetNetworkIdTimeout(); return AsCoreType(aInstance).Get<Mle::Mle>().GetNetworkIdTimeout();
} }
void otThreadSetNetworkIdTimeout(otInstance *aInstance, uint8_t aTimeout) void otThreadSetNetworkIdTimeout(otInstance *aInstance, uint8_t aTimeout)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetNetworkIdTimeout(aTimeout); AsCoreType(aInstance).Get<Mle::Mle>().SetNetworkIdTimeout(aTimeout);
} }
uint8_t otThreadGetRouterUpgradeThreshold(otInstance *aInstance) uint8_t otThreadGetRouterUpgradeThreshold(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetRouterUpgradeThreshold(); return AsCoreType(aInstance).Get<Mle::Mle>().GetRouterUpgradeThreshold();
} }
void otThreadSetRouterUpgradeThreshold(otInstance *aInstance, uint8_t aThreshold) void otThreadSetRouterUpgradeThreshold(otInstance *aInstance, uint8_t aThreshold)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetRouterUpgradeThreshold(aThreshold); AsCoreType(aInstance).Get<Mle::Mle>().SetRouterUpgradeThreshold(aThreshold);
} }
uint8_t otThreadGetChildRouterLinks(otInstance *aInstance) uint8_t otThreadGetChildRouterLinks(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetChildRouterLinks(); return AsCoreType(aInstance).Get<Mle::Mle>().GetChildRouterLinks();
} }
otError otThreadSetChildRouterLinks(otInstance *aInstance, uint8_t aChildRouterLinks) otError otThreadSetChildRouterLinks(otInstance *aInstance, uint8_t aChildRouterLinks)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetChildRouterLinks(aChildRouterLinks); return AsCoreType(aInstance).Get<Mle::Mle>().SetChildRouterLinks(aChildRouterLinks);
} }
otError otThreadReleaseRouterId(otInstance *aInstance, uint8_t aRouterId) otError otThreadReleaseRouterId(otInstance *aInstance, uint8_t aRouterId)
@@ -176,32 +176,32 @@ exit:
otError otThreadBecomeRouter(otInstance *aInstance) otError otThreadBecomeRouter(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); return AsCoreType(aInstance).Get<Mle::Mle>().BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest);
} }
otError otThreadBecomeLeader(otInstance *aInstance) otError otThreadBecomeLeader(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().BecomeLeader(/* aCheckWeight */ true); return AsCoreType(aInstance).Get<Mle::Mle>().BecomeLeader(/* aCheckWeight */ true);
} }
uint8_t otThreadGetRouterDowngradeThreshold(otInstance *aInstance) uint8_t otThreadGetRouterDowngradeThreshold(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetRouterDowngradeThreshold(); return AsCoreType(aInstance).Get<Mle::Mle>().GetRouterDowngradeThreshold();
} }
void otThreadSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold) void otThreadSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetRouterDowngradeThreshold(aThreshold); AsCoreType(aInstance).Get<Mle::Mle>().SetRouterDowngradeThreshold(aThreshold);
} }
uint8_t otThreadGetRouterSelectionJitter(otInstance *aInstance) uint8_t otThreadGetRouterSelectionJitter(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetRouterSelectionJitter(); return AsCoreType(aInstance).Get<Mle::Mle>().GetRouterSelectionJitter();
} }
void otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter) void otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetRouterSelectionJitter(aRouterJitter); AsCoreType(aInstance).Get<Mle::Mle>().SetRouterSelectionJitter(aRouterJitter);
} }
otError otThreadGetChildInfoById(otInstance *aInstance, uint16_t aChildId, otChildInfo *aChildInfo) otError otThreadGetChildInfoById(otInstance *aInstance, uint16_t aChildId, otChildInfo *aChildInfo)
@@ -260,7 +260,7 @@ otError otThreadGetNextCacheEntry(otInstance *aInstance, otCacheEntryInfo *aEntr
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE #if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
void otThreadSetSteeringData(otInstance *aInstance, const otExtAddress *aExtAddress) void otThreadSetSteeringData(otInstance *aInstance, const otExtAddress *aExtAddress)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetSteeringData(AsCoreTypePtr(aExtAddress)); AsCoreType(aInstance).Get<Mle::Mle>().SetSteeringData(AsCoreTypePtr(aExtAddress));
} }
#endif #endif
@@ -277,7 +277,7 @@ otError otThreadSetPskc(otInstance *aInstance, const otPskc *aPskc)
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
AsCoreType(aInstance).Get<KeyManager>().SetPskc(AsCoreType(aPskc)); AsCoreType(aInstance).Get<KeyManager>().SetPskc(AsCoreType(aPskc));
AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Clear(); AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Clear();
@@ -294,7 +294,7 @@ otError otThreadSetPskcRef(otInstance *aInstance, otPskcRef aKeyRef)
Instance &instance = AsCoreType(aInstance); Instance &instance = AsCoreType(aInstance);
VerifyOrExit(aKeyRef != 0, error = kErrorInvalidArgs); VerifyOrExit(aKeyRef != 0, error = kErrorInvalidArgs);
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(instance.Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
instance.Get<KeyManager>().SetPskcRef(aKeyRef); instance.Get<KeyManager>().SetPskcRef(aKeyRef);
instance.Get<MeshCoP::ActiveDatasetManager>().Clear(); instance.Get<MeshCoP::ActiveDatasetManager>().Clear();
@@ -307,12 +307,12 @@ exit:
int8_t otThreadGetParentPriority(otInstance *aInstance) int8_t otThreadGetParentPriority(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetAssignParentPriority(); return AsCoreType(aInstance).Get<Mle::Mle>().GetAssignParentPriority();
} }
otError otThreadSetParentPriority(otInstance *aInstance, int8_t aParentPriority) otError otThreadSetParentPriority(otInstance *aInstance, int8_t aParentPriority)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().SetAssignParentPriority(aParentPriority); return AsCoreType(aInstance).Get<Mle::Mle>().SetAssignParentPriority(aParentPriority);
} }
void otThreadRegisterNeighborTableCallback(otInstance *aInstance, otNeighborTableCallback aCallback) void otThreadRegisterNeighborTableCallback(otInstance *aInstance, otNeighborTableCallback aCallback)
@@ -324,7 +324,7 @@ void otThreadSetDiscoveryRequestCallback(otInstance *aInsta
otThreadDiscoveryRequestCallback aCallback, otThreadDiscoveryRequestCallback aCallback,
void *aContext) void *aContext)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetDiscoveryRequestCallback(aCallback, aContext); AsCoreType(aInstance).Get<Mle::Mle>().SetDiscoveryRequestCallback(aCallback, aContext);
} }
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
@@ -351,12 +351,12 @@ otError otThreadSendProactiveBackboneNotification(otInstance *aIns
void otThreadSetCcmEnabled(otInstance *aInstance, bool aEnabled) void otThreadSetCcmEnabled(otInstance *aInstance, bool aEnabled)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetCcmEnabled(aEnabled); AsCoreType(aInstance).Get<Mle::Mle>().SetCcmEnabled(aEnabled);
} }
void otThreadSetThreadVersionCheckEnabled(otInstance *aInstance, bool aEnabled) void otThreadSetThreadVersionCheckEnabled(otInstance *aInstance, bool aEnabled)
{ {
AsCoreType(aInstance).Get<Mle::MleRouter>().SetThreadVersionCheckEnabled(aEnabled); AsCoreType(aInstance).Get<Mle::Mle>().SetThreadVersionCheckEnabled(aEnabled);
} }
void otThreadSetTmfOriginFilterEnabled(otInstance *aInstance, bool aEnabled) void otThreadSetTmfOriginFilterEnabled(otInstance *aInstance, bool aEnabled)
@@ -384,7 +384,7 @@ otError otThreadSetRouterIdRange(otInstance *aInstance, uint8_t aMinRouterId, ui
uint32_t otThreadGetAdvertisementTrickleIntervalMax(otInstance *aInstance) uint32_t otThreadGetAdvertisementTrickleIntervalMax(otInstance *aInstance)
{ {
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetAdvertisementTrickleIntervalMax(); return AsCoreType(aInstance).Get<Mle::Mle>().GetAdvertisementTrickleIntervalMax();
} }
#endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE #endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
+1 -1
View File
@@ -97,7 +97,7 @@ void otUdpForwardReceive(otInstance *aInstance,
{ {
Ip6::MessageInfo messageInfo; Ip6::MessageInfo messageInfo;
messageInfo.SetSockAddr(AsCoreType(aInstance).Get<Mle::MleRouter>().GetMeshLocalRloc()); messageInfo.SetSockAddr(AsCoreType(aInstance).Get<Mle::Mle>().GetMeshLocalRloc());
messageInfo.SetSockPort(aSockPort); messageInfo.SetSockPort(aSockPort);
messageInfo.SetPeerAddr(AsCoreType(aPeerAddr)); messageInfo.SetPeerAddr(AsCoreType(aPeerAddr));
messageInfo.SetPeerPort(aPeerPort); messageInfo.SetPeerPort(aPeerPort);
+8 -8
View File
@@ -176,7 +176,7 @@ Error Local::AddService(RegisterMode aMode)
{ {
case kDecideBasedOnState: case kDecideBasedOnState:
VerifyOrExit(!Get<BackboneRouter::Leader>().HasPrimary() || VerifyOrExit(!Get<BackboneRouter::Leader>().HasPrimary() ||
Get<BackboneRouter::Leader>().GetServer16() == Get<Mle::MleRouter>().GetRloc16()); Get<BackboneRouter::Leader>().GetServer16() == Get<Mle::Mle>().GetRloc16());
break; break;
case kForceRegistration: case kForceRegistration:
break; break;
@@ -213,7 +213,7 @@ void Local::SetState(State aState)
{ {
case kStateDisabled: case kStateDisabled:
// Update All Network Backbone Routers Multicast Address for both Secondary and Primary state. // Update All Network Backbone Routers Multicast Address for both Secondary and Primary state.
mAllNetworkBackboneRouters.SetMulticastNetworkPrefix(Get<Mle::MleRouter>().GetMeshLocalPrefix()); mAllNetworkBackboneRouters.SetMulticastNetworkPrefix(Get<Mle::Mle>().GetMeshLocalPrefix());
break; break;
case kStateSecondary: case kStateSecondary:
break; break;
@@ -225,7 +225,7 @@ void Local::SetState(State aState)
if (aState == kStatePrimary) if (aState == kStatePrimary)
{ {
// Add Primary Backbone Router ALOC for Primary Backbone Router. // Add Primary Backbone Router ALOC for Primary Backbone Router.
mBbrPrimaryAloc.GetAddress().SetPrefix(Get<Mle::MleRouter>().GetMeshLocalPrefix()); mBbrPrimaryAloc.GetAddress().SetPrefix(Get<Mle::Mle>().GetMeshLocalPrefix());
Get<ThreadNetif>().AddUnicastAddress(mBbrPrimaryAloc); Get<ThreadNetif>().AddUnicastAddress(mBbrPrimaryAloc);
} }
@@ -241,14 +241,14 @@ void Local::HandleBackboneRouterPrimaryUpdate(Leader::State aState, const Config
{ {
OT_UNUSED_VARIABLE(aState); OT_UNUSED_VARIABLE(aState);
VerifyOrExit(IsEnabled() && Get<Mle::MleRouter>().IsAttached()); VerifyOrExit(IsEnabled() && Get<Mle::Mle>().IsAttached());
// Wait some jitter before trying to Register. // Wait some jitter before trying to Register.
if (aConfig.mServer16 == Mle::kInvalidRloc16) if (aConfig.mServer16 == Mle::kInvalidRloc16)
{ {
mRegistrationTimeout = 1; mRegistrationTimeout = 1;
if (!Get<Mle::MleRouter>().IsLeader()) if (!Get<Mle::Mle>().IsLeader())
{ {
mRegistrationTimeout += mRegistrationTimeout +=
Random::NonCrypto::GetUint16InRange(0, static_cast<uint16_t>(mRegistrationJitter) + 1); Random::NonCrypto::GetUint16InRange(0, static_cast<uint16_t>(mRegistrationJitter) + 1);
@@ -256,7 +256,7 @@ void Local::HandleBackboneRouterPrimaryUpdate(Leader::State aState, const Config
Get<TimeTicker>().RegisterReceiver(TimeTicker::kBbrLocal); Get<TimeTicker>().RegisterReceiver(TimeTicker::kBbrLocal);
} }
else if (aConfig.mServer16 != Get<Mle::MleRouter>().GetRloc16()) else if (aConfig.mServer16 != Get<Mle::Mle>().GetRloc16())
{ {
Reset(); Reset();
} }
@@ -285,7 +285,7 @@ void Local::HandleTimeTick(void)
// Delay registration while router role transition is pending // Delay registration while router role transition is pending
// (i.e., device may soon switch from REED to router role). // (i.e., device may soon switch from REED to router role).
VerifyOrExit(!Get<Mle::MleRouter>().IsRouterRoleTransitionPending()); VerifyOrExit(!Get<Mle::Mle>().IsRouterRoleTransitionPending());
if (mRegistrationTimeout > 0) if (mRegistrationTimeout > 0)
{ {
@@ -362,7 +362,7 @@ void Local::ApplyNewMeshLocalPrefix(void)
VerifyOrExit(IsEnabled()); VerifyOrExit(IsEnabled());
Get<BackboneTmfAgent>().UnsubscribeMulticast(mAllNetworkBackboneRouters); Get<BackboneTmfAgent>().UnsubscribeMulticast(mAllNetworkBackboneRouters);
mAllNetworkBackboneRouters.SetMulticastNetworkPrefix(Get<Mle::MleRouter>().GetMeshLocalPrefix()); mAllNetworkBackboneRouters.SetMulticastNetworkPrefix(Get<Mle::Mle>().GetMeshLocalPrefix());
Get<BackboneTmfAgent>().SubscribeMulticast(mAllNetworkBackboneRouters); Get<BackboneTmfAgent>().SubscribeMulticast(mAllNetworkBackboneRouters);
exit: exit:
+3 -3
View File
@@ -495,7 +495,7 @@ bool Manager::ShouldForwardDuaToBackbone(const Ip6::Address &aAddress)
// Do not forward to Backbone if the DUA belongs to a MTD Child (which may have failed in DUA registration) // Do not forward to Backbone if the DUA belongs to a MTD Child (which may have failed in DUA registration)
VerifyOrExit(Get<NeighborTable>().FindNeighbor(aAddress) == nullptr); VerifyOrExit(Get<NeighborTable>().FindNeighbor(aAddress) == nullptr);
// Forward to Backbone only if the DUA is resolved to the PBBR's RLOC16 // Forward to Backbone only if the DUA is resolved to the PBBR's RLOC16
VerifyOrExit(Get<AddressResolver>().LookUp(aAddress) == Get<Mle::MleRouter>().GetRloc16()); VerifyOrExit(Get<AddressResolver>().LookUp(aAddress) == Get<Mle::Mle>().GetRloc16());
forwardToBackbone = true; forwardToBackbone = true;
@@ -688,7 +688,7 @@ void Manager::HandleDadBackboneAnswer(const Ip6::Address &aDua, const Ip6::Inter
{ {
Ip6::Address dest; Ip6::Address dest;
dest.SetToRoutingLocator(Get<Mle::MleRouter>().GetMeshLocalPrefix(), ndProxy->GetRloc16()); dest.SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), ndProxy->GetRloc16());
Get<AddressResolver>().SendAddressError(aDua, aMeshLocalIid, &dest); Get<AddressResolver>().SendAddressError(aDua, aMeshLocalIid, &dest);
} }
@@ -706,7 +706,7 @@ void Manager::HandleExtendedBackboneAnswer(const Ip6::Address &aDua,
{ {
Ip6::Address dest; Ip6::Address dest;
dest.SetToRoutingLocator(Get<Mle::MleRouter>().GetMeshLocalPrefix(), aSrcRloc16); dest.SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), aSrcRloc16);
Get<AddressResolver>().SendAddressQueryResponse(aDua, aMeshLocalIid, &aTimeSinceLastTransaction, dest); Get<AddressResolver>().SendAddressQueryResponse(aDua, aMeshLocalIid, &aTimeSinceLastTransaction, dest);
LogInfo("HandleExtendedBackboneAnswer: target=%s, mliid=%s, LTT=%lus, rloc16=%04x", aDua.ToString().AsCString(), LogInfo("HandleExtendedBackboneAnswer: target=%s, mliid=%s, LTT=%lus, rloc16=%04x", aDua.ToString().AsCString(),
+1 -1
View File
@@ -281,7 +281,7 @@ exit:
void RoutingManager::EvaluateState(void) void RoutingManager::EvaluateState(void)
{ {
if (mIsEnabled && Get<Mle::MleRouter>().IsAttached() && mInfraIf.IsRunning()) if (mIsEnabled && Get<Mle::Mle>().IsAttached() && mInfraIf.IsRunning())
{ {
Start(); Start();
} }
+2 -2
View File
@@ -74,9 +74,9 @@ void TimeTicker::HandleTimer(void)
} }
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (mReceivers & Mask(kMleRouter)) if (mReceivers & Mask(kMle))
{ {
Get<Mle::MleRouter>().HandleTimeTick(); Get<Mle::Mle>().HandleTimeTick();
} }
if (mReceivers & Mask(kAddressResolver)) if (mReceivers & Mask(kAddressResolver))
+1 -1
View File
@@ -62,7 +62,7 @@ public:
enum Receiver : uint8_t enum Receiver : uint8_t
{ {
kMeshForwarder, ///< `MeshForwarder` kMeshForwarder, ///< `MeshForwarder`
kMleRouter, ///< `Mle::MleRouter` kMle, ///< `Mle::Mle`
kAddressResolver, ///< `AddressResolver` kAddressResolver, ///< `AddressResolver`
kChildSupervisor, ///< `ChildSupervisor` kChildSupervisor, ///< `ChildSupervisor`
kIp6FragmentReassembler, ///< `Ip6::Ip6` (handling of fragmented messages) kIp6FragmentReassembler, ///< `Ip6::Ip6` (handling of fragmented messages)
+4 -4
View File
@@ -146,7 +146,7 @@ Instance::Instance(void)
, mLowpan(*this) , mLowpan(*this)
, mMac(*this) , mMac(*this)
, mMeshForwarder(*this) , mMeshForwarder(*this)
, mMleRouter(*this) , mMle(*this)
, mDiscoverScanner(*this) , mDiscoverScanner(*this)
, mAddressResolver(*this) , mAddressResolver(*this)
#if OPENTHREAD_CONFIG_MULTI_RADIO #if OPENTHREAD_CONFIG_MULTI_RADIO
@@ -403,7 +403,7 @@ void Instance::AfterInit(void)
// Restore datasets and network information // Restore datasets and network information
Get<Settings>().Init(); Get<Settings>().Init();
Get<Mle::MleRouter>().Restore(); Get<Mle::Mle>().Restore();
#if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE #if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
Get<Trel::Link>().AfterInit(); Get<Trel::Link>().AfterInit();
@@ -470,7 +470,7 @@ Error Instance::ErasePersistentInfo(void)
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState); VerifyOrExit(Get<Mle::Mle>().IsDisabled(), error = kErrorInvalidState);
Get<Settings>().Wipe(); Get<Settings>().Wipe();
#if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
Get<KeyManager>().DestroyTemporaryKeys(); Get<KeyManager>().DestroyTemporaryKeys();
@@ -496,7 +496,7 @@ void Instance::GetBufferInfo(BufferInfo &aInfo)
Get<Ip6::Mpl>().GetBufferedMessageSetInfo(aInfo.mMplQueue); Get<Ip6::Mpl>().GetBufferedMessageSetInfo(aInfo.mMplQueue);
#endif #endif
Get<Mle::MleRouter>().GetMessageQueueInfo(aInfo.mMleQueue); Get<Mle::Mle>().GetMessageQueueInfo(aInfo.mMleQueue);
Get<Tmf::Agent>().GetRequestAndCachedResponsesQueueInfo(aInfo.mCoapQueue); Get<Tmf::Agent>().GetRequestAndCachedResponsesQueueInfo(aInfo.mCoapQueue);
+6 -11
View File
@@ -122,7 +122,6 @@
#include "thread/link_quality.hpp" #include "thread/link_quality.hpp"
#include "thread/mesh_forwarder.hpp" #include "thread/mesh_forwarder.hpp"
#include "thread/mle.hpp" #include "thread/mle.hpp"
#include "thread/mle_router.hpp"
#include "thread/mlr_manager.hpp" #include "thread/mlr_manager.hpp"
#include "thread/network_data_local.hpp" #include "thread/network_data_local.hpp"
#include "thread/network_data_notifier.hpp" #include "thread/network_data_notifier.hpp"
@@ -551,7 +550,7 @@ private:
Lowpan::Lowpan mLowpan; Lowpan::Lowpan mLowpan;
Mac::Mac mMac; Mac::Mac mMac;
MeshForwarder mMeshForwarder; MeshForwarder mMeshForwarder;
Mle::MleRouter mMleRouter; Mle::Mle mMle;
Mle::DiscoverScanner mDiscoverScanner; Mle::DiscoverScanner mDiscoverScanner;
AddressResolver mAddressResolver; AddressResolver mAddressResolver;
@@ -770,24 +769,20 @@ template <> inline Crypto::Storage::KeyRefManager &Instance::Get(void) { return
template <> inline RadioSelector &Instance::Get(void) { return mRadioSelector; } template <> inline RadioSelector &Instance::Get(void) { return mRadioSelector; }
#endif #endif
template <> inline Mle::Mle &Instance::Get(void) { return mMleRouter; } template <> inline Mle::Mle &Instance::Get(void) { return mMle; }
#if OPENTHREAD_FTD
template <> inline Mle::MleRouter &Instance::Get(void) { return mMleRouter; }
#endif
template <> inline Mle::DiscoverScanner &Instance::Get(void) { return mDiscoverScanner; } template <> inline Mle::DiscoverScanner &Instance::Get(void) { return mDiscoverScanner; }
template <> inline NeighborTable &Instance::Get(void) { return mMleRouter.mNeighborTable; } template <> inline NeighborTable &Instance::Get(void) { return mMle.mNeighborTable; }
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
template <> inline ChildTable &Instance::Get(void) { return mMleRouter.mChildTable; } template <> inline ChildTable &Instance::Get(void) { return mMle.mChildTable; }
template <> inline RouterTable &Instance::Get(void) { return mMleRouter.mRouterTable; } template <> inline RouterTable &Instance::Get(void) { return mMle.mRouterTable; }
#endif #endif
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE #if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE
template <> inline WakeupTxScheduler &Instance::Get(void) { return mMleRouter.mWakeupTxScheduler; } template <> inline WakeupTxScheduler &Instance::Get(void) { return mMle.mWakeupTxScheduler; }
#endif #endif
template <> inline Ip6::Netif &Instance::Get(void) { return mThreadNetif; } template <> inline Ip6::Netif &Instance::Get(void) { return mThreadNetif; }
+1 -1
View File
@@ -90,7 +90,7 @@ void DataPollHandler::HandleDataPoll(Mac::RxFrame &aFrame)
uint16_t indirectMsgCount; uint16_t indirectMsgCount;
VerifyOrExit(aFrame.GetSecurityEnabled()); VerifyOrExit(aFrame.GetSecurityEnabled());
VerifyOrExit(!Get<Mle::MleRouter>().IsDetached()); VerifyOrExit(!Get<Mle::Mle>().IsDetached());
SuccessOrExit(aFrame.GetSrcAddr(macSource)); SuccessOrExit(aFrame.GetSrcAddr(macSource));
child = Get<ChildTable>().FindChild(macSource, Child::kInStateValidOrRestoring); child = Get<ChildTable>().FindChild(macSource, Child::kInStateValidOrRestoring);
+8 -8
View File
@@ -57,16 +57,16 @@ DataPollSender::DataPollSender(Instance &aInstance)
const Neighbor &DataPollSender::GetParent(void) const const Neighbor &DataPollSender::GetParent(void) const
{ {
const Neighbor &parentCandidate = Get<Mle::MleRouter>().GetParentCandidate(); const Neighbor &parentCandidate = Get<Mle::Mle>().GetParentCandidate();
return parentCandidate.IsStateValid() ? parentCandidate : Get<Mle::MleRouter>().GetParent(); return parentCandidate.IsStateValid() ? parentCandidate : Get<Mle::Mle>().GetParent();
} }
void DataPollSender::StartPolling(void) void DataPollSender::StartPolling(void)
{ {
VerifyOrExit(!mEnabled); VerifyOrExit(!mEnabled);
OT_ASSERT(!Get<Mle::MleRouter>().IsRxOnWhenIdle()); OT_ASSERT(!Get<Mle::Mle>().IsRxOnWhenIdle());
mEnabled = true; mEnabled = true;
ScheduleNextPoll(kRecalculatePollPeriod); ScheduleNextPoll(kRecalculatePollPeriod);
@@ -136,7 +136,7 @@ Error DataPollSender::GetPollDestinationAddress(Mac::Address &aDest) const
// Use extended address attaching to a new parent (i.e. parent is the parent candidate). // Use extended address attaching to a new parent (i.e. parent is the parent candidate).
if ((Get<Mac::Mac>().GetShortAddress() == Mac::kShortAddrInvalid) || if ((Get<Mac::Mac>().GetShortAddress() == Mac::kShortAddrInvalid) ||
(&parent == &Get<Mle::MleRouter>().GetParentCandidate())) (&parent == &Get<Mle::Mle>().GetParentCandidate()))
{ {
aDest.SetExtended(parent.GetExtAddress()); aDest.SetExtended(parent.GetExtAddress());
} }
@@ -206,7 +206,7 @@ void DataPollSender::HandlePollSent(Mac::TxFrame &aFrame, Error aError)
if (GetParent().IsStateInvalid()) if (GetParent().IsStateInvalid())
{ {
StopPolling(); StopPolling();
IgnoreError(Get<Mle::MleRouter>().BecomeDetached()); IgnoreError(Get<Mle::Mle>().BecomeDetached());
ExitNow(); ExitNow();
} }
@@ -328,7 +328,7 @@ void DataPollSender::ProcessTxDone(const Mac::TxFrame &aFrame, const Mac::RxFram
bool sendDataPoll = false; bool sendDataPoll = false;
VerifyOrExit(mEnabled); VerifyOrExit(mEnabled);
VerifyOrExit(Get<Mle::MleRouter>().GetParent().IsEnhancedKeepAliveSupported()); VerifyOrExit(Get<Mle::Mle>().GetParent().IsEnhancedKeepAliveSupported());
VerifyOrExit(aFrame.GetSecurityEnabled()); VerifyOrExit(aFrame.GetSecurityEnabled());
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
@@ -522,12 +522,12 @@ uint32_t DataPollSender::GetDefaultPollPeriod(void) const
uint32_t pollAhead = static_cast<uint32_t>(kRetxPollPeriod) * kMaxPollRetxAttempts; uint32_t pollAhead = static_cast<uint32_t>(kRetxPollPeriod) * kMaxPollRetxAttempts;
uint32_t period; uint32_t period;
period = Time::SecToMsec(Min(Get<Mle::MleRouter>().GetTimeout(), Time::MsecToSec(TimerMilli::kMaxDelay))); period = Time::SecToMsec(Min(Get<Mle::Mle>().GetTimeout(), Time::MsecToSec(TimerMilli::kMaxDelay)));
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE && OPENTHREAD_CONFIG_MAC_CSL_AUTO_SYNC_ENABLE #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE && OPENTHREAD_CONFIG_MAC_CSL_AUTO_SYNC_ENABLE
if (Get<Mac::Mac>().IsCslEnabled()) if (Get<Mac::Mac>().IsCslEnabled())
{ {
period = Min(period, Time::SecToMsec(Get<Mle::MleRouter>().GetCslTimeout())); period = Min(period, Time::SecToMsec(Get<Mle::Mle>().GetCslTimeout()));
pollAhead = static_cast<uint32_t>(kRetxPollPeriod); pollAhead = static_cast<uint32_t>(kRetxPollPeriod);
} }
#endif #endif
+1 -1
View File
@@ -1879,7 +1879,7 @@ void Mac::HandleReceivedFrame(RxFrame *aFrame, Error aError)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
// Allow multicasts from neighbor routers if FTD // Allow multicasts from neighbor routers if FTD
if (neighbor == nullptr && dstaddr.IsBroadcast() && Get<Mle::MleRouter>().IsFullThreadDevice()) if (neighbor == nullptr && dstaddr.IsBroadcast() && Get<Mle::Mle>().IsFullThreadDevice())
{ {
neighbor = Get<NeighborTable>().FindRxOnlyNeighborRouter(srcaddr); neighbor = Get<NeighborTable>().FindRxOnlyNeighborRouter(srcaddr);
} }
+4 -4
View File
@@ -162,7 +162,7 @@ void BorderAgent::HandleNotifierEvents(Events aEvents)
{ {
if (aEvents.Contains(kEventThreadRoleChanged)) if (aEvents.Contains(kEventThreadRoleChanged))
{ {
if (Get<Mle::MleRouter>().IsAttached()) if (Get<Mle::Mle>().IsAttached())
{ {
Start(); Start();
} }
@@ -397,8 +397,8 @@ Error BorderAgent::MeshCoPTxtEncoder::EncodeTxtData(void)
if (state.mThreadIfStatus == kThreadIfStatusActive) if (state.mThreadIfStatus == kThreadIfStatusActive)
{ {
SuccessOrExit(error = AppendTxtEntry( SuccessOrExit(
"pt", BigEndian::HostSwap32(Get<Mle::MleRouter>().GetLeaderData().GetPartitionId()))); error = AppendTxtEntry("pt", BigEndian::HostSwap32(Get<Mle::Mle>().GetLeaderData().GetPartitionId())));
if (Get<MeshCoP::ActiveDatasetManager>().GetTimestamp().IsValid()) if (Get<MeshCoP::ActiveDatasetManager>().GetTimestamp().IsValid())
{ {
SuccessOrExit(error = AppendTxtEntry("at", Get<MeshCoP::ActiveDatasetManager>().GetTimestamp())); SuccessOrExit(error = AppendTxtEntry("at", Get<MeshCoP::ActiveDatasetManager>().GetTimestamp()));
@@ -469,7 +469,7 @@ BorderAgent::MeshCoPTxtEncoder::StateBitmap BorderAgent::MeshCoPTxtEncoder::GetS
state.mConnectionMode = kConnectionModePskc; state.mConnectionMode = kConnectionModePskc;
state.mAvailability = kAvailabilityHigh; state.mAvailability = kAvailabilityHigh;
switch (Get<Mle::MleRouter>().GetRole()) switch (Get<Mle::Mle>().GetRole())
{ {
case Mle::DeviceRole::kRoleDisabled: case Mle::DeviceRole::kRoleDisabled:
state.mThreadIfStatus = kThreadIfStatusNotInitialized; state.mThreadIfStatus = kThreadIfStatusNotInitialized;
+2 -2
View File
@@ -265,7 +265,7 @@ Error Commissioner::Start(StateCallback aStateCallback, JoinerCallback aJoinerCa
{ {
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(Get<Mle::MleRouter>().IsAttached(), error = kErrorInvalidState); VerifyOrExit(Get<Mle::Mle>().IsAttached(), error = kErrorInvalidState);
VerifyOrExit(mState == kStateDisabled, error = kErrorAlready); VerifyOrExit(mState == kStateDisabled, error = kErrorAlready);
SuccessOrExit(error = Get<Tmf::SecureAgent>().Open()); SuccessOrExit(error = Get<Tmf::SecureAgent>().Open());
@@ -932,7 +932,7 @@ template <> void Commissioner::HandleTmf<kUriRelayRx>(Coap::Message &aMessage, c
aMessage.SetOffset(offsetRange.GetOffset()); aMessage.SetOffset(offsetRange.GetOffset());
SuccessOrExit(error = aMessage.SetLength(offsetRange.GetEndOffset())); SuccessOrExit(error = aMessage.SetLength(offsetRange.GetEndOffset()));
joinerMessageInfo.SetPeerAddr(Get<Mle::MleRouter>().GetMeshLocalEid()); joinerMessageInfo.SetPeerAddr(Get<Mle::Mle>().GetMeshLocalEid());
joinerMessageInfo.GetPeerAddr().SetIid(mJoinerIid); joinerMessageInfo.GetPeerAddr().SetIid(mJoinerIid);
joinerMessageInfo.SetPeerPort(mJoinerPort); joinerMessageInfo.SetPeerPort(mJoinerPort);
+3 -3
View File
@@ -229,7 +229,7 @@ Error DatasetManager::ApplyConfiguration(const Dataset &aDataset) const
#endif #endif
case Tlv::kMeshLocalPrefix: case Tlv::kMeshLocalPrefix:
Get<Mle::MleRouter>().SetMeshLocalPrefix(cur->ReadValueAs<MeshLocalPrefixTlv>()); Get<Mle::Mle>().SetMeshLocalPrefix(cur->ReadValueAs<MeshLocalPrefixTlv>());
break; break;
case Tlv::kSecurityPolicy: case Tlv::kSecurityPolicy:
@@ -324,7 +324,7 @@ void DatasetManager::SaveLocal(const Dataset &aDataset)
{ {
LocalSave(aDataset); LocalSave(aDataset);
switch (Get<Mle::MleRouter>().GetRole()) switch (Get<Mle::Mle>().GetRole())
{ {
case Mle::kRoleDisabled: case Mle::kRoleDisabled:
Restore(aDataset); Restore(aDataset);
@@ -439,7 +439,7 @@ void DatasetManager::SyncLocalWithLeader(const Dataset &aDataset)
Error error = kErrorNone; Error error = kErrorNone;
VerifyOrExit(!mMgmtPending, error = kErrorBusy); VerifyOrExit(!mMgmtPending, error = kErrorBusy);
VerifyOrExit(Get<Mle::MleRouter>().IsChild() || Get<Mle::MleRouter>().IsRouter(), error = kErrorInvalidState); VerifyOrExit(Get<Mle::Mle>().IsChild() || Get<Mle::Mle>().IsRouter(), error = kErrorInvalidState);
VerifyOrExit(mNetworkTimestamp < mLocalTimestamp, error = kErrorAlready); VerifyOrExit(mNetworkTimestamp < mLocalTimestamp, error = kErrorAlready);
+3 -3
View File
@@ -98,7 +98,7 @@ Error DatasetManager::ProcessSetOrReplaceRequest(MgmtCommand aCommand,
} }
if ((dataset.Read<MeshLocalPrefixTlv>(meshLocalPrefix) == kErrorNone) && if ((dataset.Read<MeshLocalPrefixTlv>(meshLocalPrefix) == kErrorNone) &&
(meshLocalPrefix != Get<Mle::MleRouter>().GetMeshLocalPrefix())) (meshLocalPrefix != Get<Mle::Mle>().GetMeshLocalPrefix()))
{ {
aInfo.mAffectsConnectivity = true; aInfo.mAffectsConnectivity = true;
} }
@@ -262,7 +262,7 @@ Error ActiveDatasetManager::GenerateLocal(void)
Error error = kErrorNone; Error error = kErrorNone;
Dataset dataset; Dataset dataset;
VerifyOrExit(Get<Mle::MleRouter>().IsAttached(), error = kErrorInvalidState); VerifyOrExit(Get<Mle::Mle>().IsAttached(), error = kErrorInvalidState);
VerifyOrExit(!mLocalTimestamp.IsValid(), error = kErrorAlready); VerifyOrExit(!mLocalTimestamp.IsValid(), error = kErrorAlready);
IgnoreError(Read(dataset)); IgnoreError(Read(dataset));
@@ -306,7 +306,7 @@ Error ActiveDatasetManager::GenerateLocal(void)
if (!dataset.Contains<MeshLocalPrefixTlv>()) if (!dataset.Contains<MeshLocalPrefixTlv>())
{ {
IgnoreError(dataset.Write<MeshLocalPrefixTlv>(Get<Mle::MleRouter>().GetMeshLocalPrefix())); IgnoreError(dataset.Write<MeshLocalPrefixTlv>(Get<Mle::Mle>().GetMeshLocalPrefix()));
} }
if (!dataset.Contains<NetworkKeyTlv>()) if (!dataset.Contains<NetworkKeyTlv>())
+3 -3
View File
@@ -135,7 +135,7 @@ Error Joiner::Start(const char *aPskd,
// Use random-generated extended address. // Use random-generated extended address.
randomAddress.GenerateRandom(); randomAddress.GenerateRandom();
Get<Mac::Mac>().SetExtAddress(randomAddress); Get<Mac::Mac>().SetExtAddress(randomAddress);
Get<Mle::MleRouter>().UpdateLinkLocalAddress(); Get<Mle::Mle>().UpdateLinkLocalAddress();
SuccessOrExit(error = Get<Tmf::SecureAgent>().Open(Ip6::NetifIdentifier::kNetifThreadInternal)); SuccessOrExit(error = Get<Tmf::SecureAgent>().Open(Ip6::NetifIdentifier::kNetifThreadInternal));
SuccessOrExit(error = Get<Tmf::SecureAgent>().Bind(kJoinerUdpPort)); SuccessOrExit(error = Get<Tmf::SecureAgent>().Bind(kJoinerUdpPort));
@@ -256,7 +256,7 @@ void Joiner::HandleDiscoverResult(Mle::DiscoverScanner::ScanResult *aResult)
else else
{ {
Get<Mac::Mac>().SetExtAddress(mId); Get<Mac::Mac>().SetExtAddress(mId);
Get<Mle::MleRouter>().UpdateLinkLocalAddress(); Get<Mle::Mle>().UpdateLinkLocalAddress();
mJoinerRouterIndex = 0; mJoinerRouterIndex = 0;
TryNextJoinerRouter(kErrorNone); TryNextJoinerRouter(kErrorNone);
@@ -577,7 +577,7 @@ void Joiner::HandleTimer(void)
extAddress.GenerateRandom(); extAddress.GenerateRandom();
Get<Mac::Mac>().SetExtAddress(extAddress); Get<Mac::Mac>().SetExtAddress(extAddress);
Get<Mle::MleRouter>().UpdateLinkLocalAddress(); Get<Mle::Mle>().UpdateLinkLocalAddress();
error = kErrorNone; error = kErrorNone;
break; break;
+2 -2
View File
@@ -61,7 +61,7 @@ void JoinerRouter::HandleNotifierEvents(Events aEvents)
void JoinerRouter::Start(void) void JoinerRouter::Start(void)
{ {
VerifyOrExit(Get<Mle::MleRouter>().IsFullThreadDevice()); VerifyOrExit(Get<Mle::Mle>().IsFullThreadDevice());
if (Get<NetworkData::Leader>().IsJoiningAllowed()) if (Get<NetworkData::Leader>().IsJoiningAllowed())
{ {
@@ -132,7 +132,7 @@ void JoinerRouter::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &a
SuccessOrExit(error = Tlv::Append<JoinerUdpPortTlv>(*message, aMessageInfo.GetPeerPort())); SuccessOrExit(error = Tlv::Append<JoinerUdpPortTlv>(*message, aMessageInfo.GetPeerPort()));
SuccessOrExit(error = Tlv::Append<JoinerIidTlv>(*message, aMessageInfo.GetPeerAddr().GetIid())); SuccessOrExit(error = Tlv::Append<JoinerIidTlv>(*message, aMessageInfo.GetPeerAddr().GetIid()));
SuccessOrExit(error = Tlv::Append<JoinerRouterLocatorTlv>(*message, Get<Mle::MleRouter>().GetRloc16())); SuccessOrExit(error = Tlv::Append<JoinerRouterLocatorTlv>(*message, Get<Mle::Mle>().GetRloc16()));
offsetRange.InitFromMessageOffsetToEnd(aMessage); offsetRange.InitFromMessageOffsetToEnd(aMessage);
+4 -4
View File
@@ -60,9 +60,9 @@ template <> void Leader::HandleTmf<kUriLeaderPetition>(Coap::Message &aMessage,
LogInfo("Received %s", UriToString<kUriLeaderPetition>()); LogInfo("Received %s", UriToString<kUriLeaderPetition>());
VerifyOrExit(Get<Mle::MleRouter>().IsLeader()); VerifyOrExit(Get<Mle::Mle>().IsLeader());
VerifyOrExit(Get<Mle::MleRouter>().IsRoutingLocator(aMessageInfo.GetPeerAddr())); VerifyOrExit(Get<Mle::Mle>().IsRoutingLocator(aMessageInfo.GetPeerAddr()));
SuccessOrExit(Tlv::Find<CommissionerIdTlv>(aMessage, commissionerId)); SuccessOrExit(Tlv::Find<CommissionerIdTlv>(aMessage, commissionerId));
@@ -124,7 +124,7 @@ template <> void Leader::HandleTmf<kUriLeaderKeepAlive>(Coap::Message &aMessage,
LogInfo("Received %s", UriToString<kUriLeaderKeepAlive>()); LogInfo("Received %s", UriToString<kUriLeaderKeepAlive>());
VerifyOrExit(Get<Mle::MleRouter>().IsLeader()); VerifyOrExit(Get<Mle::Mle>().IsLeader());
SuccessOrExit(Tlv::Find<StateTlv>(aMessage, state)); SuccessOrExit(Tlv::Find<StateTlv>(aMessage, state));
@@ -214,7 +214,7 @@ exit:
void Leader::HandleTimer(void) void Leader::HandleTimer(void)
{ {
VerifyOrExit(Get<Mle::MleRouter>().IsLeader()); VerifyOrExit(Get<Mle::Mle>().IsLeader());
ResignCommissioner(); ResignCommissioner();
+1 -1
View File
@@ -924,7 +924,7 @@ Error TcatAgent::HandleStartThreadInterface(void)
#endif #endif
Get<ThreadNetif>().Up(); Get<ThreadNetif>().Up();
error = Get<Mle::MleRouter>().Start(); error = Get<Mle::Mle>().Start();
exit: exit:
return error; return error;
+2 -2
View File
@@ -268,9 +268,9 @@ void Client::Solicit(uint16_t aRloc16)
#if OPENTHREAD_ENABLE_DHCP6_MULTICAST_SOLICIT #if OPENTHREAD_ENABLE_DHCP6_MULTICAST_SOLICIT
messageInfo.GetPeerAddr().SetToRealmLocalAllRoutersMulticast(); messageInfo.GetPeerAddr().SetToRealmLocalAllRoutersMulticast();
#else #else
messageInfo.GetPeerAddr().SetToRoutingLocator(Get<Mle::MleRouter>().GetMeshLocalPrefix(), aRloc16); messageInfo.GetPeerAddr().SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), aRloc16);
#endif #endif
messageInfo.SetSockAddr(Get<Mle::MleRouter>().GetMeshLocalRloc()); messageInfo.SetSockAddr(Get<Mle::Mle>().GetMeshLocalRloc());
messageInfo.mPeerPort = kDhcpServerPort; messageInfo.mPeerPort = kDhcpServerPort;
SuccessOrExit(error = mSocket.SendTo(*message, messageInfo)); SuccessOrExit(error = mSocket.SendTo(*message, messageInfo));
+2 -2
View File
@@ -54,7 +54,7 @@ Server::Server(Instance &aInstance)
Error Server::UpdateService(void) Error Server::UpdateService(void)
{ {
Error error = kErrorNone; Error error = kErrorNone;
uint16_t rloc16 = Get<Mle::MleRouter>().GetRloc16(); uint16_t rloc16 = Get<Mle::Mle>().GetRloc16();
NetworkData::Iterator iterator; NetworkData::Iterator iterator;
NetworkData::OnMeshPrefixConfig config; NetworkData::OnMeshPrefixConfig config;
Lowpan::Context lowpanContext; Lowpan::Context lowpanContext;
@@ -159,7 +159,7 @@ void Server::AddPrefixAgent(const Ip6::Prefix &aIp6Prefix, const Lowpan::Context
VerifyOrExit(newEntry != nullptr, error = kErrorNoBufs); VerifyOrExit(newEntry != nullptr, error = kErrorNoBufs);
newEntry->Set(aIp6Prefix, Get<Mle::MleRouter>().GetMeshLocalPrefix(), aContext.mContextId); newEntry->Set(aIp6Prefix, Get<Mle::Mle>().GetMeshLocalPrefix(), aContext.mContextId);
Get<ThreadNetif>().AddUnicastAddress(newEntry->GetAloc()); Get<ThreadNetif>().AddUnicastAddress(newEntry->GetAloc());
mPrefixAgentsCount++; mPrefixAgentsCount++;
+1 -1
View File
@@ -57,7 +57,7 @@ bool Filter::Accept(Message &aMessage) const
VerifyOrExit(headers.GetDestinationAddress().IsLinkLocalUnicastOrMulticast()); VerifyOrExit(headers.GetDestinationAddress().IsLinkLocalUnicastOrMulticast());
// Allow all link-local IPv6 datagrams when Thread is not enabled // Allow all link-local IPv6 datagrams when Thread is not enabled
if (Get<Mle::MleRouter>().GetRole() == Mle::kRoleDisabled) if (Get<Mle::Mle>().GetRole() == Mle::kRoleDisabled)
{ {
ExitNow(rval = true); ExitNow(rval = true);
} }
+2 -2
View File
@@ -43,7 +43,7 @@ namespace NeighborDiscovery {
void Agent::UpdateService(void) void Agent::UpdateService(void)
{ {
Error error; Error error;
uint16_t rloc16 = Get<Mle::MleRouter>().GetRloc16(); uint16_t rloc16 = Get<Mle::Mle>().GetRloc16();
NetworkData::Iterator iterator; NetworkData::Iterator iterator;
NetworkData::OnMeshPrefixConfig config; NetworkData::OnMeshPrefixConfig config;
Lowpan::Context lowpanContext; Lowpan::Context lowpanContext;
@@ -99,7 +99,7 @@ void Agent::UpdateService(void)
uint16_t aloc16 = Mle::kAloc16NeighborDiscoveryAgentStart + lowpanContext.mContextId - 1; uint16_t aloc16 = Mle::kAloc16NeighborDiscoveryAgentStart + lowpanContext.mContextId - 1;
mAloc.InitAsThreadOrigin(); mAloc.InitAsThreadOrigin();
mAloc.GetAddress().SetToAnycastLocator(Get<Mle::MleRouter>().GetMeshLocalPrefix(), aloc16); mAloc.GetAddress().SetToAnycastLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), aloc16);
mAloc.mMeshLocal = true; mAloc.mMeshLocal = true;
Get<ThreadNetif>().AddUnicastAddress(mAloc); Get<ThreadNetif>().AddUnicastAddress(mAloc);
ExitNow(); ExitNow();
+4 -4
View File
@@ -214,7 +214,7 @@ void Link::BeginTransmit(void)
{ {
uint16_t fcf = Mac::Frame::kTypeAck; uint16_t fcf = Mac::Frame::kTypeAck;
if (!Get<Mle::MleRouter>().IsRxOnWhenIdle()) if (!Get<Mle::Mle>().IsRxOnWhenIdle())
{ {
fcf |= kFcfFramePending; fcf |= kFcfFramePending;
} }
@@ -275,20 +275,20 @@ void Link::HandleTimer(void)
// router/leader during a partition merge, so it is always treated // router/leader during a partition merge, so it is always treated
// as a neighbor. // as a neighbor.
switch (Get<Mle::MleRouter>().GetRole()) switch (Get<Mle::Mle>().GetRole())
{ {
case Mle::kRoleDisabled: case Mle::kRoleDisabled:
break; break;
case Mle::kRoleDetached: case Mle::kRoleDetached:
case Mle::kRoleChild: case Mle::kRoleChild:
HandleTimer(Get<Mle::MleRouter>().GetParent()); HandleTimer(Get<Mle::Mle>().GetParent());
OT_FALL_THROUGH; OT_FALL_THROUGH;
case Mle::kRoleRouter: case Mle::kRoleRouter:
case Mle::kRoleLeader: case Mle::kRoleLeader:
HandleTimer(Get<Mle::MleRouter>().GetParentCandidate()); HandleTimer(Get<Mle::Mle>().GetParentCandidate());
break; break;
} }
} }
+6 -6
View File
@@ -123,7 +123,7 @@ Error AddressResolver::GetNextCacheEntry(EntryInfo &aInfo, Iterator &aIterator)
VerifyOrExit(entry->IsLastTransactionTimeValid()); VerifyOrExit(entry->IsLastTransactionTimeValid());
aInfo.mLastTransTime = entry->GetLastTransactionTime(); aInfo.mLastTransTime = entry->GetLastTransactionTime();
AsCoreType(&aInfo.mMeshLocalEid).SetPrefix(Get<Mle::MleRouter>().GetMeshLocalPrefix()); AsCoreType(&aInfo.mMeshLocalEid).SetPrefix(Get<Mle::Mle>().GetMeshLocalPrefix());
AsCoreType(&aInfo.mMeshLocalEid).SetIid(entry->GetMeshLocalIid()); AsCoreType(&aInfo.mMeshLocalEid).SetIid(entry->GetMeshLocalIid());
ExitNow(); ExitNow();
@@ -369,7 +369,7 @@ void AddressResolver::UpdateSnoopedCacheEntry(const Ip6::Address &aEid, uint16_t
uint16_t numNonEvictable = 0; uint16_t numNonEvictable = 0;
CacheEntry *entry; CacheEntry *entry;
VerifyOrExit(Get<Mle::MleRouter>().IsFullThreadDevice()); VerifyOrExit(Get<Mle::Mle>().IsFullThreadDevice());
#if OPENTHREAD_CONFIG_TMF_ALLOW_ADDRESS_RESOLUTION_USING_NET_DATA_SERVICES #if OPENTHREAD_CONFIG_TMF_ALLOW_ADDRESS_RESOLUTION_USING_NET_DATA_SERVICES
{ {
@@ -634,7 +634,7 @@ exit:
#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE
if (Get<BackboneRouter::Local>().IsPrimary() && Get<BackboneRouter::Leader>().IsDomainUnicast(aEid)) if (Get<BackboneRouter::Local>().IsPrimary() && Get<BackboneRouter::Leader>().IsDomainUnicast(aEid))
{ {
uint16_t selfRloc16 = Get<Mle::MleRouter>().GetRloc16(); uint16_t selfRloc16 = Get<Mle::Mle>().GetRloc16();
LogInfo("Extending %s to %s for target %s, rloc16=%04x(self)", UriToString<kUriAddressQuery>(), LogInfo("Extending %s to %s for target %s, rloc16=%04x(self)", UriToString<kUriAddressQuery>(),
UriToString<kUriBackboneQuery>(), aEid.ToString().AsCString(), selfRloc16); UriToString<kUriBackboneQuery>(), aEid.ToString().AsCString(), selfRloc16);
@@ -785,7 +785,7 @@ void AddressResolver::HandleTmf<kUriAddressError>(Coap::Message &aMessage, const
for (Ip6::Netif::UnicastAddress &address : Get<ThreadNetif>().GetUnicastAddresses()) for (Ip6::Netif::UnicastAddress &address : Get<ThreadNetif>().GetUnicastAddresses())
{ {
if (address.GetAddress() == target && Get<Mle::MleRouter>().GetMeshLocalEid().GetIid() != meshLocalIid) if (address.GetAddress() == target && Get<Mle::Mle>().GetMeshLocalEid().GetIid() != meshLocalIid)
{ {
// Target EID matches address and Mesh Local EID differs // Target EID matches address and Mesh Local EID differs
#if OPENTHREAD_CONFIG_DUA_ENABLE #if OPENTHREAD_CONFIG_DUA_ENABLE
@@ -854,7 +854,7 @@ void AddressResolver::HandleTmf<kUriAddressQuery>(Coap::Message &aMessage, const
if (Get<ThreadNetif>().HasUnicastAddress(target)) if (Get<ThreadNetif>().HasUnicastAddress(target))
{ {
SendAddressQueryResponse(target, Get<Mle::MleRouter>().GetMeshLocalEid().GetIid(), nullptr, SendAddressQueryResponse(target, Get<Mle::Mle>().GetMeshLocalEid().GetIid(), nullptr,
aMessageInfo.GetPeerAddr()); aMessageInfo.GetPeerAddr());
ExitNow(); ExitNow();
} }
@@ -903,7 +903,7 @@ void AddressResolver::SendAddressQueryResponse(const Ip6::Address &a
SuccessOrExit(error = Tlv::Append<ThreadTargetTlv>(*message, aTarget)); SuccessOrExit(error = Tlv::Append<ThreadTargetTlv>(*message, aTarget));
SuccessOrExit(error = Tlv::Append<ThreadMeshLocalEidTlv>(*message, aMeshLocalIid)); SuccessOrExit(error = Tlv::Append<ThreadMeshLocalEidTlv>(*message, aMeshLocalIid));
SuccessOrExit(error = Tlv::Append<ThreadRloc16Tlv>(*message, Get<Mle::MleRouter>().GetRloc16())); SuccessOrExit(error = Tlv::Append<ThreadRloc16Tlv>(*message, Get<Mle::Mle>().GetRloc16()));
if (aLastTransactionTime != nullptr) if (aLastTransactionTime != nullptr)
{ {
+2
View File
@@ -36,6 +36,8 @@
#include "openthread-core-config.h" #include "openthread-core-config.h"
#include <openthread/thread_ftd.h>
#include "coap/coap.hpp" #include "coap/coap.hpp"
#include "common/as_core_type.hpp" #include "common/as_core_type.hpp"
#include "common/linked_list.hpp" #include "common/linked_list.hpp"
+2 -2
View File
@@ -116,7 +116,7 @@ exit:
void AnnounceSenderBase::HandleTimer(void) void AnnounceSenderBase::HandleTimer(void)
{ {
Get<Mle::MleRouter>().SendAnnounce(mChannel); Get<Mle::Mle>().SendAnnounce(mChannel);
// Go to the next channel in the mask. If we have reached the end // Go to the next channel in the mask. If we have reached the end
// of the channel mask, we start over from the first channel in // of the channel mask, we start over from the first channel in
@@ -206,7 +206,7 @@ void AnnounceSender::HandleRoleChanged(void)
case Mle::kRoleChild: case Mle::kRoleChild:
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (Get<Mle::MleRouter>().IsRouterEligible() && Get<Mle::Mle>().IsRxOnWhenIdle()) if (Get<Mle::Mle>().IsRouterEligible() && Get<Mle::Mle>().IsRxOnWhenIdle())
{ {
break; break;
} }
+4 -4
View File
@@ -152,7 +152,7 @@ Error Child::GetMeshLocalIp6Address(Ip6::Address &aAddress) const
VerifyOrExit(!mMeshLocalIid.IsUnspecified(), error = kErrorNotFound); VerifyOrExit(!mMeshLocalIid.IsUnspecified(), error = kErrorNotFound);
aAddress.SetPrefix(Get<Mle::MleRouter>().GetMeshLocalPrefix()); aAddress.SetPrefix(Get<Mle::Mle>().GetMeshLocalPrefix());
aAddress.SetIid(mMeshLocalIid); aAddress.SetIid(mMeshLocalIid);
exit: exit:
@@ -188,7 +188,7 @@ Error Child::AddIp6Address(const Ip6::Address &aAddress)
VerifyOrExit(!aAddress.IsUnspecified(), error = kErrorInvalidArgs); VerifyOrExit(!aAddress.IsUnspecified(), error = kErrorInvalidArgs);
if (Get<Mle::MleRouter>().IsMeshLocalAddress(aAddress)) if (Get<Mle::Mle>().IsMeshLocalAddress(aAddress))
{ {
VerifyOrExit(mMeshLocalIid.IsUnspecified(), error = kErrorAlready); VerifyOrExit(mMeshLocalIid.IsUnspecified(), error = kErrorAlready);
mMeshLocalIid = aAddress.GetIid(); mMeshLocalIid = aAddress.GetIid();
@@ -207,7 +207,7 @@ Error Child::RemoveIp6Address(const Ip6::Address &aAddress)
Error error = kErrorNotFound; Error error = kErrorNotFound;
Ip6AddrEntry *entry; Ip6AddrEntry *entry;
if (Get<Mle::MleRouter>().IsMeshLocalAddress(aAddress)) if (Get<Mle::Mle>().IsMeshLocalAddress(aAddress))
{ {
if (aAddress.GetIid() == mMeshLocalIid) if (aAddress.GetIid() == mMeshLocalIid)
{ {
@@ -251,7 +251,7 @@ bool Child::HasIp6Address(const Ip6::Address &aAddress) const
VerifyOrExit(!aAddress.IsUnspecified()); VerifyOrExit(!aAddress.IsUnspecified());
if (Get<Mle::MleRouter>().IsMeshLocalAddress(aAddress)) if (Get<Mle::Mle>().IsMeshLocalAddress(aAddress))
{ {
hasAddress = (aAddress.GetIid() == mMeshLocalIid); hasAddress = (aAddress.GetIid() == mMeshLocalIid);
ExitNow(); ExitNow();
+4 -4
View File
@@ -182,8 +182,8 @@ void SupervisionListener::UpdateOnReceive(const Mac::Address &aSourceAddress, bo
{ {
// If listener is enabled and device is a child and it received a secure frame from its parent, restart the timer. // If listener is enabled and device is a child and it received a secure frame from its parent, restart the timer.
VerifyOrExit(mTimer.IsRunning() && aIsSecure && Get<Mle::MleRouter>().IsChild() && VerifyOrExit(mTimer.IsRunning() && aIsSecure && Get<Mle::Mle>().IsChild() &&
(Get<NeighborTable>().FindNeighbor(aSourceAddress) == &Get<Mle::MleRouter>().GetParent())); (Get<NeighborTable>().FindNeighbor(aSourceAddress) == &Get<Mle::Mle>().GetParent()));
RestartTimer(); RestartTimer();
@@ -193,7 +193,7 @@ exit:
void SupervisionListener::RestartTimer(void) void SupervisionListener::RestartTimer(void)
{ {
if ((mTimeout != 0) && !Get<Mle::MleRouter>().IsDisabled() && !Get<MeshForwarder>().GetRxOnWhenIdle()) if ((mTimeout != 0) && !Get<Mle::Mle>().IsDisabled() && !Get<MeshForwarder>().GetRxOnWhenIdle())
{ {
mTimer.Start(Time::SecToMsec(mTimeout)); mTimer.Start(Time::SecToMsec(mTimeout));
} }
@@ -205,7 +205,7 @@ void SupervisionListener::RestartTimer(void)
void SupervisionListener::HandleTimer(void) void SupervisionListener::HandleTimer(void)
{ {
VerifyOrExit(Get<Mle::MleRouter>().IsChild() && !Get<MeshForwarder>().GetRxOnWhenIdle()); VerifyOrExit(Get<Mle::Mle>().IsChild() && !Get<MeshForwarder>().GetRxOnWhenIdle());
LogWarn("Supervision timeout. No frame from parent in %u sec", mTimeout); LogWarn("Supervision timeout. No frame from parent in %u sec", mTimeout);
mCounter++; mCounter++;
+2 -2
View File
@@ -291,7 +291,7 @@ void DuaManager::UpdateCheckDelay(uint8_t aDelay)
void DuaManager::HandleNotifierEvents(Events aEvents) void DuaManager::HandleNotifierEvents(Events aEvents)
{ {
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
#if OPENTHREAD_CONFIG_DUA_ENABLE #if OPENTHREAD_CONFIG_DUA_ENABLE
if (aEvents.Contains(kEventThreadNetdataChanged)) if (aEvents.Contains(kEventThreadNetdataChanged))
@@ -420,7 +420,7 @@ void DuaManager::UpdateTimeTickerRegistration(void)
void DuaManager::PerformNextRegistration(void) void DuaManager::PerformNextRegistration(void)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
Coap::Message *message = nullptr; Coap::Message *message = nullptr;
Tmf::MessageInfo messageInfo(GetInstance()); Tmf::MessageInfo messageInfo(GetInstance());
Ip6::Address dua; Ip6::Address dua;
+1
View File
@@ -40,6 +40,7 @@
#include "common/non_copyable.hpp" #include "common/non_copyable.hpp"
#include "common/notifier.hpp" #include "common/notifier.hpp"
#include "common/timer.hpp" #include "common/timer.hpp"
#include "mac/mac.hpp"
#include "net/ip6_address.hpp" #include "net/ip6_address.hpp"
#include "net/udp6.hpp" #include "net/udp6.hpp"
#include "thread/thread_tlvs.hpp" #include "thread/thread_tlvs.hpp"
+4 -4
View File
@@ -230,7 +230,7 @@ void KeyManager::ResetFrameCounters(void)
Router *parent; Router *parent;
// reset parent frame counters // reset parent frame counters
parent = &Get<Mle::MleRouter>().GetParent(); parent = &Get<Mle::Mle>().GetParent();
parent->SetKeySequence(0); parent->SetKeySequence(0);
parent->GetLinkFrameCounters().Reset(); parent->GetLinkFrameCounters().Reset();
parent->SetLinkAckFrameCounter(0); parent->SetLinkAckFrameCounter(0);
@@ -473,7 +473,7 @@ void KeyManager::MacFrameCounterUsed(uint32_t aMacFrameCounter)
if (mMacFrameCounters.Get154() >= mStoredMacFrameCounter) if (mMacFrameCounters.Get154() >= mStoredMacFrameCounter)
{ {
IgnoreError(Get<Mle::MleRouter>().Store()); IgnoreError(Get<Mle::Mle>().Store());
} }
exit: exit:
@@ -490,7 +490,7 @@ void KeyManager::IncrementTrelMacFrameCounter(void)
if (mMacFrameCounters.GetTrel() >= mStoredMacFrameCounter) if (mMacFrameCounters.GetTrel() >= mStoredMacFrameCounter)
{ {
IgnoreError(Get<Mle::MleRouter>().Store()); IgnoreError(Get<Mle::Mle>().Store());
} }
} }
#endif #endif
@@ -501,7 +501,7 @@ void KeyManager::IncrementMleFrameCounter(void)
if (mMleFrameCounter >= mStoredMleFrameCounter) if (mMleFrameCounter >= mStoredMleFrameCounter)
{ {
IgnoreError(Get<Mle::MleRouter>().Store()); IgnoreError(Get<Mle::Mle>().Store());
} }
} }
+6 -6
View File
@@ -640,9 +640,9 @@ exit:
Error MeshForwarder::UpdateIp6Route(Message &aMessage) Error MeshForwarder::UpdateIp6Route(Message &aMessage)
{ {
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
Error error = kErrorNone; Error error = kErrorNone;
Ip6::Header ip6Header; Ip6::Header ip6Header;
mAddMeshHeader = false; mAddMeshHeader = false;
@@ -790,7 +790,7 @@ Mac::TxFrame *MeshForwarder::HandleFrameRequest(Mac::TxFrames &aTxFrames)
{ {
Mac::Address macDestAddr; Mac::Address macDestAddr;
macDestAddr.SetShort(Get<Mle::MleRouter>().GetParent().GetRloc16()); macDestAddr.SetShort(Get<Mle::Mle>().GetParent().GetRloc16());
PrepareEmptyFrame(*frame, macDestAddr, /* aAckRequest */ true); PrepareEmptyFrame(*frame, macDestAddr, /* aAckRequest */ true);
} }
break; break;
@@ -1172,7 +1172,7 @@ void MeshForwarder::UpdateNeighborLinkFailures(Neighbor &aNeighbor,
(aNeighbor.GetLinkFailures() >= aFailLimit)) (aNeighbor.GetLinkFailures() >= aFailLimit))
{ {
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Get<Mle::MleRouter>().RemoveRouterLink(static_cast<Router &>(aNeighbor)); Get<Mle::Mle>().RemoveRouterLink(static_cast<Router &>(aNeighbor));
#else #else
IgnoreError(Get<Mle::Mle>().BecomeDetached()); IgnoreError(Get<Mle::Mle>().BecomeDetached());
#endif #endif
@@ -1726,7 +1726,7 @@ Error MeshForwarder::SendEmptyMessage(void)
OwnedPtr<Message> messagePtr; OwnedPtr<Message> messagePtr;
VerifyOrExit(mEnabled && !Get<Mac::Mac>().GetRxOnWhenIdle() && VerifyOrExit(mEnabled && !Get<Mac::Mac>().GetRxOnWhenIdle() &&
Get<Mle::MleRouter>().GetParent().IsStateValidOrRestoring(), Get<Mle::Mle>().GetParent().IsStateValidOrRestoring(),
error = kErrorInvalidState); error = kErrorInvalidState);
messagePtr.Reset(Get<MessagePool>().Allocate(Message::kTypeMacEmptyData)); messagePtr.Reset(Get<MessagePool>().Allocate(Message::kTypeMacEmptyData));
+5 -5
View File
@@ -389,9 +389,9 @@ exit:
Error MeshForwarder::UpdateIp6RouteFtd(const Ip6::Header &aIp6Header, Message &aMessage) Error MeshForwarder::UpdateIp6RouteFtd(const Ip6::Header &aIp6Header, Message &aMessage)
{ {
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
Error error = kErrorNone; Error error = kErrorNone;
Neighbor *neighbor; Neighbor *neighbor;
mMeshDest = Mle::kInvalidRloc16; mMeshDest = Mle::kInvalidRloc16;
@@ -663,7 +663,7 @@ void MeshForwarder::ResolveRoutingLoops(uint16_t aSourceRloc16, uint16_t aDestRl
VerifyOrExit(router != nullptr); VerifyOrExit(router != nullptr);
router->SetNextHopToInvalid(); router->SetNextHopToInvalid();
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
exit: exit:
return; return;
@@ -696,7 +696,7 @@ void MeshForwarder::UpdateEidRlocCacheAndStaleChild(RxInfo &aRxInfo)
if (!Get<Mle::Mle>().HasMatchingRouterIdWith(aRxInfo.GetSrcAddr().GetShort())) if (!Get<Mle::Mle>().HasMatchingRouterIdWith(aRxInfo.GetSrcAddr().GetShort()))
{ {
Get<Mle::MleRouter>().RemoveNeighbor(*neighbor); Get<Mle::Mle>().RemoveNeighbor(*neighbor);
} }
exit: exit:
+98 -49
View File
@@ -92,6 +92,36 @@ Mle::Mle(Instance &aInstance)
, mWedAttachState(kWedDetached) , mWedAttachState(kWedDetached)
, mWedAttachTimer(aInstance) , mWedAttachTimer(aInstance)
#endif #endif
#if OPENTHREAD_FTD
, mRouterEligible(true)
, mAddressSolicitPending(false)
, mAddressSolicitRejected(false)
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
, mCcmEnabled(false)
, mThreadVersionCheckEnabled(true)
#endif
, mNetworkIdTimeout(kNetworkIdTimeout)
, mRouterUpgradeThreshold(kRouterUpgradeThreshold)
, mRouterDowngradeThreshold(kRouterDowngradeThreshold)
, mPreviousPartitionRouterIdSequence(0)
, mPreviousPartitionIdTimeout(0)
, mChildRouterLinks(kChildRouterLinks)
, mAlternateRloc16Timeout(0)
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
, mMaxChildIpAddresses(0)
#endif
, mParentPriority(kParentPriorityUnspecified)
, mNextChildId(kMaxChildId)
, mPreviousPartitionIdRouter(0)
, mPreviousPartitionId(0)
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
, mPreferredLeaderPartitionId(0)
#endif
, mAdvertiseTrickleTimer(aInstance, Mle::HandleAdvertiseTrickleTimer)
, mChildTable(aInstance)
, mRouterTable(aInstance)
, mRouterRoleRestorer(aInstance)
#endif // OPENTHREAD_FTD
{ {
mParent.Init(aInstance); mParent.Init(aInstance);
mParentCandidate.Init(aInstance); mParentCandidate.Init(aInstance);
@@ -121,6 +151,26 @@ Mle::Mle(Instance &aInstance)
mMeshLocalPrefix.Clear(); mMeshLocalPrefix.Clear();
SetMeshLocalPrefix(AsCoreType(&kMeshLocalPrefixInit)); SetMeshLocalPrefix(AsCoreType(&kMeshLocalPrefixInit));
#if OPENTHREAD_FTD
mDeviceMode.Set(mDeviceMode.Get() | DeviceMode::kModeFullThreadDevice | DeviceMode::kModeFullNetworkData);
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
mLeaderWeight = mDeviceProperties.CalculateLeaderWeight();
#else
mLeaderWeight = kDefaultLeaderWeight;
#endif
mLeaderAloc.InitAsThreadOriginMeshLocal();
SetRouterId(kInvalidRouterId);
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
mSteeringData.Clear();
#endif
#endif // OPENTHREAD_FTD
} }
Error Mle::Enable(void) Error Mle::Enable(void)
@@ -193,7 +243,7 @@ Error Mle::Start(StartMode aMode)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
else if (IsRouterRloc16(GetRloc16())) else if (IsRouterRloc16(GetRloc16()))
{ {
if (Get<MleRouter>().BecomeRouter(ThreadStatusTlv::kTooFewRouters) != kErrorNone) if (BecomeRouter(ThreadStatusTlv::kTooFewRouters) != kErrorNone)
{ {
Attach(kAnyPartition); Attach(kAnyPartition);
} }
@@ -228,7 +278,7 @@ void Mle::Stop(StopMode aMode)
Get<ThreadNetif>().RemoveUnicastAddress(mMeshLocalEid); Get<ThreadNetif>().RemoveUnicastAddress(mMeshLocalEid);
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Get<MleRouter>().mRouterRoleRestorer.Stop(); mRouterRoleRestorer.Stop();
#endif #endif
SetRole(kRoleDisabled); SetRole(kRoleDisabled);
@@ -442,8 +492,8 @@ void Mle::Restore(void)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
else else
{ {
Get<MleRouter>().SetRouterId(RouterIdFromRloc16(GetRloc16())); SetRouterId(RouterIdFromRloc16(GetRloc16()));
Get<MleRouter>().SetPreviousPartitionId(networkInfo.GetPreviousPartitionId()); SetPreviousPartitionId(networkInfo.GetPreviousPartitionId());
Get<ChildTable>().Restore(); Get<ChildTable>().Restore();
} }
#endif #endif
@@ -603,7 +653,7 @@ void Mle::Attach(AttachMode aMode)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsFullThreadDevice()) if (IsFullThreadDevice())
{ {
Get<MleRouter>().StopAdvertiseTrickleTimer(); StopAdvertiseTrickleTimer();
} }
#endif #endif
} }
@@ -695,7 +745,7 @@ void Mle::SetStateDetached(void)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsLeader()) if (IsLeader())
{ {
Get<ThreadNetif>().RemoveUnicastAddress(Get<MleRouter>().mLeaderAloc); Get<ThreadNetif>().RemoveUnicastAddress(mLeaderAloc);
} }
#endif #endif
@@ -712,8 +762,8 @@ void Mle::SetStateDetached(void)
Get<MeshForwarder>().SetRxOnWhenIdle(true); Get<MeshForwarder>().SetRxOnWhenIdle(true);
Get<Mac::Mac>().SetBeaconEnabled(false); Get<Mac::Mac>().SetBeaconEnabled(false);
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Get<MleRouter>().ClearAlternateRloc16(); ClearAlternateRloc16();
Get<MleRouter>().HandleDetachStart(); HandleDetachStart();
#endif #endif
} }
@@ -722,7 +772,7 @@ void Mle::SetStateChild(uint16_t aRloc16)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsLeader()) if (IsLeader())
{ {
Get<ThreadNetif>().RemoveUnicastAddress(Get<MleRouter>().mLeaderAloc); Get<ThreadNetif>().RemoveUnicastAddress(mLeaderAloc);
} }
#endif #endif
@@ -739,7 +789,7 @@ void Mle::SetStateChild(uint16_t aRloc16)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsFullThreadDevice()) if (IsFullThreadDevice())
{ {
Get<MleRouter>().HandleChildStart(mAttachMode); HandleChildStart(mAttachMode);
} }
#endif #endif
@@ -768,7 +818,7 @@ void Mle::InformPreviousChannel(void)
VerifyOrExit(IsChild() || IsRouter()); VerifyOrExit(IsChild() || IsRouter());
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
VerifyOrExit(!IsFullThreadDevice() || IsRouter() || !Get<MleRouter>().IsRouterRoleTransitionPending()); VerifyOrExit(!IsFullThreadDevice() || IsRouter() || !IsRouterRoleTransitionPending());
#endif #endif
mAlternatePanId = Mac::kPanIdBroadcast; mAlternatePanId = Mac::kPanIdBroadcast;
@@ -839,7 +889,7 @@ Error Mle::SetDeviceMode(DeviceMode aDeviceMode)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (!aDeviceMode.IsFullThreadDevice()) if (!aDeviceMode.IsFullThreadDevice())
{ {
Get<MleRouter>().ClearAlternateRloc16(); ClearAlternateRloc16();
} }
#endif #endif
@@ -985,7 +1035,7 @@ void Mle::SetRloc16(uint16_t aRloc16)
else else
{ {
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Get<MleRouter>().ClearAlternateRloc16(); ClearAlternateRloc16();
#endif #endif
} }
} }
@@ -1000,7 +1050,7 @@ void Mle::SetLeaderData(uint32_t aPartitionId, uint8_t aWeighting, uint8_t aLead
if (mLeaderData.GetPartitionId() != aPartitionId) if (mLeaderData.GetPartitionId() != aPartitionId)
{ {
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Get<MleRouter>().HandlePartitionChange(); HandlePartitionChange();
#endif #endif
Get<Notifier>().Signal(kEventThreadPartitionIdChanged); Get<Notifier>().Signal(kEventThreadPartitionIdChanged);
mCounters.mPartitionIdChanges++; mCounters.mPartitionIdChanges++;
@@ -1161,7 +1211,7 @@ void Mle::HandleNotifierEvents(Events aEvents)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsFullThreadDevice()) if (IsFullThreadDevice())
{ {
Get<MleRouter>().HandleNetworkDataUpdateRouter(); HandleNetworkDataUpdateRouter();
} }
else else
#endif #endif
@@ -1206,7 +1256,7 @@ void Mle::HandleNotifierEvents(Events aEvents)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (aEvents.Contains(kEventSecurityPolicyChanged)) if (aEvents.Contains(kEventSecurityPolicyChanged))
{ {
Get<MleRouter>().HandleSecurityPolicyChanged(); HandleSecurityPolicyChanged();
} }
#endif #endif
@@ -1446,9 +1496,9 @@ void Mle::HandleAttachTimer(void)
} }
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsDetached() && Get<MleRouter>().mRouterRoleRestorer.IsActive()) if (IsDetached() && mRouterRoleRestorer.IsActive())
{ {
Get<MleRouter>().mRouterRoleRestorer.HandleTimer(); mRouterRoleRestorer.HandleTimer();
ExitNow(); ExitNow();
} }
#endif #endif
@@ -1613,7 +1663,7 @@ uint32_t Mle::Reattach(void)
IgnoreError(BecomeDetached()); IgnoreError(BecomeDetached());
} }
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
else if (IsFullThreadDevice() && Get<MleRouter>().BecomeLeader(/* aCheckWeight */ false) == kErrorNone) else if (IsFullThreadDevice() && BecomeLeader(/* aCheckWeight */ false) == kErrorNone)
{ {
// do nothing // do nothing
} }
@@ -2374,7 +2424,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
{ {
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
case kCommandDiscoveryRequest: case kCommandDiscoveryRequest:
Get<MleRouter>().HandleDiscoveryRequest(rxInfo); HandleDiscoveryRequest(rxInfo);
break; break;
#endif #endif
case kCommandDiscoveryResponse: case kCommandDiscoveryResponse:
@@ -2537,27 +2587,27 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
case kCommandLinkRequest: case kCommandLinkRequest:
Get<MleRouter>().HandleLinkRequest(rxInfo); HandleLinkRequest(rxInfo);
break; break;
case kCommandLinkAccept: case kCommandLinkAccept:
Get<MleRouter>().HandleLinkAccept(rxInfo); HandleLinkAccept(rxInfo);
break; break;
case kCommandLinkAcceptAndRequest: case kCommandLinkAcceptAndRequest:
Get<MleRouter>().HandleLinkAcceptAndRequest(rxInfo); HandleLinkAcceptAndRequest(rxInfo);
break; break;
case kCommandDataRequest: case kCommandDataRequest:
Get<MleRouter>().HandleDataRequest(rxInfo); HandleDataRequest(rxInfo);
break; break;
case kCommandParentRequest: case kCommandParentRequest:
Get<MleRouter>().HandleParentRequest(rxInfo); HandleParentRequest(rxInfo);
break; break;
case kCommandChildIdRequest: case kCommandChildIdRequest:
Get<MleRouter>().HandleChildIdRequest(rxInfo); HandleChildIdRequest(rxInfo);
break; break;
#endif // OPENTHREAD_FTD #endif // OPENTHREAD_FTD
@@ -2708,14 +2758,14 @@ void Mle::ReestablishLinkWithNeighbor(Neighbor &aNeighbor)
if (IsRouterRloc16(aNeighbor.GetRloc16())) if (IsRouterRloc16(aNeighbor.GetRloc16()))
{ {
Get<MleRouter>().SendLinkRequest(static_cast<Router *>(&aNeighbor)); SendLinkRequest(static_cast<Router *>(&aNeighbor));
} }
else if (Get<ChildTable>().Contains(aNeighbor)) else if (Get<ChildTable>().Contains(aNeighbor))
{ {
Child &child = static_cast<Child &>(aNeighbor); Child &child = static_cast<Child &>(aNeighbor);
child.SetState(Child::kStateChildUpdateRequest); child.SetState(Child::kStateChildUpdateRequest);
IgnoreError(Get<MleRouter>().SendChildUpdateRequestToChild(child)); IgnoreError(SendChildUpdateRequestToChild(child));
} }
#endif #endif
@@ -2741,7 +2791,7 @@ void Mle::HandleAdvertisement(RxInfo &aRxInfo)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsFullThreadDevice()) if (IsFullThreadDevice())
{ {
SuccessOrExit(error = Get<MleRouter>().HandleAdvertisementOnFtd(aRxInfo, sourceAddress, leaderData)); SuccessOrExit(error = HandleAdvertisementOnFtd(aRxInfo, sourceAddress, leaderData));
} }
#endif #endif
@@ -2762,7 +2812,7 @@ void Mle::HandleAdvertisement(RxInfo &aRxInfo)
SetLeaderData(leaderData); SetLeaderData(leaderData);
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
SuccessOrExit(error = Get<MleRouter>().ReadAndProcessRouteTlvOnFtdChild(aRxInfo, mParent.GetRouterId())); SuccessOrExit(error = ReadAndProcessRouteTlvOnFtdChild(aRxInfo, mParent.GetRouterId()));
#endif #endif
mRetrieveNewNetworkData = true; mRetrieveNewNetworkData = true;
@@ -2808,7 +2858,7 @@ void Mle::HandleDataResponse(RxInfo &aRxInfo)
#endif #endif
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
SuccessOrExit(error = Get<MleRouter>().ReadAndProcessRouteTlvOnFtdChild(aRxInfo, mParent.GetRouterId())); SuccessOrExit(error = ReadAndProcessRouteTlvOnFtdChild(aRxInfo, mParent.GetRouterId()));
#endif #endif
error = HandleLeaderData(aRxInfo); error = HandleLeaderData(aRxInfo);
@@ -3149,8 +3199,8 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo)
case kBetterPartition: case kBetterPartition:
VerifyOrExit(!isPartitionIdSame); VerifyOrExit(!isPartitionIdSame);
VerifyOrExit(MleRouter::ComparePartitions(connectivityTlv.IsSingleton(), leaderData, VerifyOrExit(Mle::ComparePartitions(connectivityTlv.IsSingleton(), leaderData, IsSingleton(), mLeaderData) >
Get<MleRouter>().IsSingleton(), mLeaderData) > 0); 0);
break; break;
case kBetterParent: case kBetterParent:
@@ -3172,8 +3222,8 @@ void Mle::HandleParentResponse(RxInfo &aRxInfo)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsFullThreadDevice()) if (IsFullThreadDevice())
{ {
compare = MleRouter::ComparePartitions(connectivityTlv.IsSingleton(), leaderData, compare = Mle::ComparePartitions(connectivityTlv.IsSingleton(), leaderData, mParentCandidate.mIsSingleton,
mParentCandidate.mIsSingleton, mParentCandidate.mLeaderData); mParentCandidate.mLeaderData);
} }
// Only consider partitions that are the same or better // Only consider partitions that are the same or better
@@ -3313,8 +3363,7 @@ void Mle::HandleChildIdResponse(RxInfo &aRxInfo)
SetLeaderData(leaderData); SetLeaderData(leaderData);
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
SuccessOrExit(error = SuccessOrExit(error = ReadAndProcessRouteTlvOnFtdChild(aRxInfo, RouterIdFromRloc16(sourceAddress)));
Get<MleRouter>().ReadAndProcessRouteTlvOnFtdChild(aRxInfo, RouterIdFromRloc16(sourceAddress)));
#endif #endif
mParentCandidate.CopyTo(mParent); mParentCandidate.CopyTo(mParent);
@@ -3351,7 +3400,7 @@ void Mle::HandleChildUpdateRequest(RxInfo &aRxInfo)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsRouterOrLeader()) if (IsRouterOrLeader())
{ {
Get<MleRouter>().HandleChildUpdateRequestOnParent(aRxInfo); HandleChildUpdateRequestOnParent(aRxInfo);
} }
else else
#endif #endif
@@ -3474,7 +3523,7 @@ void Mle::HandleChildUpdateResponse(RxInfo &aRxInfo)
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (IsRouterOrLeader()) if (IsRouterOrLeader())
{ {
Get<MleRouter>().HandleChildUpdateResponseOnParent(aRxInfo); HandleChildUpdateResponseOnParent(aRxInfo);
} }
else else
#endif #endif
@@ -4462,7 +4511,7 @@ Error Mle::DetachGracefully(DetachCallback aCallback, void *aContext)
case kRoleRouter: case kRoleRouter:
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Get<MleRouter>().SendAddressRelease(); SendAddressRelease();
#endif #endif
break; break;
@@ -4724,16 +4773,16 @@ void Mle::DelayedSender::Execute(const Schedule &aSchedule)
ParentResponseInfo info; ParentResponseInfo info;
IgnoreError(aSchedule.Read(sizeof(Header), info)); IgnoreError(aSchedule.Read(sizeof(Header), info));
Get<MleRouter>().SendParentResponse(info); Get<Mle>().SendParentResponse(info);
break; break;
} }
case kTypeAdvertisement: case kTypeAdvertisement:
Get<MleRouter>().SendAdvertisement(header.mDestination); Get<Mle>().SendAdvertisement(header.mDestination);
break; break;
case kTypeDataResponse: case kTypeDataResponse:
Get<MleRouter>().SendMulticastDataResponse(); Get<Mle>().SendMulticastDataResponse();
break; break;
case kTypeLinkAccept: case kTypeLinkAccept:
@@ -4741,7 +4790,7 @@ void Mle::DelayedSender::Execute(const Schedule &aSchedule)
LinkAcceptInfo info; LinkAcceptInfo info;
IgnoreError(aSchedule.Read(sizeof(Header), info)); IgnoreError(aSchedule.Read(sizeof(Header), info));
IgnoreError(Get<MleRouter>().SendLinkAccept(info)); IgnoreError(Get<Mle>().SendLinkAccept(info));
break; break;
} }
@@ -4755,7 +4804,7 @@ void Mle::DelayedSender::Execute(const Schedule &aSchedule)
if (router != nullptr) if (router != nullptr)
{ {
Get<MleRouter>().SendLinkRequest(router); Get<Mle>().SendLinkRequest(router);
} }
break; break;
@@ -4766,7 +4815,7 @@ void Mle::DelayedSender::Execute(const Schedule &aSchedule)
DiscoveryResponseInfo info; DiscoveryResponseInfo info;
IgnoreError(aSchedule.Read(sizeof(Header), info)); IgnoreError(aSchedule.Read(sizeof(Header), info));
IgnoreError(Get<MleRouter>().SendDiscoveryResponse(header.mDestination, info)); IgnoreError(Get<Mle>().SendDiscoveryResponse(header.mDestination, info));
break; break;
} }
#endif // OPENTHREAD_FTD #endif // OPENTHREAD_FTD
@@ -5231,7 +5280,7 @@ Error Mle::TxMessage::AppendConnectivityTlv(void)
ConnectivityTlv tlv; ConnectivityTlv tlv;
tlv.Init(); tlv.Init();
Get<MleRouter>().FillConnectivityTlv(tlv); Get<Mle>().FillConnectivityTlv(tlv);
return tlv.AppendTo(*this); return tlv.AppendTo(*this);
} }
@@ -5321,9 +5370,9 @@ Error Mle::TxMessage::AppendSteeringDataTlv(void)
MeshCoP::SteeringData steeringData; MeshCoP::SteeringData steeringData;
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE #if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
if (!Get<MleRouter>().mSteeringData.IsEmpty()) if (!Get<Mle>().mSteeringData.IsEmpty())
{ {
steeringData = Get<MleRouter>().mSteeringData; steeringData = Get<Mle>().mSteeringData;
} }
else else
#endif #endif
+658 -7
View File
@@ -36,28 +36,41 @@
#include "openthread-core-config.h" #include "openthread-core-config.h"
#include <openthread/thread_ftd.h>
#include "coap/coap_message.hpp"
#include "common/callback.hpp" #include "common/callback.hpp"
#include "common/encoding.hpp" #include "common/encoding.hpp"
#include "common/locator.hpp" #include "common/locator.hpp"
#include "common/log.hpp" #include "common/log.hpp"
#include "common/non_copyable.hpp" #include "common/non_copyable.hpp"
#include "common/notifier.hpp" #include "common/notifier.hpp"
#include "common/time_ticker.hpp"
#include "common/timer.hpp" #include "common/timer.hpp"
#include "common/trickle_timer.hpp"
#include "crypto/aes_ccm.hpp" #include "crypto/aes_ccm.hpp"
#include "mac/mac.hpp" #include "mac/mac.hpp"
#include "mac/mac_types.hpp"
#include "mac/wakeup_tx_scheduler.hpp" #include "mac/wakeup_tx_scheduler.hpp"
#include "meshcop/dataset.hpp" #include "meshcop/dataset.hpp"
#include "meshcop/joiner_router.hpp" #include "meshcop/joiner_router.hpp"
#include "meshcop/meshcop.hpp" #include "meshcop/meshcop.hpp"
#include "meshcop/meshcop_tlvs.hpp"
#include "net/icmp6.hpp"
#include "net/udp6.hpp" #include "net/udp6.hpp"
#include "thread/child.hpp" #include "thread/child.hpp"
#include "thread/child_table.hpp"
#include "thread/link_metrics.hpp" #include "thread/link_metrics.hpp"
#include "thread/link_metrics_tlvs.hpp" #include "thread/link_metrics_tlvs.hpp"
#include "thread/mle.hpp"
#include "thread/mle_tlvs.hpp" #include "thread/mle_tlvs.hpp"
#include "thread/mle_types.hpp" #include "thread/mle_types.hpp"
#include "thread/neighbor_table.hpp" #include "thread/neighbor_table.hpp"
#include "thread/network_data_types.hpp" #include "thread/network_data_types.hpp"
#include "thread/router.hpp" #include "thread/router.hpp"
#include "thread/router_table.hpp"
#include "thread/thread_tlvs.hpp"
#include "thread/tmf.hpp"
namespace ot { namespace ot {
@@ -97,18 +110,11 @@ namespace Mle {
* @{ * @{
*/ */
#if OPENTHREAD_FTD
class MleRouter;
#endif
/** /**
* Implements MLE functionality required by the Thread EndDevices, Router, and Leader roles. * Implements MLE functionality required by the Thread EndDevices, Router, and Leader roles.
*/ */
class Mle : public InstanceLocator, private NonCopyable class Mle : public InstanceLocator, private NonCopyable
{ {
#if OPENTHREAD_FTD
friend class MleRouter;
#endif
friend class DiscoverScanner; friend class DiscoverScanner;
friend class ot::Instance; friend class ot::Instance;
friend class ot::Notifier; friend class ot::Notifier;
@@ -117,6 +123,10 @@ class Mle : public InstanceLocator, private NonCopyable
friend class ot::LinkMetrics::Initiator; friend class ot::LinkMetrics::Initiator;
#endif #endif
friend class ot::UnitTester; friend class ot::UnitTester;
#if OPENTHREAD_FTD
friend class ot::TimeTicker;
friend class Tmf::Agent;
#endif
public: public:
typedef otDetachGracefullyCallback DetachCallback; ///< Callback to signal end of graceful detach. typedef otDetachGracefullyCallback DetachCallback; ///< Callback to signal end of graceful detach.
@@ -758,6 +768,408 @@ public:
void *aCallbackContext); void *aCallbackContext);
#endif // OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE #endif // OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE
#if OPENTHREAD_FTD
/**
* Indicates whether or not the device is router-eligible.
*
* @retval true If device is router-eligible.
* @retval false If device is not router-eligible.
*/
bool IsRouterEligible(void) const;
/**
* Sets whether or not the device is router-eligible.
*
* If @p aEligible is false and the device is currently operating as a router, this call will cause the device to
* detach and attempt to reattach as a child.
*
* @param[in] aEligible TRUE to configure device router-eligible, FALSE otherwise.
*
* @retval kErrorNone Successfully set the router-eligible configuration.
* @retval kErrorNotCapable The device is not capable of becoming a router.
*/
Error SetRouterEligible(bool aEligible);
/**
* Indicates whether a node is the only router on the network.
*
* @retval TRUE It is the only router in the network.
* @retval FALSE It is a child or is not a single router in the network.
*/
bool IsSingleton(void) const;
/**
* Generates an Address Solicit request for a Router ID.
*
* @param[in] aStatus The reason for requesting a Router ID.
*
* @retval kErrorNone Successfully generated an Address Solicit message.
* @retval kErrorNotCapable Device is not capable of becoming a router
* @retval kErrorInvalidState Thread is not enabled
*/
Error BecomeRouter(ThreadStatusTlv::Status aStatus);
/**
* Becomes a leader and starts a new partition.
*
* If the device is already attached, this method can be used to attempt to take over as the leader, creating a new
* partition. For this to work, the local leader weight must be greater than the weight of the current leader. The
* @p aCheckWeight can be used to ensure that this check is performed.
*
* @param[in] aCheckWeight Check that the local leader weight is larger than the weight of the current leader.
*
* @retval kErrorNone Successfully become a Leader and started a new partition.
* @retval kErrorInvalidState Thread is not enabled.
* @retval kErrorNotCapable Device is not capable of becoming a leader (not router eligible), or
* @p aCheckWeight is true and cannot override the current leader due to its local
* leader weight being same or smaller than current leader's weight.
*/
Error BecomeLeader(bool aCheckWeight);
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
/**
* Gets the device properties which are used to determine the Leader Weight.
*
* @returns The current device properties.
*/
const DeviceProperties &GetDeviceProperties(void) const { return mDeviceProperties; }
/**
* Sets the device properties which are then used to determine and set the Leader Weight.
*
* @param[in] aDeviceProperties The device properties.
*/
void SetDeviceProperties(const DeviceProperties &aDeviceProperties);
#endif
/**
* Returns the Leader Weighting value for this Thread interface.
*
* @returns The Leader Weighting value for this Thread interface.
*/
uint8_t GetLeaderWeight(void) const { return mLeaderWeight; }
/**
* Sets the Leader Weighting value for this Thread interface.
*
* Directly sets the Leader Weight to the new value replacing its previous value (which may have been
* determined from a previous call to `SetDeviceProperties()`).
*
* @param[in] aWeight The Leader Weighting value.
*/
void SetLeaderWeight(uint8_t aWeight) { mLeaderWeight = aWeight; }
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
/**
* Returns the preferred Partition Id when operating in the Leader role for certification testing.
*
* @returns The preferred Partition Id value.
*/
uint32_t GetPreferredLeaderPartitionId(void) const { return mPreferredLeaderPartitionId; }
/**
* Sets the preferred Partition Id when operating in the Leader role for certification testing.
*
* @param[in] aPartitionId The preferred Leader Partition Id.
*/
void SetPreferredLeaderPartitionId(uint32_t aPartitionId) { mPreferredLeaderPartitionId = aPartitionId; }
#endif
/**
* Sets the preferred Router Id. Upon becoming a router/leader the node
* attempts to use this Router Id. If the preferred Router Id is not set or if it
* can not be used, a randomly generated router Id is picked.
* This property can be set when he device role is detached or disabled.
*
* @param[in] aRouterId The preferred Router Id.
*
* @retval kErrorNone Successfully set the preferred Router Id.
* @retval kErrorInvalidState Could not set (role is other than detached and disabled)
*/
Error SetPreferredRouterId(uint8_t aRouterId);
/**
* Gets the Partition Id which the device joined successfully once.
*/
uint32_t GetPreviousPartitionId(void) const { return mPreviousPartitionId; }
/**
* Sets the Partition Id which the device joins successfully.
*
* @param[in] aPartitionId The Partition Id.
*/
void SetPreviousPartitionId(uint32_t aPartitionId) { mPreviousPartitionId = aPartitionId; }
/**
* Sets the Router Id.
*
* @param[in] aRouterId The Router Id.
*/
void SetRouterId(uint8_t aRouterId);
/**
* Returns the NETWORK_ID_TIMEOUT value.
*
* @returns The NETWORK_ID_TIMEOUT value.
*/
uint8_t GetNetworkIdTimeout(void) const { return mNetworkIdTimeout; }
/**
* Sets the NETWORK_ID_TIMEOUT value.
*
* @param[in] aTimeout The NETWORK_ID_TIMEOUT value.
*/
void SetNetworkIdTimeout(uint8_t aTimeout) { mNetworkIdTimeout = aTimeout; }
/**
* Returns the ROUTER_SELECTION_JITTER value.
*
* @returns The ROUTER_SELECTION_JITTER value in seconds.
*/
uint8_t GetRouterSelectionJitter(void) const { return mRouterRoleTransition.GetJitter(); }
/**
* Sets the ROUTER_SELECTION_JITTER value.
*
* @param[in] aRouterJitter The router selection jitter value (in seconds).
*/
void SetRouterSelectionJitter(uint8_t aRouterJitter) { mRouterRoleTransition.SetJitter(aRouterJitter); }
/**
* Indicates whether or not router role transition (upgrade from REED or downgrade to REED) is pending.
*
* @retval TRUE Router role transition is pending.
* @retval FALSE Router role transition is not pending
*/
bool IsRouterRoleTransitionPending(void) const { return mRouterRoleTransition.IsPending(); }
/**
* Returns the current timeout delay in seconds till router role transition (upgrade from REED or downgrade to
* REED).
*
* @returns The timeout in seconds till router role transition, or zero if not pending role transition.
*/
uint8_t GetRouterRoleTransitionTimeout(void) const { return mRouterRoleTransition.GetTimeout(); }
/**
* Returns the ROUTER_UPGRADE_THRESHOLD value.
*
* @returns The ROUTER_UPGRADE_THRESHOLD value.
*/
uint8_t GetRouterUpgradeThreshold(void) const { return mRouterUpgradeThreshold; }
/**
* Sets the ROUTER_UPGRADE_THRESHOLD value.
*
* @param[in] aThreshold The ROUTER_UPGRADE_THRESHOLD value.
*/
void SetRouterUpgradeThreshold(uint8_t aThreshold) { mRouterUpgradeThreshold = aThreshold; }
/**
* Returns the ROUTER_DOWNGRADE_THRESHOLD value.
*
* @returns The ROUTER_DOWNGRADE_THRESHOLD value.
*/
uint8_t GetRouterDowngradeThreshold(void) const { return mRouterDowngradeThreshold; }
/**
* Sets the ROUTER_DOWNGRADE_THRESHOLD value.
*
* @param[in] aThreshold The ROUTER_DOWNGRADE_THRESHOLD value.
*/
void SetRouterDowngradeThreshold(uint8_t aThreshold) { mRouterDowngradeThreshold = aThreshold; }
/**
* Returns the MLE_CHILD_ROUTER_LINKS value.
*
* @returns The MLE_CHILD_ROUTER_LINKS value.
*/
uint8_t GetChildRouterLinks(void) const { return mChildRouterLinks; }
/**
* Sets the MLE_CHILD_ROUTER_LINKS value.
*
* @param[in] aChildRouterLinks The MLE_CHILD_ROUTER_LINKS value.
*
* @retval kErrorNone Successfully set the value.
* @retval kErrorInvalidState Thread protocols are enabled.
*/
Error SetChildRouterLinks(uint8_t aChildRouterLinks);
/**
* Returns if the REED is expected to become Router soon.
*
* @retval TRUE If the REED is going to become a Router soon.
* @retval FALSE If the REED is not going to become a Router soon.
*/
bool IsExpectedToBecomeRouterSoon(void) const;
/**
* Removes a link to a neighbor.
*
* @param[in] aNeighbor A reference to the neighbor object.
*/
void RemoveNeighbor(Neighbor &aNeighbor);
/**
* Invalidates a direct link to a neighboring router (due to failed link-layer acks).
*
* @param[in] aRouter A reference to the router object.
*/
void RemoveRouterLink(Router &aRouter);
/**
* Indicates whether or not the given Thread partition attributes are preferred.
*
* @param[in] aSingletonA Whether or not the Thread Partition A has a single router.
* @param[in] aLeaderDataA A reference to Thread Partition A's Leader Data.
* @param[in] aSingletonB Whether or not the Thread Partition B has a single router.
* @param[in] aLeaderDataB A reference to Thread Partition B's Leader Data.
*
* @retval 1 If partition A is preferred.
* @retval 0 If partition A and B have equal preference.
* @retval -1 If partition B is preferred.
*/
static int ComparePartitions(bool aSingletonA,
const LeaderData &aLeaderDataA,
bool aSingletonB,
const LeaderData &aLeaderDataB);
/**
* Fills an ConnectivityTlv.
*
* @param[out] aTlv A reference to the tlv to be filled.
*/
void FillConnectivityTlv(ConnectivityTlv &aTlv);
/**
* Schedule tx of MLE Advertisement message (unicast) to the given neighboring router after a random delay.
*
* @param[in] aRouter The router to send the Advertisement to.
*
*/
void ScheduleUnicastAdvertisementTo(const Router &aRouter);
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
/**
* Sets steering data out of band
*
* @param[in] aExtAddress Value used to set steering data
* All zeros clears steering data
* All 0xFFs sets steering data to 0xFF
* Anything else is used to compute the bloom filter
*/
void SetSteeringData(const Mac::ExtAddress *aExtAddress);
#endif
/**
* Gets the assigned parent priority.
*
* @returns The assigned parent priority value, -2 means not assigned.
*/
int8_t GetAssignParentPriority(void) const { return mParentPriority; }
/**
* Sets the parent priority.
*
* @param[in] aParentPriority The parent priority value.
*
* @retval kErrorNone Successfully set the parent priority.
* @retval kErrorInvalidArgs If the parent priority value is not among 1, 0, -1 and -2.
*/
Error SetAssignParentPriority(int8_t aParentPriority);
/**
* Gets the longest MLE Timeout TLV for all active MTD children.
*
* @param[out] aTimeout A reference to where the information is placed.
*
* @retval kErrorNone Successfully get the max child timeout
* @retval kErrorInvalidState Not an active router
* @retval kErrorNotFound NO MTD child
*/
Error GetMaxChildTimeout(uint32_t &aTimeout) const;
/**
* Sets the callback that is called when processing an MLE Discovery Request message.
*
* @param[in] aCallback A pointer to a function that is called to deliver MLE Discovery Request data.
* @param[in] aContext A pointer to application-specific context.
*/
void SetDiscoveryRequestCallback(otThreadDiscoveryRequestCallback aCallback, void *aContext)
{
mDiscoveryRequestCallback.Set(aCallback, aContext);
}
/**
* Resets the MLE Advertisement Trickle timer interval.
*/
void ResetAdvertiseInterval(void);
/**
* Updates the MLE Advertisement Trickle timer max interval (if timer is running).
*
* This is called when there is change in router table.
*/
void UpdateAdvertiseInterval(void);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
/**
* Generates an MLE Time Synchronization message.
*
* @retval kErrorNone Successfully sent an MLE Time Synchronization message.
* @retval kErrorNoBufs Insufficient buffers to generate the MLE Time Synchronization message.
*/
Error SendTimeSync(void);
#endif
/**
* Gets the maximum number of IP addresses that each MTD child may register with this device as parent.
*
* @returns The maximum number of IP addresses that each MTD child may register with this device as parent.
*/
uint8_t GetMaxChildIpAddresses(void) const;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
/**
* Sets/restores the maximum number of IP addresses that each MTD child may register with this
* device as parent.
*
* @param[in] aMaxIpAddresses The maximum number of IP addresses that each MTD child may register with this
* device as parent. 0 to clear the setting and restore the default.
*
* @retval kErrorNone Successfully set/cleared the number.
* @retval kErrorInvalidArgs If exceeds the allowed maximum number.
*/
Error SetMaxChildIpAddresses(uint8_t aMaxIpAddresses);
/**
* Sets whether the device was commissioned using CCM.
*
* @param[in] aEnabled TRUE if the device was commissioned using CCM, FALSE otherwise.
*/
void SetCcmEnabled(bool aEnabled) { mCcmEnabled = aEnabled; }
/**
* Sets whether the Security Policy TLV version-threshold for routing (VR field) is enabled.
*
* @param[in] aEnabled TRUE to enable Security Policy TLV version-threshold for routing, FALSE otherwise.
*/
void SetThreadVersionCheckEnabled(bool aEnabled) { mThreadVersionCheckEnabled = aEnabled; }
/**
* Gets the current Interval Max value used by Advertisement trickle timer.
*
* @returns The Interval Max of Advertisement trickle timer in milliseconds.
*/
uint32_t GetAdvertisementTrickleIntervalMax(void) const { return mAdvertiseTrickleTimer.GetIntervalMax(); }
#endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
#endif // OPENTHREAD_FTD
private: private:
//------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------
// Constants // Constants
@@ -832,6 +1244,65 @@ private:
static constexpr uint32_t kDefaultChildTimeout = OPENTHREAD_CONFIG_MLE_CHILD_TIMEOUT_DEFAULT; static constexpr uint32_t kDefaultChildTimeout = OPENTHREAD_CONFIG_MLE_CHILD_TIMEOUT_DEFAULT;
static constexpr uint32_t kDefaultCslTimeout = OPENTHREAD_CONFIG_CSL_TIMEOUT; static constexpr uint32_t kDefaultCslTimeout = OPENTHREAD_CONFIG_CSL_TIMEOUT;
#if OPENTHREAD_FTD
// Advertisement trickle timer constants - all times are in milliseconds.
static constexpr uint32_t kAdvIntervalMin = 1000; // I_MIN
static constexpr uint32_t kAdvIntervalNeighborMultiplier = 4000; // Multiplier for I_MAX per router neighbor
static constexpr uint32_t kAdvIntervalMaxLowerBound = 12000; // Lower bound for I_MAX
static constexpr uint32_t kAdvIntervalMaxUpperBound = 32000; // Upper bound for I_MAX
static constexpr uint32_t kReedAdvIntervalMin = 570000;
static constexpr uint32_t kReedAdvIntervalMax = 630000;
#if OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
static constexpr uint32_t kAdvIntervalMaxLogRoutes = 5000;
#endif
static constexpr uint32_t kMaxUnicastAdvertisementDelay = 1000; // Max random delay for unciast Adv tx
static constexpr uint32_t kMaxNeighborAge = 100000; // Max neighbor age on router (in msec)
static constexpr uint32_t kMaxNeighborAgeOnChild = 150000; // Max neighbor age on FTD child (in msec)
static constexpr uint32_t kMaxLeaderToRouterTimeout = 90000; // (in msec)
static constexpr uint8_t kMinDowngradeNeighbors = 7;
static constexpr uint8_t kNetworkIdTimeout = 120; // (in sec)
static constexpr uint8_t kRouterSelectionJitter = 120; // (in sec)
static constexpr uint8_t kRouterDowngradeThreshold = 23;
static constexpr uint8_t kRouterUpgradeThreshold = 16;
static constexpr uint16_t kDiscoveryMaxJitter = 250; // Max jitter delay Discovery Responses (in msec).
static constexpr uint16_t kUnsolicitedDataResponseJitter = 500; // Max delay for unsol Data Response (in msec).
static constexpr uint8_t kLeaderDowngradeExtraDelay = 10; // Extra delay to downgrade leader (in sec).
static constexpr uint8_t kDefaultLeaderWeight = 64;
static constexpr uint8_t kAlternateRloc16Timeout = 8; // Time to use alternate RLOC16 (in sec).
// Threshold to accept a router upgrade request with reason
// `kBorderRouterRequest` (number of BRs acting as router in
// Network Data).
static constexpr uint8_t kRouterUpgradeBorderRouterRequestThreshold = 2;
static constexpr uint8_t kLinkRequestMinMargin = OPENTHREAD_CONFIG_MLE_LINK_REQUEST_MARGIN_MIN;
static constexpr uint8_t kPartitionMergeMinMargin = OPENTHREAD_CONFIG_MLE_PARTITION_MERGE_MARGIN_MIN;
static constexpr uint8_t kChildRouterLinks = OPENTHREAD_CONFIG_MLE_CHILD_ROUTER_LINKS;
static constexpr uint8_t kMaxChildIpAddresses = OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD;
// Constants for gradual router link establishment (on FTD child)
struct GradualChildRouterLink
{
static constexpr uint8_t kExtraChildRouterLinks = OPENTHREAD_CONFIG_MLE_EXTRA_CHILD_ROUTER_LINKS_GRADUAL;
static constexpr uint32_t kWaitDurationAfterAttach = 300; // in seconds (5 minutes)
static constexpr uint32_t kMinLinkRequestDelay = 1500; // in msec
static constexpr uint32_t kMaxLinkRequestDelay = 10000; // in msec
static constexpr uint32_t kProbabilityPercentage = 5; // in percent
};
static constexpr uint8_t kMinCriticalChildrenCount = 6;
static constexpr uint16_t kChildSupervisionDefaultIntervalForOlderVersion =
OPENTHREAD_CONFIG_CHILD_SUPERVISION_OLDER_VERSION_CHILD_DEFAULT_INTERVAL;
static constexpr int8_t kParentPriorityHigh = 1;
static constexpr int8_t kParentPriorityMedium = 0;
static constexpr int8_t kParentPriorityLow = -1;
static constexpr int8_t kParentPriorityUnspecified = -2;
#endif // OPENTHREAD_FTD
//------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------
// Enumerations // Enumerations
@@ -1317,6 +1788,57 @@ private:
}; };
#endif // OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE #endif // OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#if OPENTHREAD_FTD
class RouterRoleTransition
{
public:
RouterRoleTransition(void);
bool IsPending(void) const { return (mTimeout != 0); }
void StartTimeout(void);
void StopTimeout(void) { mTimeout = 0; }
void IncreaseTimeout(uint8_t aIncrement) { mTimeout += aIncrement; }
uint8_t GetTimeout(void) const { return mTimeout; }
bool HandleTimeTick(void);
uint8_t GetJitter(void) const { return mJitter; }
void SetJitter(uint8_t aJitter) { mJitter = aJitter; }
private:
uint8_t mTimeout;
uint8_t mJitter;
};
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class RouterRoleRestorer : public InstanceLocator
{
// Attempts to restore the router or leader role after an MLE
// restart(e.g., after a device reboot) by sending multicast
// Link Requests.
public:
RouterRoleRestorer(Instance &aInstance);
bool IsActive(void) const { return mAttempts > 0; }
void Start(DeviceRole aPreviousRole);
void Stop(void) { mAttempts = 0; }
void HandleTimer(void);
void GenerateRandomChallenge(void) { mChallenge.GenerateRandom(); }
const TxChallenge &GetChallenge(void) const { return mChallenge; }
private:
void SendMulticastLinkRequest(void);
uint8_t mAttempts;
TxChallenge mChallenge;
};
#endif // OPENTHREAD_FTD
//------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------
// Methods // Methods
@@ -1452,6 +1974,83 @@ private:
static void LogSendError(MessageType, Error) {} static void LogSendError(MessageType, Error) {}
#endif #endif
#if OPENTHREAD_FTD
void SetAlternateRloc16(uint16_t aRloc16);
void ClearAlternateRloc16(void);
void HandleDetachStart(void);
void HandleChildStart(AttachMode aMode);
void HandleSecurityPolicyChanged(void);
void HandleLinkRequest(RxInfo &aRxInfo);
void HandleLinkAccept(RxInfo &aRxInfo);
void HandleLinkAcceptAndRequest(RxInfo &aRxInfo);
void HandleLinkAcceptVariant(RxInfo &aRxInfo, MessageType aMessageType);
Error HandleAdvertisementOnFtd(RxInfo &aRxInfo, uint16_t aSourceAddress, const LeaderData &aLeaderData);
void HandleParentRequest(RxInfo &aRxInfo);
void HandleChildIdRequest(RxInfo &aRxInfo);
void HandleChildUpdateRequestOnParent(RxInfo &aRxInfo);
void HandleChildUpdateResponseOnParent(RxInfo &aRxInfo);
void HandleDataRequest(RxInfo &aRxInfo);
void HandleNetworkDataUpdateRouter(void);
void HandleDiscoveryRequest(RxInfo &aRxInfo);
void EstablishRouterLinkOnFtdChild(Router &aRouter, RxInfo &aRxInfo, uint8_t aLinkMargin);
Error ProcessRouteTlv(const RouteTlv &aRouteTlv, RxInfo &aRxInfo);
Error ReadAndProcessRouteTlvOnFtdChild(RxInfo &aRxInfo, uint8_t aParentId);
void StopAdvertiseTrickleTimer(void);
uint32_t DetermineAdvertiseIntervalMax(void) const;
Error SendAddressSolicit(ThreadStatusTlv::Status aStatus);
void SendAddressSolicitResponse(const Coap::Message &aRequest,
ThreadStatusTlv::Status aResponseStatus,
const Router *aRouter,
const Ip6::MessageInfo &aMessageInfo);
void SendAddressRelease(void);
void SendMulticastAdvertisement(void);
void SendAdvertisement(const Ip6::Address &aDestination);
void SendLinkRequest(Router *aRouter);
Error SendLinkAccept(const LinkAcceptInfo &aInfo);
void SendParentResponse(const ParentResponseInfo &aInfo);
Error SendChildIdResponse(Child &aChild);
Error SendChildUpdateRequestToChild(Child &aChild);
void SendChildUpdateResponseToChild(Child *aChild,
const Ip6::MessageInfo &aMessageInfo,
const TlvList &aTlvList,
const RxChallenge &aChallenge);
void SendMulticastDataResponse(void);
void SendDataResponse(const Ip6::Address &aDestination,
const TlvList &aTlvList,
const Message *aRequestMessage = nullptr);
Error SendDiscoveryResponse(const Ip6::Address &aDestination, const DiscoveryResponseInfo &aInfo);
void SetStateRouter(uint16_t aRloc16);
void SetStateLeader(uint16_t aRloc16, LeaderStartMode aStartMode);
void SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, LeaderStartMode aStartMode);
void StopLeader(void);
void SynchronizeChildNetworkData(void);
Error ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild);
bool HasNeighborWithGoodLinkQuality(void) const;
void HandlePartitionChange(void);
void SetChildStateToValid(Child &aChild);
bool HasChildren(void);
void RemoveChildren(void);
bool ShouldDowngrade(uint8_t aNeighborId, const RouteTlv &aRouteTlv) const;
bool NeighborHasComparableConnectivity(const RouteTlv &aRouteTlv, uint8_t aNeighborId) const;
void HandleAdvertiseTrickleTimer(void);
void HandleAddressSolicitResponse(Coap::Message *aMessage, const Ip6::MessageInfo *aMessageInfo, Error aResult);
void HandleTimeTick(void);
template <Uri kUri> void HandleTmf(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
void SignalDuaAddressEvent(const Child &aChild, const Ip6::Address &aOldDua) const;
#endif
static bool IsMessageMleSubType(const Message &aMessage);
static bool IsMessageChildUpdateRequest(const Message &aMessage);
static void HandleAdvertiseTrickleTimer(TrickleTimer &aTimer);
static void HandleAddressSolicitResponse(void *aContext,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otError aResult);
#endif // OPENTHREAD_FTD
//------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------
// Variables // Variables
@@ -1533,8 +2132,60 @@ private:
WedAttachTimer mWedAttachTimer; WedAttachTimer mWedAttachTimer;
Callback<WakeupCallback> mWakeupCallback; Callback<WakeupCallback> mWakeupCallback;
#endif #endif
#if OPENTHREAD_FTD
bool mRouterEligible : 1;
bool mAddressSolicitPending : 1;
bool mAddressSolicitRejected : 1;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
bool mCcmEnabled : 1;
bool mThreadVersionCheckEnabled : 1;
#endif
uint8_t mRouterId;
uint8_t mPreviousRouterId;
uint8_t mNetworkIdTimeout;
uint8_t mRouterUpgradeThreshold;
uint8_t mRouterDowngradeThreshold;
uint8_t mLeaderWeight;
uint8_t mPreviousPartitionRouterIdSequence;
uint8_t mPreviousPartitionIdTimeout;
uint8_t mChildRouterLinks;
uint8_t mAlternateRloc16Timeout;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
uint8_t mMaxChildIpAddresses;
#endif
int8_t mParentPriority;
uint16_t mNextChildId;
uint32_t mPreviousPartitionIdRouter;
uint32_t mPreviousPartitionId;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
uint32_t mPreferredLeaderPartitionId;
#endif
TrickleTimer mAdvertiseTrickleTimer;
ChildTable mChildTable;
RouterTable mRouterTable;
RouterRoleRestorer mRouterRoleRestorer;
RouterRoleTransition mRouterRoleTransition;
Ip6::Netif::UnicastAddress mLeaderAloc;
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
DeviceProperties mDeviceProperties;
#endif
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
MeshCoP::SteeringData mSteeringData;
#endif
Callback<otThreadDiscoveryRequestCallback> mDiscoveryRequestCallback;
#endif // OPENTHREAD_FTD
}; };
#if OPENTHREAD_FTD
DeclareTmfHandler(Mle, kUriAddressSolicit);
DeclareTmfHandler(Mle, kUriAddressRelease);
#endif
} // namespace Mle } // namespace Mle
/** /**
@@ -30,7 +30,7 @@
* This file implements MLE functionality required for the Thread Router and Leader roles. * This file implements MLE functionality required for the Thread Router and Leader roles.
*/ */
#include "mle_router.hpp" #include "mle.hpp"
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
@@ -41,55 +41,7 @@ namespace Mle {
RegisterLogModule("Mle"); RegisterLogModule("Mle");
MleRouter::MleRouter(Instance &aInstance) void Mle::SetAlternateRloc16(uint16_t aRloc16)
: Mle(aInstance)
, mRouterEligible(true)
, mAddressSolicitPending(false)
, mAddressSolicitRejected(false)
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
, mCcmEnabled(false)
, mThreadVersionCheckEnabled(true)
#endif
, mNetworkIdTimeout(kNetworkIdTimeout)
, mRouterUpgradeThreshold(kRouterUpgradeThreshold)
, mRouterDowngradeThreshold(kRouterDowngradeThreshold)
, mPreviousPartitionRouterIdSequence(0)
, mPreviousPartitionIdTimeout(0)
, mChildRouterLinks(kChildRouterLinks)
, mAlternateRloc16Timeout(0)
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
, mMaxChildIpAddresses(0)
#endif
, mParentPriority(kParentPriorityUnspecified)
, mNextChildId(kMaxChildId)
, mPreviousPartitionIdRouter(0)
, mPreviousPartitionId(0)
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
, mPreferredLeaderPartitionId(0)
#endif
, mAdvertiseTrickleTimer(aInstance, MleRouter::HandleAdvertiseTrickleTimer)
, mChildTable(aInstance)
, mRouterTable(aInstance)
, mRouterRoleRestorer(aInstance)
{
mDeviceMode.Set(mDeviceMode.Get() | DeviceMode::kModeFullThreadDevice | DeviceMode::kModeFullNetworkData);
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
mLeaderWeight = mDeviceProperties.CalculateLeaderWeight();
#else
mLeaderWeight = kDefaultLeaderWeight;
#endif
mLeaderAloc.InitAsThreadOriginMeshLocal();
SetRouterId(kInvalidRouterId);
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
mSteeringData.Clear();
#endif
}
void MleRouter::SetAlternateRloc16(uint16_t aRloc16)
{ {
VerifyOrExit(aRloc16 != Mac::kShortAddrInvalid); VerifyOrExit(aRloc16 != Mac::kShortAddrInvalid);
@@ -102,7 +54,7 @@ exit:
return; return;
} }
void MleRouter::ClearAlternateRloc16(void) void Mle::ClearAlternateRloc16(void)
{ {
VerifyOrExit(Get<Mac::Mac>().GetAlternateShortAddress() != Mac::kShortAddrInvalid); VerifyOrExit(Get<Mac::Mac>().GetAlternateShortAddress() != Mac::kShortAddrInvalid);
@@ -113,18 +65,18 @@ exit:
mAlternateRloc16Timeout = 0; mAlternateRloc16Timeout = 0;
} }
void MleRouter::HandlePartitionChange(void) void Mle::HandlePartitionChange(void)
{ {
mPreviousPartitionId = mLeaderData.GetPartitionId(); mPreviousPartitionId = mLeaderData.GetPartitionId();
mPreviousPartitionRouterIdSequence = mRouterTable.GetRouterIdSequence(); mPreviousPartitionRouterIdSequence = mRouterTable.GetRouterIdSequence();
mPreviousPartitionIdTimeout = GetNetworkIdTimeout(); mPreviousPartitionIdTimeout = GetNetworkIdTimeout();
Get<AddressResolver>().Clear(); Get<AddressResolver>().Clear();
IgnoreError(Get<Tmf::Agent>().AbortTransaction(&MleRouter::HandleAddressSolicitResponse, this)); IgnoreError(Get<Tmf::Agent>().AbortTransaction(&Mle::HandleAddressSolicitResponse, this));
mRouterTable.Clear(); mRouterTable.Clear();
} }
bool MleRouter::IsRouterEligible(void) const bool Mle::IsRouterEligible(void) const
{ {
bool rval = false; bool rval = false;
const SecurityPolicy &secPolicy = Get<KeyManager>().GetSecurityPolicy(); const SecurityPolicy &secPolicy = Get<KeyManager>().GetSecurityPolicy();
@@ -161,7 +113,7 @@ exit:
return rval; return rval;
} }
Error MleRouter::SetRouterEligible(bool aEligible) Error Mle::SetRouterEligible(bool aEligible)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -203,7 +155,7 @@ exit:
return error; return error;
} }
void MleRouter::HandleSecurityPolicyChanged(void) void Mle::HandleSecurityPolicyChanged(void)
{ {
// If we are currently router or leader and no longer eligible to // If we are currently router or leader and no longer eligible to
// be a router (due to security policy change), we start jitter // be a router (due to security policy change), we start jitter
@@ -225,7 +177,7 @@ exit:
} }
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE #if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
void MleRouter::SetDeviceProperties(const DeviceProperties &aDeviceProperties) void Mle::SetDeviceProperties(const DeviceProperties &aDeviceProperties)
{ {
mDeviceProperties = aDeviceProperties; mDeviceProperties = aDeviceProperties;
mDeviceProperties.ClampWeightAdjustment(); mDeviceProperties.ClampWeightAdjustment();
@@ -233,7 +185,7 @@ void MleRouter::SetDeviceProperties(const DeviceProperties &aDeviceProperties)
} }
#endif #endif
Error MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus) Error Mle::BecomeRouter(ThreadStatusTlv::Status aStatus)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -264,7 +216,7 @@ exit:
return error; return error;
} }
Error MleRouter::BecomeLeader(bool aCheckWeight) Error Mle::BecomeLeader(bool aCheckWeight)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Router *router; Router *router;
@@ -321,27 +273,27 @@ exit:
return error; return error;
} }
void MleRouter::StopLeader(void) void Mle::StopLeader(void)
{ {
StopAdvertiseTrickleTimer(); StopAdvertiseTrickleTimer();
Get<ThreadNetif>().UnsubscribeAllRoutersMulticast(); Get<ThreadNetif>().UnsubscribeAllRoutersMulticast();
} }
void MleRouter::HandleDetachStart(void) void Mle::HandleDetachStart(void)
{ {
mRouterTable.ClearNeighbors(); mRouterTable.ClearNeighbors();
StopLeader(); StopLeader();
Get<TimeTicker>().UnregisterReceiver(TimeTicker::kMleRouter); Get<TimeTicker>().UnregisterReceiver(TimeTicker::kMle);
} }
void MleRouter::HandleChildStart(AttachMode aMode) void Mle::HandleChildStart(AttachMode aMode)
{ {
mAddressSolicitRejected = false; mAddressSolicitRejected = false;
mRouterRoleTransition.StartTimeout(); mRouterRoleTransition.StartTimeout();
StopLeader(); StopLeader();
Get<TimeTicker>().RegisterReceiver(TimeTicker::kMleRouter); Get<TimeTicker>().RegisterReceiver(TimeTicker::kMle);
if (mRouterEligible) if (mRouterEligible)
{ {
@@ -416,18 +368,18 @@ exit:
} }
} }
void MleRouter::SetStateRouter(uint16_t aRloc16) void Mle::SetStateRouter(uint16_t aRloc16)
{ {
// The `aStartMode` is ignored when used with `kRoleRouter` // The `aStartMode` is ignored when used with `kRoleRouter`
SetStateRouterOrLeader(kRoleRouter, aRloc16, /* aStartMode */ kStartingAsLeader); SetStateRouterOrLeader(kRoleRouter, aRloc16, /* aStartMode */ kStartingAsLeader);
} }
void MleRouter::SetStateLeader(uint16_t aRloc16, LeaderStartMode aStartMode) void Mle::SetStateLeader(uint16_t aRloc16, LeaderStartMode aStartMode)
{ {
SetStateRouterOrLeader(kRoleLeader, aRloc16, aStartMode); SetStateRouterOrLeader(kRoleLeader, aRloc16, aStartMode);
} }
void MleRouter::SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, LeaderStartMode aStartMode) void Mle::SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, LeaderStartMode aStartMode)
{ {
if (aRole == kRoleLeader) if (aRole == kRoleLeader)
{ {
@@ -449,7 +401,7 @@ void MleRouter::SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, Leade
Get<ThreadNetif>().SubscribeAllRoutersMulticast(); Get<ThreadNetif>().SubscribeAllRoutersMulticast();
mPreviousPartitionIdRouter = mLeaderData.GetPartitionId(); mPreviousPartitionIdRouter = mLeaderData.GetPartitionId();
Get<Mac::Mac>().SetBeaconEnabled(true); Get<Mac::Mac>().SetBeaconEnabled(true);
Get<TimeTicker>().RegisterReceiver(TimeTicker::kMleRouter); Get<TimeTicker>().RegisterReceiver(TimeTicker::kMle);
if (aRole == kRoleLeader) if (aRole == kRoleLeader)
{ {
@@ -473,12 +425,9 @@ void MleRouter::SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, Leade
LogNote("Partition ID 0x%lx", ToUlong(mLeaderData.GetPartitionId())); LogNote("Partition ID 0x%lx", ToUlong(mLeaderData.GetPartitionId()));
} }
void MleRouter::HandleAdvertiseTrickleTimer(TrickleTimer &aTimer) void Mle::HandleAdvertiseTrickleTimer(TrickleTimer &aTimer) { aTimer.Get<Mle>().HandleAdvertiseTrickleTimer(); }
{
aTimer.Get<MleRouter>().HandleAdvertiseTrickleTimer();
}
void MleRouter::HandleAdvertiseTrickleTimer(void) void Mle::HandleAdvertiseTrickleTimer(void)
{ {
VerifyOrExit(IsRouterEligible(), mAdvertiseTrickleTimer.Stop()); VerifyOrExit(IsRouterEligible(), mAdvertiseTrickleTimer.Stop());
@@ -488,9 +437,9 @@ exit:
return; return;
} }
void MleRouter::StopAdvertiseTrickleTimer(void) { mAdvertiseTrickleTimer.Stop(); } void Mle::StopAdvertiseTrickleTimer(void) { mAdvertiseTrickleTimer.Stop(); }
uint32_t MleRouter::DetermineAdvertiseIntervalMax(void) const uint32_t Mle::DetermineAdvertiseIntervalMax(void) const
{ {
uint32_t interval; uint32_t interval;
@@ -507,7 +456,7 @@ uint32_t MleRouter::DetermineAdvertiseIntervalMax(void) const
return interval; return interval;
} }
void MleRouter::UpdateAdvertiseInterval(void) void Mle::UpdateAdvertiseInterval(void)
{ {
if (IsRouterOrLeader() && mAdvertiseTrickleTimer.IsRunning()) if (IsRouterOrLeader() && mAdvertiseTrickleTimer.IsRunning())
{ {
@@ -515,7 +464,7 @@ void MleRouter::UpdateAdvertiseInterval(void)
} }
} }
void MleRouter::ResetAdvertiseInterval(void) void Mle::ResetAdvertiseInterval(void)
{ {
VerifyOrExit(IsRouterOrLeader()); VerifyOrExit(IsRouterOrLeader());
@@ -530,7 +479,7 @@ exit:
return; return;
} }
void MleRouter::SendMulticastAdvertisement(void) void Mle::SendMulticastAdvertisement(void)
{ {
Ip6::Address destination; Ip6::Address destination;
@@ -538,7 +487,7 @@ void MleRouter::SendMulticastAdvertisement(void)
SendAdvertisement(destination); SendAdvertisement(destination);
} }
void MleRouter::ScheduleUnicastAdvertisementTo(const Router &aRouter) void Mle::ScheduleUnicastAdvertisementTo(const Router &aRouter)
{ {
Ip6::Address destination; Ip6::Address destination;
@@ -547,7 +496,7 @@ void MleRouter::ScheduleUnicastAdvertisementTo(const Router &aRouter)
Random::NonCrypto::GetUint32InRange(0, kMaxUnicastAdvertisementDelay)); Random::NonCrypto::GetUint32InRange(0, kMaxUnicastAdvertisementDelay));
} }
void MleRouter::SendAdvertisement(const Ip6::Address &aDestination) void Mle::SendAdvertisement(const Ip6::Address &aDestination)
{ {
Error error = kErrorNone; Error error = kErrorNone;
TxMessage *message = nullptr; TxMessage *message = nullptr;
@@ -595,7 +544,7 @@ exit:
LogSendError(kTypeAdvertisement, error); LogSendError(kTypeAdvertisement, error);
} }
void MleRouter::SendLinkRequest(Router *aRouter) void Mle::SendLinkRequest(Router *aRouter)
{ {
static const uint8_t kDetachedTlvs[] = {Tlv::kAddress16, Tlv::kRoute}; static const uint8_t kDetachedTlvs[] = {Tlv::kAddress16, Tlv::kRoute};
static const uint8_t kRouterTlvs[] = {Tlv::kLinkMargin}; static const uint8_t kRouterTlvs[] = {Tlv::kLinkMargin};
@@ -677,7 +626,7 @@ exit:
FreeMessageOnError(message, error); FreeMessageOnError(message, error);
} }
void MleRouter::HandleLinkRequest(RxInfo &aRxInfo) void Mle::HandleLinkRequest(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Neighbor *neighbor = nullptr; Neighbor *neighbor = nullptr;
@@ -784,7 +733,7 @@ exit:
OT_UNUSED_VARIABLE(neighbor); OT_UNUSED_VARIABLE(neighbor);
} }
Error MleRouter::SendLinkAccept(const LinkAcceptInfo &aInfo) Error Mle::SendLinkAccept(const LinkAcceptInfo &aInfo)
{ {
static const uint8_t kRouterTlvs[] = {Tlv::kLinkMargin}; static const uint8_t kRouterTlvs[] = {Tlv::kLinkMargin};
@@ -871,14 +820,11 @@ exit:
return error; return error;
} }
void MleRouter::HandleLinkAccept(RxInfo &aRxInfo) { HandleLinkAcceptVariant(aRxInfo, kTypeLinkAccept); } void Mle::HandleLinkAccept(RxInfo &aRxInfo) { HandleLinkAcceptVariant(aRxInfo, kTypeLinkAccept); }
void MleRouter::HandleLinkAcceptAndRequest(RxInfo &aRxInfo) void Mle::HandleLinkAcceptAndRequest(RxInfo &aRxInfo) { HandleLinkAcceptVariant(aRxInfo, kTypeLinkAcceptAndRequest); }
{
HandleLinkAcceptVariant(aRxInfo, kTypeLinkAcceptAndRequest);
}
void MleRouter::HandleLinkAcceptVariant(RxInfo &aRxInfo, MessageType aMessageType) void Mle::HandleLinkAcceptVariant(RxInfo &aRxInfo, MessageType aMessageType)
{ {
// Handles "Link Accept" or "Link Accept And Request". // Handles "Link Accept" or "Link Accept And Request".
@@ -1087,7 +1033,7 @@ exit:
LogProcessError(aMessageType, error); LogProcessError(aMessageType, error);
} }
Error MleRouter::ProcessRouteTlv(const RouteTlv &aRouteTlv, RxInfo &aRxInfo) Error Mle::ProcessRouteTlv(const RouteTlv &aRouteTlv, RxInfo &aRxInfo)
{ {
// This method processes `aRouteTlv` read from an MLE message. // This method processes `aRouteTlv` read from an MLE message.
// //
@@ -1122,7 +1068,7 @@ Error MleRouter::ProcessRouteTlv(const RouteTlv &aRouteTlv, RxInfo &aRxInfo)
return error; return error;
} }
Error MleRouter::ReadAndProcessRouteTlvOnFtdChild(RxInfo &aRxInfo, uint8_t aParentId) Error Mle::ReadAndProcessRouteTlvOnFtdChild(RxInfo &aRxInfo, uint8_t aParentId)
{ {
// This method reads and processes Route TLV from message on an // This method reads and processes Route TLV from message on an
// FTD child if message contains one. It returns `kErrorNone` // FTD child if message contains one. It returns `kErrorNone`
@@ -1154,7 +1100,7 @@ exit:
return error; return error;
} }
bool MleRouter::IsSingleton(void) const bool Mle::IsSingleton(void) const
{ {
bool isSingleton = true; bool isSingleton = true;
@@ -1165,10 +1111,10 @@ exit:
return isSingleton; return isSingleton;
} }
int MleRouter::ComparePartitions(bool aSingletonA, int Mle::ComparePartitions(bool aSingletonA,
const LeaderData &aLeaderDataA, const LeaderData &aLeaderDataA,
bool aSingletonB, bool aSingletonB,
const LeaderData &aLeaderDataB) const LeaderData &aLeaderDataB)
{ {
int rval = 0; int rval = 0;
@@ -1185,7 +1131,7 @@ exit:
return rval; return rval;
} }
Error MleRouter::HandleAdvertisementOnFtd(RxInfo &aRxInfo, uint16_t aSourceAddress, const LeaderData &aLeaderData) Error Mle::HandleAdvertisementOnFtd(RxInfo &aRxInfo, uint16_t aSourceAddress, const LeaderData &aLeaderData)
{ {
// This method processes a received MLE Advertisement message on // This method processes a received MLE Advertisement message on
// an FTD device. It is called from `Mle::HandleAdvertisement()` // an FTD device. It is called from `Mle::HandleAdvertisement()`
@@ -1375,7 +1321,7 @@ exit:
return error; return error;
} }
void MleRouter::EstablishRouterLinkOnFtdChild(Router &aRouter, RxInfo &aRxInfo, uint8_t aLinkMargin) void Mle::EstablishRouterLinkOnFtdChild(Router &aRouter, RxInfo &aRxInfo, uint8_t aLinkMargin)
{ {
// Decide on an FTD child whether to establish a link with a // Decide on an FTD child whether to establish a link with a
// router upon receiving an advertisement from it. // router upon receiving an advertisement from it.
@@ -1437,7 +1383,7 @@ exit:
return; return;
} }
void MleRouter::HandleParentRequest(RxInfo &aRxInfo) void Mle::HandleParentRequest(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
uint16_t version; uint16_t version;
@@ -1537,7 +1483,7 @@ exit:
LogProcessError(kTypeParentRequest, error); LogProcessError(kTypeParentRequest, error);
} }
bool MleRouter::HasNeighborWithGoodLinkQuality(void) const bool Mle::HasNeighborWithGoodLinkQuality(void) const
{ {
bool haveNeighbor = true; bool haveNeighbor = true;
uint8_t linkMargin; uint8_t linkMargin;
@@ -1570,11 +1516,11 @@ exit:
return haveNeighbor; return haveNeighbor;
} }
void MleRouter::HandleTimeTick(void) void Mle::HandleTimeTick(void)
{ {
bool roleTransitionTimeoutExpired = false; bool roleTransitionTimeoutExpired = false;
VerifyOrExit(IsFullThreadDevice(), Get<TimeTicker>().UnregisterReceiver(TimeTicker::kMleRouter)); VerifyOrExit(IsFullThreadDevice(), Get<TimeTicker>().UnregisterReceiver(TimeTicker::kMle));
if (mPreviousPartitionIdTimeout > 0) if (mPreviousPartitionIdTimeout > 0)
{ {
@@ -1802,7 +1748,7 @@ exit:
return; return;
} }
void MleRouter::SendParentResponse(const ParentResponseInfo &aInfo) void Mle::SendParentResponse(const ParentResponseInfo &aInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
TxMessage *message = nullptr; TxMessage *message = nullptr;
@@ -1848,7 +1794,7 @@ exit:
LogSendError(kTypeParentResponse, error); LogSendError(kTypeParentResponse, error);
} }
uint8_t MleRouter::GetMaxChildIpAddresses(void) const uint8_t Mle::GetMaxChildIpAddresses(void) const
{ {
uint8_t num = kMaxChildIpAddresses; uint8_t num = kMaxChildIpAddresses;
@@ -1863,7 +1809,7 @@ uint8_t MleRouter::GetMaxChildIpAddresses(void) const
} }
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
Error MleRouter::SetMaxChildIpAddresses(uint8_t aMaxIpAddresses) Error Mle::SetMaxChildIpAddresses(uint8_t aMaxIpAddresses)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -1876,7 +1822,7 @@ exit:
} }
#endif #endif
Error MleRouter::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild) Error Mle::ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild)
{ {
Error error; Error error;
OffsetRange offsetRange; OffsetRange offsetRange;
@@ -2044,7 +1990,7 @@ exit:
} }
#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE #if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
void MleRouter::SignalDuaAddressEvent(const Child &aChild, const Ip6::Address &aOldDua) const void Mle::SignalDuaAddressEvent(const Child &aChild, const Ip6::Address &aOldDua) const
{ {
DuaManager::ChildDuaAddressEvent event = DuaManager::kAddressUnchanged; DuaManager::ChildDuaAddressEvent event = DuaManager::kAddressUnchanged;
Ip6::Address newDua; Ip6::Address newDua;
@@ -2077,14 +2023,14 @@ exit:
} }
#endif // OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE #endif // OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
bool MleRouter::IsMessageMleSubType(const Message &aMessage) { return aMessage.IsSubTypeMle(); } bool Mle::IsMessageMleSubType(const Message &aMessage) { return aMessage.IsSubTypeMle(); }
bool MleRouter::IsMessageChildUpdateRequest(const Message &aMessage) bool Mle::IsMessageChildUpdateRequest(const Message &aMessage)
{ {
return aMessage.IsMleCommand(kCommandChildUpdateRequest); return aMessage.IsMleCommand(kCommandChildUpdateRequest);
} }
void MleRouter::HandleChildIdRequest(RxInfo &aRxInfo) void Mle::HandleChildIdRequest(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Mac::ExtAddress extAddr; Mac::ExtAddress extAddr;
@@ -2245,7 +2191,7 @@ exit:
LogProcessError(kTypeChildIdRequest, error); LogProcessError(kTypeChildIdRequest, error);
} }
void MleRouter::HandleChildUpdateRequestOnParent(RxInfo &aRxInfo) void Mle::HandleChildUpdateRequestOnParent(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Mac::ExtAddress extAddr; Mac::ExtAddress extAddr;
@@ -2463,7 +2409,7 @@ exit:
LogProcessError(kTypeChildUpdateRequestOfChild, error); LogProcessError(kTypeChildUpdateRequestOfChild, error);
} }
void MleRouter::HandleChildUpdateResponseOnParent(RxInfo &aRxInfo) void Mle::HandleChildUpdateResponseOnParent(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
uint16_t sourceAddress; uint16_t sourceAddress;
@@ -2608,7 +2554,7 @@ exit:
LogProcessError(kTypeChildUpdateResponseOfChild, error); LogProcessError(kTypeChildUpdateResponseOfChild, error);
} }
void MleRouter::HandleDataRequest(RxInfo &aRxInfo) void Mle::HandleDataRequest(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
TlvList tlvList; TlvList tlvList;
@@ -2665,7 +2611,7 @@ exit:
LogProcessError(kTypeDataRequest, error); LogProcessError(kTypeDataRequest, error);
} }
void MleRouter::HandleNetworkDataUpdateRouter(void) void Mle::HandleNetworkDataUpdateRouter(void)
{ {
uint16_t delay; uint16_t delay;
@@ -2687,7 +2633,7 @@ exit:
return; return;
} }
void MleRouter::SynchronizeChildNetworkData(void) void Mle::SynchronizeChildNetworkData(void)
{ {
VerifyOrExit(IsRouterOrLeader()); VerifyOrExit(IsRouterOrLeader());
@@ -2711,7 +2657,7 @@ exit:
} }
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE #if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
void MleRouter::SetSteeringData(const Mac::ExtAddress *aExtAddress) void Mle::SetSteeringData(const Mac::ExtAddress *aExtAddress)
{ {
Mac::ExtAddress nullExtAddr; Mac::ExtAddress nullExtAddr;
Mac::ExtAddress allowAnyExtAddr; Mac::ExtAddress allowAnyExtAddr;
@@ -2738,7 +2684,7 @@ void MleRouter::SetSteeringData(const Mac::ExtAddress *aExtAddress)
} }
#endif // OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE #endif // OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
void MleRouter::HandleDiscoveryRequest(RxInfo &aRxInfo) void Mle::HandleDiscoveryRequest(RxInfo &aRxInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Tlv::ParsedInfo tlvInfo; Tlv::ParsedInfo tlvInfo;
@@ -2826,7 +2772,7 @@ exit:
LogProcessError(kTypeDiscoveryRequest, error); LogProcessError(kTypeDiscoveryRequest, error);
} }
Error MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, const DiscoveryResponseInfo &aInfo) Error Mle::SendDiscoveryResponse(const Ip6::Address &aDestination, const DiscoveryResponseInfo &aInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
TxMessage *message; TxMessage *message;
@@ -2902,7 +2848,7 @@ exit:
return error; return error;
} }
Error MleRouter::SendChildIdResponse(Child &aChild) Error Mle::SendChildIdResponse(Child &aChild)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Ip6::Address destination; Ip6::Address destination;
@@ -2994,7 +2940,7 @@ exit:
return error; return error;
} }
Error MleRouter::SendChildUpdateRequestToChild(Child &aChild) Error Mle::SendChildUpdateRequestToChild(Child &aChild)
{ {
static const uint8_t kTlvs[] = {Tlv::kTimeout, Tlv::kAddressRegistration}; static const uint8_t kTlvs[] = {Tlv::kTimeout, Tlv::kAddressRegistration};
@@ -3063,10 +3009,10 @@ exit:
return error; return error;
} }
void MleRouter::SendChildUpdateResponseToChild(Child *aChild, void Mle::SendChildUpdateResponseToChild(Child *aChild,
const Ip6::MessageInfo &aMessageInfo, const Ip6::MessageInfo &aMessageInfo,
const TlvList &aTlvList, const TlvList &aTlvList,
const RxChallenge &aChallenge) const RxChallenge &aChallenge)
{ {
Error error = kErrorNone; Error error = kErrorNone;
TxMessage *message; TxMessage *message;
@@ -3165,7 +3111,7 @@ exit:
FreeMessageOnError(message, error); FreeMessageOnError(message, error);
} }
void MleRouter::SendMulticastDataResponse(void) void Mle::SendMulticastDataResponse(void)
{ {
Ip6::Address destination; Ip6::Address destination;
TlvList tlvList; TlvList tlvList;
@@ -3175,9 +3121,7 @@ void MleRouter::SendMulticastDataResponse(void)
SendDataResponse(destination, tlvList); SendDataResponse(destination, tlvList);
} }
void MleRouter::SendDataResponse(const Ip6::Address &aDestination, void Mle::SendDataResponse(const Ip6::Address &aDestination, const TlvList &aTlvList, const Message *aRequestMessage)
const TlvList &aTlvList,
const Message *aRequestMessage)
{ {
OT_UNUSED_VARIABLE(aRequestMessage); OT_UNUSED_VARIABLE(aRequestMessage);
@@ -3239,7 +3183,7 @@ exit:
LogSendError(kTypeDataResponse, error); LogSendError(kTypeDataResponse, error);
} }
void MleRouter::RemoveRouterLink(Router &aRouter) void Mle::RemoveRouterLink(Router &aRouter)
{ {
switch (mRole) switch (mRole)
{ {
@@ -3260,7 +3204,7 @@ void MleRouter::RemoveRouterLink(Router &aRouter)
} }
} }
void MleRouter::RemoveNeighbor(Neighbor &aNeighbor) void Mle::RemoveNeighbor(Neighbor &aNeighbor)
{ {
VerifyOrExit(!aNeighbor.IsStateInvalid()); VerifyOrExit(!aNeighbor.IsStateInvalid());
@@ -3311,7 +3255,7 @@ exit:
return; return;
} }
Error MleRouter::SetPreferredRouterId(uint8_t aRouterId) Error Mle::SetPreferredRouterId(uint8_t aRouterId)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -3323,13 +3267,13 @@ exit:
return error; return error;
} }
void MleRouter::SetRouterId(uint8_t aRouterId) void Mle::SetRouterId(uint8_t aRouterId)
{ {
mRouterId = aRouterId; mRouterId = aRouterId;
mPreviousRouterId = mRouterId; mPreviousRouterId = mRouterId;
} }
Error MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus) Error Mle::SendAddressSolicit(ThreadStatusTlv::Status aStatus)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Tmf::MessageInfo messageInfo(GetInstance()); Tmf::MessageInfo messageInfo(GetInstance());
@@ -3365,7 +3309,7 @@ exit:
return error; return error;
} }
void MleRouter::SendAddressRelease(void) void Mle::SendAddressRelease(void)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Tmf::MessageInfo messageInfo(GetInstance()); Tmf::MessageInfo messageInfo(GetInstance());
@@ -3388,18 +3332,16 @@ exit:
LogSendError(kTypeAddressRelease, error); LogSendError(kTypeAddressRelease, error);
} }
void MleRouter::HandleAddressSolicitResponse(void *aContext, void Mle::HandleAddressSolicitResponse(void *aContext,
otMessage *aMessage, otMessage *aMessage,
const otMessageInfo *aMessageInfo, const otMessageInfo *aMessageInfo,
otError aResult) otError aResult)
{ {
static_cast<MleRouter *>(aContext)->HandleAddressSolicitResponse(AsCoapMessagePtr(aMessage), static_cast<Mle *>(aContext)->HandleAddressSolicitResponse(AsCoapMessagePtr(aMessage), AsCoreTypePtr(aMessageInfo),
AsCoreTypePtr(aMessageInfo), aResult); aResult);
} }
void MleRouter::HandleAddressSolicitResponse(Coap::Message *aMessage, void Mle::HandleAddressSolicitResponse(Coap::Message *aMessage, const Ip6::MessageInfo *aMessageInfo, Error aResult)
const Ip6::MessageInfo *aMessageInfo,
Error aResult)
{ {
uint8_t status; uint8_t status;
uint16_t rloc16; uint16_t rloc16;
@@ -3507,7 +3449,7 @@ exit:
InformPreviousChannel(); InformPreviousChannel();
} }
Error MleRouter::SetChildRouterLinks(uint8_t aChildRouterLinks) Error Mle::SetChildRouterLinks(uint8_t aChildRouterLinks)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -3517,7 +3459,7 @@ exit:
return error; return error;
} }
bool MleRouter::IsExpectedToBecomeRouterSoon(void) const bool Mle::IsExpectedToBecomeRouterSoon(void) const
{ {
static constexpr uint8_t kMaxDelay = 10; static constexpr uint8_t kMaxDelay = 10;
@@ -3526,7 +3468,7 @@ bool MleRouter::IsExpectedToBecomeRouterSoon(void) const
mAddressSolicitPending); mAddressSolicitPending);
} }
template <> void MleRouter::HandleTmf<kUriAddressSolicit>(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) template <> void Mle::HandleTmf<kUriAddressSolicit>(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
Error error = kErrorNone; Error error = kErrorNone;
ThreadStatusTlv::Status responseStatus = ThreadStatusTlv::kNoAddressAvailable; ThreadStatusTlv::Status responseStatus = ThreadStatusTlv::kNoAddressAvailable;
@@ -3624,10 +3566,10 @@ exit:
} }
} }
void MleRouter::SendAddressSolicitResponse(const Coap::Message &aRequest, void Mle::SendAddressSolicitResponse(const Coap::Message &aRequest,
ThreadStatusTlv::Status aResponseStatus, ThreadStatusTlv::Status aResponseStatus,
const Router *aRouter, const Router *aRouter,
const Ip6::MessageInfo &aMessageInfo) const Ip6::MessageInfo &aMessageInfo)
{ {
Coap::Message *message = Get<Tmf::Agent>().NewPriorityResponseMessage(aRequest); Coap::Message *message = Get<Tmf::Agent>().NewPriorityResponseMessage(aRequest);
@@ -3676,7 +3618,7 @@ exit:
FreeMessage(message); FreeMessage(message);
} }
template <> void MleRouter::HandleTmf<kUriAddressRelease>(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) template <> void Mle::HandleTmf<kUriAddressRelease>(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{ {
uint16_t rloc16; uint16_t rloc16;
Mac::ExtAddress extAddress; Mac::ExtAddress extAddress;
@@ -3707,7 +3649,7 @@ exit:
return; return;
} }
void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) void Mle::FillConnectivityTlv(ConnectivityTlv &aTlv)
{ {
int8_t parentPriority = kParentPriorityMedium; int8_t parentPriority = kParentPriorityMedium;
@@ -3763,7 +3705,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
aTlv.SetSedDatagramCount(OPENTHREAD_CONFIG_DEFAULT_SED_DATAGRAM_COUNT); aTlv.SetSedDatagramCount(OPENTHREAD_CONFIG_DEFAULT_SED_DATAGRAM_COUNT);
} }
bool MleRouter::ShouldDowngrade(uint8_t aNeighborId, const RouteTlv &aRouteTlv) const bool Mle::ShouldDowngrade(uint8_t aNeighborId, const RouteTlv &aRouteTlv) const
{ {
// Determine whether all conditions are satisfied for the router // Determine whether all conditions are satisfied for the router
// to downgrade after receiving info for a neighboring router // to downgrade after receiving info for a neighboring router
@@ -3825,7 +3767,7 @@ exit:
return shouldDowngrade; return shouldDowngrade;
} }
bool MleRouter::NeighborHasComparableConnectivity(const RouteTlv &aRouteTlv, uint8_t aNeighborId) const bool Mle::NeighborHasComparableConnectivity(const RouteTlv &aRouteTlv, uint8_t aNeighborId) const
{ {
// Check whether the neighboring router with Router ID `aNeighborId` // Check whether the neighboring router with Router ID `aNeighborId`
// (along with its `aRouteTlv`) has as good or better-quality links // (along with its `aRouteTlv`) has as good or better-quality links
@@ -3881,7 +3823,7 @@ exit:
return isComparable; return isComparable;
} }
void MleRouter::SetChildStateToValid(Child &aChild) void Mle::SetChildStateToValid(Child &aChild)
{ {
VerifyOrExit(!aChild.IsStateValid()); VerifyOrExit(!aChild.IsStateValid());
@@ -3898,9 +3840,9 @@ exit:
return; return;
} }
bool MleRouter::HasChildren(void) { return mChildTable.HasChildren(Child::kInStateValidOrAttaching); } bool Mle::HasChildren(void) { return mChildTable.HasChildren(Child::kInStateValidOrAttaching); }
void MleRouter::RemoveChildren(void) void Mle::RemoveChildren(void)
{ {
for (Child &child : Get<ChildTable>().Iterate(Child::kInStateValidOrRestoring)) for (Child &child : Get<ChildTable>().Iterate(Child::kInStateValidOrRestoring))
{ {
@@ -3908,7 +3850,7 @@ void MleRouter::RemoveChildren(void)
} }
} }
Error MleRouter::SetAssignParentPriority(int8_t aParentPriority) Error Mle::SetAssignParentPriority(int8_t aParentPriority)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -3921,7 +3863,7 @@ exit:
return error; return error;
} }
Error MleRouter::GetMaxChildTimeout(uint32_t &aTimeout) const Error Mle::GetMaxChildTimeout(uint32_t &aTimeout) const
{ {
Error error = kErrorNotFound; Error error = kErrorNotFound;
@@ -3949,7 +3891,7 @@ exit:
} }
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
Error MleRouter::SendTimeSync(void) Error Mle::SendTimeSync(void)
{ {
Error error = kErrorNone; Error error = kErrorNone;
Ip6::Address destination; Ip6::Address destination;
@@ -3973,18 +3915,15 @@ exit:
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// RouterRoleTransition // RouterRoleTransition
MleRouter::RouterRoleTransition::RouterRoleTransition(void) Mle::RouterRoleTransition::RouterRoleTransition(void)
: mTimeout(0) : mTimeout(0)
, mJitter(kRouterSelectionJitter) , mJitter(kRouterSelectionJitter)
{ {
} }
void MleRouter::RouterRoleTransition::StartTimeout(void) void Mle::RouterRoleTransition::StartTimeout(void) { mTimeout = 1 + Random::NonCrypto::GetUint8InRange(0, mJitter); }
{
mTimeout = 1 + Random::NonCrypto::GetUint8InRange(0, mJitter);
}
bool MleRouter::RouterRoleTransition::HandleTimeTick(void) bool Mle::RouterRoleTransition::HandleTimeTick(void)
{ {
bool expired = false; bool expired = false;
@@ -3999,13 +3938,13 @@ exit:
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// RouterRoleRestorer // RouterRoleRestorer
MleRouter::RouterRoleRestorer::RouterRoleRestorer(Instance &aInstance) Mle::RouterRoleRestorer::RouterRoleRestorer(Instance &aInstance)
: InstanceLocator(aInstance) : InstanceLocator(aInstance)
, mAttempts(0) , mAttempts(0)
{ {
} }
void MleRouter::RouterRoleRestorer::Start(DeviceRole aPreviousRole) void Mle::RouterRoleRestorer::Start(DeviceRole aPreviousRole)
{ {
// If the device was previously the leader or had more than // If the device was previously the leader or had more than
// `kMinCriticalChildrenCount` children, we use more link // `kMinCriticalChildrenCount` children, we use more link
@@ -4016,7 +3955,7 @@ void MleRouter::RouterRoleRestorer::Start(DeviceRole aPreviousRole)
switch (aPreviousRole) switch (aPreviousRole)
{ {
case kRoleRouter: case kRoleRouter:
if (Get<MleRouter>().mChildTable.GetNumChildren(Child::kInStateValidOrRestoring) < kMinCriticalChildrenCount) if (Get<Mle>().mChildTable.GetNumChildren(Child::kInStateValidOrRestoring) < kMinCriticalChildrenCount)
{ {
mAttempts = kMaxTxCount; mAttempts = kMaxTxCount;
break; break;
@@ -4037,7 +3976,7 @@ void MleRouter::RouterRoleRestorer::Start(DeviceRole aPreviousRole)
SendMulticastLinkRequest(); SendMulticastLinkRequest();
} }
void MleRouter::RouterRoleRestorer::HandleTimer(void) void Mle::RouterRoleRestorer::HandleTimer(void)
{ {
if (mAttempts > 0) if (mAttempts > 0)
{ {
@@ -4047,7 +3986,7 @@ void MleRouter::RouterRoleRestorer::HandleTimer(void)
SendMulticastLinkRequest(); SendMulticastLinkRequest();
} }
void MleRouter::RouterRoleRestorer::SendMulticastLinkRequest(void) void Mle::RouterRoleRestorer::SendMulticastLinkRequest(void)
{ {
uint32_t delay; uint32_t delay;
@@ -4059,7 +3998,7 @@ void MleRouter::RouterRoleRestorer::SendMulticastLinkRequest(void)
ExitNow(); ExitNow();
} }
Get<MleRouter>().SendLinkRequest(nullptr); Get<Mle>().SendLinkRequest(nullptr);
delay = (mAttempts == 1) ? kLinkRequestTimeout delay = (mAttempts == 1) ? kLinkRequestTimeout
: Random::NonCrypto::GetUint32InRange(kMulticastRetxDelayMin, kMulticastRetxDelayMax); : Random::NonCrypto::GetUint32InRange(kMulticastRetxDelayMin, kMulticastRetxDelayMax);
-742
View File
@@ -1,742 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for MLE functionality required by the Thread Router and Leader roles.
*/
#ifndef MLE_ROUTER_HPP_
#define MLE_ROUTER_HPP_
#include "openthread-core-config.h"
#include <openthread/thread_ftd.h>
#include "coap/coap_message.hpp"
#include "common/callback.hpp"
#include "common/time_ticker.hpp"
#include "common/timer.hpp"
#include "common/trickle_timer.hpp"
#include "mac/mac_types.hpp"
#include "meshcop/meshcop_tlvs.hpp"
#include "net/icmp6.hpp"
#include "net/udp6.hpp"
#include "thread/child.hpp"
#include "thread/child_table.hpp"
#include "thread/mle.hpp"
#include "thread/mle_tlvs.hpp"
#include "thread/router.hpp"
#include "thread/router_table.hpp"
#include "thread/thread_tlvs.hpp"
#include "thread/tmf.hpp"
namespace ot {
namespace Mle {
/**
* @addtogroup core-mle-router
*
* @brief
* This module includes definitions for MLE functionality required by the Thread Router and Leader roles.
*
* @{
*/
#if OPENTHREAD_FTD
/**
* Implements MLE functionality required by the Thread Router and Leader roles.
*/
class MleRouter : public Mle
{
friend class Mle;
friend class ot::Instance;
friend class ot::TimeTicker;
friend class Tmf::Agent;
public:
/**
* Initializes the object.
*
* @param[in] aInstance A reference to the OpenThread instance.
*/
explicit MleRouter(Instance &aInstance);
/**
* Indicates whether or not the device is router-eligible.
*
* @retval true If device is router-eligible.
* @retval false If device is not router-eligible.
*/
bool IsRouterEligible(void) const;
/**
* Sets whether or not the device is router-eligible.
*
* If @p aEligible is false and the device is currently operating as a router, this call will cause the device to
* detach and attempt to reattach as a child.
*
* @param[in] aEligible TRUE to configure device router-eligible, FALSE otherwise.
*
* @retval kErrorNone Successfully set the router-eligible configuration.
* @retval kErrorNotCapable The device is not capable of becoming a router.
*/
Error SetRouterEligible(bool aEligible);
/**
* Indicates whether a node is the only router on the network.
*
* @retval TRUE It is the only router in the network.
* @retval FALSE It is a child or is not a single router in the network.
*/
bool IsSingleton(void) const;
/**
* Generates an Address Solicit request for a Router ID.
*
* @param[in] aStatus The reason for requesting a Router ID.
*
* @retval kErrorNone Successfully generated an Address Solicit message.
* @retval kErrorNotCapable Device is not capable of becoming a router
* @retval kErrorInvalidState Thread is not enabled
*/
Error BecomeRouter(ThreadStatusTlv::Status aStatus);
/**
* Becomes a leader and starts a new partition.
*
* If the device is already attached, this method can be used to attempt to take over as the leader, creating a new
* partition. For this to work, the local leader weight must be greater than the weight of the current leader. The
* @p aCheckWeight can be used to ensure that this check is performed.
*
* @param[in] aCheckWeight Check that the local leader weight is larger than the weight of the current leader.
*
* @retval kErrorNone Successfully become a Leader and started a new partition.
* @retval kErrorInvalidState Thread is not enabled.
* @retval kErrorNotCapable Device is not capable of becoming a leader (not router eligible), or
* @p aCheckWeight is true and cannot override the current leader due to its local
* leader weight being same or smaller than current leader's weight.
*/
Error BecomeLeader(bool aCheckWeight);
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
/**
* Gets the device properties which are used to determine the Leader Weight.
*
* @returns The current device properties.
*/
const DeviceProperties &GetDeviceProperties(void) const { return mDeviceProperties; }
/**
* Sets the device properties which are then used to determine and set the Leader Weight.
*
* @param[in] aDeviceProperties The device properties.
*/
void SetDeviceProperties(const DeviceProperties &aDeviceProperties);
#endif
/**
* Returns the Leader Weighting value for this Thread interface.
*
* @returns The Leader Weighting value for this Thread interface.
*/
uint8_t GetLeaderWeight(void) const { return mLeaderWeight; }
/**
* Sets the Leader Weighting value for this Thread interface.
*
* Directly sets the Leader Weight to the new value replacing its previous value (which may have been
* determined from a previous call to `SetDeviceProperties()`).
*
* @param[in] aWeight The Leader Weighting value.
*/
void SetLeaderWeight(uint8_t aWeight) { mLeaderWeight = aWeight; }
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
/**
* Returns the preferred Partition Id when operating in the Leader role for certification testing.
*
* @returns The preferred Partition Id value.
*/
uint32_t GetPreferredLeaderPartitionId(void) const { return mPreferredLeaderPartitionId; }
/**
* Sets the preferred Partition Id when operating in the Leader role for certification testing.
*
* @param[in] aPartitionId The preferred Leader Partition Id.
*/
void SetPreferredLeaderPartitionId(uint32_t aPartitionId) { mPreferredLeaderPartitionId = aPartitionId; }
#endif
/**
* Sets the preferred Router Id. Upon becoming a router/leader the node
* attempts to use this Router Id. If the preferred Router Id is not set or if it
* can not be used, a randomly generated router Id is picked.
* This property can be set when he device role is detached or disabled.
*
* @param[in] aRouterId The preferred Router Id.
*
* @retval kErrorNone Successfully set the preferred Router Id.
* @retval kErrorInvalidState Could not set (role is other than detached and disabled)
*/
Error SetPreferredRouterId(uint8_t aRouterId);
/**
* Gets the Partition Id which the device joined successfully once.
*/
uint32_t GetPreviousPartitionId(void) const { return mPreviousPartitionId; }
/**
* Sets the Partition Id which the device joins successfully.
*
* @param[in] aPartitionId The Partition Id.
*/
void SetPreviousPartitionId(uint32_t aPartitionId) { mPreviousPartitionId = aPartitionId; }
/**
* Sets the Router Id.
*
* @param[in] aRouterId The Router Id.
*/
void SetRouterId(uint8_t aRouterId);
/**
* Returns the NETWORK_ID_TIMEOUT value.
*
* @returns The NETWORK_ID_TIMEOUT value.
*/
uint8_t GetNetworkIdTimeout(void) const { return mNetworkIdTimeout; }
/**
* Sets the NETWORK_ID_TIMEOUT value.
*
* @param[in] aTimeout The NETWORK_ID_TIMEOUT value.
*/
void SetNetworkIdTimeout(uint8_t aTimeout) { mNetworkIdTimeout = aTimeout; }
/**
* Returns the ROUTER_SELECTION_JITTER value.
*
* @returns The ROUTER_SELECTION_JITTER value in seconds.
*/
uint8_t GetRouterSelectionJitter(void) const { return mRouterRoleTransition.GetJitter(); }
/**
* Sets the ROUTER_SELECTION_JITTER value.
*
* @param[in] aRouterJitter The router selection jitter value (in seconds).
*/
void SetRouterSelectionJitter(uint8_t aRouterJitter) { mRouterRoleTransition.SetJitter(aRouterJitter); }
/**
* Indicates whether or not router role transition (upgrade from REED or downgrade to REED) is pending.
*
* @retval TRUE Router role transition is pending.
* @retval FALSE Router role transition is not pending
*/
bool IsRouterRoleTransitionPending(void) const { return mRouterRoleTransition.IsPending(); }
/**
* Returns the current timeout delay in seconds till router role transition (upgrade from REED or downgrade to
* REED).
*
* @returns The timeout in seconds till router role transition, or zero if not pending role transition.
*/
uint8_t GetRouterRoleTransitionTimeout(void) const { return mRouterRoleTransition.GetTimeout(); }
/**
* Returns the ROUTER_UPGRADE_THRESHOLD value.
*
* @returns The ROUTER_UPGRADE_THRESHOLD value.
*/
uint8_t GetRouterUpgradeThreshold(void) const { return mRouterUpgradeThreshold; }
/**
* Sets the ROUTER_UPGRADE_THRESHOLD value.
*
* @param[in] aThreshold The ROUTER_UPGRADE_THRESHOLD value.
*/
void SetRouterUpgradeThreshold(uint8_t aThreshold) { mRouterUpgradeThreshold = aThreshold; }
/**
* Returns the ROUTER_DOWNGRADE_THRESHOLD value.
*
* @returns The ROUTER_DOWNGRADE_THRESHOLD value.
*/
uint8_t GetRouterDowngradeThreshold(void) const { return mRouterDowngradeThreshold; }
/**
* Sets the ROUTER_DOWNGRADE_THRESHOLD value.
*
* @param[in] aThreshold The ROUTER_DOWNGRADE_THRESHOLD value.
*/
void SetRouterDowngradeThreshold(uint8_t aThreshold) { mRouterDowngradeThreshold = aThreshold; }
/**
* Returns the MLE_CHILD_ROUTER_LINKS value.
*
* @returns The MLE_CHILD_ROUTER_LINKS value.
*/
uint8_t GetChildRouterLinks(void) const { return mChildRouterLinks; }
/**
* Sets the MLE_CHILD_ROUTER_LINKS value.
*
* @param[in] aChildRouterLinks The MLE_CHILD_ROUTER_LINKS value.
*
* @retval kErrorNone Successfully set the value.
* @retval kErrorInvalidState Thread protocols are enabled.
*/
Error SetChildRouterLinks(uint8_t aChildRouterLinks);
/**
* Returns if the REED is expected to become Router soon.
*
* @retval TRUE If the REED is going to become a Router soon.
* @retval FALSE If the REED is not going to become a Router soon.
*/
bool IsExpectedToBecomeRouterSoon(void) const;
/**
* Removes a link to a neighbor.
*
* @param[in] aNeighbor A reference to the neighbor object.
*/
void RemoveNeighbor(Neighbor &aNeighbor);
/**
* Invalidates a direct link to a neighboring router (due to failed link-layer acks).
*
* @param[in] aRouter A reference to the router object.
*/
void RemoveRouterLink(Router &aRouter);
/**
* Indicates whether or not the given Thread partition attributes are preferred.
*
* @param[in] aSingletonA Whether or not the Thread Partition A has a single router.
* @param[in] aLeaderDataA A reference to Thread Partition A's Leader Data.
* @param[in] aSingletonB Whether or not the Thread Partition B has a single router.
* @param[in] aLeaderDataB A reference to Thread Partition B's Leader Data.
*
* @retval 1 If partition A is preferred.
* @retval 0 If partition A and B have equal preference.
* @retval -1 If partition B is preferred.
*/
static int ComparePartitions(bool aSingletonA,
const LeaderData &aLeaderDataA,
bool aSingletonB,
const LeaderData &aLeaderDataB);
/**
* Fills an ConnectivityTlv.
*
* @param[out] aTlv A reference to the tlv to be filled.
*/
void FillConnectivityTlv(ConnectivityTlv &aTlv);
/**
* Schedule tx of MLE Advertisement message (unicast) to the given neighboring router after a random delay.
*
* @param[in] aRouter The router to send the Advertisement to.
*
*/
void ScheduleUnicastAdvertisementTo(const Router &aRouter);
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
/**
* Sets steering data out of band
*
* @param[in] aExtAddress Value used to set steering data
* All zeros clears steering data
* All 0xFFs sets steering data to 0xFF
* Anything else is used to compute the bloom filter
*/
void SetSteeringData(const Mac::ExtAddress *aExtAddress);
#endif
/**
* Gets the assigned parent priority.
*
* @returns The assigned parent priority value, -2 means not assigned.
*/
int8_t GetAssignParentPriority(void) const { return mParentPriority; }
/**
* Sets the parent priority.
*
* @param[in] aParentPriority The parent priority value.
*
* @retval kErrorNone Successfully set the parent priority.
* @retval kErrorInvalidArgs If the parent priority value is not among 1, 0, -1 and -2.
*/
Error SetAssignParentPriority(int8_t aParentPriority);
/**
* Gets the longest MLE Timeout TLV for all active MTD children.
*
* @param[out] aTimeout A reference to where the information is placed.
*
* @retval kErrorNone Successfully get the max child timeout
* @retval kErrorInvalidState Not an active router
* @retval kErrorNotFound NO MTD child
*/
Error GetMaxChildTimeout(uint32_t &aTimeout) const;
/**
* Sets the callback that is called when processing an MLE Discovery Request message.
*
* @param[in] aCallback A pointer to a function that is called to deliver MLE Discovery Request data.
* @param[in] aContext A pointer to application-specific context.
*/
void SetDiscoveryRequestCallback(otThreadDiscoveryRequestCallback aCallback, void *aContext)
{
mDiscoveryRequestCallback.Set(aCallback, aContext);
}
/**
* Resets the MLE Advertisement Trickle timer interval.
*/
void ResetAdvertiseInterval(void);
/**
* Updates the MLE Advertisement Trickle timer max interval (if timer is running).
*
* This is called when there is change in router table.
*/
void UpdateAdvertiseInterval(void);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
/**
* Generates an MLE Time Synchronization message.
*
* @retval kErrorNone Successfully sent an MLE Time Synchronization message.
* @retval kErrorNoBufs Insufficient buffers to generate the MLE Time Synchronization message.
*/
Error SendTimeSync(void);
#endif
/**
* Gets the maximum number of IP addresses that each MTD child may register with this device as parent.
*
* @returns The maximum number of IP addresses that each MTD child may register with this device as parent.
*/
uint8_t GetMaxChildIpAddresses(void) const;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
/**
* Sets/restores the maximum number of IP addresses that each MTD child may register with this
* device as parent.
*
* @param[in] aMaxIpAddresses The maximum number of IP addresses that each MTD child may register with this
* device as parent. 0 to clear the setting and restore the default.
*
* @retval kErrorNone Successfully set/cleared the number.
* @retval kErrorInvalidArgs If exceeds the allowed maximum number.
*/
Error SetMaxChildIpAddresses(uint8_t aMaxIpAddresses);
/**
* Sets whether the device was commissioned using CCM.
*
* @param[in] aEnabled TRUE if the device was commissioned using CCM, FALSE otherwise.
*/
void SetCcmEnabled(bool aEnabled) { mCcmEnabled = aEnabled; }
/**
* Sets whether the Security Policy TLV version-threshold for routing (VR field) is enabled.
*
* @param[in] aEnabled TRUE to enable Security Policy TLV version-threshold for routing, FALSE otherwise.
*/
void SetThreadVersionCheckEnabled(bool aEnabled) { mThreadVersionCheckEnabled = aEnabled; }
/**
* Gets the current Interval Max value used by Advertisement trickle timer.
*
* @returns The Interval Max of Advertisement trickle timer in milliseconds.
*/
uint32_t GetAdvertisementTrickleIntervalMax(void) const { return mAdvertiseTrickleTimer.GetIntervalMax(); }
#endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
private:
//------------------------------------------------------------------------------------------------------------------
// Constants
// Advertisement trickle timer constants - all times are in milliseconds.
static constexpr uint32_t kAdvIntervalMin = 1000; // I_MIN
static constexpr uint32_t kAdvIntervalNeighborMultiplier = 4000; // Multiplier for I_MAX per router neighbor
static constexpr uint32_t kAdvIntervalMaxLowerBound = 12000; // Lower bound for I_MAX
static constexpr uint32_t kAdvIntervalMaxUpperBound = 32000; // Upper bound for I_MAX
static constexpr uint32_t kReedAdvIntervalMin = 570000;
static constexpr uint32_t kReedAdvIntervalMax = 630000;
#if OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
static constexpr uint32_t kAdvIntervalMaxLogRoutes = 5000;
#endif
static constexpr uint32_t kMaxUnicastAdvertisementDelay = 1000; // Max random delay for unciast Adv tx
static constexpr uint32_t kMaxNeighborAge = 100000; // Max neighbor age on router (in msec)
static constexpr uint32_t kMaxNeighborAgeOnChild = 150000; // Max neighbor age on FTD child (in msec)
static constexpr uint32_t kMaxLeaderToRouterTimeout = 90000; // (in msec)
static constexpr uint8_t kMinDowngradeNeighbors = 7;
static constexpr uint8_t kNetworkIdTimeout = 120; // (in sec)
static constexpr uint8_t kRouterSelectionJitter = 120; // (in sec)
static constexpr uint8_t kRouterDowngradeThreshold = 23;
static constexpr uint8_t kRouterUpgradeThreshold = 16;
static constexpr uint16_t kDiscoveryMaxJitter = 250; // Max jitter delay Discovery Responses (in msec).
static constexpr uint16_t kUnsolicitedDataResponseJitter = 500; // Max delay for unsol Data Response (in msec).
static constexpr uint8_t kLeaderDowngradeExtraDelay = 10; // Extra delay to downgrade leader (in sec).
static constexpr uint8_t kDefaultLeaderWeight = 64;
static constexpr uint8_t kAlternateRloc16Timeout = 8; // Time to use alternate RLOC16 (in sec).
// Threshold to accept a router upgrade request with reason
// `kBorderRouterRequest` (number of BRs acting as router in
// Network Data).
static constexpr uint8_t kRouterUpgradeBorderRouterRequestThreshold = 2;
static constexpr uint8_t kLinkRequestMinMargin = OPENTHREAD_CONFIG_MLE_LINK_REQUEST_MARGIN_MIN;
static constexpr uint8_t kPartitionMergeMinMargin = OPENTHREAD_CONFIG_MLE_PARTITION_MERGE_MARGIN_MIN;
static constexpr uint8_t kChildRouterLinks = OPENTHREAD_CONFIG_MLE_CHILD_ROUTER_LINKS;
static constexpr uint8_t kMaxChildIpAddresses = OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD;
// Constants for gradual router link establishment (on FTD child)
struct GradualChildRouterLink
{
static constexpr uint8_t kExtraChildRouterLinks = OPENTHREAD_CONFIG_MLE_EXTRA_CHILD_ROUTER_LINKS_GRADUAL;
static constexpr uint32_t kWaitDurationAfterAttach = 300; // in seconds (5 minutes)
static constexpr uint32_t kMinLinkRequestDelay = 1500; // in msec
static constexpr uint32_t kMaxLinkRequestDelay = 10000; // in msec
static constexpr uint32_t kProbabilityPercentage = 5; // in percent
};
static constexpr uint8_t kMinCriticalChildrenCount = 6;
static constexpr uint16_t kChildSupervisionDefaultIntervalForOlderVersion =
OPENTHREAD_CONFIG_CHILD_SUPERVISION_OLDER_VERSION_CHILD_DEFAULT_INTERVAL;
static constexpr int8_t kParentPriorityHigh = 1;
static constexpr int8_t kParentPriorityMedium = 0;
static constexpr int8_t kParentPriorityLow = -1;
static constexpr int8_t kParentPriorityUnspecified = -2;
//------------------------------------------------------------------------------------------------------------------
// Nested types
class RouterRoleTransition
{
public:
RouterRoleTransition(void);
bool IsPending(void) const { return (mTimeout != 0); }
void StartTimeout(void);
void StopTimeout(void) { mTimeout = 0; }
void IncreaseTimeout(uint8_t aIncrement) { mTimeout += aIncrement; }
uint8_t GetTimeout(void) const { return mTimeout; }
bool HandleTimeTick(void);
uint8_t GetJitter(void) const { return mJitter; }
void SetJitter(uint8_t aJitter) { mJitter = aJitter; }
private:
uint8_t mTimeout;
uint8_t mJitter;
};
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class RouterRoleRestorer : public InstanceLocator
{
// Attempts to restore the router or leader role after an MLE
// restart(e.g., after a device reboot) by sending multicast
// Link Requests.
public:
RouterRoleRestorer(Instance &aInstance);
bool IsActive(void) const { return mAttempts > 0; }
void Start(DeviceRole aPreviousRole);
void Stop(void) { mAttempts = 0; }
void HandleTimer(void);
void GenerateRandomChallenge(void) { mChallenge.GenerateRandom(); }
const TxChallenge &GetChallenge(void) const { return mChallenge; }
private:
void SendMulticastLinkRequest(void);
uint8_t mAttempts;
TxChallenge mChallenge;
};
//------------------------------------------------------------------------------------------------------------------
// Methods
void SetAlternateRloc16(uint16_t aRloc16);
void ClearAlternateRloc16(void);
void HandleDetachStart(void);
void HandleChildStart(AttachMode aMode);
void HandleSecurityPolicyChanged(void);
void HandleLinkRequest(RxInfo &aRxInfo);
void HandleLinkAccept(RxInfo &aRxInfo);
void HandleLinkAcceptAndRequest(RxInfo &aRxInfo);
void HandleLinkAcceptVariant(RxInfo &aRxInfo, MessageType aMessageType);
Error HandleAdvertisementOnFtd(RxInfo &aRxInfo, uint16_t aSourceAddress, const LeaderData &aLeaderData);
void HandleParentRequest(RxInfo &aRxInfo);
void HandleChildIdRequest(RxInfo &aRxInfo);
void HandleChildUpdateRequestOnParent(RxInfo &aRxInfo);
void HandleChildUpdateResponseOnParent(RxInfo &aRxInfo);
void HandleDataRequest(RxInfo &aRxInfo);
void HandleNetworkDataUpdateRouter(void);
void HandleDiscoveryRequest(RxInfo &aRxInfo);
void EstablishRouterLinkOnFtdChild(Router &aRouter, RxInfo &aRxInfo, uint8_t aLinkMargin);
Error ProcessRouteTlv(const RouteTlv &aRouteTlv, RxInfo &aRxInfo);
Error ReadAndProcessRouteTlvOnFtdChild(RxInfo &aRxInfo, uint8_t aParentId);
void StopAdvertiseTrickleTimer(void);
uint32_t DetermineAdvertiseIntervalMax(void) const;
Error SendAddressSolicit(ThreadStatusTlv::Status aStatus);
void SendAddressSolicitResponse(const Coap::Message &aRequest,
ThreadStatusTlv::Status aResponseStatus,
const Router *aRouter,
const Ip6::MessageInfo &aMessageInfo);
void SendAddressRelease(void);
void SendMulticastAdvertisement(void);
void SendAdvertisement(const Ip6::Address &aDestination);
void SendLinkRequest(Router *aRouter);
Error SendLinkAccept(const LinkAcceptInfo &aInfo);
void SendParentResponse(const ParentResponseInfo &aInfo);
Error SendChildIdResponse(Child &aChild);
Error SendChildUpdateRequestToChild(Child &aChild);
void SendChildUpdateResponseToChild(Child *aChild,
const Ip6::MessageInfo &aMessageInfo,
const TlvList &aTlvList,
const RxChallenge &aChallenge);
void SendMulticastDataResponse(void);
void SendDataResponse(const Ip6::Address &aDestination,
const TlvList &aTlvList,
const Message *aRequestMessage = nullptr);
Error SendDiscoveryResponse(const Ip6::Address &aDestination, const DiscoveryResponseInfo &aInfo);
void SetStateRouter(uint16_t aRloc16);
void SetStateLeader(uint16_t aRloc16, LeaderStartMode aStartMode);
void SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, LeaderStartMode aStartMode);
void StopLeader(void);
void SynchronizeChildNetworkData(void);
Error ProcessAddressRegistrationTlv(RxInfo &aRxInfo, Child &aChild);
bool HasNeighborWithGoodLinkQuality(void) const;
void HandlePartitionChange(void);
void SetChildStateToValid(Child &aChild);
bool HasChildren(void);
void RemoveChildren(void);
bool ShouldDowngrade(uint8_t aNeighborId, const RouteTlv &aRouteTlv) const;
bool NeighborHasComparableConnectivity(const RouteTlv &aRouteTlv, uint8_t aNeighborId) const;
void HandleAdvertiseTrickleTimer(void);
void HandleAddressSolicitResponse(Coap::Message *aMessage, const Ip6::MessageInfo *aMessageInfo, Error aResult);
void HandleTimeTick(void);
template <Uri kUri> void HandleTmf(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
#if OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
void SignalDuaAddressEvent(const Child &aChild, const Ip6::Address &aOldDua) const;
#endif
static bool IsMessageMleSubType(const Message &aMessage);
static bool IsMessageChildUpdateRequest(const Message &aMessage);
static void HandleAdvertiseTrickleTimer(TrickleTimer &aTimer);
static void HandleAddressSolicitResponse(void *aContext,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otError aResult);
//------------------------------------------------------------------------------------------------------------------
// Variables
bool mRouterEligible : 1;
bool mAddressSolicitPending : 1;
bool mAddressSolicitRejected : 1;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
bool mCcmEnabled : 1;
bool mThreadVersionCheckEnabled : 1;
#endif
uint8_t mRouterId;
uint8_t mPreviousRouterId;
uint8_t mNetworkIdTimeout;
uint8_t mRouterUpgradeThreshold;
uint8_t mRouterDowngradeThreshold;
uint8_t mLeaderWeight;
uint8_t mPreviousPartitionRouterIdSequence;
uint8_t mPreviousPartitionIdTimeout;
uint8_t mChildRouterLinks;
uint8_t mAlternateRloc16Timeout;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
uint8_t mMaxChildIpAddresses;
#endif
int8_t mParentPriority;
uint16_t mNextChildId;
uint32_t mPreviousPartitionIdRouter;
uint32_t mPreviousPartitionId;
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
uint32_t mPreferredLeaderPartitionId;
#endif
TrickleTimer mAdvertiseTrickleTimer;
ChildTable mChildTable;
RouterTable mRouterTable;
RouterRoleRestorer mRouterRoleRestorer;
RouterRoleTransition mRouterRoleTransition;
Ip6::Netif::UnicastAddress mLeaderAloc;
#if OPENTHREAD_CONFIG_MLE_DEVICE_PROPERTY_LEADER_WEIGHT_ENABLE
DeviceProperties mDeviceProperties;
#endif
#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
MeshCoP::SteeringData mSteeringData;
#endif
Callback<otThreadDiscoveryRequestCallback> mDiscoveryRequestCallback;
};
DeclareTmfHandler(MleRouter, kUriAddressSolicit);
DeclareTmfHandler(MleRouter, kUriAddressRelease);
#endif // OPENTHREAD_FTD
#if OPENTHREAD_MTD
typedef Mle MleRouter;
#endif
} // namespace Mle
/**
* @}
*/
} // namespace ot
#endif // MLE_ROUTER_HPP_
+6 -6
View File
@@ -61,7 +61,7 @@ void MlrManager::HandleNotifierEvents(Events aEvents)
} }
#endif #endif
if (aEvents.Contains(kEventThreadRoleChanged) && Get<Mle::MleRouter>().IsChild()) if (aEvents.Contains(kEventThreadRoleChanged) && Get<Mle::Mle>().IsChild())
{ {
// Reregistration after re-attach // Reregistration after re-attach
UpdateReregistrationDelay(true); UpdateReregistrationDelay(true);
@@ -211,9 +211,9 @@ void MlrManager::UpdateTimeTickerRegistration(void)
void MlrManager::SendMlr(void) void MlrManager::SendMlr(void)
{ {
Error error; Error error;
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
AddressArray addresses; AddressArray addresses;
VerifyOrExit(!mMlrPending, error = kErrorBusy); VerifyOrExit(!mMlrPending, error = kErrorBusy);
VerifyOrExit(mle.IsAttached(), error = kErrorInvalidState); VerifyOrExit(mle.IsAttached(), error = kErrorInvalidState);
@@ -370,7 +370,7 @@ Error MlrManager::SendMlrMessage(const Ip6::Address *aAddresses,
OT_UNUSED_VARIABLE(aTimeout); OT_UNUSED_VARIABLE(aTimeout);
Error error = kErrorNone; Error error = kErrorNone;
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
Coap::Message *message = nullptr; Coap::Message *message = nullptr;
Tmf::MessageInfo messageInfo(GetInstance()); Tmf::MessageInfo messageInfo(GetInstance());
Ip6AddressesTlv addressesTlv; Ip6AddressesTlv addressesTlv;
@@ -607,7 +607,7 @@ void MlrManager::Reregister(void)
void MlrManager::UpdateReregistrationDelay(bool aRereg) void MlrManager::UpdateReregistrationDelay(bool aRereg)
{ {
Mle::MleRouter &mle = Get<Mle::MleRouter>(); Mle::Mle &mle = Get<Mle::Mle>();
bool needSendMlr = (mle.IsFullThreadDevice() || mle.GetParent().IsThreadVersion1p1()) && bool needSendMlr = (mle.IsFullThreadDevice() || mle.GetParent().IsThreadVersion1p1()) &&
Get<BackboneRouter::Leader>().HasPrimary(); Get<BackboneRouter::Leader>().HasPrimary();
+1 -1
View File
@@ -48,7 +48,7 @@
#include "common/timer.hpp" #include "common/timer.hpp"
#include "net/udp6.hpp" #include "net/udp6.hpp"
#include "thread/lowpan.hpp" #include "thread/lowpan.hpp"
#include "thread/mle_router.hpp" #include "thread/mle.hpp"
#include "thread/network_data_tlvs.hpp" #include "thread/network_data_tlvs.hpp"
#include "thread/network_data_types.hpp" #include "thread/network_data_types.hpp"
+4 -4
View File
@@ -164,7 +164,7 @@ Error Leader::GetContext(const Ip6::Address &aAddress, Lowpan::Context &aContext
aContext.mPrefix.SetLength(0); aContext.mPrefix.SetLength(0);
if (Get<Mle::MleRouter>().IsMeshLocalAddress(aAddress)) if (Get<Mle::Mle>().IsMeshLocalAddress(aAddress))
{ {
GetContextForMeshLocalPrefix(aContext); GetContextForMeshLocalPrefix(aContext);
} }
@@ -236,7 +236,7 @@ exit:
void Leader::GetContextForMeshLocalPrefix(Lowpan::Context &aContext) const void Leader::GetContextForMeshLocalPrefix(Lowpan::Context &aContext) const
{ {
aContext.mPrefix.Set(Get<Mle::MleRouter>().GetMeshLocalPrefix()); aContext.mPrefix.Set(Get<Mle::Mle>().GetMeshLocalPrefix());
aContext.mContextId = Mle::kMeshLocalPrefixContextId; aContext.mContextId = Mle::kMeshLocalPrefixContextId;
aContext.mCompressFlag = true; aContext.mCompressFlag = true;
aContext.mIsValid = true; aContext.mIsValid = true;
@@ -247,7 +247,7 @@ bool Leader::IsOnMesh(const Ip6::Address &aAddress) const
const PrefixTlv *prefixTlv = nullptr; const PrefixTlv *prefixTlv = nullptr;
bool isOnMesh = false; bool isOnMesh = false;
VerifyOrExit(!Get<Mle::MleRouter>().IsMeshLocalAddress(aAddress), isOnMesh = true); VerifyOrExit(!Get<Mle::Mle>().IsMeshLocalAddress(aAddress), isOnMesh = true);
while ((prefixTlv = FindNextMatchingPrefixTlv(aAddress, prefixTlv)) != nullptr) while ((prefixTlv = FindNextMatchingPrefixTlv(aAddress, prefixTlv)) != nullptr)
{ {
@@ -484,7 +484,7 @@ Error Leader::SetNetworkData(uint8_t aVersion,
} }
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
if (Get<Mle::MleRouter>().IsLeader()) if (Get<Mle::Mle>().IsLeader())
{ {
Get<Leader>().HandleNetworkDataRestoredAfterReset(); Get<Leader>().HandleNetworkDataRestoredAfterReset();
} }
+1 -1
View File
@@ -44,7 +44,7 @@
#include "common/numeric_limits.hpp" #include "common/numeric_limits.hpp"
#include "common/timer.hpp" #include "common/timer.hpp"
#include "net/ip6_address.hpp" #include "net/ip6_address.hpp"
#include "thread/mle_router.hpp" #include "thread/mle.hpp"
#include "thread/network_data.hpp" #include "thread/network_data.hpp"
#include "thread/tmf.hpp" #include "thread/tmf.hpp"
+5 -5
View File
@@ -58,7 +58,7 @@ void Leader::Start(Mle::LeaderStartMode aStartMode)
void Leader::IncrementVersion(void) void Leader::IncrementVersion(void)
{ {
if (Get<Mle::MleRouter>().IsLeader()) if (Get<Mle::Mle>().IsLeader())
{ {
IncrementVersions(/* aIncludeStable */ false); IncrementVersions(/* aIncludeStable */ false);
} }
@@ -66,7 +66,7 @@ void Leader::IncrementVersion(void)
void Leader::IncrementVersionAndStableVersion(void) void Leader::IncrementVersionAndStableVersion(void)
{ {
if (Get<Mle::MleRouter>().IsLeader()) if (Get<Mle::Mle>().IsLeader())
{ {
IncrementVersions(/* aIncludeStable */ true); IncrementVersions(/* aIncludeStable */ true);
} }
@@ -293,7 +293,7 @@ template <> void Leader::HandleTmf<kUriCommissionerSet>(Coap::Message &aMessage,
state = MeshCoP::StateTlv::kAccept; state = MeshCoP::StateTlv::kAccept;
exit: exit:
if (Get<Mle::MleRouter>().IsLeader()) if (Get<Mle::Mle>().IsLeader())
{ {
SendCommissioningSetResponse(aMessage, aMessageInfo, state); SendCommissioningSetResponse(aMessage, aMessageInfo, state);
} }
@@ -664,7 +664,7 @@ void Leader::CheckForNetDataGettingFull(const NetworkData &aNetworkData, uint16_
// device. If provided, then entries matching old RLOC16 are first // device. If provided, then entries matching old RLOC16 are first
// removed, before checking if new entries from @p aNetworkData can fit. // removed, before checking if new entries from @p aNetworkData can fit.
if (!Get<Mle::MleRouter>().IsLeader()) if (!Get<Mle::Mle>().IsLeader())
{ {
// Create a clone of the leader's network data, and try to register // Create a clone of the leader's network data, and try to register
// `aNetworkData` into the copy (as if this device itself is the // `aNetworkData` into the copy (as if this device itself is the
@@ -1415,7 +1415,7 @@ void Leader::HandleTimer(void)
if (mWaitingForNetDataSync) if (mWaitingForNetDataSync)
{ {
LogInfo("Timed out waiting for netdata on restoring leader role after reset"); LogInfo("Timed out waiting for netdata on restoring leader role after reset");
IgnoreError(Get<Mle::MleRouter>().BecomeDetached()); IgnoreError(Get<Mle::Mle>().BecomeDetached());
} }
else else
{ {
+3 -3
View File
@@ -152,7 +152,7 @@ exit:
void Local::UpdateRloc(PrefixTlv &aPrefixTlv) void Local::UpdateRloc(PrefixTlv &aPrefixTlv)
{ {
uint16_t rloc16 = Get<Mle::MleRouter>().GetRloc16(); uint16_t rloc16 = Get<Mle::Mle>().GetRloc16();
for (NetworkDataTlv *cur = aPrefixTlv.GetSubTlvs(); cur < aPrefixTlv.GetNext(); cur = cur->GetNext()) for (NetworkDataTlv *cur = aPrefixTlv.GetSubTlvs(); cur < aPrefixTlv.GetNext(); cur = cur->GetNext())
{ {
@@ -197,7 +197,7 @@ Error Local::AddService(uint32_t aEnterpriseNumber,
serviceTlv->SetSubTlvsLength(sizeof(ServerTlv) + aServerData.GetLength()); serviceTlv->SetSubTlvsLength(sizeof(ServerTlv) + aServerData.GetLength());
serverTlv = As<ServerTlv>(serviceTlv->GetSubTlvs()); serverTlv = As<ServerTlv>(serviceTlv->GetSubTlvs());
serverTlv->Init(Get<Mle::MleRouter>().GetRloc16(), aServerData); serverTlv->Init(Get<Mle::Mle>().GetRloc16(), aServerData);
// According to Thread spec 1.1.1, section 5.18.6 Service TLV: // According to Thread spec 1.1.1, section 5.18.6 Service TLV:
// "The Stable flag is set if any of the included sub-TLVs have their Stable flag set." // "The Stable flag is set if any of the included sub-TLVs have their Stable flag set."
@@ -237,7 +237,7 @@ exit:
void Local::UpdateRloc(ServiceTlv &aService) void Local::UpdateRloc(ServiceTlv &aService)
{ {
uint16_t rloc16 = Get<Mle::MleRouter>().GetRloc16(); uint16_t rloc16 = Get<Mle::Mle>().GetRloc16();
for (NetworkDataTlv *cur = aService.GetSubTlvs(); cur < aService.GetNext(); cur = cur->GetNext()) for (NetworkDataTlv *cur = aService.GetSubTlvs(); cur < aService.GetNext(); cur = cur->GetNext())
{ {
+11 -11
View File
@@ -74,7 +74,7 @@ void Notifier::SynchronizeServerData(void)
{ {
Error error = kErrorNotFound; Error error = kErrorNotFound;
VerifyOrExit(Get<Mle::MleRouter>().IsAttached() && !mWaitingForResponse); VerifyOrExit(Get<Mle::Mle>().IsAttached() && !mWaitingForResponse);
VerifyOrExit((mNextDelay == 0) || !mTimer.IsRunning()); VerifyOrExit((mNextDelay == 0) || !mTimer.IsRunning());
@@ -101,7 +101,7 @@ exit:
break; break;
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
case kErrorInvalidState: case kErrorInvalidState:
mTimer.Start(Time::SecToMsec(Get<Mle::MleRouter>().GetRouterRoleTransitionTimeout() + 1)); mTimer.Start(Time::SecToMsec(Get<Mle::Mle>().GetRouterRoleTransitionTimeout() + 1));
break; break;
#endif #endif
case kErrorNotFound: case kErrorNotFound:
@@ -125,7 +125,7 @@ Error Notifier::RemoveStaleChildEntries(void)
Error error = kErrorNotFound; Error error = kErrorNotFound;
Rlocs rlocs; Rlocs rlocs;
VerifyOrExit(Get<Mle::MleRouter>().IsRouterOrLeader()); VerifyOrExit(Get<Mle::Mle>().IsRouterOrLeader());
Get<Leader>().FindRlocs(kAnyBrOrServer, kAnyRole, rlocs); Get<Leader>().FindRlocs(kAnyBrOrServer, kAnyRole, rlocs);
@@ -148,13 +148,13 @@ exit:
Error Notifier::UpdateInconsistentData(void) Error Notifier::UpdateInconsistentData(void)
{ {
Error error = kErrorNone; Error error = kErrorNone;
uint16_t deviceRloc = Get<Mle::MleRouter>().GetRloc16(); uint16_t deviceRloc = Get<Mle::Mle>().GetRloc16();
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
// Don't send this Server Data Notification if the device is going // Don't send this Server Data Notification if the device is going
// to upgrade to Router. // to upgrade to Router.
if (Get<Mle::MleRouter>().IsExpectedToBecomeRouterSoon()) if (Get<Mle::Mle>().IsExpectedToBecomeRouterSoon())
{ {
ExitNow(error = kErrorInvalidState); ExitNow(error = kErrorInvalidState);
} }
@@ -294,12 +294,12 @@ bool Notifier::IsEligibleForRouterRoleUpgradeAsBorderRouter(void) const
uint16_t rloc16 = Get<Mle::Mle>().GetRloc16(); uint16_t rloc16 = Get<Mle::Mle>().GetRloc16();
uint8_t activeRouterCount; uint8_t activeRouterCount;
VerifyOrExit(Get<Mle::MleRouter>().IsRouterEligible()); VerifyOrExit(Get<Mle::Mle>().IsRouterEligible());
// RouterUpgradeThreshold can be explicitly set to zero in some of // RouterUpgradeThreshold can be explicitly set to zero in some of
// cert tests to disallow device to become router. // cert tests to disallow device to become router.
VerifyOrExit(Get<Mle::MleRouter>().GetRouterUpgradeThreshold() != 0); VerifyOrExit(Get<Mle::Mle>().GetRouterUpgradeThreshold() != 0);
// Check that we are a border router providing IP connectivity and already // Check that we are a border router providing IP connectivity and already
// in the leader's network data and therefore eligible to request router // in the leader's network data and therefore eligible to request router
@@ -309,7 +309,7 @@ bool Notifier::IsEligibleForRouterRoleUpgradeAsBorderRouter(void) const
Get<Leader>().ContainsBorderRouterWithRloc(rloc16)); Get<Leader>().ContainsBorderRouterWithRloc(rloc16));
activeRouterCount = Get<RouterTable>().GetActiveRouterCount(); activeRouterCount = Get<RouterTable>().GetActiveRouterCount();
VerifyOrExit((activeRouterCount >= Get<Mle::MleRouter>().GetRouterUpgradeThreshold()) && VerifyOrExit((activeRouterCount >= Get<Mle::Mle>().GetRouterUpgradeThreshold()) &&
(activeRouterCount < Mle::kMaxRouters)); (activeRouterCount < Mle::kMaxRouters));
VerifyOrExit(Get<Leader>().CountBorderRouters(kRouterRoleOnly) < Mle::kRouterUpgradeBorderRouterRequestThreshold); VerifyOrExit(Get<Leader>().CountBorderRouters(kRouterRoleOnly) < Mle::kRouterUpgradeBorderRouterRequestThreshold);
@@ -333,7 +333,7 @@ void Notifier::ScheduleRouterRoleUpgradeIfEligible(void)
VerifyOrExit(!mDidRequestRouterRoleUpgrade); VerifyOrExit(!mDidRequestRouterRoleUpgrade);
VerifyOrExit(Get<Mle::MleRouter>().IsChild()); VerifyOrExit(Get<Mle::Mle>().IsChild());
VerifyOrExit(IsEligibleForRouterRoleUpgradeAsBorderRouter() && (mRouterRoleUpgradeTimeout == 0)); VerifyOrExit(IsEligibleForRouterRoleUpgradeAsBorderRouter() && (mRouterRoleUpgradeTimeout == 0));
mRouterRoleUpgradeTimeout = Random::NonCrypto::GetUint8InRange(1, kRouterRoleUpgradeMaxTimeout + 1); mRouterRoleUpgradeTimeout = Random::NonCrypto::GetUint8InRange(1, kRouterRoleUpgradeMaxTimeout + 1);
@@ -357,11 +357,11 @@ void Notifier::HandleTimeTick(void)
// upgrade (note that state can change since the last time we // upgrade (note that state can change since the last time we
// checked and registered to receive time ticks). // checked and registered to receive time ticks).
if (Get<Mle::MleRouter>().IsChild() && IsEligibleForRouterRoleUpgradeAsBorderRouter()) if (Get<Mle::Mle>().IsChild() && IsEligibleForRouterRoleUpgradeAsBorderRouter())
{ {
LogInfo("Requesting router role as BR"); LogInfo("Requesting router role as BR");
mDidRequestRouterRoleUpgrade = true; mDidRequestRouterRoleUpgrade = true;
IgnoreError(Get<Mle::MleRouter>().BecomeRouter(ThreadStatusTlv::kBorderRouterRequest)); IgnoreError(Get<Mle::Mle>().BecomeRouter(ThreadStatusTlv::kBorderRouterRequest));
} }
} }
exit: exit:
+1 -1
View File
@@ -143,7 +143,7 @@ bool Manager::IsBackboneRouterPreferredTo(const ServerTlv &aServerTlv,
const BbrServerData &aOtherServerData) const const BbrServerData &aOtherServerData) const
{ {
bool isPreferred; bool isPreferred;
uint16_t leaderRloc16 = Get<Mle::MleRouter>().GetLeaderRloc16(); uint16_t leaderRloc16 = Get<Mle::Mle>().GetLeaderRloc16();
VerifyOrExit(aServerTlv.GetServer16() != leaderRloc16, isPreferred = true); VerifyOrExit(aServerTlv.GetServer16() != leaderRloc16, isPreferred = true);
VerifyOrExit(aOtherServerTlv.GetServer16() != leaderRloc16, isPreferred = false); VerifyOrExit(aOtherServerTlv.GetServer16() != leaderRloc16, isPreferred = false);
+1 -1
View File
@@ -206,7 +206,7 @@ void ExternalRouteConfig::SetFrom(Instance &aInstance,
SetFromTlvFlags(aHasRouteEntry.GetFlags()); SetFromTlvFlags(aHasRouteEntry.GetFlags());
mStable = aHasRouteTlv.IsStable(); mStable = aHasRouteTlv.IsStable();
mRloc16 = aHasRouteEntry.GetRloc(); mRloc16 = aHasRouteEntry.GetRloc();
mNextHopIsThisDevice = (aHasRouteEntry.GetRloc() == aInstance.Get<Mle::MleRouter>().GetRloc16()); mNextHopIsThisDevice = (aHasRouteEntry.GetRloc() == aInstance.Get<Mle::Mle>().GetRloc16());
} }
void ExternalRouteConfig::SetFromTlvFlags(uint8_t aFlags) void ExternalRouteConfig::SetFromTlvFlags(uint8_t aFlags)
+9 -9
View File
@@ -99,7 +99,7 @@ void Server::PrepareMessageInfoForDest(const Ip6::Address &aDestination, Tmf::Me
if (aDestination.IsLinkLocalUnicastOrMulticast()) if (aDestination.IsLinkLocalUnicastOrMulticast())
{ {
aMessageInfo.SetSockAddr(Get<Mle::MleRouter>().GetLinkLocalAddress()); aMessageInfo.SetSockAddr(Get<Mle::Mle>().GetLinkLocalAddress());
} }
else else
{ {
@@ -152,7 +152,7 @@ Error Server::AppendChildTable(Message &aMessage)
Error error = kErrorNone; Error error = kErrorNone;
uint16_t count; uint16_t count;
VerifyOrExit(Get<Mle::MleRouter>().IsRouterOrLeader()); VerifyOrExit(Get<Mle::Mle>().IsRouterOrLeader());
count = Min(Get<ChildTable>().GetNumChildren(Child::kInStateValid), kMaxChildEntries); count = Min(Get<ChildTable>().GetNumChildren(Child::kInStateValid), kMaxChildEntries);
@@ -400,11 +400,11 @@ Error Server::AppendDiagTlv(uint8_t aTlvType, Message &aMessage)
break; break;
case Tlv::kAddress16: case Tlv::kAddress16:
error = Tlv::Append<Address16Tlv>(aMessage, Get<Mle::MleRouter>().GetRloc16()); error = Tlv::Append<Address16Tlv>(aMessage, Get<Mle::Mle>().GetRloc16());
break; break;
case Tlv::kMode: case Tlv::kMode:
error = Tlv::Append<ModeTlv>(aMessage, Get<Mle::MleRouter>().GetDeviceMode().Get()); error = Tlv::Append<ModeTlv>(aMessage, Get<Mle::Mle>().GetDeviceMode().Get());
break; break;
case Tlv::kEui64: case Tlv::kEui64:
@@ -421,8 +421,8 @@ Error Server::AppendDiagTlv(uint8_t aTlvType, Message &aMessage)
break; break;
case Tlv::kTimeout: case Tlv::kTimeout:
VerifyOrExit(!Get<Mle::MleRouter>().IsRxOnWhenIdle()); VerifyOrExit(!Get<Mle::Mle>().IsRxOnWhenIdle());
error = Tlv::Append<TimeoutTlv>(aMessage, Get<Mle::MleRouter>().GetTimeout()); error = Tlv::Append<TimeoutTlv>(aMessage, Get<Mle::Mle>().GetTimeout());
break; break;
case Tlv::kLeaderData: case Tlv::kLeaderData:
@@ -430,7 +430,7 @@ Error Server::AppendDiagTlv(uint8_t aTlvType, Message &aMessage)
LeaderDataTlv tlv; LeaderDataTlv tlv;
tlv.Init(); tlv.Init();
tlv.Set(Get<Mle::MleRouter>().GetLeaderData()); tlv.Set(Get<Mle::Mle>().GetLeaderData());
error = tlv.AppendTo(aMessage); error = tlv.AppendTo(aMessage);
break; break;
} }
@@ -511,7 +511,7 @@ Error Server::AppendDiagTlv(uint8_t aTlvType, Message &aMessage)
ConnectivityTlv tlv; ConnectivityTlv tlv;
tlv.Init(); tlv.Init();
Get<Mle::MleRouter>().FillConnectivityTlv(tlv); Get<Mle::Mle>().FillConnectivityTlv(tlv);
error = tlv.AppendTo(aMessage); error = tlv.AppendTo(aMessage);
break; break;
} }
@@ -538,7 +538,7 @@ Error Server::AppendDiagTlv(uint8_t aTlvType, Message &aMessage)
{ {
uint32_t maxTimeout; uint32_t maxTimeout;
SuccessOrExit(Get<Mle::MleRouter>().GetMaxChildTimeout(maxTimeout)); SuccessOrExit(Get<Mle::Mle>().GetMaxChildTimeout(maxTimeout));
error = Tlv::Append<MaxChildTimeoutTlv>(aMessage, maxTimeout); error = Tlv::Append<MaxChildTimeoutTlv>(aMessage, maxTimeout);
break; break;
} }
+12 -12
View File
@@ -175,7 +175,7 @@ Router *RouterTable::Allocate(uint8_t aRouterId)
mRouterIdSequence++; mRouterIdSequence++;
mRouterIdSequenceLastUpdated = TimerMilli::GetNow(); mRouterIdSequenceLastUpdated = TimerMilli::GetNow();
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
LogNote("Allocate router id %d", aRouterId); LogNote("Allocate router id %d", aRouterId);
@@ -190,7 +190,7 @@ Error RouterTable::Release(uint8_t aRouterId)
OT_ASSERT(aRouterId <= Mle::kMaxRouterId); OT_ASSERT(aRouterId <= Mle::kMaxRouterId);
VerifyOrExit(Get<Mle::MleRouter>().IsLeader(), error = kErrorInvalidState); VerifyOrExit(Get<Mle::Mle>().IsLeader(), error = kErrorInvalidState);
router = FindRouterById(aRouterId); router = FindRouterById(aRouterId);
VerifyOrExit(router != nullptr, error = kErrorNotFound); VerifyOrExit(router != nullptr, error = kErrorNotFound);
@@ -211,7 +211,7 @@ Error RouterTable::Release(uint8_t aRouterId)
Get<AddressResolver>().RemoveEntriesForRouterId(aRouterId); Get<AddressResolver>().RemoveEntriesForRouterId(aRouterId);
Get<NetworkData::Leader>().RemoveBorderRouter(Mle::Rloc16FromRouterId(aRouterId), Get<NetworkData::Leader>().RemoveBorderRouter(Mle::Rloc16FromRouterId(aRouterId),
NetworkData::Leader::kMatchModeRouterId); NetworkData::Leader::kMatchModeRouterId);
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
LogNote("Release router id %d", aRouterId); LogNote("Release router id %d", aRouterId);
@@ -237,14 +237,14 @@ void RouterTable::RemoveRouterLink(Router &aRouter)
if (GetLinkCost(router) >= Mle::kMaxRouteCost) if (GetLinkCost(router) >= Mle::kMaxRouteCost)
{ {
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
} }
} }
} }
if (aRouter.GetNextHop() == Mle::kInvalidRouterId) if (aRouter.GetNextHop() == Mle::kInvalidRouterId)
{ {
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
// Clear all EID-to-RLOC entries associated with the router. // Clear all EID-to-RLOC entries associated with the router.
Get<AddressResolver>().RemoveEntriesForRouterId(aRouter.GetRouterId()); Get<AddressResolver>().RemoveEntriesForRouterId(aRouter.GetRouterId());
@@ -328,7 +328,7 @@ exit:
return error; return error;
} }
const Router *RouterTable::GetLeader(void) const { return FindRouterById(Get<Mle::MleRouter>().GetLeaderId()); } const Router *RouterTable::GetLeader(void) const { return FindRouterById(Get<Mle::Mle>().GetLeaderId()); }
uint32_t RouterTable::GetLeaderAge(void) const uint32_t RouterTable::GetLeaderAge(void) const
{ {
@@ -411,7 +411,7 @@ void RouterTable::GetNextHopAndPathCost(uint16_t aDestRloc16, uint16_t &aNextHop
router = FindRouterById(Mle::RouterIdFromRloc16(aDestRloc16)); router = FindRouterById(Mle::RouterIdFromRloc16(aDestRloc16));
nextHop = (router != nullptr) ? FindNextHopOf(*router) : nullptr; nextHop = (router != nullptr) ? FindNextHopOf(*router) : nullptr;
if (Get<Mle::MleRouter>().IsChild()) if (Get<Mle::Mle>().IsChild())
{ {
const Router &parent = Get<Mle::Mle>().GetParent(); const Router &parent = Get<Mle::Mle>().GetParent();
bool destIsParentOrItsChild; bool destIsParentOrItsChild;
@@ -544,7 +544,7 @@ void RouterTable::UpdateRouterIdSet(uint8_t aRouterIdSequence, const Mle::Router
} }
} }
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
exit: exit:
return; return;
@@ -613,7 +613,7 @@ void RouterTable::UpdateRoutes(const Mle::RouteTlv &aRouteTlv, uint8_t aNeighbor
if (neighbor->IsStateValid() && (aRouteTlv.GetLinkQualityOut(index) == kLinkQuality0) && if (neighbor->IsStateValid() && (aRouteTlv.GetLinkQualityOut(index) == kLinkQuality0) &&
(neighbor->GetTwoWayLinkQuality() >= kLinkQuality2)) (neighbor->GetTwoWayLinkQuality() >= kLinkQuality2))
{ {
Get<Mle::MleRouter>().ScheduleUnicastAdvertisementTo(*neighbor); Get<Mle::Mle>().ScheduleUnicastAdvertisementTo(*neighbor);
} }
} }
@@ -684,7 +684,7 @@ void RouterTable::UpdateRoutes(const Mle::RouteTlv &aRouteTlv, uint8_t aNeighbor
if (newCostFinite != oldCostFinite) if (newCostFinite != oldCostFinite)
{ {
Get<Mle::MleRouter>().ResetAdvertiseInterval(); Get<Mle::Mle>().ResetAdvertiseInterval();
break; break;
} }
} }
@@ -817,7 +817,7 @@ void RouterTable::HandleTimeTick(void)
{ {
mRouterIdMap.HandleTimeTick(); mRouterIdMap.HandleTimeTick();
VerifyOrExit(Get<Mle::MleRouter>().IsLeader()); VerifyOrExit(Get<Mle::Mle>().IsLeader());
// Update router id sequence // Update router id sequence
if (GetLeaderAge() >= kRouterIdSequencePeriod) if (GetLeaderAge() >= kRouterIdSequencePeriod)
@@ -890,7 +890,7 @@ void RouterTable::HandleTableChanged(void)
Get<Utils::HistoryTracker>().RecordRouterTableChange(); Get<Utils::HistoryTracker>().RecordRouterTableChange();
#endif #endif
Get<Mle::MleRouter>().UpdateAdvertiseInterval(); Get<Mle::Mle>().UpdateAdvertiseInterval();
} }
#if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO) #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO)
+2 -2
View File
@@ -57,7 +57,7 @@ void ThreadNetif::Up(void)
mIsUp = true; mIsUp = true;
SubscribeAllNodesMulticast(); SubscribeAllNodesMulticast();
IgnoreError(Get<Mle::MleRouter>().Enable()); IgnoreError(Get<Mle::Mle>().Enable());
IgnoreError(Get<Tmf::Agent>().Start()); IgnoreError(Get<Tmf::Agent>().Start());
#if OPENTHREAD_CONFIG_DNSSD_SERVER_ENABLE #if OPENTHREAD_CONFIG_DNSSD_SERVER_ENABLE
IgnoreError(Get<Dns::ServiceDiscovery::Server>().Start()); IgnoreError(Get<Dns::ServiceDiscovery::Server>().Start());
@@ -88,7 +88,7 @@ void ThreadNetif::Down(void)
Get<Dns::ServiceDiscovery::Server>().Stop(); Get<Dns::ServiceDiscovery::Server>().Stop();
#endif #endif
IgnoreError(Get<Tmf::Agent>().Stop()); IgnoreError(Get<Tmf::Agent>().Stop());
IgnoreError(Get<Mle::MleRouter>().Disable()); IgnoreError(Get<Mle::Mle>().Disable());
RemoveAllExternalUnicastAddresses(); RemoveAllExternalUnicastAddresses();
UnsubscribeAllExternalMulticastAddresses(); UnsubscribeAllExternalMulticastAddresses();
UnsubscribeAllRoutersMulticast(); UnsubscribeAllRoutersMulticast();
-1
View File
@@ -41,7 +41,6 @@
#include "common/tlvs.hpp" #include "common/tlvs.hpp"
#include "meshcop/network_name.hpp" #include "meshcop/network_name.hpp"
#include "net/ip6_address.hpp" #include "net/ip6_address.hpp"
#include "thread/mle.hpp"
#include "thread/mle_types.hpp" #include "thread/mle_types.hpp"
namespace ot { namespace ot {
+7 -8
View File
@@ -86,7 +86,7 @@ void TimeSync::HandleTimeSyncMessage(const Message &aMessage)
LogInfo("Older time sync seq received:%u. Forwarding current seq:%u", aMessage.GetTimeSyncSeq(), mTimeSyncSeq); LogInfo("Older time sync seq received:%u. Forwarding current seq:%u", aMessage.GetTimeSyncSeq(), mTimeSyncSeq);
} }
else if (Get<Mle::MleRouter>().IsLeader() && timeSyncSeqDelta > 0) else if (Get<Mle::Mle>().IsLeader() && timeSyncSeqDelta > 0)
{ {
// Another device is forwarding a later time sync sequence, perhaps because it merged from a different // Another device is forwarding a later time sync sequence, perhaps because it merged from a different
// partition. The leader is authoritative, so ensure all devices synchronize to the time being seeded by this // partition. The leader is authoritative, so ensure all devices synchronize to the time being seeded by this
@@ -97,13 +97,13 @@ void TimeSync::HandleTimeSyncMessage(const Message &aMessage)
LogInfo("Newer time sync seq:%u received by leader. Setting current seq to:%u and forwarding", LogInfo("Newer time sync seq:%u received by leader. Setting current seq to:%u and forwarding",
aMessage.GetTimeSyncSeq(), mTimeSyncSeq); aMessage.GetTimeSyncSeq(), mTimeSyncSeq);
} }
else if (!Get<Mle::MleRouter>().IsLeader()) else if (!Get<Mle::Mle>().IsLeader())
{ {
// For all devices aside from the leader, update network time in following three cases: // For all devices aside from the leader, update network time in following three cases:
// 1. During first attach. // 1. During first attach.
// 2. Already attached, and a newer time sync sequence was received. // 2. Already attached, and a newer time sync sequence was received.
// 3. During reattach or migration process. // 3. During reattach or migration process.
if (mTimeSyncSeq == OT_TIME_SYNC_INVALID_SEQ || timeSyncSeqDelta > 0 || Get<Mle::MleRouter>().IsDetached()) if (mTimeSyncSeq == OT_TIME_SYNC_INVALID_SEQ || timeSyncSeqDelta > 0 || Get<Mle::Mle>().IsDetached())
{ {
// Update network time and forward it. // Update network time and forward it.
mLastTimeSyncReceived = TimerMilli::GetNow(); mLastTimeSyncReceived = TimerMilli::GetNow();
@@ -137,8 +137,7 @@ void TimeSync::NotifyTimeSyncCallback(void) { mTimeSyncCallback.InvokeIfSet(); }
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
void TimeSync::ProcessTimeSync(void) void TimeSync::ProcessTimeSync(void)
{ {
if (Get<Mle::MleRouter>().IsLeader() && if (Get<Mle::Mle>().IsLeader() && (TimerMilli::GetNow() - mLastTimeSyncSent > Time::SecToMsec(mTimeSyncPeriod)))
(TimerMilli::GetNow() - mLastTimeSyncSent > Time::SecToMsec(mTimeSyncPeriod)))
{ {
IncrementTimeSyncSeq(); IncrementTimeSyncSeq();
mTimeSyncRequired = true; mTimeSyncRequired = true;
@@ -148,7 +147,7 @@ void TimeSync::ProcessTimeSync(void)
if (mTimeSyncRequired) if (mTimeSyncRequired)
{ {
VerifyOrExit(Get<Mle::MleRouter>().SendTimeSync() == kErrorNone); VerifyOrExit(Get<Mle::Mle>().SendTimeSync() == kErrorNone);
mLastTimeSyncSent = TimerMilli::GetNow(); mLastTimeSyncSent = TimerMilli::GetNow();
mTimeSyncRequired = false; mTimeSyncRequired = false;
@@ -168,7 +167,7 @@ void TimeSync::HandleNotifierEvents(Events aEvents)
stateChanged = true; stateChanged = true;
} }
if (aEvents.Contains(kEventThreadPartitionIdChanged) && !Get<Mle::MleRouter>().IsLeader()) if (aEvents.Contains(kEventThreadPartitionIdChanged) && !Get<Mle::Mle>().IsLeader())
{ {
// Partition has changed. Accept any network time currently being seeded on the new partition // Partition has changed. Accept any network time currently being seeded on the new partition
// and don't attempt to forward the currently held network time from the previous partition. // and don't attempt to forward the currently held network time from the previous partition.
@@ -200,7 +199,7 @@ void TimeSync::CheckAndHandleChanges(bool aTimeUpdated)
mTimer.Stop(); mTimer.Stop();
switch (Get<Mle::MleRouter>().GetRole()) switch (Get<Mle::Mle>().GetRole())
{ {
case Mle::kRoleDisabled: case Mle::kRoleDisabled:
case Mle::kRoleDetached: case Mle::kRoleDetached:
+5 -5
View File
@@ -41,18 +41,18 @@ namespace Tmf {
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// MessageInfo // MessageInfo
void MessageInfo::SetSockAddrToRloc(void) { SetSockAddr(Get<Mle::MleRouter>().GetMeshLocalRloc()); } void MessageInfo::SetSockAddrToRloc(void) { SetSockAddr(Get<Mle::Mle>().GetMeshLocalRloc()); }
void MessageInfo::SetSockAddrToRlocPeerAddrToLeaderAloc(void) void MessageInfo::SetSockAddrToRlocPeerAddrToLeaderAloc(void)
{ {
SetSockAddrToRloc(); SetSockAddrToRloc();
Get<Mle::MleRouter>().GetLeaderAloc(GetPeerAddr()); Get<Mle::Mle>().GetLeaderAloc(GetPeerAddr());
} }
void MessageInfo::SetSockAddrToRlocPeerAddrToLeaderRloc(void) void MessageInfo::SetSockAddrToRlocPeerAddrToLeaderRloc(void)
{ {
SetSockAddrToRloc(); SetSockAddrToRloc();
Get<Mle::MleRouter>().GetLeaderRloc(GetPeerAddr()); Get<Mle::Mle>().GetLeaderRloc(GetPeerAddr());
} }
void MessageInfo::SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(void) void MessageInfo::SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(void)
@@ -127,8 +127,8 @@ bool Agent::HandleResource(const char *aUriPath, Message &aMessage, const Ip6::M
#if OPENTHREAD_FTD #if OPENTHREAD_FTD
Case(kUriAddressQuery, AddressResolver); Case(kUriAddressQuery, AddressResolver);
Case(kUriAddressNotify, AddressResolver); Case(kUriAddressNotify, AddressResolver);
Case(kUriAddressSolicit, Mle::MleRouter); Case(kUriAddressSolicit, Mle::Mle);
Case(kUriAddressRelease, Mle::MleRouter); Case(kUriAddressRelease, Mle::Mle);
Case(kUriActiveSet, MeshCoP::ActiveDatasetManager); Case(kUriActiveSet, MeshCoP::ActiveDatasetManager);
Case(kUriActiveReplace, MeshCoP::ActiveDatasetManager); Case(kUriActiveReplace, MeshCoP::ActiveDatasetManager);
Case(kUriPendingSet, MeshCoP::PendingDatasetManager); Case(kUriPendingSet, MeshCoP::PendingDatasetManager);
+1 -1
View File
@@ -96,7 +96,7 @@ void JamDetector::CheckState(void)
{ {
VerifyOrExit(mEnabled); VerifyOrExit(mEnabled);
switch (Get<Mle::MleRouter>().GetRole()) switch (Get<Mle::Mle>().GetRole())
{ {
case Mle::kRoleDisabled: case Mle::kRoleDisabled:
VerifyOrExit(mTimer.IsRunning()); VerifyOrExit(mTimer.IsRunning());
+3 -3
View File
@@ -40,7 +40,7 @@ void Node::Form(void)
Get<MeshCoP::ActiveDatasetManager>().SaveLocal(datasetInfo); Get<MeshCoP::ActiveDatasetManager>().SaveLocal(datasetInfo);
Get<ThreadNetif>().Up(); Get<ThreadNetif>().Up();
SuccessOrQuit(Get<Mle::MleRouter>().Start()); SuccessOrQuit(Get<Mle::Mle>().Start());
} }
void Node::Join(Node &aNode, JoinMode aJoinMode) void Node::Join(Node &aNode, JoinMode aJoinMode)
@@ -51,7 +51,7 @@ void Node::Join(Node &aNode, JoinMode aJoinMode)
switch (aJoinMode) switch (aJoinMode)
{ {
case kAsFed: case kAsFed:
SuccessOrQuit(Get<Mle::MleRouter>().SetRouterEligible(false)); SuccessOrQuit(Get<Mle::Mle>().SetRouterEligible(false));
OT_FALL_THROUGH; OT_FALL_THROUGH;
case kAsFtd: case kAsFtd:
@@ -72,7 +72,7 @@ void Node::Join(Node &aNode, JoinMode aJoinMode)
Get<MeshCoP::ActiveDatasetManager>().SaveLocal(dataset); Get<MeshCoP::ActiveDatasetManager>().SaveLocal(dataset);
Get<ThreadNetif>().Up(); Get<ThreadNetif>().Up();
SuccessOrQuit(Get<Mle::MleRouter>().Start()); SuccessOrQuit(Get<Mle::Mle>().Start());
} }
void Node::AllowList(Node &aNode) void Node::AllowList(Node &aNode)
+1 -1
View File
@@ -866,7 +866,7 @@ void TestBorderAgentMeshCoPServiceChangedCallback(void)
VerifyOrQuit(meshCoPServiceTester.FindTxtEntry("sb", txtEntry)); VerifyOrQuit(meshCoPServiceTester.FindTxtEntry("sb", txtEntry));
VerifyOrQuit(meshCoPServiceTester.FindTxtEntry("pt", txtEntry)); VerifyOrQuit(meshCoPServiceTester.FindTxtEntry("pt", txtEntry));
VerifyOrQuit(CheckObjectSameAsTxtEntryData( VerifyOrQuit(CheckObjectSameAsTxtEntryData(
txtEntry, BigEndian::HostSwap32(node0.Get<Mle::MleRouter>().GetLeaderData().GetPartitionId()))); txtEntry, BigEndian::HostSwap32(node0.Get<Mle::Mle>().GetLeaderData().GetPartitionId())));
VerifyOrQuit(meshCoPServiceTester.FindTxtEntry("at", txtEntry)); VerifyOrQuit(meshCoPServiceTester.FindTxtEntry("at", txtEntry));
VerifyOrQuit(CheckObjectSameAsTxtEntryData(txtEntry, node0.Get<ActiveDatasetManager>().GetTimestamp())); VerifyOrQuit(CheckObjectSameAsTxtEntryData(txtEntry, node0.Get<ActiveDatasetManager>().GetTimestamp()));
+4 -4
View File
@@ -247,12 +247,12 @@ void TestDtlsSingleSession(void)
nexus.AdvanceTime(50 * Time::kOneSecondInMsec); nexus.AdvanceTime(50 * Time::kOneSecondInMsec);
VerifyOrQuit(node0.Get<Mle::Mle>().IsLeader()); VerifyOrQuit(node0.Get<Mle::Mle>().IsLeader());
SuccessOrQuit(node1.Get<Mle::MleRouter>().SetRouterEligible(false)); SuccessOrQuit(node1.Get<Mle::Mle>().SetRouterEligible(false));
node1.Join(node0); node1.Join(node0);
nexus.AdvanceTime(20 * Time::kOneSecondInMsec); nexus.AdvanceTime(20 * Time::kOneSecondInMsec);
VerifyOrQuit(node1.Get<Mle::Mle>().IsChild()); VerifyOrQuit(node1.Get<Mle::Mle>().IsChild());
SuccessOrQuit(node2.Get<Mle::MleRouter>().SetRouterEligible(false)); SuccessOrQuit(node2.Get<Mle::Mle>().SetRouterEligible(false));
node2.Join(node0); node2.Join(node0);
nexus.AdvanceTime(20 * Time::kOneSecondInMsec); nexus.AdvanceTime(20 * Time::kOneSecondInMsec);
VerifyOrQuit(node2.Get<Mle::Mle>().IsChild()); VerifyOrQuit(node2.Get<Mle::Mle>().IsChild());
@@ -489,12 +489,12 @@ void TestDtlsMultiSession(void)
nexus.AdvanceTime(50 * Time::kOneSecondInMsec); nexus.AdvanceTime(50 * Time::kOneSecondInMsec);
VerifyOrQuit(node0.Get<Mle::Mle>().IsLeader()); VerifyOrQuit(node0.Get<Mle::Mle>().IsLeader());
SuccessOrQuit(node1.Get<Mle::MleRouter>().SetRouterEligible(false)); SuccessOrQuit(node1.Get<Mle::Mle>().SetRouterEligible(false));
node1.Join(node0); node1.Join(node0);
nexus.AdvanceTime(20 * Time::kOneSecondInMsec); nexus.AdvanceTime(20 * Time::kOneSecondInMsec);
VerifyOrQuit(node1.Get<Mle::Mle>().IsChild()); VerifyOrQuit(node1.Get<Mle::Mle>().IsChild());
SuccessOrQuit(node2.Get<Mle::MleRouter>().SetRouterEligible(false)); SuccessOrQuit(node2.Get<Mle::Mle>().SetRouterEligible(false));
node2.Join(node0); node2.Join(node0);
nexus.AdvanceTime(20 * Time::kOneSecondInMsec); nexus.AdvanceTime(20 * Time::kOneSecondInMsec);
VerifyOrQuit(node2.Get<Mle::Mle>().IsChild()); VerifyOrQuit(node2.Get<Mle::Mle>().IsChild());
+2 -2
View File
@@ -78,7 +78,7 @@ void VerifyChildIp6Addresses(const Child &aChild, uint8_t aAddressListLength, co
{ {
Ip6::Address address; Ip6::Address address;
if (sInstance->Get<Mle::MleRouter>().IsMeshLocalAddress(aAddressList[index])) if (sInstance->Get<Mle::Mle>().IsMeshLocalAddress(aAddressList[index]))
{ {
SuccessOrQuit(aChild.GetMeshLocalIp6Address(address)); SuccessOrQuit(aChild.GetMeshLocalIp6Address(address));
VerifyOrQuit(address == aAddressList[index], "GetMeshLocalIp6Address() did not return expected address"); VerifyOrQuit(address == aAddressList[index], "GetMeshLocalIp6Address() did not return expected address");
@@ -127,7 +127,7 @@ void TestChildIp6Address(void)
numAddresses = 0; numAddresses = 0;
// First addresses uses the mesh local prefix (mesh-local address). // First addresses uses the mesh local prefix (mesh-local address).
addresses[numAddresses] = sInstance->Get<Mle::MleRouter>().GetMeshLocalEid(); addresses[numAddresses] = sInstance->Get<Mle::Mle>().GetMeshLocalEid();
addresses[numAddresses].SetIid(meshLocalIid); addresses[numAddresses].SetIid(meshLocalIid);
numAddresses++; numAddresses++;
+1 -1
View File
@@ -104,7 +104,7 @@ static void Init(void)
otMeshLocalPrefix meshLocalPrefix = {{0xfd, 0x00, 0xca, 0xfe, 0xfa, 0xce, 0x12, 0x34}}; otMeshLocalPrefix meshLocalPrefix = {{0xfd, 0x00, 0xca, 0xfe, 0xfa, 0xce, 0x12, 0x34}};
OffsetRange offsetRange; OffsetRange offsetRange;
sInstance->Get<Mle::MleRouter>().SetMeshLocalPrefix(static_cast<Ip6::NetworkPrefix &>(meshLocalPrefix)); sInstance->Get<Mle::Mle>().SetMeshLocalPrefix(static_cast<Ip6::NetworkPrefix &>(meshLocalPrefix));
// Emulate global prefixes with contextes. // Emulate global prefixes with contextes.
uint8_t mockNetworkData[] = { uint8_t mockNetworkData[] = {