From 919d303c754718a68ba11a51219cf29d56853956 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Mon, 17 Apr 2017 10:55:20 -0700 Subject: [PATCH] Restrict 15.4 Beacon transmissions to REEDs/Routers/Leaders. (#1591) --- src/core/mac/mac.cpp | 16 ++++++++++------ src/core/mac/mac.hpp | 17 +++++++++++++++++ src/core/thread/mle.cpp | 2 ++ src/core/thread/mle_router.cpp | 26 ++++++++++++++++++++++++-- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index a257f235d..edb66c0a8 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -132,6 +132,7 @@ Mac::Mac(ThreadNetif &aThreadNetif): mCsmaAttempts = 0; mTransmitAttempts = 0; mTransmitBeacon = false; + mBeaconsEnabled = false; mPendingScanRequest = kScanTypeNone; mScanChannel = kPhyMinChannel; @@ -1536,13 +1537,16 @@ ThreadError Mac::HandleMacCommand(Frame &aFrame) mCounters.mRxBeaconRequest++; otLogDebgMac(GetInstance(), "Received Beacon Request"); - mTransmitBeacon = true; - - if (mState == kStateIdle) + if (mBeaconsEnabled) { - mState = kStateTransmitBeacon; - mTransmitBeacon = false; - StartCsmaBackoff(); + mTransmitBeacon = true; + + if (mState == kStateIdle) + { + mState = kStateTransmitBeacon; + mTransmitBeacon = false; + StartCsmaBackoff(); + } } ExitNow(error = kThreadError_Drop); diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 92f8458b4..37423d7f2 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -281,6 +281,22 @@ public: */ void EnergyScanDone(int8_t aEnergyScanMaxRssi); + /** + * This method indicates whether or not IEEE 802.15.4 Beacon transmissions are enabled. + * + * @retval TRUE if IEEE 802.15.4 Beacon transmissions are enabled, FALSE otherwise. + * + */ + bool IsBeaconEnabled(void) const { return mBeaconsEnabled; } + + /** + * This method enables/disables IEEE 802.15.4 Beacon transmissions. + * + * @param[in] aEnabled TRUE to enable IEEE 802.15.4 Beacon transmissions, FALSE otherwise. + * + */ + void SetBeaconEnabled(bool aEnabled) { mBeaconsEnabled = aEnabled; } + /** * This method indicates whether or not rx-on-when-idle is enabled. * @@ -662,6 +678,7 @@ private: uint8_t mCsmaAttempts; uint8_t mTransmitAttempts; bool mTransmitBeacon; + bool mBeaconsEnabled; ScanType mPendingScanRequest; uint8_t mScanChannel; diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 57728e7cb..476830e10 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -551,6 +551,7 @@ ThreadError Mle::SetStateDetached(void) mParentRequestState = kParentIdle; mParentRequestTimer.Stop(); mNetif.GetMeshForwarder().SetRxOff(); + mNetif.GetMac().SetBeaconEnabled(false); mNetif.GetMle().HandleDetachStart(); mNetif.GetIp6().SetForwardingEnabled(false); mNetif.GetIp6().mMpl.SetTimerExpirations(0); @@ -575,6 +576,7 @@ ThreadError Mle::SetStateChild(uint16_t aRloc16) mDeviceState = kDeviceStateChild; mParentRequestState = kParentIdle; mChildUpdateAttempts = 0; + mNetif.GetMac().SetBeaconEnabled(false); if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) != 0) { diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 1e0e8cfcd..a9a60a242 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -90,9 +90,24 @@ void MleRouter::SetRouterRoleEnabled(bool aEnabled) { mRouterRoleEnabled = aEnabled; - if (!mRouterRoleEnabled && (mDeviceState == kDeviceStateRouter || mDeviceState == kDeviceStateLeader)) + switch (mDeviceState) { - BecomeDetached(); + case kDeviceStateDisabled: + case kDeviceStateDetached: + break; + + case kDeviceStateChild: + mNetif.GetMac().SetBeaconEnabled(mRouterRoleEnabled); + break; + + case kDeviceStateRouter: + case kDeviceStateLeader: + if (!mRouterRoleEnabled) + { + BecomeDetached(); + } + + break; } } @@ -329,6 +344,11 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter) StopLeader(); mStateUpdateTimer.Start(kStateUpdatePeriod); + if (mRouterRoleEnabled) + { + mNetif.GetMac().SetBeaconEnabled(true); + } + mNetif.SubscribeAllRoutersMulticast(); VerifyOrExit(IsRouterIdValid(mPreviousRouterId)); @@ -401,6 +421,7 @@ ThreadError MleRouter::SetStateRouter(uint16_t aRloc16) mStateUpdateTimer.Start(kStateUpdatePeriod); mNetif.GetIp6().SetForwardingEnabled(true); mNetif.GetIp6().mMpl.SetTimerExpirations(kMplRouterDataMessageTimerExpirations); + mNetif.GetMac().SetBeaconEnabled(true); for (int i = 0; i < mMaxChildrenAllowed; i++) { @@ -442,6 +463,7 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16) mNetif.GetCoapServer().AddResource(mAddressRelease); mNetif.GetIp6().SetForwardingEnabled(true); mNetif.GetIp6().mMpl.SetTimerExpirations(kMplRouterDataMessageTimerExpirations); + mNetif.GetMac().SetBeaconEnabled(true); for (int i = 0; i < mMaxChildrenAllowed; i++) {