[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:
Eduardo Montoya
2024-09-26 23:01:46 +02:00
committed by GitHub
parent b42be4cff1
commit 596c5aa6a2
23 changed files with 308 additions and 3 deletions
+3
View File
@@ -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
+1 -1
View File
@@ -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
+26
View File
@@ -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);
/**
* @}
*/
+24
View File
@@ -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
```
+26 -1
View File
@@ -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
```
+23
View File
@@ -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)
+30
View File
@@ -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"},
+2
View File
@@ -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);
+23
View File
@@ -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();
+9
View File
@@ -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
*
+20
View File
@@ -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
+20
View File
@@ -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
{
+18
View File
@@ -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;
+5
View File
@@ -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
+20 -1
View File
@@ -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);
+8
View File
@@ -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;
+6
View File
@@ -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.
*/
+1
View File
@@ -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
+1
View File
@@ -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"},
+9
View File
@@ -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,
+6
View File
@@ -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),
+20
View File
@@ -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
+7
View File
@@ -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}')