Fix channel mask in MLE Discover process. (#1702)

- Fix channel mask interpretation (bit 0 is channel 0).
- Do not send Discover Request on invalid channels.
This commit is contained in:
Jonathan Hui
2017-05-03 09:48:14 -07:00
committed by GitHub
parent d87b36be56
commit 1ea4ceb151
2 changed files with 36 additions and 14 deletions
+35 -14
View File
@@ -432,6 +432,35 @@ exit:
return error;
}
ThreadError MeshForwarder::PrepareDiscoverRequest(void)
{
ThreadError error = kThreadError_None;
VerifyOrExit(!mScanning);
mScanChannel = kPhyMinChannel;
mScanChannels >>= kPhyMinChannel;
mRestoreChannel = mNetif.GetMac().GetChannel();
mRestorePanId = mNetif.GetMac().GetPanId();
while ((mScanChannels & 1) == 0)
{
mScanChannels >>= 1;
mScanChannel++;
if (mScanChannel > kPhyMaxChannel)
{
mNetif.GetMle().HandleDiscoverComplete();
ExitNow(error = kThreadError_Drop);
}
}
mScanning = true;
exit:
return error;
}
Message *MeshForwarder::GetDirectTransmission(void)
{
Message *curMessage, *nextMessage;
@@ -450,6 +479,12 @@ Message *MeshForwarder::GetDirectTransmission(void)
{
case Message::kTypeIp6:
error = UpdateIp6Route(*curMessage);
if (curMessage->GetSubType() == Message::kSubTypeMleDiscoverRequest)
{
error = PrepareDiscoverRequest();
}
break;
case Message::kType6lowpan:
@@ -885,20 +920,6 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame)
case Message::kTypeIp6:
if (mSendMessage->GetSubType() == Message::kSubTypeMleDiscoverRequest)
{
if (!mScanning)
{
mScanChannel = kPhyMinChannel;
mRestoreChannel = mNetif.GetMac().GetChannel();
mRestorePanId = mNetif.GetMac().GetPanId();
mScanning = true;
}
while ((mScanChannels & 1) == 0)
{
mScanChannels >>= 1;
mScanChannel++;
}
mNetif.GetMac().SetChannel(mScanChannel);
aFrame.SetChannel(mScanChannel);
+1
View File
@@ -249,6 +249,7 @@ private:
ThreadError GetMacSourceAddress(const Ip6::Address &aIp6Addr, Mac::Address &aMacAddr);
Message *GetDirectTransmission(void);
Message *GetIndirectTransmission(Child &aChild);
ThreadError PrepareDiscoverRequest(void);
void PrepareIndirectTransmission(Message &aMessage, const Child &aChild);
void HandleMesh(uint8_t *aFrame, uint8_t aPayloadLength, const Mac::Address &aMacSource,
const ThreadMessageInfo &aMessageInfo);