Restrict 15.4 Beacon transmissions to REEDs/Routers/Leaders. (#1591)

This commit is contained in:
Jonathan Hui
2017-04-17 10:55:20 -07:00
committed by GitHub
parent b36358a362
commit 919d303c75
4 changed files with 53 additions and 8 deletions
+10 -6
View File
@@ -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);
+17
View File
@@ -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;
+2
View File
@@ -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)
{
+24 -2
View File
@@ -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++)
{