mirror of
https://github.com/espressif/openthread.git
synced 2026-09-16 22:20:07 +00:00
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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user