mirror of
https://github.com/espressif/openthread.git
synced 2026-10-17 05:07:39 +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;
|
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 *MeshForwarder::GetDirectTransmission(void)
|
||||||
{
|
{
|
||||||
Message *curMessage, *nextMessage;
|
Message *curMessage, *nextMessage;
|
||||||
@@ -450,6 +479,12 @@ Message *MeshForwarder::GetDirectTransmission(void)
|
|||||||
{
|
{
|
||||||
case Message::kTypeIp6:
|
case Message::kTypeIp6:
|
||||||
error = UpdateIp6Route(*curMessage);
|
error = UpdateIp6Route(*curMessage);
|
||||||
|
|
||||||
|
if (curMessage->GetSubType() == Message::kSubTypeMleDiscoverRequest)
|
||||||
|
{
|
||||||
|
error = PrepareDiscoverRequest();
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Message::kType6lowpan:
|
case Message::kType6lowpan:
|
||||||
@@ -885,20 +920,6 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame)
|
|||||||
case Message::kTypeIp6:
|
case Message::kTypeIp6:
|
||||||
if (mSendMessage->GetSubType() == Message::kSubTypeMleDiscoverRequest)
|
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);
|
mNetif.GetMac().SetChannel(mScanChannel);
|
||||||
aFrame.SetChannel(mScanChannel);
|
aFrame.SetChannel(mScanChannel);
|
||||||
|
|
||||||
|
|||||||
@@ -249,6 +249,7 @@ private:
|
|||||||
ThreadError GetMacSourceAddress(const Ip6::Address &aIp6Addr, Mac::Address &aMacAddr);
|
ThreadError GetMacSourceAddress(const Ip6::Address &aIp6Addr, Mac::Address &aMacAddr);
|
||||||
Message *GetDirectTransmission(void);
|
Message *GetDirectTransmission(void);
|
||||||
Message *GetIndirectTransmission(Child &aChild);
|
Message *GetIndirectTransmission(Child &aChild);
|
||||||
|
ThreadError PrepareDiscoverRequest(void);
|
||||||
void PrepareIndirectTransmission(Message &aMessage, const Child &aChild);
|
void PrepareIndirectTransmission(Message &aMessage, const Child &aChild);
|
||||||
void HandleMesh(uint8_t *aFrame, uint8_t aPayloadLength, const Mac::Address &aMacSource,
|
void HandleMesh(uint8_t *aFrame, uint8_t aPayloadLength, const Mac::Address &aMacSource,
|
||||||
const ThreadMessageInfo &aMessageInfo);
|
const ThreadMessageInfo &aMessageInfo);
|
||||||
|
|||||||
Reference in New Issue
Block a user