From 91111c6237196f2c21eb7a78c90c3a01e74e38f3 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 6 Apr 2020 23:56:31 -0700 Subject: [PATCH] [mle] add DeviceRole type, and IsChild, IsRouter, etc method (#4794) This commit defines a new enum type `Mle::DeviceRole` mirroring the public `otDeviceRole` enumeration. The enumerator in the new type follow `kRole{Value}` style and intended for use in the core modules. It also adds helper method in `Mle`, `IsChild()`, `IsRouter()`, `IsLeader()`, etc to check the current device role. --- src/core/api/link_api.cpp | 8 +- src/core/api/network_time_api.cpp | 4 +- src/core/api/thread_api.cpp | 10 +- src/core/api/thread_ftd_api.cpp | 12 +- src/core/backbone_router/local.cpp | 2 +- src/core/common/instance.cpp | 2 +- src/core/common/settings.cpp | 2 +- src/core/mac/data_poll_handler.cpp | 2 +- src/core/meshcop/dataset_manager.cpp | 8 +- src/core/meshcop/dataset_manager_ftd.cpp | 4 +- src/core/meshcop/meshcop_leader.cpp | 2 +- src/core/thread/announce_sender.cpp | 10 +- src/core/thread/mesh_forwarder.cpp | 6 +- src/core/thread/mle.cpp | 168 +++++++++--------- src/core/thread/mle.hpp | 66 ++++++- src/core/thread/mle_router.cpp | 186 ++++++++++---------- src/core/thread/mle_types.hpp | 13 ++ src/core/thread/network_data_leader.cpp | 2 +- src/core/thread/network_data_leader_ftd.cpp | 17 +- src/core/thread/network_data_local.cpp | 2 +- src/core/thread/network_diagnostic.cpp | 3 +- src/core/thread/router_table.cpp | 4 +- src/core/thread/time_sync_service.cpp | 21 ++- src/core/utils/channel_manager.cpp | 4 +- src/core/utils/child_supervision.cpp | 9 +- src/core/utils/jam_detector.cpp | 2 +- 26 files changed, 317 insertions(+), 252 deletions(-) diff --git a/src/core/api/link_api.cpp b/src/core/api/link_api.cpp index 46935efea..80f4bee00 100644 --- a/src/core/api/link_api.cpp +++ b/src/core/api/link_api.cpp @@ -74,7 +74,7 @@ otError otLinkSetChannel(otInstance *aInstance, uint8_t aChannel) } #endif - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); SuccessOrExit(error = instance.Get().SetPanChannel(aChannel)); instance.Get().Clear(); @@ -96,7 +96,7 @@ otError otLinkSetSupportedChannelMask(otInstance *aInstance, uint32_t aChannelMa otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetSupportedChannelMask(static_cast(aChannelMask)); @@ -117,7 +117,7 @@ otError otLinkSetExtendedAddress(otInstance *aInstance, const otExtAddress *aExt Instance &instance = *static_cast(aInstance); OT_ASSERT(aExtAddress != NULL); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetExtAddress(*static_cast(aExtAddress)); @@ -146,7 +146,7 @@ otError otLinkSetPanId(otInstance *aInstance, otPanId aPanId) otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetPanId(aPanId); instance.Get().Clear(); diff --git a/src/core/api/network_time_api.cpp b/src/core/api/network_time_api.cpp index 156f363ae..49893daf0 100644 --- a/src/core/api/network_time_api.cpp +++ b/src/core/api/network_time_api.cpp @@ -54,7 +54,7 @@ otError otNetworkTimeSetSyncPeriod(otInstance *aInstance, uint16_t aTimeSyncPeri otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetTimeSyncPeriod(aTimeSyncPeriod); @@ -74,7 +74,7 @@ otError otNetworkTimeSetXtalThreshold(otInstance *aInstance, uint16_t aXtalThres otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetXtalThreshold(aXtalThreshold); diff --git a/src/core/api/thread_api.cpp b/src/core/api/thread_api.cpp index 586f5160c..72ebbbc4f 100644 --- a/src/core/api/thread_api.cpp +++ b/src/core/api/thread_api.cpp @@ -71,7 +71,7 @@ otError otThreadSetExtendedPanId(otInstance *aInstance, const otExtendedPanId *a const Mac::ExtendedPanId &extPanId = *static_cast(aExtendedPanId); Mle::MeshLocalPrefix prefix; - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetExtendedPanId(extPanId); @@ -125,7 +125,7 @@ otError otThreadSetMasterKey(otInstance *aInstance, const otMasterKey *aKey) OT_ASSERT(aKey != NULL); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); error = instance.Get().SetMasterKey(*static_cast(aKey)); instance.Get().Clear(); @@ -161,7 +161,7 @@ otError otThreadSetMeshLocalPrefix(otInstance *aInstance, const otMeshLocalPrefi otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetMeshLocalPrefix(*static_cast(aMeshLocalPrefix)); instance.Get().Clear(); @@ -190,7 +190,7 @@ otError otThreadSetNetworkName(otInstance *aInstance, const char *aNetworkName) otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); error = instance.Get().SetNetworkName(aNetworkName); instance.Get().Clear(); @@ -310,7 +310,7 @@ otError otThreadGetParentInfo(otInstance *aInstance, otRouterInfo *aParentInfo) // Reference device needs get the original parent's info even after the node state changed. #if !OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_CHILD, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsChild(), error = OT_ERROR_INVALID_STATE); #endif parent = &instance.Get().GetParent(); diff --git a/src/core/api/thread_ftd_api.cpp b/src/core/api/thread_ftd_api.cpp index cc564dedd..34969f611 100644 --- a/src/core/api/thread_ftd_api.cpp +++ b/src/core/api/thread_ftd_api.cpp @@ -201,16 +201,16 @@ otError otThreadBecomeRouter(otInstance *aInstance) switch (instance.Get().GetRole()) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case Mle::kRoleDisabled: + case Mle::kRoleDetached: break; - case OT_DEVICE_ROLE_CHILD: + case Mle::kRoleChild: error = instance.Get().BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case Mle::kRoleRouter: + case Mle::kRoleLeader: error = OT_ERROR_NONE; break; } @@ -346,7 +346,7 @@ otError otThreadSetPskc(otInstance *aInstance, const otPskc *aPskc) otError error = OT_ERROR_NONE; Instance &instance = *static_cast(aInstance); - VerifyOrExit(instance.Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(instance.Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); instance.Get().SetPskc(*static_cast(aPskc)); instance.Get().Clear(); diff --git a/src/core/backbone_router/local.cpp b/src/core/backbone_router/local.cpp index 003ea33a8..a650633fe 100644 --- a/src/core/backbone_router/local.cpp +++ b/src/core/backbone_router/local.cpp @@ -206,7 +206,7 @@ void Local::UpdateBackboneRouterPrimary(Leader::State aState, const BackboneRout { uint8_t delay = 1; - if (Get().GetRole() != OT_DEVICE_ROLE_LEADER) + if (!Get().IsLeader()) { delay += Random::NonCrypto::GetUint8InRange(0, mRegistrationJitter < 255 ? mRegistrationJitter + 1 : mRegistrationJitter); diff --git a/src/core/common/instance.cpp b/src/core/common/instance.cpp index 33c21377b..91fdc3e65 100644 --- a/src/core/common/instance.cpp +++ b/src/core/common/instance.cpp @@ -221,7 +221,7 @@ otError Instance::ErasePersistentInfo(void) { otError error = OT_ERROR_NONE; - VerifyOrExit(Get().GetRole() == OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); Get().Wipe(); exit: diff --git a/src/core/common/settings.cpp b/src/core/common/settings.cpp index d3859c83e..fda8d6b6d 100644 --- a/src/core/common/settings.cpp +++ b/src/core/common/settings.cpp @@ -54,7 +54,7 @@ void SettingsBase::LogNetworkInfo(const char *aAction, const NetworkInfo &aNetwo otLogInfoCore( "Non-volatile: %s NetworkInfo {rloc:0x%04x, extaddr:%s, role:%s, mode:0x%02x, version:%hu, keyseq:0x%x, ...", aAction, aNetworkInfo.GetRloc16(), aNetworkInfo.GetExtAddress().ToString().AsCString(), - Mle::Mle::RoleToString(static_cast(aNetworkInfo.GetRole())), aNetworkInfo.GetDeviceMode(), + Mle::Mle::RoleToString(static_cast(aNetworkInfo.GetRole())), aNetworkInfo.GetDeviceMode(), aNetworkInfo.GetVersion(), aNetworkInfo.GetKeySequence()); otLogInfoCore( diff --git a/src/core/mac/data_poll_handler.cpp b/src/core/mac/data_poll_handler.cpp index cd85b573e..ddedf7ce0 100644 --- a/src/core/mac/data_poll_handler.cpp +++ b/src/core/mac/data_poll_handler.cpp @@ -131,7 +131,7 @@ void DataPollHandler::HandleDataPoll(Mac::RxFrame &aFrame) uint16_t indirectMsgCount; VerifyOrExit(aFrame.GetSecurityEnabled()); - VerifyOrExit(Get().GetRole() != OT_DEVICE_ROLE_DETACHED); + VerifyOrExit(!Get().IsDetached()); SuccessOrExit(aFrame.GetSrcAddr(macSource)); child = Get().FindChild(macSource, Child::kInStateValidOrRestoring); diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 95593d5de..fc00017b5 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -183,19 +183,19 @@ otError DatasetManager::Save(const otOperationalDataset &aDataset) switch (Get().GetRole()) { - case OT_DEVICE_ROLE_DISABLED: + case Mle::kRoleDisabled: Restore(); break; - case OT_DEVICE_ROLE_CHILD: + case Mle::kRoleChild: mTimer.Start(1000); break; #if OPENTHREAD_FTD - case OT_DEVICE_ROLE_ROUTER: + case Mle::kRoleRouter: mTimer.Start(1000); break; - case OT_DEVICE_ROLE_LEADER: + case Mle::kRoleLeader: Restore(); Get().IncrementVersionAndStableVersion(); break; diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index e77255ddd..783e807f2 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -92,7 +92,7 @@ otError DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInf channel.SetLength(0); pendingTimestamp.SetLength(0); - VerifyOrExit(Get().GetRole() == OT_DEVICE_ROLE_LEADER); + VerifyOrExit(Get().IsLeader()); // verify that TLV data size is less than maximum TLV value size while (offset < aMessage.GetLength()) @@ -269,7 +269,7 @@ otError DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInf exit: - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER) + if (Get().IsLeader()) { SendSetResponse(aMessage, aMessageInfo, state); } diff --git a/src/core/meshcop/meshcop_leader.cpp b/src/core/meshcop/meshcop_leader.cpp index 2fabbf7e9..42d46f255 100644 --- a/src/core/meshcop/meshcop_leader.cpp +++ b/src/core/meshcop/meshcop_leader.cpp @@ -286,7 +286,7 @@ void Leader::HandleTimer(Timer &aTimer) void Leader::HandleTimer(void) { - VerifyOrExit(Get().GetRole() == OT_DEVICE_ROLE_LEADER); + VerifyOrExit(Get().IsLeader()); ResignCommissioner(); diff --git a/src/core/thread/announce_sender.cpp b/src/core/thread/announce_sender.cpp index 502cd2729..4e9ee86bc 100644 --- a/src/core/thread/announce_sender.cpp +++ b/src/core/thread/announce_sender.cpp @@ -132,12 +132,12 @@ void AnnounceSender::CheckState(void) switch (mle.GetRole()) { - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case Mle::kRoleRouter: + case Mle::kRoleLeader: interval = kRouterTxInterval; break; - case OT_DEVICE_ROLE_CHILD: + case Mle::kRoleChild: #if OPENTHREAD_FTD if (mle.IsRouterEligible() && mle.IsRxOnWhenIdle()) { @@ -148,8 +148,8 @@ void AnnounceSender::CheckState(void) // fall through - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case Mle::kRoleDisabled: + case Mle::kRoleDetached: Stop(); ExitNow(); } diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index fd5a39641..b38aa06a7 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -292,7 +292,7 @@ otError MeshForwarder::UpdateIp6Route(Message &aMessage) GetMacSourceAddress(ip6Header.GetSource(), mMacSource); - if (mle.GetRole() == OT_DEVICE_ROLE_DISABLED || mle.GetRole() == OT_DEVICE_ROLE_DETACHED) + if (mle.IsDisabled() || mle.IsDetached()) { if (ip6Header.GetDestination().IsLinkLocal() || ip6Header.GetDestination().IsLinkLocalMulticast()) { @@ -312,7 +312,7 @@ otError MeshForwarder::UpdateIp6Route(Message &aMessage) // transmits multicasts, as IEEE 802.15.4 unicasts to its // parent. - if (mle.GetRole() == OT_DEVICE_ROLE_CHILD && !aMessage.IsSubTypeMle()) + if (mle.IsChild() && !aMessage.IsSubTypeMle()) { mMacDest.SetShort(mle.GetNextHop(Mac::kShortAddrBroadcast)); } @@ -646,7 +646,7 @@ start: uint16_t meshHeaderLength; uint8_t hopsLeft; - if (mle.GetRole() == OT_DEVICE_ROLE_CHILD) + if (mle.IsChild()) { // REED sets hopsLeft to max (16) + 1. It does not know the route cost. hopsLeft = Mle::kMaxRouteCost + 1; diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 93d5b03d1..2f7273ef1 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -67,7 +67,7 @@ namespace Mle { Mle::Mle(Instance &aInstance) : InstanceLocator(aInstance) , mRetrieveNewNetworkData(false) - , mRole(OT_DEVICE_ROLE_DISABLED) + , mRole(kRoleDisabled) , mDeviceMode(DeviceMode::kModeRxOnWhenIdle | DeviceMode::kModeSecureDataRequest) , mAttachState(kAttachStateIdle) , mReattachState(kReattachStop) @@ -326,7 +326,7 @@ void Mle::Stop(bool aClearNetworkDatasets) Get().HandleDetach(); } - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED); + VerifyOrExit(!IsDisabled()); Get().Stop(); SetStateDetached(); @@ -335,15 +335,15 @@ void Mle::Stop(bool aClearNetworkDatasets) Get().RemoveUnicastAddress(mMeshLocal16); Get().RemoveUnicastAddress(mMeshLocal64); - SetRole(OT_DEVICE_ROLE_DISABLED); + SetRole(kRoleDisabled); exit: return; } -void Mle::SetRole(otDeviceRole aRole) +void Mle::SetRole(DeviceRole aRole) { - otDeviceRole oldRole = mRole; + DeviceRole oldRole = mRole; SuccessOrExit(Get().Update(mRole, aRole, OT_CHANGED_THREAD_ROLE)); @@ -351,25 +351,25 @@ void Mle::SetRole(otDeviceRole aRole) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: mCounters.mDisabledRole++; break; - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: mCounters.mDetachedRole++; break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: mCounters.mChildRole++; break; - case OT_DEVICE_ROLE_ROUTER: + case kRoleRouter: mCounters.mRouterRole++; break; - case OT_DEVICE_ROLE_LEADER: + case kRoleLeader: mCounters.mLeaderRole++; break; } // If the previous state is disabled, the parent can be in kStateRestored. - if (mRole != OT_DEVICE_ROLE_CHILD && oldRole != OT_DEVICE_ROLE_DISABLED) + if (!IsChild() && oldRole != kRoleDisabled) { mParent.SetState(Neighbor::kStateInvalid); } @@ -420,9 +420,9 @@ otError Mle::Restore(void) switch (networkInfo.GetRole()) { - case OT_DEVICE_ROLE_CHILD: - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleChild: + case kRoleRouter: + case kRoleLeader: break; default: @@ -502,7 +502,7 @@ otError Mle::Store(void) networkInfo.SetMeshLocalIid(&mMeshLocal64.GetAddress().mFields.m8[OT_IP6_PREFIX_SIZE]); networkInfo.SetVersion(kThreadVersion); - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { Settings::ParentInfo parentInfo; @@ -636,13 +636,13 @@ otError Mle::BecomeDetached(void) { otError error = OT_ERROR_NONE; - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(!IsDisabled(), error = OT_ERROR_INVALID_STATE); // In case role is already detached and attach state is `kAttachStateStart` // (i.e., waiting to start an attach attempt), there is no need to make any // changes. - VerifyOrExit(mRole != OT_DEVICE_ROLE_DETACHED || mAttachState != kAttachStateStart); + VerifyOrExit(!IsDetached() || mAttachState != kAttachStateStart); // not in reattach stage after reset if (mReattachState == kReattachStop) @@ -667,7 +667,7 @@ otError Mle::BecomeChild(AttachMode aMode) { otError error = OT_ERROR_NONE; - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(!IsDisabled(), error = OT_ERROR_INVALID_STATE); VerifyOrExit(!IsAttaching(), error = OT_ERROR_BUSY); if (mReattachState == kReattachStart) @@ -702,7 +702,7 @@ otError Mle::BecomeChild(AttachMode aMode) mAttachTimer.Start(GetAttachStartDelay()); - if (mRole == OT_DEVICE_ROLE_DETACHED) + if (IsDetached()) { mAttachCounter++; @@ -728,7 +728,7 @@ uint32_t Mle::GetAttachStartDelay(void) const uint32_t delay = 1; uint32_t jitter; - VerifyOrExit(mRole == OT_DEVICE_ROLE_DETACHED); + VerifyOrExit(IsDetached()); if (mAttachCounter == 0) { @@ -769,7 +769,12 @@ exit: bool Mle::IsAttached(void) const { - return (mRole == OT_DEVICE_ROLE_CHILD || mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER); + return (IsChild() || IsRouter() || IsLeader()); +} + +bool Mle::IsRouterOrLeader(void) const +{ + return (IsRouter() || IsLeader()); } void Mle::SetStateDetached(void) @@ -781,12 +786,12 @@ void Mle::SetStateDetached(void) Get().Reset(); #endif - if (mRole == OT_DEVICE_ROLE_LEADER) + if (IsLeader()) { Get().RemoveUnicastAddress(mLeaderAloc); } - SetRole(OT_DEVICE_ROLE_DETACHED); + SetRole(kRoleDetached); SetAttachState(kAttachStateIdle); mAttachTimer.Stop(); mMessageTransmissionTimer.Stop(); @@ -807,13 +812,13 @@ void Mle::SetStateDetached(void) void Mle::SetStateChild(uint16_t aRloc16) { - if (mRole == OT_DEVICE_ROLE_LEADER) + if (IsLeader()) { Get().RemoveUnicastAddress(mLeaderAloc); } SetRloc16(aRloc16); - SetRole(OT_DEVICE_ROLE_CHILD); + SetRole(kRoleChild); SetAttachState(kAttachStateIdle); mAttachTimer.Stop(); mAttachCounter = 0; @@ -851,11 +856,10 @@ void Mle::SetStateChild(uint16_t aRloc16) void Mle::InformPreviousChannel(void) { VerifyOrExit(mAlternatePanId != Mac::kPanIdBroadcast); - VerifyOrExit(mRole == OT_DEVICE_ROLE_CHILD || mRole == OT_DEVICE_ROLE_ROUTER); + VerifyOrExit(IsChild() || IsRouter()); #if OPENTHREAD_FTD - VerifyOrExit(!IsFullThreadDevice() || mRole == OT_DEVICE_ROLE_ROUTER || - Get().GetRouterSelectionJitterTimeout() == 0); + VerifyOrExit(!IsFullThreadDevice() || IsRouter() || Get().GetRouterSelectionJitterTimeout() == 0); #endif mAlternatePanId = Mac::kPanIdBroadcast; @@ -878,7 +882,7 @@ void Mle::SetTimeout(uint32_t aTimeout) Get().RecalculatePollPeriod(); - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { SendChildUpdateRequest(); } @@ -902,22 +906,22 @@ otError Mle::SetDeviceMode(DeviceMode aDeviceMode) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: break; - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: mAttachCounter = 0; SetStateDetached(); BecomeChild(kAttachAny); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: SetStateChild(GetRloc16()); SendChildUpdateRequest(); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: if (oldMode.IsFullThreadDevice() && !mDeviceMode.IsFullThreadDevice()) { BecomeDetached(); @@ -989,7 +993,7 @@ void Mle::ApplyMeshLocalPrefix(void) mLinkLocalAllThreadNodes.GetAddress().SetMulticastNetworkPrefix(GetMeshLocalPrefix()); mRealmLocalAllThreadNodes.GetAddress().SetMulticastNetworkPrefix(GetMeshLocalPrefix()); - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED); + VerifyOrExit(!IsDisabled()); // Add the addresses back into the table. Get().AddUnicastAddress(mMeshLocal64); @@ -1002,7 +1006,7 @@ void Mle::ApplyMeshLocalPrefix(void) } // update Leader ALOC - if (mRole == OT_DEVICE_ROLE_LEADER) + if (IsLeader()) { Get().AddUnicastAddress(mLeaderAloc); } @@ -1148,7 +1152,7 @@ otError Mle::AddLeaderAloc(void) { otError error = OT_ERROR_NONE; - VerifyOrExit(mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(IsLeader(), error = OT_ERROR_INVALID_STATE); SuccessOrExit(error = GetLeaderAloc(mLeaderAloc.GetAddress())); @@ -1549,11 +1553,11 @@ void Mle::HandleStateChanged(Notifier::Callback &aCallback, otChangedFlags aFlag void Mle::HandleStateChanged(otChangedFlags aFlags) { - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED); + VerifyOrExit(!IsDisabled()); if (aFlags & OT_CHANGED_THREAD_ROLE) { - if (mRole == OT_DEVICE_ROLE_CHILD && !IsFullThreadDevice() && mAddressRegistrationMode == kAppendMeshLocalOnly) + if (IsChild() && !IsFullThreadDevice() && mAddressRegistrationMode == kAppendMeshLocalOnly) { // If only mesh-local address was registered in the "Child // ID Request" message, after device is attached, trigger a @@ -1578,7 +1582,7 @@ void Mle::HandleStateChanged(otChangedFlags aFlags) Get().Signal(OT_CHANGED_THREAD_ML_ADDR); } - if (mRole == OT_DEVICE_ROLE_CHILD && !IsFullThreadDevice()) + if (IsChild() && !IsFullThreadDevice()) { mChildUpdateRequestState = kChildUpdateRequestPending; ScheduleMessageTransmissionTimer(); @@ -1587,7 +1591,7 @@ void Mle::HandleStateChanged(otChangedFlags aFlags) if ((aFlags & (OT_CHANGED_IP6_MULTICAST_SUBSCRIBED | OT_CHANGED_IP6_MULTICAST_UNSUBSCRIBED)) != 0) { - if (mRole == OT_DEVICE_ROLE_CHILD && !IsFullThreadDevice() && !IsRxOnWhenIdle()) + if (IsChild() && !IsFullThreadDevice() && !IsRxOnWhenIdle()) { mChildUpdateRequestState = kChildUpdateRequestPending; ScheduleMessageTransmissionTimer(); @@ -1685,7 +1689,7 @@ void Mle::UpdateServiceAlocs(void) NetworkData::Iterator serviceIterator = NetworkData::kIteratorInit; int serviceAlocsLength = OT_ARRAY_LENGTH(mServiceAlocs); - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED); + VerifyOrExit(!IsDisabled()); // First remove all alocs which are no longer necessary, to free up space in mServiceAlocs for (i = 0; i < serviceAlocsLength; i++) @@ -1770,7 +1774,7 @@ void Mle::HandleAttachTimer(void) if ((linkQuality == 3 || mAttachState != kAttachStateParentRequestRouter) && mParentCandidate.IsStateParentResponse() && - (mRole != OT_DEVICE_ROLE_CHILD || mReceivedResponseFromParent || mParentRequestMode == kAttachBetter) && + (!IsChild() || mReceivedResponseFromParent || mParentRequestMode == kAttachBetter) && SendChildIdRequest() == OT_ERROR_NONE) { SetAttachState(kAttachStateChildIdRequest); @@ -1875,7 +1879,7 @@ bool Mle::PrepareAnnounceState(void) bool shouldAnnounce = false; Mac::ChannelMask channelMask; - VerifyOrExit((mRole != OT_DEVICE_ROLE_CHILD) && (mReattachState == kReattachStop) && + VerifyOrExit(!IsChild() && (mReattachState == kReattachStop) && (Get().IsPartiallyComplete() || !IsFullThreadDevice())); if (Get().GetChannelMask(channelMask) != OT_ERROR_NONE) @@ -1925,7 +1929,7 @@ uint32_t Mle::Reattach(void) switch (mParentRequestMode) { case kAttachAny: - if (mRole != OT_DEVICE_ROLE_CHILD) + if (!IsChild()) { if (mAlternatePanId != Mac::kPanIdBroadcast) { @@ -2127,7 +2131,7 @@ otError Mle::SendChildIdRequest(void) if (mParent.GetExtAddress() == mParentCandidate.GetExtAddress()) { - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { otLogInfoMle("Already attached to candidate parent"); ExitNow(error = OT_ERROR_ALREADY); @@ -2234,7 +2238,7 @@ exit: message->Free(); } - if ((mRole == OT_DEVICE_ROLE_CHILD) && !IsRxOnWhenIdle()) + if (IsChild() && !IsRxOnWhenIdle()) { mDataRequestState = kDataRequestActive; @@ -2272,7 +2276,7 @@ void Mle::ScheduleMessageTransmissionTimer(void) ExitNow(interval = kUnicastRetransmissionDelay); } - if ((mRole == OT_DEVICE_ROLE_CHILD) && IsRxOnWhenIdle()) + if (IsChild() && IsRxOnWhenIdle()) { interval = Time::SecToMsec(mTimeout) - static_cast(kUnicastRetransmissionDelay) * kMaxChildKeepAliveAttempts; @@ -2326,7 +2330,7 @@ void Mle::HandleMessageTransmissionTimer(void) } // Keep-alive "Child Update Request" only on a non-sleepy child - VerifyOrExit((mRole == OT_DEVICE_ROLE_CHILD) && IsRxOnWhenIdle()); + VerifyOrExit(IsChild() && IsRxOnWhenIdle()); break; case kChildUpdateRequestPending: @@ -2385,20 +2389,20 @@ otError Mle::SendChildUpdateRequest(void) switch (mRole) { - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: mParentRequestChallenge.GenerateRandom(); SuccessOrExit(error = AppendChallenge(*message, mParentRequestChallenge)); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); SuccessOrExit(error = AppendTimeout(*message, mTimeout)); break; - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleDisabled: + case kRoleRouter: + case kRoleLeader: OT_ASSERT(false); break; } @@ -2718,7 +2722,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn ExitNow(); } - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(!IsDisabled(), error = OT_ERROR_INVALID_STATE); VerifyOrExit(header.GetSecuritySuite() == Header::k154Security, error = OT_ERROR_PARSE); keySequence = header.GetKeyId(); @@ -2783,13 +2787,13 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn switch (mRole) { - case OT_DEVICE_ROLE_DETACHED: - case OT_DEVICE_ROLE_CHILD: + case kRoleDetached: + case kRoleChild: neighbor = GetNeighbor(macAddr); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: if (command == Header::kCommandChildIdResponse) { neighbor = GetNeighbor(macAddr); @@ -2846,7 +2850,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn case Header::kCommandChildUpdateRequest: #if OPENTHREAD_FTD - if (mRole == OT_DEVICE_ROLE_LEADER || mRole == OT_DEVICE_ROLE_ROUTER) + if (IsRouterOrLeader()) { Get().HandleChildUpdateRequest(aMessage, aMessageInfo, keySequence); } @@ -2860,7 +2864,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn case Header::kCommandChildUpdateResponse: #if OPENTHREAD_FTD - if (mRole == OT_DEVICE_ROLE_LEADER || mRole == OT_DEVICE_ROLE_ROUTER) + if (IsRouterOrLeader()) { Get().HandleChildUpdateResponse(aMessage, aMessageInfo, keySequence, neighbor); } @@ -2934,7 +2938,7 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo // Leader Data SuccessOrExit(error = ReadLeaderData(aMessage, leaderData)); - if (mRole != OT_DEVICE_ROLE_DETACHED) + if (!IsDetached()) { #if OPENTHREAD_FTD if (IsFullThreadDevice()) @@ -2954,11 +2958,11 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: ExitNow(); - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: VerifyOrExit(aNeighbor == &mParent); if ((mParent.GetRloc16() == sourceAddress) && (leaderData.GetPartitionId() != mLeaderData.GetPartitionId() || @@ -2985,8 +2989,8 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo mParent.SetLastHeard(TimerMilli::GetNow()); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: VerifyOrExit(aNeighbor && aNeighbor->IsStateValid()); break; } @@ -3073,7 +3077,7 @@ otError Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &a if ((leaderData.GetPartitionId() != mLeaderData.GetPartitionId()) || (leaderData.GetWeighting() != mLeaderData.GetWeighting()) || (leaderData.GetLeaderRouterId() != GetLeaderId())) { - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId()); mRetrieveNewNetworkData = true; @@ -3305,7 +3309,7 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf aMessageInfo.GetPeerAddr().ToExtAddress(extAddress); - if (mRole == OT_DEVICE_ROLE_CHILD && mParent.GetExtAddress() == extAddress) + if (IsChild() && mParent.GetExtAddress() == extAddress) { mReceivedResponseFromParent = true; } @@ -3347,7 +3351,7 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf } #if OPENTHREAD_FTD - if (IsFullThreadDevice() && (mRole != OT_DEVICE_ROLE_DETACHED)) + if (IsFullThreadDevice() && !IsDetached()) { int8_t diff = static_cast(connectivity.GetIdSequence() - Get().GetRouterIdSequence()); @@ -3716,12 +3720,12 @@ otError Mle::HandleChildUpdateResponse(const Message & aMessage, switch (mRole) { - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: SuccessOrExit(error = ReadResponse(aMessage, response)); VerifyOrExit(response == mParentRequestChallenge, error = OT_ERROR_SECURITY); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: VerifyOrExit((aNeighbor == &mParent) && mParent.IsStateValid(), error = OT_ERROR_SECURITY); break; @@ -3743,7 +3747,7 @@ otError Mle::HandleChildUpdateResponse(const Message & aMessage, switch (mRole) { - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: SuccessOrExit(error = Tlv::ReadUint32Tlv(aMessage, Tlv::kLinkFrameCounter, linkFrameCounter)); switch (Tlv::ReadUint32Tlv(aMessage, Tlv::kMleFrameCounter, mleFrameCounter)) @@ -3767,7 +3771,7 @@ otError Mle::HandleChildUpdateResponse(const Message & aMessage, // fall through - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: // Source Address SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kSourceAddress, sourceAddress)); @@ -3859,7 +3863,7 @@ otError Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo &aMe // channel and pan-id match the values from the received MLE // Announce message. - VerifyOrExit((mRole != OT_DEVICE_ROLE_DETACHED) || (Get().GetPanChannel() != channel) || + VerifyOrExit(!IsDetached() || (Get().GetPanChannel() != channel) || (Get().GetPanId() != panId)); if (mAttachState == kAttachStateProcessAnnounce) @@ -4192,7 +4196,7 @@ void Mle::HandleParentSearchTimer(void) mParentSearchIsInBackoff = false; - VerifyOrExit(mRole == OT_DEVICE_ROLE_CHILD); + VerifyOrExit(IsChild()); parentRss = GetParent().GetLinkInfo().GetAverageRss(); otLogInfoMle("PeriodicParentSearch: Parent RSS %d", parentRss); @@ -4289,29 +4293,29 @@ void Mle::LogMleMessage(const char *aLogString, const Ip6::Address &aAddress, ui otLogInfoMle("%s (%s,0x%04x)", aLogString, aAddress.ToString().AsCString(), aRloc); } -const char *Mle::RoleToString(otDeviceRole aRole) +const char *Mle::RoleToString(DeviceRole aRole) { const char *roleString = "Unknown"; switch (aRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: roleString = "Disabled"; break; - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: roleString = "Detached"; break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: roleString = "Child"; break; - case OT_DEVICE_ROLE_ROUTER: + case kRoleRouter: roleString = "Router"; break; - case OT_DEVICE_ROLE_LEADER: + case kRoleLeader: roleString = "Leader"; break; } diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 709597829..dd2eb146b 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -471,12 +471,66 @@ public: bool IsAttaching(void) const { return (mAttachState != kAttachStateIdle); } /** - * This method returns the current Thread interface state. + * This method returns the current Thread device role. * - * @returns The current Thread interface state. + * @returns The current Thread device role. * */ - otDeviceRole GetRole(void) const { return mRole; } + DeviceRole GetRole(void) const { return mRole; } + + /** + * This method indicates whether device role is disabled. + * + * @retval TRUE Device role is disabled. + * @retval FALSE Device role is not disabled. + * + */ + bool IsDisabled(void) const { return (mRole == kRoleDisabled); } + + /** + * This method indicates whether device role is detached. + * + * @retval TRUE Device role is detached. + * @retval FALSE Device role is not detached. + * + */ + bool IsDetached(void) const { return (mRole == kRoleDetached); } + + /** + * This method indicates whether device role is child. + * + * @retval TRUE Device role is child. + * @retval FALSE Device role is not child. + * + */ + bool IsChild(void) const { return (mRole == kRoleChild); } + + /** + * This method indicates whether device role is router. + * + * @retval TRUE Device role is router. + * @retval FALSE Device role is not router. + * + */ + bool IsRouter(void) const { return (mRole == kRoleRouter); } + + /** + * This method indicates whether device role is leader. + * + * @retval TRUE Device role is leader. + * @retval FALSE Device role is not leader. + * + */ + bool IsLeader(void) const { return (mRole == kRoleLeader); } + + /** + * This method indicates whether device role is either router or leader. + * + * @retval TRUE Device role is either router or leader. + * @retval FALSE Device role is neither router nor leader. + * + */ + bool IsRouterOrLeader(void) const; /** * This method returns the Device Mode as reported in the Mode TLV. @@ -884,7 +938,7 @@ public: * This method converts a device role into a human-readable string. * */ - static const char *RoleToString(otDeviceRole aRole); + static const char *RoleToString(DeviceRole aRole); /** * This method gets the MLE counters. @@ -1031,7 +1085,7 @@ protected: * @param[in] aRole A device role. * */ - void SetRole(otDeviceRole aRole); + void SetRole(DeviceRole aRole); /** * This method sets the attach state @@ -1595,7 +1649,7 @@ protected: LeaderData mLeaderData; ///< Last received Leader Data TLV. bool mRetrieveNewNetworkData; ///< Indicating new Network Data is needed if set. - otDeviceRole mRole; ///< Current Thread role. + DeviceRole mRole; ///< Current Thread role. Router mParent; ///< Parent information. DeviceMode mDeviceMode; ///< Device mode setting. AttachState mAttachState; ///< The parent request state. diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 61a25f1d0..085dcd77a 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -119,16 +119,16 @@ otError MleRouter::SetRouterEligible(bool aEligible) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: Get().SetBeaconEnabled(mRouterEligible); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: if (!mRouterEligible) { BecomeDetached(); @@ -145,8 +145,8 @@ otError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus) { otError error = OT_ERROR_NONE; - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); - VerifyOrExit(mRole != OT_DEVICE_ROLE_ROUTER, error = OT_ERROR_NONE); + VerifyOrExit(!IsDisabled(), error = OT_ERROR_INVALID_STATE); + VerifyOrExit(!IsRouter(), error = OT_ERROR_NONE); VerifyOrExit(IsRouterEligible(), error = OT_ERROR_NOT_CAPABLE); otLogInfoMle("Attempt to become router"); @@ -156,12 +156,12 @@ otError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus) switch (mRole) { - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: SuccessOrExit(error = SendLinkRequest(NULL)); mStateUpdateTimer.Start(kStateUpdatePeriod); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: SuccessOrExit(error = SendAddressSolicit(aStatus)); break; @@ -182,8 +182,8 @@ otError MleRouter::BecomeLeader(void) uint8_t leaderId; VerifyOrExit(!Get().IsPartiallyComplete(), error = OT_ERROR_INVALID_STATE); - VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); - VerifyOrExit(mRole != OT_DEVICE_ROLE_LEADER, error = OT_ERROR_NONE); + VerifyOrExit(!IsDisabled(), error = OT_ERROR_INVALID_STATE); + VerifyOrExit(!IsLeader(), error = OT_ERROR_NONE); VerifyOrExit(IsRouterEligible(), error = OT_ERROR_NOT_CAPABLE); mRouterTable.Clear(); @@ -310,7 +310,7 @@ void MleRouter::SetStateRouter(uint16_t aRloc16) { SetRloc16(aRloc16); - SetRole(OT_DEVICE_ROLE_ROUTER); + SetRole(kRoleRouter); SetAttachState(kAttachStateIdle); mAttachCounter = 0; mAttachTimer.Stop(); @@ -339,7 +339,7 @@ void MleRouter::SetStateLeader(uint16_t aRloc16) { SetRloc16(aRloc16); - SetRole(OT_DEVICE_ROLE_LEADER); + SetRole(kRoleLeader); SetAttachState(kAttachStateIdle); mAttachCounter = 0; mAttachTimer.Stop(); @@ -398,7 +398,7 @@ void MleRouter::StopAdvertiseTimer(void) void MleRouter::ResetAdvertiseInterval(void) { - VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER); + VerifyOrExit(IsRouterOrLeader()); if (!mAdvertiseTimer.IsRunning()) { @@ -438,16 +438,16 @@ otError MleRouter::SendAdvertisement(void) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: OT_ASSERT(false); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: SuccessOrExit(error = AppendRoute(*message)); break; } @@ -486,21 +486,21 @@ otError MleRouter::SendLinkRequest(Neighbor *aNeighbor) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: OT_ASSERT(false); break; - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: SuccessOrExit(error = AppendTlvRequest(*message, detachedTlvs, sizeof(detachedTlvs))); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: if (aNeighbor == NULL || !aNeighbor->IsStateValid()) { SuccessOrExit(error = AppendTlvRequest(*message, routerTlvs, sizeof(routerTlvs))); @@ -577,7 +577,7 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message LogMleMessage("Receive Link Request", aMessageInfo.GetPeerAddr()); - VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(IsRouterOrLeader(), error = OT_ERROR_INVALID_STATE); VerifyOrExit(!IsAttaching(), error = OT_ERROR_INVALID_STATE); @@ -895,7 +895,7 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage, break; case OT_ERROR_NOT_FOUND: // Link Margin TLV may be skipped in Router Synchronization process after Reset - VerifyOrExit(mRole == OT_DEVICE_ROLE_DETACHED, error = OT_ERROR_NOT_FOUND); + VerifyOrExit(IsDetached(), error = OT_ERROR_NOT_FOUND); // Wait for an MLE Advertisement to establish a routing cost to the neighbor linkMargin = 0; break; @@ -905,11 +905,11 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage, switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: OT_ASSERT(false); break; - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: // Address16 SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kAddress16, address16)); VerifyOrExit(GetRloc16() == address16, error = OT_ERROR_DROP); @@ -943,12 +943,12 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage, #endif break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: VerifyOrExit(router != NULL); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: VerifyOrExit(router != NULL); // Leader Data @@ -1083,7 +1083,7 @@ otError MleRouter::ProcessRouteTlv(const RouteTlv &aRoute) mRouterTable.UpdateRouterIdSet(aRoute.GetRouterIdSequence(), aRoute.GetRouterIdMask()); - if (mRole == OT_DEVICE_ROLE_ROUTER && !mRouterTable.IsAllocated(mRouterId)) + if (IsRouter() && !mRouterTable.IsAllocated(mRouterId)) { BecomeDetached(); error = OT_ERROR_NO_ROUTE; @@ -1209,7 +1209,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, error = OT_ERROR_DROP); } - if (mRole == OT_DEVICE_ROLE_CHILD && (aNeighbor == &mParent || !IsFullThreadDevice())) + if (IsChild() && (aNeighbor == &mParent || !IsFullThreadDevice())) { ExitNow(); } @@ -1230,7 +1230,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, { VerifyOrExit(aNeighbor && aNeighbor->IsStateValid()); - if (mRole != OT_DEVICE_ROLE_CHILD) + if (!IsChild()) { otLogInfoMle("Leader ID mismatch"); BecomeDetached(); @@ -1255,11 +1255,11 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: if (sourceAddress == mParent.GetRloc16()) { processRouteTlv = true; @@ -1276,8 +1276,8 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: processRouteTlv = true; break; } @@ -1290,11 +1290,11 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: ExitNow(); - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: if (aNeighbor == &mParent) { // MLE Advertisement from parent @@ -1374,7 +1374,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, ExitNow(); - case OT_DEVICE_ROLE_ROUTER: + case kRoleRouter: router = mRouterTable.GetRouter(routerId); VerifyOrExit(router != NULL); @@ -1398,7 +1398,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage, // fall through - case OT_DEVICE_ROLE_LEADER: + case kRoleLeader: router = mRouterTable.GetRouter(routerId); VerifyOrExit(router != NULL); @@ -1606,7 +1606,7 @@ otError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::Messa // A Router MUST NOT send an MLE Parent Response if: // 0. It is detached or attempting to another partition - VerifyOrExit((mRole != OT_DEVICE_ROLE_DETACHED) && !IsAttaching(), error = OT_ERROR_DROP); + VerifyOrExit(!IsDetached() && !IsAttaching(), error = OT_ERROR_DROP); // 1. It has no available Child capacity (if Max Child Count minus // Child Count would be equal to zero) @@ -1621,8 +1621,8 @@ otError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::Messa leader = mRouterTable.GetLeader(); OT_ASSERT(leader != NULL); - VerifyOrExit(mRole == OT_DEVICE_ROLE_LEADER || GetLinkCost(GetLeaderId()) < kMaxRouteCost || - (mRole == OT_DEVICE_ROLE_CHILD && leader->GetCost() + 1 < kMaxRouteCost) || + VerifyOrExit(IsLeader() || GetLinkCost(GetLeaderId()) < kMaxRouteCost || + (IsChild() && leader->GetCost() + 1 < kMaxRouteCost) || (leader->GetCost() + GetLinkCost(leader->GetNextHop()) < kMaxRouteCost), error = OT_ERROR_DROP); @@ -1637,16 +1637,16 @@ otError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::Messa switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: ExitNow(); - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: VerifyOrExit(ScanMaskTlv::IsEndDeviceFlagSet(scanMask)); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: VerifyOrExit(ScanMaskTlv::IsRouterFlagSet(scanMask)); break; } @@ -1752,11 +1752,11 @@ void MleRouter::HandleStateUpdateTimer(void) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: OT_ASSERT(false); break; - case OT_DEVICE_ROLE_DETACHED: + case kRoleDetached: if (mChallengeTimeout == 0) { BecomeDetached(); @@ -1765,7 +1765,7 @@ void MleRouter::HandleStateUpdateTimer(void) break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: if (routerStateUpdate) { if (mRouterTable.GetActiveRouterCount() < mRouterUpgradeThreshold) @@ -1793,7 +1793,7 @@ void MleRouter::HandleStateUpdateTimer(void) // fall through - case OT_DEVICE_ROLE_ROUTER: + case kRoleRouter: // verify path to leader otLogDebgMle("network id timeout = %d", mRouterTable.GetLeaderAge()); @@ -1812,7 +1812,7 @@ void MleRouter::HandleStateUpdateTimer(void) break; - case OT_DEVICE_ROLE_LEADER: + case kRoleLeader: break; } @@ -1846,7 +1846,7 @@ void MleRouter::HandleStateUpdateTimer(void) otLogInfoMle("Child timeout expired"); RemoveNeighbor(child); } - else if ((mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER) && child.IsStateRestored()) + else if (IsRouterOrLeader() && child.IsStateRestored()) { SendChildUpdateRequest(child); } @@ -1905,7 +1905,7 @@ void MleRouter::HandleStateUpdateTimer(void) } } - if (GetRole() == OT_DEVICE_ROLE_LEADER) + if (IsLeader()) { if (mRouterTable.GetRouter(router.GetNextHop()) == NULL && mRouterTable.GetLinkCost(router) >= kMaxRouteCost && age >= Time::SecToMsec(kMaxLeaderToRouterTimeout)) @@ -1921,7 +1921,7 @@ void MleRouter::HandleStateUpdateTimer(void) SynchronizeChildNetworkData(); #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE - if (mRole == OT_DEVICE_ROLE_LEADER || mRole == OT_DEVICE_ROLE_ROUTER) + if (IsRouterOrLeader()) { Get().ProcessTimeSync(); } @@ -2288,18 +2288,18 @@ otError MleRouter::HandleChildIdRequest(const Message & aMessage, switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: OT_ASSERT(false); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: child->SetState(Neighbor::kStateChildIdRequest); BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: SuccessOrExit(error = SendChildIdResponse(*child)); break; } @@ -2702,14 +2702,13 @@ void MleRouter::HandleNetworkDataUpdateRouter(void) Ip6::Address destination; uint16_t delay; - VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER); + VerifyOrExit(IsRouterOrLeader()); destination.Clear(); destination.mFields.m16[0] = HostSwap16(0xff02); destination.mFields.m16[7] = HostSwap16(0x0001); - delay = - (mRole == OT_DEVICE_ROLE_LEADER) ? 0 : Random::NonCrypto::GetUint16InRange(0, kUnsolicitedDataResponseJitter); + delay = IsLeader() ? 0 : Random::NonCrypto::GetUint16InRange(0, kUnsolicitedDataResponseJitter); SendDataResponse(destination, tlvs, sizeof(tlvs), delay); SynchronizeChildNetworkData(); @@ -2720,7 +2719,7 @@ exit: void MleRouter::SynchronizeChildNetworkData(void) { - VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER); + VerifyOrExit(IsRouterOrLeader()); for (ChildTable::Iterator iter(GetInstance(), Child::kInStateValid); !iter.IsDone(); iter++) { @@ -3295,7 +3294,7 @@ void MleRouter::RemoveRouterLink(Router &aRouter) { switch (mRole) { - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: if (&aRouter == &mParent) { BecomeDetached(); @@ -3303,8 +3302,8 @@ void MleRouter::RemoveRouterLink(Router &aRouter) break; #if OPENTHREAD_FTD - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: mRouterTable.RemoveRouterLink(aRouter); break; #endif @@ -3318,7 +3317,7 @@ void MleRouter::RemoveNeighbor(Neighbor &aNeighbor) { if (&aNeighbor == &mParent) { - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { BecomeDetached(); } @@ -3361,16 +3360,16 @@ Neighbor *MleRouter::GetNeighbor(uint16_t aAddress) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: break; - case OT_DEVICE_ROLE_DETACHED: - case OT_DEVICE_ROLE_CHILD: + case kRoleDetached: + case kRoleChild: rval = Mle::GetNeighbor(aAddress); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: rval = mChildTable.FindChild(aAddress, Child::kInStateValidOrRestoring); VerifyOrExit(rval == NULL); @@ -3388,16 +3387,16 @@ Neighbor *MleRouter::GetNeighbor(const Mac::ExtAddress &aAddress) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: + case kRoleDisabled: break; - case OT_DEVICE_ROLE_DETACHED: - case OT_DEVICE_ROLE_CHILD: + case kRoleDetached: + case kRoleChild: rval = Mle::GetNeighbor(aAddress); break; - case OT_DEVICE_ROLE_ROUTER: - case OT_DEVICE_ROLE_LEADER: + case kRoleRouter: + case kRoleLeader: rval = mChildTable.FindChild(aAddress, Child::kInStateValidOrRestoring); VerifyOrExit(rval == NULL); @@ -3493,7 +3492,7 @@ Neighbor *MleRouter::GetRxOnlyNeighborRouter(const Mac::Address &aAddress) { Neighbor *rval = NULL; - VerifyOrExit(mRole == OT_DEVICE_ROLE_CHILD, rval = NULL); + VerifyOrExit(IsChild(), rval = NULL); switch (aAddress.GetType()) { @@ -3522,7 +3521,7 @@ uint16_t MleRouter::GetNextHop(uint16_t aDestination) const Router *router; const Router *nextHop; - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { ExitNow(rval = Mle::GetNextHop(aDestination)); } @@ -3593,8 +3592,7 @@ otError MleRouter::SetPreferredRouterId(uint8_t aRouterId) { otError error = OT_ERROR_NONE; - VerifyOrExit((mRole == OT_DEVICE_ROLE_DETACHED) || (mRole == OT_DEVICE_ROLE_DISABLED), - error = OT_ERROR_INVALID_STATE); + VerifyOrExit(IsDetached() || IsDisabled(), error = OT_ERROR_INVALID_STATE); mPreviousRouterId = aRouterId; @@ -3893,7 +3891,7 @@ otError MleRouter::CheckReachability(uint16_t aMeshSource, uint16_t aMeshDest, I Ip6::MessageInfo messageInfo; otError error = OT_ERROR_NONE; - if (mRole == OT_DEVICE_ROLE_CHILD) + if (IsChild()) { error = Mle::CheckReachability(aMeshSource, aMeshDest, aIp6Header); ExitNow(); @@ -4326,12 +4324,12 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) switch (mRole) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case kRoleDisabled: + case kRoleDetached: cost = static_cast(kMaxRouteCost); break; - case OT_DEVICE_ROLE_CHILD: + case kRoleChild: switch (mParent.GetLinkInfo().GetLinkQuality()) { case 1: @@ -4350,7 +4348,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) cost += LinkQualityToCost(mParent.GetLinkInfo().GetLinkQuality()); break; - case OT_DEVICE_ROLE_ROUTER: + case kRoleRouter: if (leader != NULL) { cost += GetLinkCost(leader->GetNextHop()); @@ -4363,7 +4361,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) break; - case OT_DEVICE_ROLE_LEADER: + case kRoleLeader: cost = 0; break; } @@ -4702,7 +4700,7 @@ otError MleRouter::GetMaxChildTimeout(uint32_t &aTimeout) const { otError error = OT_ERROR_NOT_FOUND; - VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(IsRouterOrLeader(), error = OT_ERROR_INVALID_STATE); for (ChildTable::Iterator iter(GetInstance(), Child::kInStateValid); !iter.IsDone(); iter++) { diff --git a/src/core/thread/mle_types.hpp b/src/core/thread/mle_types.hpp index 4022bcab7..bfe774a37 100644 --- a/src/core/thread/mle_types.hpp +++ b/src/core/thread/mle_types.hpp @@ -190,6 +190,19 @@ enum kMplRouterDataMessageTimerExpirations = 2, ///< Number of MPL retransmissions for Routers. }; +/** + * This type represents a Thread device role. + * + */ +enum DeviceRole +{ + kRoleDisabled = OT_DEVICE_ROLE_DISABLED, ///< The Thread stack is disabled. + kRoleDetached = OT_DEVICE_ROLE_DETACHED, ///< Not currently participating in a Thread network/partition. + kRoleChild = OT_DEVICE_ROLE_CHILD, ///< The Thread Child role. + kRoleRouter = OT_DEVICE_ROLE_ROUTER, ///< The Thread Router role. + kRoleLeader = OT_DEVICE_ROLE_LEADER, ///< The Thread Leader role. +}; + /** * MLE Attach modes * diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 820c063de..6489f9380 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -436,7 +436,7 @@ otError LeaderBase::SetNetworkData(uint8_t aVersion, #if OPENTHREAD_FTD // Synchronize internal 6LoWPAN Context ID Set with recently obtained Network Data. - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER) + if (Get().IsLeader()) { Get().UpdateContextsAfterReset(); } diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 60cb59e97..e2db811a4 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -90,7 +90,7 @@ void Leader::Stop(void) void Leader::IncrementVersion(void) { - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER) + if (Get().IsLeader()) { IncrementVersions(/* aIncludeStable */ false); } @@ -98,7 +98,7 @@ void Leader::IncrementVersion(void) void Leader::IncrementVersionAndStableVersion(void) { - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER) + if (Get().IsLeader()) { IncrementVersions(/* aIncludeStable */ true); } @@ -190,7 +190,7 @@ void Leader::HandleCommissioningSet(Coap::Message &aMessage, const Ip6::MessageI MeshCoP::Tlv *end; VerifyOrExit(length <= sizeof(tlvs)); - VerifyOrExit(Get().GetRole() == OT_DEVICE_ROLE_LEADER); + VerifyOrExit(Get().IsLeader()); aMessage.Read(offset, length, tlvs); @@ -267,7 +267,7 @@ void Leader::HandleCommissioningSet(Coap::Message &aMessage, const Ip6::MessageI exit: - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER) + if (Get().IsLeader()) { SendCommissioningSetResponse(aMessage, aMessageInfo, state); } @@ -1390,12 +1390,11 @@ void Leader::HandleTimer(void) otError Leader::RemoveStaleChildEntries(Coap::ResponseHandler aHandler, void *aContext) { - otError error = OT_ERROR_NOT_FOUND; - Iterator iterator = kIteratorInit; - otDeviceRole role = Get().GetRole(); - uint16_t rloc16; + otError error = OT_ERROR_NOT_FOUND; + Iterator iterator = kIteratorInit; + uint16_t rloc16; - VerifyOrExit((role == OT_DEVICE_ROLE_ROUTER) || (role == OT_DEVICE_ROLE_LEADER)); + VerifyOrExit(Get().IsRouterOrLeader()); while (GetNextServer(iterator, rloc16) == OT_ERROR_NONE) { diff --git a/src/core/thread/network_data_local.cpp b/src/core/thread/network_data_local.cpp index 79a630a90..6d5ca3ba2 100644 --- a/src/core/thread/network_data_local.cpp +++ b/src/core/thread/network_data_local.cpp @@ -320,7 +320,7 @@ otError Local::UpdateInconsistentServerData(Coap::ResponseHandler aHandler, void #if OPENTHREAD_FTD // Don't send this Server Data Notification if the device is going to upgrade to Router - if (Get().IsRouterEligible() && (Get().GetRole() < OT_DEVICE_ROLE_ROUTER) && + if (Get().IsRouterEligible() && !Get().IsRouterOrLeader() && (Get().GetActiveRouterCount() < Get().GetRouterUpgradeThreshold())) { ExitNow(error = OT_ERROR_INVALID_STATE); diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 4fec0c15e..a5c2c87d4 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -438,8 +438,7 @@ otError NetworkDiagnostic::FillRequestedTlvs(Message & aRequest, // Thread 1.1.1 Specification Section 10.11.2.2: // If a Thread device is unable to supply a specific Diagnostic TLV, that TLV is omitted. // Here only Leader or Router may have children. - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER || - Get().GetRole() == OT_DEVICE_ROLE_ROUTER) + if (Get().IsRouterOrLeader()) { SuccessOrExit(error = AppendChildTable(aResponse)); } diff --git a/src/core/thread/router_table.cpp b/src/core/thread/router_table.cpp index 4a22d3fb6..72f47ce18 100644 --- a/src/core/thread/router_table.cpp +++ b/src/core/thread/router_table.cpp @@ -276,7 +276,7 @@ otError RouterTable::Release(uint8_t aRouterId) OT_ASSERT(aRouterId <= Mle::kMaxRouterId); - VerifyOrExit(Get().GetRole() == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(Get().IsLeader(), error = OT_ERROR_INVALID_STATE); VerifyOrExit(IsAllocated(aRouterId), error = OT_ERROR_NOT_FOUND); mAllocatedRouterIds.Remove(aRouterId); @@ -536,7 +536,7 @@ void RouterTable::ProcessTimerTick(void) { Mle::MleRouter &mle = Get(); - if (mle.GetRole() == OT_DEVICE_ROLE_LEADER) + if (mle.IsLeader()) { // update router id sequence if (GetLeaderAge() >= Mle::kRouterIdSequencePeriod) diff --git a/src/core/thread/time_sync_service.cpp b/src/core/thread/time_sync_service.cpp index 47b2481ed..0b12b6a75 100644 --- a/src/core/thread/time_sync_service.cpp +++ b/src/core/thread/time_sync_service.cpp @@ -94,7 +94,7 @@ void TimeSync::HandleTimeSyncMessage(const Message &aMessage) otLogInfoCore("Older time sync seq received:%u. Forwarding current seq:%u", aMessage.GetTimeSyncSeq(), mTimeSyncSeq); } - else if (Get().GetRole() == OT_DEVICE_ROLE_LEADER && timeSyncSeqDelta > 0) + else if (Get().IsLeader() && timeSyncSeqDelta > 0) { // 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 @@ -105,14 +105,13 @@ void TimeSync::HandleTimeSyncMessage(const Message &aMessage) otLogInfoCore("Newer time sync seq:%u received by leader. Setting current seq to:%u and forwarding", aMessage.GetTimeSyncSeq(), mTimeSyncSeq); } - else if (Get().GetRole() != OT_DEVICE_ROLE_LEADER) + else if (!Get().IsLeader()) { // For all devices aside from the leader, update network time in following three cases: // 1. During first attach. // 2. Already attached, and a newer time sync sequence was received. // 3. During reattach or migration process. - if (mTimeSyncSeq == OT_TIME_SYNC_INVALID_SEQ || timeSyncSeqDelta > 0 || - Get().GetRole() == OT_DEVICE_ROLE_DETACHED) + if (mTimeSyncSeq == OT_TIME_SYNC_INVALID_SEQ || timeSyncSeqDelta > 0 || Get().IsDetached()) { // Update network time and forward it. mLastTimeSyncReceived = TimerMilli::GetNow(); @@ -152,7 +151,7 @@ void TimeSync::NotifyTimeSyncCallback(void) #if OPENTHREAD_FTD void TimeSync::ProcessTimeSync(void) { - if (Get().GetRole() == OT_DEVICE_ROLE_LEADER && + if (Get().IsLeader() && (TimerMilli::GetNow() - mLastTimeSyncSent > Time::SecToMsec(mTimeSyncPeriod))) { IncrementTimeSyncSeq(); @@ -183,7 +182,7 @@ void TimeSync::HandleStateChanged(otChangedFlags aFlags) stateChanged = true; } - if ((aFlags & OT_CHANGED_THREAD_PARTITION_ID) != 0 && Get().GetRole() != OT_DEVICE_ROLE_LEADER) + if ((aFlags & OT_CHANGED_THREAD_PARTITION_ID) != 0 && !Get().IsLeader()) { // 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. @@ -230,14 +229,14 @@ void TimeSync::CheckAndHandleChanges(bool aTimeUpdated) switch (Get().GetRole()) { - case OT_DEVICE_ROLE_DISABLED: - case OT_DEVICE_ROLE_DETACHED: + case Mle::kRoleDisabled: + case Mle::kRoleDetached: networkTimeStatus = OT_NETWORK_TIME_UNSYNCHRONIZED; otLogInfoCore("Time sync status UNSYNCHRONIZED as role:DISABLED/DETACHED"); break; - case OT_DEVICE_ROLE_CHILD: - case OT_DEVICE_ROLE_ROUTER: + case Mle::kRoleChild: + case Mle::kRoleRouter: if (mLastTimeSyncReceived.GetValue() == 0) { // Haven't yet received any time sync @@ -260,7 +259,7 @@ void TimeSync::CheckAndHandleChanges(bool aTimeUpdated) } break; - case OT_DEVICE_ROLE_LEADER: + case Mle::kRoleLeader: otLogInfoCore("Time sync status SYNCHRONIZED as role:LEADER"); break; } diff --git a/src/core/utils/channel_manager.cpp b/src/core/utils/channel_manager.cpp index e5432210c..b48877a45 100644 --- a/src/core/utils/channel_manager.cpp +++ b/src/core/utils/channel_manager.cpp @@ -140,7 +140,7 @@ void ChannelManager::PreparePendingDataset(void) // situation where a channel change request comes right after the // network is formed but before the active dataset is created. - if (Get().GetRole() != OT_DEVICE_ROLE_DISABLED) + if (!Get().IsDisabled()) { mTimer.Start(kPendingDatasetTxRetryInterval); } @@ -345,7 +345,7 @@ otError ChannelManager::RequestChannelSelect(bool aSkipQualityCheck) otLogInfoUtil("ChannelManager: Request to select channel (skip quality check: %s)", aSkipQualityCheck ? "yes" : "no"); - VerifyOrExit(Get().GetRole() != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE); + VerifyOrExit(!Get().IsDisabled(), error = OT_ERROR_INVALID_STATE); VerifyOrExit(aSkipQualityCheck || ShouldAttemptChannelChange()); diff --git a/src/core/utils/child_supervision.cpp b/src/core/utils/child_supervision.cpp index 5800a0288..2316b8ee5 100644 --- a/src/core/utils/child_supervision.cpp +++ b/src/core/utils/child_supervision.cpp @@ -146,7 +146,7 @@ void ChildSupervisor::CheckState(void) // zero, Thread MLE operation is enabled, and there is at least one // "valid" child in the child table. - shouldRun = ((mSupervisionInterval != 0) && (Get().GetRole() != OT_DEVICE_ROLE_DISABLED) && + shouldRun = ((mSupervisionInterval != 0) && !Get().IsDisabled() && Get().HasChildren(Child::kInStateValid)); if (shouldRun && !mTimer.IsRunning()) @@ -208,7 +208,7 @@ 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. - VerifyOrExit(mTimer.IsRunning() && aIsSecure && (Get().GetRole() == OT_DEVICE_ROLE_CHILD) && + VerifyOrExit(mTimer.IsRunning() && aIsSecure && Get().IsChild() && (Get().GetNeighbor(aSourceAddress) == &Get().GetParent())); RestartTimer(); @@ -219,8 +219,7 @@ exit: void SupervisionListener::RestartTimer(void) { - if ((mTimeout != 0) && (Get().GetRole() != OT_DEVICE_ROLE_DISABLED) && - !Get().GetRxOnWhenIdle()) + if ((mTimeout != 0) && !Get().IsDisabled() && !Get().GetRxOnWhenIdle()) { mTimer.Start(Time::SecToMsec(mTimeout)); } @@ -237,7 +236,7 @@ void SupervisionListener::HandleTimer(Timer &aTimer) void SupervisionListener::HandleTimer(void) { - VerifyOrExit((Get().GetRole() == OT_DEVICE_ROLE_CHILD) && !Get().GetRxOnWhenIdle()); + VerifyOrExit(Get().IsChild() && !Get().GetRxOnWhenIdle()); otLogWarnUtil("Supervision timeout. No frame from parent in %d sec", mTimeout); diff --git a/src/core/utils/jam_detector.cpp b/src/core/utils/jam_detector.cpp index 7b31619a5..3cb68e4f0 100644 --- a/src/core/utils/jam_detector.cpp +++ b/src/core/utils/jam_detector.cpp @@ -105,7 +105,7 @@ void JamDetector::CheckState(void) switch (Get().GetRole()) { - case OT_DEVICE_ROLE_DISABLED: + case Mle::kRoleDisabled: VerifyOrExit(mTimer.IsRunning()); mTimer.Stop(); SetJamState(false);