mirror of
https://github.com/espressif/openthread.git
synced 2026-06-05 21:14:49 +00:00
[dataset] add support for wake-up channel (#10736)
- Add Wake-up Channel TLV to the dataset. - Add CLI support to handle the wake-up channel. - Add MAC support for wake-up channel (to be used for sending and receiving wake-up frames).
This commit is contained in:
@@ -200,6 +200,7 @@ typedef struct otOperationalDatasetComponents
|
||||
bool mIsPskcPresent; ///< TRUE if PSKc is present, FALSE otherwise.
|
||||
bool mIsSecurityPolicyPresent; ///< TRUE if Security Policy is present, FALSE otherwise.
|
||||
bool mIsChannelMaskPresent; ///< TRUE if Channel Mask is present, FALSE otherwise.
|
||||
bool mIsWakeupChannelPresent; ///< TRUE if Wake-up Channel is present, FALSE otherwise.
|
||||
} otOperationalDatasetComponents;
|
||||
|
||||
/**
|
||||
@@ -228,6 +229,7 @@ typedef struct otOperationalDataset
|
||||
uint32_t mDelay; ///< Delay Timer
|
||||
otPanId mPanId; ///< PAN ID
|
||||
uint16_t mChannel; ///< Channel
|
||||
uint16_t mWakeupChannel; ///< Wake-up Channel
|
||||
otPskc mPskc; ///< PSKc
|
||||
otSecurityPolicy mSecurityPolicy; ///< Security Policy
|
||||
otChannelMask mChannelMask; ///< Channel Mask
|
||||
@@ -293,6 +295,7 @@ typedef enum otMeshcopTlvType
|
||||
OT_MESHCOP_TLV_SCAN_DURATION = 56, ///< meshcop Scan Duration TLV
|
||||
OT_MESHCOP_TLV_ENERGY_LIST = 57, ///< meshcop Energy List TLV
|
||||
OT_MESHCOP_TLV_THREAD_DOMAIN_NAME = 59, ///< meshcop Thread Domain Name TLV
|
||||
OT_MESHCOP_TLV_WAKEUP_CHANNEL = 74, ///< meshcop Wake-up Channel TLV
|
||||
OT_MESHCOP_TLV_DISCOVERYREQUEST = 128, ///< meshcop Discovery Request TLV
|
||||
OT_MESHCOP_TLV_DISCOVERYRESPONSE = 129, ///< meshcop Discovery Response TLV
|
||||
OT_MESHCOP_TLV_JOINERADVERTISEMENT = 241, ///< meshcop Joiner Advertisement TLV
|
||||
|
||||
@@ -52,7 +52,7 @@ extern "C" {
|
||||
*
|
||||
* @note This number versions both OpenThread platform and user APIs.
|
||||
*/
|
||||
#define OPENTHREAD_API_VERSION (449)
|
||||
#define OPENTHREAD_API_VERSION (450)
|
||||
|
||||
/**
|
||||
* @addtogroup api-instance
|
||||
|
||||
@@ -1100,6 +1100,32 @@ otError otLinkSetRegion(otInstance *aInstance, uint16_t aRegionCode);
|
||||
*/
|
||||
otError otLinkGetRegion(otInstance *aInstance, uint16_t *aRegionCode);
|
||||
|
||||
/**
|
||||
* Gets the Wake-up channel.
|
||||
*
|
||||
* Requires `OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE` or `OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE`.
|
||||
*
|
||||
* @param[in] aInstance A pointer to an OpenThread instance.
|
||||
*
|
||||
* @returns The Wake-up channel.
|
||||
*/
|
||||
uint8_t otLinkGetWakeupChannel(otInstance *aInstance);
|
||||
|
||||
/**
|
||||
* Sets the Wake-up channel.
|
||||
*
|
||||
* Requires `OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE` or `OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE`.
|
||||
*
|
||||
* @param[in] aInstance A pointer to an OpenThread instance.
|
||||
* @param[in] aChannel The Wake-up sample channel. Channel value should be `0` (Set Wake-up Channel unspecified,
|
||||
* which means the device will use the PAN channel) or within the range [1, 10] (if 915-MHz
|
||||
* supported) and [11, 26] (if 2.4 GHz supported).
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully set the Wake-up channel.
|
||||
* @retval OT_ERROR_INVALID_ARGS Invalid @p aChannel.
|
||||
*/
|
||||
otError otLinkSetWakeupChannel(otInstance *aInstance, uint8_t aChannel);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -133,6 +133,7 @@ Done
|
||||
- [vendor](#vendor-name)
|
||||
- [verhoeff](#verhoeff-calculate)
|
||||
- [version](#version)
|
||||
- [wakeupchannel](#wakeupchannel)
|
||||
|
||||
## OpenThread Command Details
|
||||
|
||||
@@ -4371,3 +4372,26 @@ Done
|
||||
Factory Diagnostics module is enabled only when building OpenThread with `OPENTHREAD_CONFIG_DIAG_ENABLE=1` option. Go [diagnostics module][diag] for more information.
|
||||
|
||||
[diag]: ../../src/core/diags/README.md
|
||||
|
||||
### wakeupchannel
|
||||
|
||||
Get the wake-up channel.
|
||||
|
||||
Requires `OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE` or `OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE`.
|
||||
|
||||
```bash
|
||||
> wakeupchannel
|
||||
12
|
||||
Done
|
||||
```
|
||||
|
||||
### wakeupchannel \<channel\>
|
||||
|
||||
Set the wake-up channel.
|
||||
|
||||
Requires `OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE` or `OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE`.
|
||||
|
||||
```bash
|
||||
> wakeupchannel 12
|
||||
Done
|
||||
```
|
||||
|
||||
@@ -19,6 +19,7 @@ The Active Operational Dataset includes parameters that are currently in use acr
|
||||
|
||||
- Active Timestamp
|
||||
- Channel
|
||||
- Wake-up Channel
|
||||
- Channel Mask
|
||||
- Extended PAN ID
|
||||
- Mesh-Local Prefix
|
||||
@@ -46,6 +47,7 @@ The Pending Operational Dataset is used to communicate changes to the Active Ope
|
||||
> dataset
|
||||
Active Timestamp: 1
|
||||
Channel: 15
|
||||
Wake-up Channel: 16
|
||||
Channel Mask: 0x07fff800
|
||||
Ext PAN ID: 39758ec8144b07fb
|
||||
Mesh Local Prefix: fdf1:f1ad:d079:7dc0::/64
|
||||
@@ -105,6 +107,7 @@ After the device successfully attaches to a Thread network, the device will retr
|
||||
> dataset active
|
||||
Active Timestamp: 1
|
||||
Channel: 15
|
||||
Wake-up Channel: 16
|
||||
Channel Mask: 0x07fff800
|
||||
Ext PAN ID: 39758ec8144b07fb
|
||||
Mesh Local Prefix: fdf1:f1ad:d079:7dc0::/64
|
||||
@@ -303,6 +306,7 @@ Normally, an active Commissioner will set a new Pending Operational Dataset. For
|
||||
- [securitypolicy](#securitypolicy)
|
||||
- [tlvs](#tlvs)
|
||||
- [updater](#updater)
|
||||
- [wakeupchannel](#wakeupchannel)
|
||||
|
||||
## Command Details
|
||||
|
||||
@@ -336,6 +340,7 @@ pskc
|
||||
securitypolicy
|
||||
set
|
||||
tlvs
|
||||
wakeupchannel
|
||||
Done
|
||||
```
|
||||
|
||||
@@ -349,6 +354,7 @@ Print Active Operational Dataset in human-readable form.
|
||||
> dataset active
|
||||
Active Timestamp: 1
|
||||
Channel: 15
|
||||
Wake-up Channel: 16
|
||||
Channel Mask: 0x07fff800
|
||||
Ext PAN ID: 39758ec8144b07fb
|
||||
Mesh Local Prefix: fdf1:f1ad:d079:7dc0::/64
|
||||
@@ -364,7 +370,7 @@ Print Active Operational Dataset as hex-encoded TLVs.
|
||||
|
||||
```bash
|
||||
> dataset active -x
|
||||
0e080000000000010000000300000f35060004001fffe0020839758ec8144b07fb0708fdf1f1add0797dc00510f366cec7a446bab978d90d27abe38f23030f4f70656e5468726561642d353933380102593804103ca67c969efb0d0c74a4d8ee923b576c0c0402a0f7f8
|
||||
0e08000000000001000000030000164a0300001735060004001fffe00208b182e6a17996cecc0708fd3f363fa8f1b0bc0510ebb6f6a447c96e1542176df3a834ac0e030f4f70656e5468726561642d3663393901026c99041096e9cdfe1eb1363a3676e2b94df0271b0c0402a0f7f8
|
||||
Done
|
||||
```
|
||||
|
||||
@@ -828,3 +834,22 @@ Done
|
||||
Disabled
|
||||
Done
|
||||
```
|
||||
|
||||
### wakeupchannel
|
||||
|
||||
Usage: `wakeupchannel [channel]`
|
||||
|
||||
Get wake-up channel.
|
||||
|
||||
```bash
|
||||
> dataset wakeupchannel
|
||||
13
|
||||
Done
|
||||
```
|
||||
|
||||
Set wake-up channel.
|
||||
|
||||
```bash
|
||||
> dataset wakeupchannel 13
|
||||
Done
|
||||
```
|
||||
|
||||
@@ -8198,6 +8198,29 @@ exit:
|
||||
|
||||
#endif // OPENTHREAD_CONFIG_VERHOEFF_CHECKSUM_ENABLE
|
||||
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
/**
|
||||
* @cli wakeupchannel (get,set)
|
||||
* @code
|
||||
* wakeupchannel
|
||||
* 12
|
||||
* Done
|
||||
* @endcode
|
||||
* @code
|
||||
* wakeupchannel 12
|
||||
* Done
|
||||
* @endcode
|
||||
* @cparam wakeupchannel [@ca{channel}]
|
||||
* Use `channel` to set the wake-up channel.
|
||||
* @par
|
||||
* Gets or sets the wake-up channel value.
|
||||
*/
|
||||
template <> otError Interpreter::Process<Cmd("wakeupchannel")>(Arg aArgs[])
|
||||
{
|
||||
return ProcessGetSet(aArgs, otLinkGetWakeupChannel, otLinkSetWakeupChannel);
|
||||
}
|
||||
#endif // OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
|
||||
#endif // OPENTHREAD_FTD || OPENTHREAD_MTD
|
||||
|
||||
void Interpreter::Initialize(otInstance *aInstance, otCliOutputCallback aCallback, void *aContext)
|
||||
|
||||
@@ -134,6 +134,12 @@ const Dataset::ComponentMapper *Dataset::LookupMapper(const char *aName) const
|
||||
&Dataset::OutputSecurityPolicy,
|
||||
&Dataset::ParseSecurityPolicy,
|
||||
},
|
||||
{
|
||||
"wakeupchannel",
|
||||
&Components::mIsWakeupChannelPresent,
|
||||
&Dataset::OutputWakeupChannel,
|
||||
&Dataset::ParseWakeupChannel,
|
||||
},
|
||||
};
|
||||
|
||||
static_assert(BinarySearch::IsSorted(kMappers), "kMappers is not sorted");
|
||||
@@ -182,6 +188,24 @@ void Dataset::OutputActiveTimestamp(const otOperationalDataset &aDataset)
|
||||
*/
|
||||
void Dataset::OutputChannel(const otOperationalDataset &aDataset) { OutputLine("%u", aDataset.mChannel); }
|
||||
|
||||
/**
|
||||
* @cli dataset wakeupchannel (get,set)
|
||||
* @code
|
||||
* dataset wakeupchannel
|
||||
* 13
|
||||
* Done
|
||||
* @endcode
|
||||
* @code
|
||||
* dataset wakeupchannel 13
|
||||
* Done
|
||||
* @endcode
|
||||
* @cparam dataset wakeupchannel [@ca{channel-num}]
|
||||
* Use the optional `channel-num` argument to set the wake-up channel.
|
||||
* @par
|
||||
* Gets or sets #otOperationalDataset::mWakeupChannel.
|
||||
*/
|
||||
void Dataset::OutputWakeupChannel(const otOperationalDataset &aDataset) { OutputLine("%u", aDataset.mWakeupChannel); }
|
||||
|
||||
/**
|
||||
* @cli dataset channelmask (get,set)
|
||||
* @code
|
||||
@@ -412,6 +436,11 @@ otError Dataset::ParseChannel(Arg *&aArgs, otOperationalDataset &aDataset)
|
||||
return aArgs++->ParseAsUint16(aDataset.mChannel);
|
||||
}
|
||||
|
||||
otError Dataset::ParseWakeupChannel(Arg *&aArgs, otOperationalDataset &aDataset)
|
||||
{
|
||||
return aArgs++->ParseAsUint16(aDataset.mWakeupChannel);
|
||||
}
|
||||
|
||||
otError Dataset::ParseChannelMask(Arg *&aArgs, otOperationalDataset &aDataset)
|
||||
{
|
||||
return aArgs++->ParseAsUint32(aDataset.mChannelMask);
|
||||
@@ -561,6 +590,7 @@ otError Dataset::Print(otOperationalDatasetTlvs &aDatasetTlvs)
|
||||
{"Pending Timestamp", "pendingtimestamp"},
|
||||
{"Active Timestamp", "activetimestamp"},
|
||||
{"Channel", "channel"},
|
||||
{"Wake-up Channel", "wakeupchannel"},
|
||||
{"Channel Mask", "channelmask"},
|
||||
{"Delay", "delay"},
|
||||
{"Ext PAN ID", "extpanid"},
|
||||
|
||||
@@ -92,6 +92,7 @@ private:
|
||||
|
||||
void OutputActiveTimestamp(const otOperationalDataset &aDataset);
|
||||
void OutputChannel(const otOperationalDataset &aDataset);
|
||||
void OutputWakeupChannel(const otOperationalDataset &aDataset);
|
||||
void OutputChannelMask(const otOperationalDataset &aDataset);
|
||||
void OutputDelay(const otOperationalDataset &aDataset);
|
||||
void OutputExtendedPanId(const otOperationalDataset &aDataset);
|
||||
@@ -105,6 +106,7 @@ private:
|
||||
|
||||
otError ParseActiveTimestamp(Arg *&aArgs, otOperationalDataset &aDataset);
|
||||
otError ParseChannel(Arg *&aArgs, otOperationalDataset &aDataset);
|
||||
otError ParseWakeupChannel(Arg *&aArgs, otOperationalDataset &aDataset);
|
||||
otError ParseChannelMask(Arg *&aArgs, otOperationalDataset &aDataset);
|
||||
otError ParseDelay(Arg *&aArgs, otOperationalDataset &aDataset);
|
||||
otError ParseExtendedPanId(Arg *&aArgs, otOperationalDataset &aDataset);
|
||||
|
||||
@@ -79,6 +79,29 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
uint8_t otLinkGetWakeupChannel(otInstance *aInstance)
|
||||
{
|
||||
return AsCoreType(aInstance).Get<Mac::Mac>().GetWakeupChannel();
|
||||
}
|
||||
|
||||
otError otLinkSetWakeupChannel(otInstance *aInstance, uint8_t aChannel)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Instance &instance = AsCoreType(aInstance);
|
||||
|
||||
VerifyOrExit(instance.Get<Mle::MleRouter>().IsDisabled(), error = kErrorInvalidState);
|
||||
|
||||
SuccessOrExit(error = instance.Get<Mac::Mac>().SetWakeupChannel(aChannel));
|
||||
|
||||
instance.Get<MeshCoP::ActiveDatasetManager>().Clear();
|
||||
instance.Get<MeshCoP::PendingDatasetManager>().Clear();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
#endif // OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
|
||||
uint32_t otLinkGetSupportedChannelMask(otInstance *aInstance)
|
||||
{
|
||||
return AsCoreType(aInstance).Get<Mac::Mac>().GetSupportedChannelMask().GetMask();
|
||||
|
||||
@@ -481,6 +481,15 @@
|
||||
#endif // OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT
|
||||
#endif // OPENTHREAD_CONFIG_DEFAULT_CHANNEL
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_CONFIG_DEFAULT_WAKEUP_CHANNEL
|
||||
*
|
||||
* The default IEEE 802.15.4 wake-up channel.
|
||||
*/
|
||||
#ifndef OPENTHREAD_CONFIG_DEFAULT_WAKEUP_CHANNEL
|
||||
#define OPENTHREAD_CONFIG_DEFAULT_WAKEUP_CHANNEL 11
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_CONFIG_OTNS_ENABLE
|
||||
*
|
||||
|
||||
@@ -82,6 +82,7 @@ Mac::Mac(Instance &aInstance)
|
||||
, mCslChannel(0)
|
||||
, mCslPeriod(0)
|
||||
#endif
|
||||
, mWakeupChannel(OPENTHREAD_CONFIG_DEFAULT_WAKEUP_CHANNEL)
|
||||
, mActiveScanHandler(nullptr) // Initialize `mActiveScanHandler` and `mEnergyScanHandler` union
|
||||
, mScanHandlerContext(nullptr)
|
||||
, mLinks(aInstance)
|
||||
@@ -2399,5 +2400,24 @@ void Mac::SetRadioFilterEnabled(bool aFilterEnabled)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
Error Mac::SetWakeupChannel(uint8_t aChannel)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
|
||||
if (aChannel == 0)
|
||||
{
|
||||
mWakeupChannel = GetPanChannel();
|
||||
ExitNow();
|
||||
}
|
||||
|
||||
VerifyOrExit(mSupportedChannelMask.ContainsChannel(aChannel), error = kErrorInvalidArgs);
|
||||
mWakeupChannel = aChannel;
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace Mac
|
||||
} // namespace ot
|
||||
|
||||
@@ -680,6 +680,25 @@ public:
|
||||
*/
|
||||
Error GetRegion(uint16_t &aRegionCode) const;
|
||||
|
||||
/**
|
||||
* Gets the Wake-up channel.
|
||||
*
|
||||
* @returns Wake-up channel.
|
||||
*/
|
||||
uint8_t GetWakeupChannel(void) const { return mWakeupChannel; }
|
||||
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
/**
|
||||
* Sets the Wake-up channel.
|
||||
*
|
||||
* @param[in] aChannel The Wake-up channel.
|
||||
*
|
||||
* @retval kErrorNone Successfully set the wake-up channel.
|
||||
* @retval kErrorInvalidArgs The @p aChannel is not in the supported channel mask.
|
||||
*/
|
||||
Error SetWakeupChannel(uint8_t aChannel);
|
||||
#endif
|
||||
|
||||
private:
|
||||
static constexpr uint16_t kMaxCcaSampleCount = OPENTHREAD_CONFIG_CCA_FAILURE_RATE_AVERAGING_WINDOW;
|
||||
|
||||
@@ -809,6 +828,7 @@ private:
|
||||
uint8_t mCslChannel;
|
||||
uint16_t mCslPeriod;
|
||||
#endif
|
||||
uint8_t mWakeupChannel;
|
||||
|
||||
union
|
||||
{
|
||||
|
||||
@@ -65,6 +65,7 @@ Error Dataset::Info::GenerateRandom(Instance &aInstance)
|
||||
mActiveTimestamp.mAuthoritative = false;
|
||||
mChannel = preferredChannels.ChooseRandomChannel();
|
||||
mChannelMask = supportedChannels.GetMask();
|
||||
mWakeupChannel = supportedChannels.ChooseRandomChannel();
|
||||
mPanId = Mac::GenerateRandomPanId();
|
||||
AsCoreType(&mSecurityPolicy).SetToDefault();
|
||||
|
||||
@@ -82,6 +83,7 @@ Error Dataset::Info::GenerateRandom(Instance &aInstance)
|
||||
mComponents.mIsMeshLocalPrefixPresent = true;
|
||||
mComponents.mIsPanIdPresent = true;
|
||||
mComponents.mIsChannelPresent = true;
|
||||
mComponents.mIsWakeupChannelPresent = true;
|
||||
mComponents.mIsPskcPresent = true;
|
||||
mComponents.mIsSecurityPolicyPresent = true;
|
||||
mComponents.mIsChannelMaskPresent = true;
|
||||
@@ -147,6 +149,10 @@ bool Dataset::IsTlvValid(const Tlv &aTlv)
|
||||
VerifyOrExit(aTlv.GetLength() >= sizeof(ChannelTlvValue), isValid = false);
|
||||
isValid = aTlv.ReadValueAs<ChannelTlv>().IsValid();
|
||||
break;
|
||||
case Tlv::kWakeupChannel:
|
||||
VerifyOrExit(aTlv.GetLength() >= sizeof(ChannelTlvValue), isValid = false);
|
||||
isValid = aTlv.ReadValueAs<WakeupChannelTlv>().IsValid();
|
||||
break;
|
||||
case Tlv::kNetworkName:
|
||||
isValid = As<NetworkNameTlv>(aTlv).IsValid();
|
||||
break;
|
||||
@@ -234,6 +240,10 @@ void Dataset::ConvertTo(Info &aDatasetInfo) const
|
||||
aDatasetInfo.Set<kChannel>(cur->ReadValueAs<ChannelTlv>().GetChannel());
|
||||
break;
|
||||
|
||||
case Tlv::kWakeupChannel:
|
||||
aDatasetInfo.Set<kWakeupChannel>(cur->ReadValueAs<WakeupChannelTlv>().GetChannel());
|
||||
break;
|
||||
|
||||
case Tlv::kChannelMask:
|
||||
{
|
||||
uint32_t mask;
|
||||
@@ -432,6 +442,14 @@ Error Dataset::WriteTlvsFrom(const Dataset::Info &aDatasetInfo)
|
||||
SuccessOrExit(error = Write<ChannelTlv>(channelValue));
|
||||
}
|
||||
|
||||
if (aDatasetInfo.IsPresent<kWakeupChannel>())
|
||||
{
|
||||
ChannelTlvValue channelValue;
|
||||
|
||||
channelValue.SetChannelAndPage(aDatasetInfo.Get<kWakeupChannel>());
|
||||
SuccessOrExit(error = Write<WakeupChannelTlv>(channelValue));
|
||||
}
|
||||
|
||||
if (aDatasetInfo.IsPresent<kChannelMask>())
|
||||
{
|
||||
ChannelMaskTlv::Value value;
|
||||
|
||||
@@ -89,6 +89,7 @@ public:
|
||||
kDelay, ///< Delay
|
||||
kPanId, ///< PAN Identifier
|
||||
kChannel, ///< Channel
|
||||
kWakeupChannel, ///< Wakeup Channel
|
||||
kPskc, ///< PSKc
|
||||
kSecurityPolicy, ///< Security Policy
|
||||
kChannelMask, ///< Channel Mask
|
||||
@@ -686,6 +687,7 @@ DefineIsPresentAndMarkAsPresent(MeshLocalPrefix)
|
||||
DefineIsPresentAndMarkAsPresent(Delay)
|
||||
DefineIsPresentAndMarkAsPresent(PanId)
|
||||
DefineIsPresentAndMarkAsPresent(Channel)
|
||||
DefineIsPresentAndMarkAsPresent(WakeupChannel)
|
||||
DefineIsPresentAndMarkAsPresent(Pskc)
|
||||
DefineIsPresentAndMarkAsPresent(SecurityPolicy)
|
||||
DefineIsPresentAndMarkAsPresent(ChannelMask)
|
||||
@@ -704,6 +706,7 @@ template <> struct Dataset::TypeFor<Dataset::kMeshLocalPrefix> { using Type = I
|
||||
template <> struct Dataset::TypeFor<Dataset::kDelay> { using Type = uint32_t; };
|
||||
template <> struct Dataset::TypeFor<Dataset::kPanId> { using Type = Mac::PanId; };
|
||||
template <> struct Dataset::TypeFor<Dataset::kChannel> { using Type = uint16_t; };
|
||||
template <> struct Dataset::TypeFor<Dataset::kWakeupChannel> { using Type = uint16_t; };
|
||||
template <> struct Dataset::TypeFor<Dataset::kPskc> { using Type = Pskc; };
|
||||
template <> struct Dataset::TypeFor<Dataset::kSecurityPolicy> { using Type = SecurityPolicy; };
|
||||
template <> struct Dataset::TypeFor<Dataset::kChannelMask> { using Type = uint32_t; };
|
||||
@@ -739,6 +742,8 @@ template <> inline const Mac::PanId &Dataset::Info::Get<Dataset::kPanId>(void) c
|
||||
|
||||
template <> inline const uint16_t &Dataset::Info::Get<Dataset::kChannel>(void) const { return mChannel; }
|
||||
|
||||
template <> inline const uint16_t &Dataset::Info::Get<Dataset::kWakeupChannel>(void) const { return mWakeupChannel; }
|
||||
|
||||
template <> inline const Pskc &Dataset::Info::Get<Dataset::kPskc>(void) const { return AsCoreType(&mPskc); }
|
||||
|
||||
template <> inline const SecurityPolicy &Dataset::Info::Get<Dataset::kSecurityPolicy>(void) const
|
||||
|
||||
@@ -186,12 +186,26 @@ Error DatasetManager::ApplyConfiguration(const Dataset &aDataset) const
|
||||
|
||||
if (error != kErrorNone)
|
||||
{
|
||||
LogCrit("Failed to set channel to %u when applying dataset: %s", channel, ErrorToString(error));
|
||||
LogCrit("Failed to set PAN channel to %u when applying dataset: %s", channel, ErrorToString(error));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Tlv::kWakeupChannel:
|
||||
{
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
uint8_t channel = static_cast<uint8_t>(cur->ReadValueAs<WakeupChannelTlv>().GetChannel());
|
||||
error = Get<Mac::Mac>().SetWakeupChannel(channel);
|
||||
|
||||
if (error != kErrorNone)
|
||||
{
|
||||
LogCrit("Failed to set wake-up channel to %u when applying dataset: %s", channel, ErrorToString(error));
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
case Tlv::kPanId:
|
||||
Get<Mac::Mac>().SetPanId(cur->ReadValueAs<PanIdTlv>());
|
||||
break;
|
||||
@@ -678,6 +692,11 @@ Error DatasetManager::SendGetRequest(const Dataset::Components &aDatasetComponen
|
||||
tlvList.Add(Tlv::kChannel);
|
||||
}
|
||||
|
||||
if (aDatasetComponents.IsPresent<Dataset::kWakeupChannel>())
|
||||
{
|
||||
tlvList.Add(Tlv::kWakeupChannel);
|
||||
}
|
||||
|
||||
if (aDatasetComponents.IsPresent<Dataset::kPskc>())
|
||||
{
|
||||
tlvList.Add(Tlv::kPskc);
|
||||
|
||||
@@ -283,6 +283,14 @@ Error ActiveDatasetManager::GenerateLocal(void)
|
||||
IgnoreError(dataset.Write<ChannelTlv>(channelValue));
|
||||
}
|
||||
|
||||
if (!dataset.Contains<WakeupChannelTlv>())
|
||||
{
|
||||
ChannelTlvValue channelValue;
|
||||
|
||||
channelValue.SetChannelAndPage(Get<Mac::Mac>().GetWakeupChannel());
|
||||
IgnoreError(dataset.Write<WakeupChannelTlv>(channelValue));
|
||||
}
|
||||
|
||||
if (!dataset.Contains<ChannelMaskTlv>())
|
||||
{
|
||||
ChannelMaskTlv::Value value;
|
||||
|
||||
@@ -109,6 +109,7 @@ public:
|
||||
kScanDuration = OT_MESHCOP_TLV_SCAN_DURATION, ///< Scan Duration TLV
|
||||
kEnergyList = OT_MESHCOP_TLV_ENERGY_LIST, ///< Energy List TLV
|
||||
kThreadDomainName = OT_MESHCOP_TLV_THREAD_DOMAIN_NAME, ///< Thread Domain Name TLV
|
||||
kWakeupChannel = OT_MESHCOP_TLV_WAKEUP_CHANNEL, ///< Wakeup Channel TLV
|
||||
kDiscoveryRequest = OT_MESHCOP_TLV_DISCOVERYREQUEST, ///< Discovery Request TLV
|
||||
kDiscoveryResponse = OT_MESHCOP_TLV_DISCOVERYRESPONSE, ///< Discovery Response TLV
|
||||
kJoinerAdvertisement = OT_MESHCOP_TLV_JOINERADVERTISEMENT, ///< Joiner Advertisement TLV
|
||||
@@ -233,6 +234,11 @@ typedef Mle::ChannelTlvValue ChannelTlvValue;
|
||||
*/
|
||||
typedef SimpleTlvInfo<Tlv::kChannel, ChannelTlvValue> ChannelTlv;
|
||||
|
||||
/**
|
||||
* Defines Wake-up Channel TLV constants and types.
|
||||
*/
|
||||
typedef SimpleTlvInfo<Tlv::kWakeupChannel, ChannelTlvValue> WakeupChannelTlv;
|
||||
|
||||
/**
|
||||
* Defines PAN ID TLV constants and types.
|
||||
*/
|
||||
|
||||
@@ -98,6 +98,7 @@ public:
|
||||
kPendingDataset = 25, ///< Pending Operational Dataset TLV
|
||||
kDiscovery = 26, ///< Thread Discovery TLV
|
||||
kSupervisionInterval = 27, ///< Supervision Interval TLV
|
||||
kWakeupChannel = 74, ///< Wakeup Channel TLV
|
||||
kCslChannel = 80, ///< CSL Channel TLV
|
||||
kCslTimeout = 85, ///< CSL Timeout TLV
|
||||
kCslClockAccuracy = 86, ///< CSL Clock Accuracy TLV
|
||||
|
||||
@@ -1364,6 +1364,7 @@ const char *spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
|
||||
{SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_REGISTRATION_JITTER,
|
||||
"THREAD_BACKBONE_ROUTER_LOCAL_REGISTRATION_JITTER"},
|
||||
{SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS, "THREAD_MGMT_SET_PENDING_DATASET_TLVS"},
|
||||
{SPINEL_PROP_THREAD_WAKEUP_CHANNEL, "THREAD_WAKEUP_CHANNEL"},
|
||||
{SPINEL_PROP_MESHCOP_JOINER_STATE, "MESHCOP_JOINER_STATE"},
|
||||
{SPINEL_PROP_MESHCOP_JOINER_COMMISSIONING, "MESHCOP_JOINER_COMMISSIONING"},
|
||||
{SPINEL_PROP_IPV6_LL_ADDR, "IPV6_LL_ADDR"},
|
||||
|
||||
@@ -3284,6 +3284,15 @@ enum
|
||||
*/
|
||||
SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS = SPINEL_PROP_THREAD_EXT__BEGIN + 62,
|
||||
|
||||
/// Wake-up Channel
|
||||
/** Format: `C`
|
||||
*
|
||||
* The Wake-up sample channel. Channel value should be `0` (Set Wake-up Channel unspecified,
|
||||
* which means the device will use the PAN channel) or within the range [1, 10] (if 915-MHz
|
||||
* supported) and [11, 26] (if 2.4 GHz supported).
|
||||
*/
|
||||
SPINEL_PROP_THREAD_WAKEUP_CHANNEL = SPINEL_PROP_THREAD_EXT__BEGIN + 63,
|
||||
|
||||
SPINEL_PROP_THREAD_EXT__END = 0x1600,
|
||||
|
||||
SPINEL_PROP_IPV6__BEGIN = 0x60,
|
||||
|
||||
@@ -337,6 +337,9 @@ NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey)
|
||||
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_ACTIVE_DATASET_TLVS),
|
||||
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_PENDING_DATASET_TLVS),
|
||||
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS),
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_WAKEUP_CHANNEL),
|
||||
#endif
|
||||
#if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE
|
||||
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL),
|
||||
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_CHANNEL_MANAGER_DELAY),
|
||||
@@ -612,6 +615,9 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey)
|
||||
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_ACTIVE_DATASET_TLVS),
|
||||
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_PENDING_DATASET_TLVS),
|
||||
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS),
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_WAKEUP_CHANNEL),
|
||||
#endif
|
||||
#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
|
||||
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN),
|
||||
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN),
|
||||
|
||||
@@ -4793,6 +4793,26 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
#if OPENTHREAD_CONFIG_WAKEUP_COORDINATOR_ENABLE || OPENTHREAD_CONFIG_WAKEUP_END_DEVICE_ENABLE
|
||||
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_WAKEUP_CHANNEL>(void)
|
||||
{
|
||||
uint8_t wakeupChannel;
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
SuccessOrExit(error = mDecoder.ReadUint8(wakeupChannel));
|
||||
|
||||
error = otLinkSetWakeupChannel(mInstance, wakeupChannel);
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_WAKEUP_CHANNEL>(void)
|
||||
{
|
||||
return mEncoder.WriteUint8(otLinkGetWakeupChannel(mInstance));
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace Ncp
|
||||
} // namespace ot
|
||||
|
||||
|
||||
@@ -1762,6 +1762,7 @@ class OTCI(object):
|
||||
#
|
||||
# Active Timestamp: 1
|
||||
# Channel: 22
|
||||
# Wake-up Channel: 11
|
||||
# Channel Mask: 0x07fff800
|
||||
# Ext PAN ID: 5c93ae980ff22d35
|
||||
# Mesh Local Prefix: fdc7:55fe:6363:bd01::/64
|
||||
@@ -1781,6 +1782,8 @@ class OTCI(object):
|
||||
dataset['active_timestamp'] = int(val)
|
||||
elif key == 'Channel':
|
||||
dataset['channel'] = int(val)
|
||||
elif key == 'Wake-up Channel':
|
||||
dataset['wakeupchannel'] = int(val)
|
||||
elif key == 'Channel Mask':
|
||||
dataset['channel_mask'] = int(val, 16)
|
||||
elif key == 'Ext PAN ID':
|
||||
@@ -1829,6 +1832,7 @@ class OTCI(object):
|
||||
def dataset_set_buffer(self,
|
||||
active_timestamp: Optional[int] = None,
|
||||
channel: Optional[int] = None,
|
||||
wakeupchannel: Optional[int] = None,
|
||||
channel_mask: Optional[int] = None,
|
||||
extpanid: Optional[str] = None,
|
||||
mesh_local_prefix: Optional[str] = None,
|
||||
@@ -1844,6 +1848,9 @@ class OTCI(object):
|
||||
if channel is not None:
|
||||
self.execute_command(f'dataset channel {channel}')
|
||||
|
||||
if wakeupchannel is not None:
|
||||
self.execute_command(f'dataset wakeupchannel {wakeupchannel}')
|
||||
|
||||
if channel_mask is not None:
|
||||
self.execute_command(f'dataset channelmask {channel_mask}')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user