diff --git a/include/openthread.h b/include/openthread.h index 3edd2a190..d6935cfd1 100644 --- a/include/openthread.h +++ b/include/openthread.h @@ -258,11 +258,12 @@ typedef void (*otHandleActiveScanResult)(otActiveScanResult *aResult); ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback); /** - * This function determines if an IEEE 802.15.4 Active Scan is currently in progress. + * This function indicates whether or not an IEEE 802.15.4 Active Scan is currently in progress. + * + * @returns true if an IEEE 802.15.4 Active Scan is in progress, false otherwise. * - * @returns true if an active scan is in progress. */ -bool otActiveScanInProgress(void); +bool otIsActiveScanInProgress(void); /** * This function starts a Thread Discovery scan. @@ -280,11 +281,12 @@ ThreadError otDiscover(uint32_t aScanChannels, uint16_t aScanDuration, uint16_t otHandleActiveScanResult aCallback); /** - * This function determines if an MLE Thread Discovery is currently in progress. + * This function indicates whether or not an MLE Thread Discovery is currently in progress. + * + * @returns true if an MLE Thread Discovery is in progress, false otherwise. * - * @returns true if an active scan is in progress. */ -bool otDiscoverInProgress(void); +bool otIsDiscoverInProgress(void); /** * @} diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 3d707313e..1c620ba8f 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -935,7 +935,7 @@ ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandl reinterpret_cast(aCallback)); } -bool otActiveScanInProgress(void) +bool otIsActiveScanInProgress(void) { return sThreadNetif->GetMac().IsActiveScanInProgress(); } @@ -990,6 +990,11 @@ ThreadError otDiscover(uint32_t aScanChannels, uint16_t aScanDuration, uint16_t reinterpret_cast(aCallback)); } +bool otIsDiscoverInProgress(void) +{ + return sThreadNetif->GetMle().IsDiscoverInProgress(); +} + void HandleMleDiscover(otActiveScanResult *aResult, void *aContext) { otHandleActiveScanResult handler = reinterpret_cast(aContext); diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 17cda393e..5f90b3235 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -103,6 +103,13 @@ ThreadError MeshForwarder::Stop() mPollTimer.Stop(); mReassemblyTimer.Stop(); + if (mScanning) + { + mMac.SetChannel(mRestoreChannel); + mScanning = false; + mMle.HandleDiscoverComplete(); + } + while ((message = mSendQueue.GetHead()) != NULL) { mSendQueue.Dequeue(*message); diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 64bb11fbb..6719aae0f 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -148,6 +148,8 @@ Mle::Mle(ThreadNetif &aThreadNetif) : mAssignLinkQuality = 0; mAssignLinkMargin = 0; memset(&mAddr64, 0, sizeof(mAddr64)); + + mIsDiscoverInProgress = false; } ThreadError Mle::Enable(void) @@ -218,12 +220,14 @@ ThreadError Mle::Discover(uint32_t aScanChannels, uint16_t aScanDuration, uint16 DiscoverHandler aCallback, void *aContext) { ThreadError error = kThreadError_None; - Message *message; + Message *message = NULL; Ip6::Address destination; Tlv tlv; MeshCoP::DiscoveryRequestTlv discoveryRequest; uint16_t startOffset; + VerifyOrExit(!mIsDiscoverInProgress, error = kThreadError_Busy); + mDiscoverHandler = aCallback; mDiscoverContext = aContext; mMesh.SetDiscoverParameters(aScanChannels, aScanDuration); @@ -253,6 +257,8 @@ ThreadError Mle::Discover(uint32_t aScanChannels, uint16_t aScanDuration, uint16 destination.mFields.m16[7] = HostSwap16(0x0002); SuccessOrExit(error = SendMessage(*message, destination)); + mIsDiscoverInProgress = true; + otLogInfoMle("Sent discovery request\n"); exit: @@ -265,8 +271,14 @@ exit: return error; } +bool Mle::IsDiscoverInProgress(void) +{ + return mIsDiscoverInProgress; +} + void Mle::HandleDiscoverComplete(void) { + mIsDiscoverInProgress = false; mDiscoverHandler(NULL, mDiscoverContext); } @@ -2232,6 +2244,8 @@ ThreadError Mle::HandleDiscoveryResponse(const Message &aMessage, const Ip6::Mes otLogInfoMle("Handle discovery response\n"); + VerifyOrExit(mIsDiscoverInProgress, error = kThreadError_Drop); + offset = aMessage.GetOffset(); end = aMessage.GetLength(); diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index 1c77d541d..eb0994003 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -420,6 +420,14 @@ public: ThreadError Discover(uint32_t aScanChannels, uint16_t aScanDuration, uint16_t aPanId, DiscoverHandler aCallback, void *aContext); + /** + * This method indicates whether or not an MLE Thread Discovery is currently in progress. + * + * @returns true if an MLE Thread Discovery is in progress, false otherwise. + * + */ + bool IsDiscoverInProgress(void); + /** * This method is called by the MeshForwarder to indicate that discovery is complete. * @@ -1146,6 +1154,7 @@ private: DiscoverHandler mDiscoverHandler; void *mDiscoverContext; + bool mIsDiscoverInProgress; Ip6::NetifUnicastAddress mLinkLocal16; Ip6::NetifUnicastAddress mLinkLocal64; diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index a104ab2e3..b0427a5e7 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -1317,7 +1317,7 @@ ThreadError NcpBase::GetPropertyHandler_MAC_SCAN_STATE(uint8_t header, spinel_pr { ThreadError errorCode = kThreadError_None; - if (otActiveScanInProgress()) + if (otIsActiveScanInProgress()) { errorCode = SendPropertyUpdate( header,