mirror of
https://github.com/espressif/openthread.git
synced 2026-08-11 05:07:47 +00:00
Restrict 15.4 Beacon transmissions to REEDs/Routers/Leaders. (#1591)
This commit is contained in:
+10
-6
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user