diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 672bbc37c..d7757d872 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -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); diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index 0704c578f..309ff3612 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -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);