From 7ec184d68e2a629fa3d86c2be0b02d06675f972a Mon Sep 17 00:00:00 2001 From: Lukasz Duda Date: Sat, 4 Mar 2023 00:33:36 +0100 Subject: [PATCH] [discovery] allow (S)SED devices to perform MLE Discovery (#8832) Signed-off-by: Lukasz Duda --- include/openthread/instance.h | 2 +- include/openthread/thread.h | 2 ++ src/core/thread/discover_scanner.cpp | 12 ++++++++++++ src/core/thread/mesh_forwarder.cpp | 7 +++++-- src/core/thread/mle_router.cpp | 1 + 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/include/openthread/instance.h b/include/openthread/instance.h index 54cde798c..bc4557b62 100644 --- a/include/openthread/instance.h +++ b/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (304) +#define OPENTHREAD_API_VERSION (305) /** * @addtogroup api-instance diff --git a/include/openthread/thread.h b/include/openthread/thread.h index e541648e9..df663f7f5 100644 --- a/include/openthread/thread.h +++ b/include/openthread/thread.h @@ -264,6 +264,8 @@ bool otThreadIsSingleton(otInstance *aInstance); /** * This function starts a Thread Discovery scan. * + * @note A successful call to this function enables the rx-on-when-idle mode for the entire scan procedure. + * * @param[in] aInstance A pointer to an OpenThread instance. * @param[in] aScanChannels A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK). * @param[in] aPanId The PAN ID filter (set to Broadcast PAN to disable filter). diff --git a/src/core/thread/discover_scanner.cpp b/src/core/thread/discover_scanner.cpp index c530e635a..288bbe7c9 100644 --- a/src/core/thread/discover_scanner.cpp +++ b/src/core/thread/discover_scanner.cpp @@ -152,6 +152,12 @@ Error DiscoverScanner::Discover(const Mac::ChannelMask &aScanChannels, mScanChannel = Mac::ChannelMask::kChannelIteratorFirst; mState = (mScanChannels.GetNextChannel(mScanChannel) == kErrorNone) ? kStateScanning : kStateScanDone; + // For rx-off-when-idle device, temporarily enable receiver during discovery procedure. + if (!Get().IsDisabled() && !Get().IsRxOnWhenIdle()) + { + Get().SetRxOnWhenIdle(true); + } + Mle::Log(Mle::kMessageSend, Mle::kTypeDiscoveryRequest, destination); exit: @@ -225,6 +231,12 @@ void DiscoverScanner::HandleDiscoveryRequestFrameTxDone(Message &aMessage) void DiscoverScanner::HandleDiscoverComplete(void) { + // Restore Data Polling or CSL for rx-off-when-idle device. + if (!Get().IsDisabled() && !Get().IsRxOnWhenIdle()) + { + Get().SetRxOnWhenIdle(false); + } + switch (mState) { case kStateIdle: diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index ccc6a6fbc..9af353bc5 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -733,7 +733,7 @@ Mac::TxFrame *MeshForwarder::HandleFrameRequest(Mac::TxFrames &aTxFrames) VerifyOrExit(frame != nullptr); } #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE - if (Get().IsCslEnabled() && mSendMessage->IsSubTypeMle()) + else if (Get().IsCslEnabled() && mSendMessage->IsSubTypeMle()) { mSendMessage->SetLinkSecurityEnabled(true); } @@ -1669,7 +1669,10 @@ bool MeshForwarder::CalcIePresent(const Message *aMessage) iePresent |= (aMessage != nullptr && aMessage->IsTimeSync()); #endif #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE - iePresent |= Get().IsCslEnabled(); + if (!(aMessage != nullptr && aMessage->GetSubType() == Message::kSubTypeMleDiscoverRequest)) + { + iePresent |= Get().IsCslEnabled(); + } #endif #endif diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index c5fc52764..935451d03 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -2764,6 +2764,7 @@ Error MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, const M uint16_t delay; VerifyOrExit((message = NewMleMessage(kCommandDiscoveryResponse)) != nullptr, error = kErrorNoBufs); + message->SetDirectTransmission(); message->SetPanId(aDiscoverRequestMessage.GetPanId()); #if OPENTHREAD_CONFIG_MULTI_RADIO // Send the MLE Discovery Response message on same radio link