Skip to content

Commit 0005499

Browse files
committed
[thread-direct] add NCP/Spinel Thread Direct Wake property handlers
Extends `spinel.h` with new Thread Direct Wake property IDs.
1 parent 7bb660b commit 0005499

6 files changed

Lines changed: 282 additions & 8 deletions

File tree

src/lib/spinel/spinel.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1365,7 +1365,14 @@ const char *spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
13651365
{SPINEL_PROP_THREAD_BACKBONE_ROUTER_LOCAL_REGISTRATION_JITTER,
13661366
"THREAD_BACKBONE_ROUTER_LOCAL_REGISTRATION_JITTER"},
13671367
{SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS, "THREAD_MGMT_SET_PENDING_DATASET_TLVS"},
1368-
{SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL, "THREAD_WAKEUP_CHANNEL"},
1368+
{SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL, "THREAD_DIRECT_WAKE_CHANNEL"},
1369+
{SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_ENABLED, "THREAD_DIRECT_WAKE_LISTEN_ENABLED"},
1370+
{SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_PARAMS, "THREAD_DIRECT_WAKE_LISTEN_PARAMS"},
1371+
{SPINEL_PROP_THREAD_DIRECT_WAKE, "THREAD_DIRECT_WAKE"},
1372+
{SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY, "THREAD_DIRECT_GUEST_WAKE_KEY"},
1373+
{SPINEL_PROP_THREAD_DIRECT_LINK_EVENT, "THREAD_DIRECT_LINK_EVENT"},
1374+
{SPINEL_PROP_THREAD_DIRECT_WAKE_BURST_ACTIVE, "THREAD_DIRECT_WAKE_BURST_ACTIVE"},
1375+
{SPINEL_PROP_THREAD_DIRECT_WAKE_FRAME_COUNTER, "THREAD_DIRECT_WAKE_FRAME_COUNTER"},
13691376
{SPINEL_PROP_MESHCOP_JOINER_STATE, "MESHCOP_JOINER_STATE"},
13701377
{SPINEL_PROP_MESHCOP_JOINER_COMMISSIONING, "MESHCOP_JOINER_COMMISSIONING"},
13711378
{SPINEL_PROP_IPV6_LL_ADDR, "IPV6_LL_ADDR"},

src/lib/spinel/spinel.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3310,6 +3310,73 @@ enum
33103310
*/
33113311
SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL = SPINEL_PROP_THREAD_EXT__BEGIN + 63,
33123312

3313+
/// Thread Direct Wake Listener Enable
3314+
/** Format: `b` - Read-write
3315+
*
3316+
* Indicates whether the Wake Listener scheduled receive window is enabled.
3317+
* When enabled the device opens periodic listen windows on the wake channel
3318+
* according to the configured listen parameters.
3319+
*/
3320+
SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_ENABLED = SPINEL_PROP_THREAD_EXT__BEGIN + 64,
3321+
3322+
/// Thread Direct Wake Listener Parameters
3323+
/** Format: `LL` - Read-write
3324+
*
3325+
* Configures the Wake Listener scheduled receive window timing:
3326+
* `L` - Listen interval in microseconds.
3327+
* `L` - Listen window duration in microseconds.
3328+
*/
3329+
SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_PARAMS = SPINEL_PROP_THREAD_EXT__BEGIN + 65,
3330+
3331+
/// Thread Direct Wake (start wake burst)
3332+
/** Format: `ECSSCd` - Write only
3333+
*
3334+
* Starts a Thread Direct wake burst targeting the specified WL:
3335+
* `E` - WL extended address.
3336+
* `C` - Wake type (0=link, 1=poweroutage, 2=connectionless).
3337+
* `S` - Inter-frame interval in us (0 = default).
3338+
* `S` - Burst duration in ms (0 = default).
3339+
* `C` - Key index (0 or 129 = default key; 130-192 = guest key provisioned via
3340+
* SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY).
3341+
* `d` - Inline key (legacy field; must be zero-length; ignored).
3342+
*
3343+
* The result is reported asynchronously via SPINEL_PROP_THREAD_DIRECT_LINK_EVENT.
3344+
*/
3345+
SPINEL_PROP_THREAD_DIRECT_WAKE = SPINEL_PROP_THREAD_EXT__BEGIN + 68,
3346+
3347+
/// Thread Direct Guest Wake Key
3348+
/** Format: `Cd` - Insert, `C` - Remove
3349+
*
3350+
* Manages the out-of-band guest wake key table:
3351+
* Insert (`SPINEL_CMD_PROP_VALUE_INSERT`): `C` key index, `d` 16-byte key material.
3352+
* Remove (`SPINEL_CMD_PROP_VALUE_REMOVE`): `C` key index.
3353+
*/
3354+
SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY = SPINEL_PROP_THREAD_EXT__BEGIN + 71,
3355+
3356+
/// Thread Direct Link Event Notification
3357+
/** Format: `CEb` - Unsolicited notify (PROP_VALUE_IS)
3358+
*
3359+
* Reports Thread Direct link events (`otThreadDirectEvent`):
3360+
* `C` - Event: 0 = linked, 1 = link failed, 2 = unlinked, 3 = wake received.
3361+
* `E` - Peer extended address (zero if none, e.g. some link-failed cases).
3362+
* `b` - Success indicator: false only for event 1 (link failed); true otherwise.
3363+
*/
3364+
SPINEL_PROP_THREAD_DIRECT_LINK_EVENT = SPINEL_PROP_THREAD_EXT__BEGIN + 72,
3365+
3366+
/// Thread Direct - WI wake burst active
3367+
/** Format: `b` - Read only
3368+
*
3369+
* TRUE when the WI has an active wake burst or open connection window.
3370+
*/
3371+
SPINEL_PROP_THREAD_DIRECT_WAKE_BURST_ACTIVE = SPINEL_PROP_THREAD_EXT__BEGIN + 73,
3372+
3373+
/// Thread Direct Wake Frame Counter
3374+
/** Format: `L` - Read-write
3375+
*
3376+
* The current Thread Direct wake frame counter.
3377+
*/
3378+
SPINEL_PROP_THREAD_DIRECT_WAKE_FRAME_COUNTER = SPINEL_PROP_THREAD_EXT__BEGIN + 75,
3379+
33133380
SPINEL_PROP_THREAD_EXT__END = 0x1600,
33143381

33153382
SPINEL_PROP_IPV6__BEGIN = 0x60,

src/ncp/ncp_base.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
#include <openthread/logging.h>
4444
#include <openthread/ncp.h>
4545
#include <openthread/network_time.h>
46+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
47+
#include <openthread/thread_direct.h>
48+
#endif
4649
#include <openthread/platform/misc.h>
4750
#include <openthread/platform/radio.h>
4851

@@ -360,6 +363,9 @@ NcpBase::NcpBase(Instance *aInstance)
360363
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
361364
otNetworkTimeSyncSetCallback(mInstance, &NcpBase::HandleTimeSyncUpdate, this);
362365
#endif // OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
366+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
367+
otThreadDirectSetEventCallback(mInstance, &NcpBase::HandleThreadDirectEvent, this);
368+
#endif
363369
#if OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE
364370
otUdpForwardSetForwarder(mInstance, &NcpBase::HandleUdpForwardStream, this);
365371
#endif

src/ncp/ncp_base.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
#if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
5454
#include <openthread/srp_client.h>
5555
#endif
56+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
57+
#include <openthread/thread_direct.h>
58+
#endif
5659
#include <openthread/platform/dnssd.h>
5760

5861
#include "changed_props_set.hpp"
@@ -474,6 +477,13 @@ class NcpBase
474477
static void HandleTimeSyncUpdate(void *aContext);
475478
void HandleTimeSyncUpdate(void);
476479

480+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
481+
static void HandleThreadDirectEvent(otThreadDirectEvent aEvent,
482+
const otThreadDirectPeerInfo *aPeerInfo,
483+
void *aContext);
484+
void HandleThreadDirectEvent(otThreadDirectEvent aEvent, const otThreadDirectPeerInfo *aPeerInfo);
485+
#endif
486+
477487
#if OPENTHREAD_FTD
478488
static void HandleNeighborTableChanged(otNeighborTableEvent aEvent, const otNeighborTableEntryInfo *aEntry);
479489
void HandleNeighborTableChanged(otNeighborTableEvent aEvent, const otNeighborTableEntryInfo &aEntry);

src/ncp/ncp_base_dispatcher.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,17 @@ NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey)
349349
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_PENDING_DATASET_TLVS),
350350
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS),
351351
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
352-
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL),
352+
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL), // 63
353+
#endif
354+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
355+
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_ENABLED), // 64
356+
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_PARAMS), // 65
357+
#endif
358+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
359+
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_BURST_ACTIVE), // 73
360+
#endif
361+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
362+
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_FRAME_COUNTER), // 75
353363
#endif
354364
#if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE
355365
OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL),
@@ -659,7 +669,17 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey)
659669
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_PENDING_DATASET_TLVS),
660670
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET_TLVS),
661671
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
662-
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL),
672+
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL), // 63
673+
#endif
674+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
675+
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_ENABLED), // 64
676+
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_PARAMS), // 65
677+
#endif
678+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
679+
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE), // 68
680+
#endif
681+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
682+
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_WAKE_FRAME_COUNTER), // 75
663683
#endif
664684
#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
665685
OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN),
@@ -757,6 +777,9 @@ NcpBase::PropertyHandler NcpBase::FindInsertPropertyHandler(spinel_prop_key_t aK
757777
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
758778
OT_NCP_INSERT_HANDLER_ENTRY(SPINEL_PROP_THREAD_JOINERS),
759779
#endif
780+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
781+
OT_NCP_INSERT_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY), // 71
782+
#endif
760783
#if OPENTHREAD_FTD || OPENTHREAD_MTD
761784
#if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
762785
OT_NCP_INSERT_HANDLER_ENTRY(SPINEL_PROP_SRP_CLIENT_SERVICES),
@@ -807,6 +830,9 @@ NcpBase::PropertyHandler NcpBase::FindRemovePropertyHandler(spinel_prop_key_t aK
807830
#if OPENTHREAD_FTD
808831
OT_NCP_REMOVE_HANDLER_ENTRY(SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS),
809832
#endif
833+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
834+
OT_NCP_REMOVE_HANDLER_ENTRY(SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY), // 71
835+
#endif
810836
#if OPENTHREAD_FTD || OPENTHREAD_MTD
811837
#if OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE
812838
OT_NCP_REMOVE_HANDLER_ENTRY(SPINEL_PROP_SRP_CLIENT_SERVICES),

src/ncp/ncp_base_mtd.cpp

Lines changed: 163 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
#if OPENTHREAD_FTD
5757
#include <openthread/thread_ftd.h>
5858
#endif
59+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
60+
#include <openthread/thread_direct.h>
61+
#endif
5962
#if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE
6063
#include <openthread/server.h>
6164
#endif
@@ -4831,12 +4834,11 @@ void NcpBase::ProcessThreadChangedFlags(void)
48314834
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
48324835
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DIRECT_WAKE_CHANNEL>(void)
48334836
{
4834-
uint8_t wakeupChannel;
4837+
uint8_t wakeChannel;
48354838
otError error = OT_ERROR_NONE;
48364839

4837-
SuccessOrExit(error = mDecoder.ReadUint8(wakeupChannel));
4838-
4839-
error = otLinkSetWakeupChannel(mInstance, wakeupChannel);
4840+
SuccessOrExit(error = mDecoder.ReadUint8(wakeChannel));
4841+
error = otLinkSetWakeupChannel(mInstance, wakeChannel);
48404842

48414843
exit:
48424844
return error;
@@ -4846,7 +4848,163 @@ template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DIRECT_WAKE_CH
48464848
{
48474849
return mEncoder.WriteUint8(otLinkGetWakeupChannel(mInstance));
48484850
}
4849-
#endif
4851+
4852+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
4853+
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_ENABLED>(void)
4854+
{
4855+
return mEncoder.WriteBool(otThreadDirectIsWakeListenerEnabled(mInstance));
4856+
}
4857+
4858+
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_ENABLED>(void)
4859+
{
4860+
bool enable;
4861+
otError error = OT_ERROR_NONE;
4862+
4863+
SuccessOrExit(error = mDecoder.ReadBool(enable));
4864+
error = otThreadDirectWakeListenerEnable(mInstance, enable);
4865+
4866+
exit:
4867+
return error;
4868+
}
4869+
4870+
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_PARAMS>(void)
4871+
{
4872+
uint32_t interval;
4873+
uint32_t duration;
4874+
4875+
otLinkGetWakeupListenParameters(mInstance, &interval, &duration);
4876+
SuccessOrExit(mEncoder.WriteUint32(interval));
4877+
SuccessOrExit(mEncoder.WriteUint32(duration));
4878+
4879+
exit:
4880+
return OT_ERROR_NONE;
4881+
}
4882+
4883+
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DIRECT_WAKE_LISTEN_PARAMS>(void)
4884+
{
4885+
uint32_t interval;
4886+
uint32_t duration;
4887+
otError error = OT_ERROR_NONE;
4888+
4889+
SuccessOrExit(error = mDecoder.ReadUint32(interval));
4890+
SuccessOrExit(error = mDecoder.ReadUint32(duration));
4891+
error = otLinkSetWakeupListenParameters(mInstance, interval, duration);
4892+
4893+
exit:
4894+
return error;
4895+
}
4896+
#endif // OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_LISTENER_ENABLE
4897+
4898+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
4899+
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DIRECT_WAKE>(void)
4900+
{
4901+
otExtAddress extAddress;
4902+
uint8_t wakeType;
4903+
uint16_t intervalUs;
4904+
uint16_t durationMs;
4905+
uint8_t keyIndex;
4906+
const uint8_t *keyData;
4907+
uint16_t keyLength;
4908+
otError error = OT_ERROR_NONE;
4909+
4910+
SuccessOrExit(error = mDecoder.ReadEui64(extAddress));
4911+
SuccessOrExit(error = mDecoder.ReadUint8(wakeType));
4912+
SuccessOrExit(error = mDecoder.ReadUint16(intervalUs));
4913+
SuccessOrExit(error = mDecoder.ReadUint16(durationMs));
4914+
SuccessOrExit(error = mDecoder.ReadUint8(keyIndex));
4915+
// Consume the inline-key data field for wire compatibility; guest keys must be
4916+
// provisioned via SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY before calling this property.
4917+
SuccessOrExit(error = mDecoder.ReadDataWithLen(keyData, keyLength));
4918+
OT_UNUSED_VARIABLE(keyData);
4919+
OT_UNUSED_VARIABLE(keyLength);
4920+
4921+
error = otThreadDirectWakeup(mInstance, &extAddress, static_cast<otThreadDirectWakeType>(wakeType), intervalUs,
4922+
durationMs, keyIndex);
4923+
4924+
exit:
4925+
return error;
4926+
}
4927+
#endif // OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
4928+
4929+
template <> otError NcpBase::HandlePropertyInsert<SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY>(void)
4930+
{
4931+
uint8_t keyIndex;
4932+
const uint8_t *keyData;
4933+
uint16_t keyLength;
4934+
otThreadDirectWakeKey key;
4935+
otError error = OT_ERROR_NONE;
4936+
4937+
SuccessOrExit(error = mDecoder.ReadUint8(keyIndex));
4938+
SuccessOrExit(error = mDecoder.ReadDataWithLen(keyData, keyLength));
4939+
VerifyOrExit(keyLength == sizeof(key.m8), error = OT_ERROR_PARSE);
4940+
memcpy(key.m8, keyData, sizeof(key.m8));
4941+
error = otThreadDirectSetGuestWakeKey(mInstance, keyIndex, &key);
4942+
4943+
exit:
4944+
return error;
4945+
}
4946+
4947+
template <> otError NcpBase::HandlePropertyRemove<SPINEL_PROP_THREAD_DIRECT_GUEST_WAKE_KEY>(void)
4948+
{
4949+
uint8_t keyIndex;
4950+
otError error = OT_ERROR_NONE;
4951+
4952+
SuccessOrExit(error = mDecoder.ReadUint8(keyIndex));
4953+
error = otThreadDirectRemoveGuestWakeKey(mInstance, keyIndex);
4954+
4955+
exit:
4956+
return error;
4957+
}
4958+
4959+
#if OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
4960+
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DIRECT_WAKE_BURST_ACTIVE>(void)
4961+
{
4962+
return mEncoder.WriteBool(otThreadDirectIsWakeBurstActive(mInstance));
4963+
}
4964+
4965+
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_DIRECT_WAKE_FRAME_COUNTER>(void)
4966+
{
4967+
return mEncoder.WriteUint32(mInstance->Get<Mac::SubMac>().GetWakeFrameCounter());
4968+
}
4969+
4970+
template <> otError NcpBase::HandlePropertySet<SPINEL_PROP_THREAD_DIRECT_WAKE_FRAME_COUNTER>(void)
4971+
{
4972+
uint32_t counter;
4973+
otError error = OT_ERROR_NONE;
4974+
4975+
SuccessOrExit(error = mDecoder.ReadUint32(counter));
4976+
mInstance->Get<Mac::SubMac>().SetWakeFrameCounter(counter, /* aSetIfLarger */ false);
4977+
4978+
exit:
4979+
return error;
4980+
}
4981+
#endif // OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE
4982+
4983+
void NcpBase::HandleThreadDirectEvent(otThreadDirectEvent aEvent,
4984+
const otThreadDirectPeerInfo *aPeerInfo,
4985+
void *aContext)
4986+
{
4987+
static_cast<NcpBase *>(aContext)->HandleThreadDirectEvent(aEvent, aPeerInfo);
4988+
}
4989+
4990+
void NcpBase::HandleThreadDirectEvent(otThreadDirectEvent aEvent, const otThreadDirectPeerInfo *aPeerInfo)
4991+
{
4992+
otExtAddress noAddr;
4993+
otError error = OT_ERROR_NONE;
4994+
4995+
memset(&noAddr, 0, sizeof(noAddr));
4996+
4997+
SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_CMD_PROP_VALUE_IS,
4998+
SPINEL_PROP_THREAD_DIRECT_LINK_EVENT));
4999+
SuccessOrExit(error = mEncoder.WriteUint8(static_cast<uint8_t>(aEvent)));
5000+
SuccessOrExit(error = mEncoder.WriteEui64(aPeerInfo != nullptr ? aPeerInfo->mExtAddress : noAddr));
5001+
SuccessOrExit(error = mEncoder.WriteBool(aEvent != OT_THREAD_DIRECT_EVENT_LINK_FAILED));
5002+
SuccessOrExit(error = mEncoder.EndFrame());
5003+
5004+
exit:
5005+
return;
5006+
}
5007+
#endif // OPENTHREAD_CONFIG_THREAD_DIRECT_WAKE_INITIATOR_ENABLE || ...WAKE_LISTENER_ENABLE
48505008

48515009
} // namespace Ncp
48525010
} // namespace ot

0 commit comments

Comments
 (0)