mirror of
https://github.com/espressif/openthread.git
synced 2026-10-14 19:57:40 +00:00
[mac] Adding SetTemporaryChannel()/ClearTemporaryChannel() (#4283)
This commit adds new method in `Mac` namely `SetTemporaryChannel()` and `ClearTemporaryChannel()` to allow user to temporarily change the radio channel and use a different channel (during receive) instead of the PAN channel (from `SetPanChannel()`). A subsequent call to `ClearTemporaryChannel()` would clear the temporary channel and adopt the PAN channel again. The new implementation replaces and simplifies the previous `<Acquire/Release>RadioChannel()` model.
This commit is contained in:
committed by
Jonathan Hui
parent
21da048a00
commit
795cd14f8c
+13
-34
@@ -84,6 +84,7 @@ Mac::Mac(Instance &aInstance)
|
||||
, mShouldTxPollBeforeData(false)
|
||||
, mRxOnWhenIdle(false)
|
||||
, mBeaconsEnabled(false)
|
||||
, mUsingTemporaryChannel(false)
|
||||
#if OPENTHREAD_CONFIG_MAC_STAY_AWAKE_BETWEEN_FRAGMENTS
|
||||
, mShouldDelaySleep(false)
|
||||
, mDelayingSleep(false)
|
||||
@@ -95,7 +96,6 @@ Mac::Mac(Instance &aInstance)
|
||||
, mPanId(kPanIdBroadcast)
|
||||
, mPanChannel(OPENTHREAD_CONFIG_DEFAULT_CHANNEL)
|
||||
, mRadioChannel(OPENTHREAD_CONFIG_DEFAULT_CHANNEL)
|
||||
, mRadioChannelAcquisitionId(0)
|
||||
, mSupportedChannelMask(Get<Radio>().GetSupportedChannelMask())
|
||||
, mNetworkName()
|
||||
, mScanChannel(Radio::kChannelMin)
|
||||
@@ -377,7 +377,8 @@ otError Mac::SetPanChannel(uint8_t aChannel)
|
||||
|
||||
mCcaSuccessRateTracker.Reset();
|
||||
|
||||
VerifyOrExit(!mRadioChannelAcquisitionId);
|
||||
VerifyOrExit(!mUsingTemporaryChannel);
|
||||
|
||||
mRadioChannel = mPanChannel;
|
||||
|
||||
UpdateIdleMode();
|
||||
@@ -386,16 +387,14 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
otError Mac::SetRadioChannel(uint16_t aAcquisitionId, uint8_t aChannel)
|
||||
otError Mac::SetTemporaryChannel(uint8_t aChannel)
|
||||
{
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
VerifyOrExit(mSupportedChannelMask.ContainsChannel(aChannel), error = OT_ERROR_INVALID_ARGS);
|
||||
|
||||
VerifyOrExit(mRadioChannelAcquisitionId && aAcquisitionId == mRadioChannelAcquisitionId,
|
||||
error = OT_ERROR_INVALID_STATE);
|
||||
|
||||
mRadioChannel = aChannel;
|
||||
mUsingTemporaryChannel = true;
|
||||
mRadioChannel = aChannel;
|
||||
|
||||
UpdateIdleMode();
|
||||
|
||||
@@ -403,34 +402,14 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
otError Mac::AcquireRadioChannel(uint16_t *aAcquisitionId)
|
||||
void Mac::ClearTemporaryChannel(void)
|
||||
{
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
VerifyOrExit(aAcquisitionId != NULL, error = OT_ERROR_INVALID_ARGS);
|
||||
VerifyOrExit(!mRadioChannelAcquisitionId, error = OT_ERROR_INVALID_STATE);
|
||||
|
||||
mRadioChannelAcquisitionId = Random::NonCrypto::GetUint16InRange(1, kMaxAcquisitionId);
|
||||
|
||||
*aAcquisitionId = mRadioChannelAcquisitionId;
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
otError Mac::ReleaseRadioChannel(void)
|
||||
{
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
VerifyOrExit(mRadioChannelAcquisitionId, error = OT_ERROR_INVALID_STATE);
|
||||
|
||||
mRadioChannelAcquisitionId = 0;
|
||||
mRadioChannel = mPanChannel;
|
||||
|
||||
UpdateIdleMode();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
if (mUsingTemporaryChannel)
|
||||
{
|
||||
mUsingTemporaryChannel = false;
|
||||
mRadioChannel = mPanChannel;
|
||||
UpdateIdleMode();
|
||||
}
|
||||
}
|
||||
|
||||
void Mac::SetSupportedChannelMask(const ChannelMask &aMask)
|
||||
|
||||
+11
-31
@@ -308,46 +308,26 @@ public:
|
||||
otError SetPanChannel(uint8_t aChannel);
|
||||
|
||||
/**
|
||||
* This method returns the IEEE 802.15.4 Radio Channel.
|
||||
* This method sets the temporary IEEE 802.15.4 radio channel.
|
||||
*
|
||||
* @returns The IEEE 802.15.4 Radio Channel.
|
||||
* This method allows user to temporarily change the radio channel and use a different channel (during receive)
|
||||
* instead of the PAN channel (from `SetPanChannel()`). A call to `ClearTemporaryChannel()` would clear the
|
||||
* temporary channel and adopt the PAN channel again. The `SetTemporaryChannel()` can be used multiple times in row
|
||||
* (before a call to `ClearTemporaryChannel()`) to change the temporary channel.
|
||||
*
|
||||
*/
|
||||
uint8_t GetRadioChannel(void) const { return mRadioChannel; }
|
||||
|
||||
/**
|
||||
* This method sets the IEEE 802.15.4 Radio Channel. It can only be called after successfully calling
|
||||
* `AcquireRadioChannel()`.
|
||||
* @param[in] aChannel A IEEE 802.15.4 channel.
|
||||
*
|
||||
* @param[in] aChannel The IEEE 802.15.4 Radio Channel.
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully set the IEEE 802.15.4 Radio Channel.
|
||||
* @retval OT_ERROR_NONE Successfully set the temporary channel
|
||||
* @retval OT_ERROR_INVALID_ARGS The @p aChannel is not in the supported channel mask.
|
||||
* @retval OT_ERROR_INVALID_STATE The acquisition ID is incorrect.
|
||||
*
|
||||
*/
|
||||
otError SetRadioChannel(uint16_t aAcquisitionId, uint8_t aChannel);
|
||||
otError SetTemporaryChannel(uint8_t aChannel);
|
||||
|
||||
/**
|
||||
* This method acquires external ownership of the Radio channel so that future calls to `SetRadioChannel)()` will
|
||||
* succeed.
|
||||
*
|
||||
* @param[out] aAcquisitionId The AcquisitionId that the caller should use when calling `SetRadioChannel()`.
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully acquired permission to Set the Radio Channel.
|
||||
* @retval OT_ERROR_INVALID_STATE Failed to acquire permission as the radio Channel has already been acquired.
|
||||
* This method clears the use of a previously set temporary channel and adopts the PAN channel.
|
||||
*
|
||||
*/
|
||||
otError AcquireRadioChannel(uint16_t *aAcquisitionId);
|
||||
|
||||
/**
|
||||
* This method releases external ownership of the radio Channel that was acquired with `AcquireRadioChannel()`. The
|
||||
* channel will re-adopt the PAN Channel when this API is called.
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully released the IEEE 802.15.4 Radio Channel.
|
||||
*
|
||||
*/
|
||||
otError ReleaseRadioChannel(void);
|
||||
void ClearTemporaryChannel(void);
|
||||
|
||||
/**
|
||||
* This method returns the supported channel mask.
|
||||
@@ -733,6 +713,7 @@ private:
|
||||
bool mRxOnWhenIdle : 1;
|
||||
bool mPromiscuous : 1;
|
||||
bool mBeaconsEnabled : 1;
|
||||
bool mUsingTemporaryChannel : 1;
|
||||
#if OPENTHREAD_CONFIG_MAC_STAY_AWAKE_BETWEEN_FRAGMENTS
|
||||
bool mShouldDelaySleep : 1;
|
||||
bool mDelayingSleep : 1;
|
||||
@@ -745,7 +726,6 @@ private:
|
||||
PanId mPanId;
|
||||
uint8_t mPanChannel;
|
||||
uint8_t mRadioChannel;
|
||||
uint16_t mRadioChannelAcquisitionId;
|
||||
ChannelMask mSupportedChannelMask;
|
||||
ExtendedPanId mExtendedPanId;
|
||||
NetworkName mNetworkName;
|
||||
|
||||
@@ -69,7 +69,6 @@ MeshForwarder::MeshForwarder(Instance &aInstance)
|
||||
, mEnabled(false)
|
||||
, mScanChannels(0)
|
||||
, mScanChannel(0)
|
||||
, mMacRadioAcquisitionId(0)
|
||||
, mRestorePanId(Mac::kPanIdBroadcast)
|
||||
, mScanning(false)
|
||||
#if OPENTHREAD_FTD
|
||||
@@ -192,8 +191,6 @@ otError MeshForwarder::PrepareDiscoverRequest(void)
|
||||
mScanChannel = Mac::ChannelMask::kChannelIteratorFirst;
|
||||
mRestorePanId = Get<Mac::Mac>().GetPanId();
|
||||
|
||||
SuccessOrExit(error = Get<Mac::Mac>().AcquireRadioChannel(&mMacRadioAcquisitionId));
|
||||
|
||||
mScanning = true;
|
||||
|
||||
if (mScanChannels.GetNextChannel(mScanChannel) != OT_ERROR_NONE)
|
||||
@@ -486,7 +483,7 @@ otError MeshForwarder::HandleFrameRequest(Mac::TxFrame &aFrame)
|
||||
case Message::kTypeIp6:
|
||||
if (mSendMessage->GetSubType() == Message::kSubTypeMleDiscoverRequest)
|
||||
{
|
||||
SuccessOrExit(error = Get<Mac::Mac>().SetRadioChannel(mMacRadioAcquisitionId, mScanChannel));
|
||||
SuccessOrExit(error = Get<Mac::Mac>().SetTemporaryChannel(mScanChannel));
|
||||
|
||||
aFrame.SetChannel(mScanChannel);
|
||||
|
||||
@@ -1034,12 +1031,7 @@ void MeshForwarder::HandleDiscoverComplete(void)
|
||||
{
|
||||
assert(mScanning);
|
||||
|
||||
if (mMacRadioAcquisitionId)
|
||||
{
|
||||
Get<Mac::Mac>().ReleaseRadioChannel();
|
||||
mMacRadioAcquisitionId = 0;
|
||||
}
|
||||
|
||||
Get<Mac::Mac>().ClearTemporaryChannel();
|
||||
Get<Mac::Mac>().SetPanId(mRestorePanId);
|
||||
mScanning = false;
|
||||
Get<Mle::MleRouter>().HandleDiscoverComplete();
|
||||
|
||||
@@ -513,7 +513,6 @@ private:
|
||||
|
||||
Mac::ChannelMask mScanChannels;
|
||||
uint8_t mScanChannel;
|
||||
uint16_t mMacRadioAcquisitionId;
|
||||
uint16_t mRestorePanId;
|
||||
bool mScanning;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user