From afb4118d9af821e8a5988659bea30f4605dc235d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Kuro=C5=9B?= <50902978+ankuns@users.noreply.github.com> Date: Fri, 5 Feb 2021 03:55:08 +0100 Subject: [PATCH] [spinel] add CSL-related properties (#6135) This commit adds spinel properties for NCP built with OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE. Such NCP will have also a new capability SPINEL_CAP_THREAD_CSL_RECEIVER. --- src/lib/spinel/spinel.c | 16 ++++++++++ src/lib/spinel/spinel.h | 27 ++++++++++++++++ src/ncp/ncp_base.cpp | 4 +++ src/ncp/ncp_base_dispatcher.cpp | 12 +++++++ src/ncp/ncp_base_mtd.cpp | 56 +++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+) diff --git a/src/lib/spinel/spinel.c b/src/lib/spinel/spinel.c index 9e7d8a099..56276e5a5 100644 --- a/src/lib/spinel/spinel.c +++ b/src/lib/spinel/spinel.c @@ -1823,6 +1823,18 @@ const char *spinel_prop_key_to_cstr(spinel_prop_key_t prop_key) ret = "THREAD_NEW_DATASET"; break; + case SPINEL_PROP_THREAD_CSL_PERIOD: + ret = "SPINEL_PROP_THREAD_CSL_PERIOD"; + break; + + case SPINEL_PROP_THREAD_CSL_TIMEOUT: + ret = "SPINEL_PROP_THREAD_CSL_TIMEOUT"; + break; + + case SPINEL_PROP_THREAD_CSL_CHANNEL: + ret = "SPINEL_PROP_THREAD_CSL_CHANNEL"; + break; + case SPINEL_PROP_MESHCOP_JOINER_STATE: ret = "MESHCOP_JOINER_STATE"; break; @@ -2767,6 +2779,10 @@ const char *spinel_capability_to_cstr(spinel_capability_t capability) ret = "THREAD_SERVICE"; break; + case SPINEL_CAP_THREAD_CSL_RECEIVER: + ret = "THREAD_CSL_RECEIVER"; + break; + case SPINEL_CAP_NEST_LEGACY_INTERFACE: ret = "NEST_LEGACY_INTERFACE"; break; diff --git a/src/lib/spinel/spinel.h b/src/lib/spinel/spinel.h index bf2a1f8bf..cdd8769ee 100644 --- a/src/lib/spinel/spinel.h +++ b/src/lib/spinel/spinel.h @@ -1189,6 +1189,7 @@ enum SPINEL_CAP_THREAD_JOINER = (SPINEL_CAP_THREAD__BEGIN + 3), SPINEL_CAP_THREAD_BORDER_ROUTER = (SPINEL_CAP_THREAD__BEGIN + 4), SPINEL_CAP_THREAD_SERVICE = (SPINEL_CAP_THREAD__BEGIN + 5), + SPINEL_CAP_THREAD_CSL_RECEIVER = (SPINEL_CAP_THREAD__BEGIN + 6), SPINEL_CAP_THREAD__END = 1152, SPINEL_CAP_NEST__BEGIN = 15296, @@ -2897,6 +2898,32 @@ enum */ SPINEL_PROP_THREAD_NEW_DATASET = SPINEL_PROP_THREAD_EXT__BEGIN + 40, + /// MAC CSL Period + /** Format: `S` + * Required capability: `SPINEL_CAP_THREAD_CSL_RECEIVER` + * + * The CSL period in units of 10 symbols. Value of 0 indicates that CSL should be disabled. + */ + SPINEL_PROP_THREAD_CSL_PERIOD = SPINEL_PROP_THREAD_EXT__BEGIN + 41, + + /// MAC CSL Timeout + /** Format: `L` + * Required capability: `SPINEL_CAP_THREAD_CSL_RECEIVER` + * + * The CSL timeout in seconds. + */ + SPINEL_PROP_THREAD_CSL_TIMEOUT = SPINEL_PROP_THREAD_EXT__BEGIN + 42, + + /// MAC CSL Channel + /** Format: `C` + * Required capability: `SPINEL_CAP_THREAD_CSL_RECEIVER` + * + * The CSL channel as described in chapter 4.6.5.1.2 of the Thread v1.2.0 Specification. + * Value of 0 means that CSL reception (if enabled) occurs on the Thread Network channel. + * Value from range [11,26] is an alternative channel on which a CSL reception occurs. + */ + SPINEL_PROP_THREAD_CSL_CHANNEL = SPINEL_PROP_THREAD_EXT__BEGIN + 43, + SPINEL_PROP_THREAD_EXT__END = 0x1600, SPINEL_PROP_IPV6__BEGIN = 0x60, diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index a55c5680d..784e8f263 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -1912,6 +1912,10 @@ template <> otError NcpBase::HandlePropertyGet(void) SuccessOrExit(error = mEncoder.WriteUintPacked(SPINEL_CAP_THREAD_SERVICE)); #endif +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + SuccessOrExit(error = mEncoder.WriteUintPacked(SPINEL_CAP_THREAD_CSL_RECEIVER)); +#endif + #if OPENTHREAD_CONFIG_MULTI_RADIO SuccessOrExit(error = mEncoder.WriteUintPacked(SPINEL_CAP_MULTI_RADIO)); #endif diff --git a/src/ncp/ncp_base_dispatcher.cpp b/src/ncp/ncp_base_dispatcher.cpp index 7c11ec749..831f1bd57 100644 --- a/src/ncp/ncp_base_dispatcher.cpp +++ b/src/ncp/ncp_base_dispatcher.cpp @@ -300,6 +300,13 @@ NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey) #if OPENTHREAD_FTD OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE), OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_NEW_DATASET), +#endif +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_CSL_PERIOD), + OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_CSL_TIMEOUT), + OT_NCP_GET_HANDLER_ENTRY(SPINEL_PROP_THREAD_CSL_CHANNEL), +#endif +#if OPENTHREAD_FTD #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), @@ -522,6 +529,11 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey) #endif OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_MGMT_GET_ACTIVE_DATASET), OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_MGMT_GET_PENDING_DATASET), +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_CSL_PERIOD), + OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_CSL_TIMEOUT), + OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_THREAD_CSL_CHANNEL), +#endif #if OPENTHREAD_FTD #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN), diff --git a/src/ncp/ncp_base_mtd.cpp b/src/ncp/ncp_base_mtd.cpp index 45829ec44..459caa387 100644 --- a/src/ncp/ncp_base_mtd.cpp +++ b/src/ncp/ncp_base_mtd.cpp @@ -186,6 +186,62 @@ exit: return error; } +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE +template <> otError NcpBase::HandlePropertySet(void) +{ + uint16_t cslPeriod; + otError error = OT_ERROR_NONE; + + SuccessOrExit(error = mDecoder.ReadUint16(cslPeriod)); + + error = otLinkCslSetPeriod(mInstance, cslPeriod); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyGet(void) +{ + return mEncoder.WriteUint16(otLinkCslGetPeriod(mInstance)); +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + uint32_t cslTimeout; + otError error = OT_ERROR_NONE; + + SuccessOrExit(error = mDecoder.ReadUint32(cslTimeout)); + + error = otLinkCslSetTimeout(mInstance, cslTimeout); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyGet(void) +{ + return mEncoder.WriteUint32(otLinkCslGetTimeout(mInstance)); +} + +template <> otError NcpBase::HandlePropertySet(void) +{ + uint8_t cslChannel; + otError error = OT_ERROR_NONE; + + SuccessOrExit(error = mDecoder.ReadUint8(cslChannel)); + + error = otLinkCslSetChannel(mInstance, cslChannel); + +exit: + return error; +} + +template <> otError NcpBase::HandlePropertyGet(void) +{ + return mEncoder.WriteUint8(otLinkCslGetChannel(mInstance)); +} +#endif // OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + template <> otError NcpBase::HandlePropertyGet(void) { return mEncoder.WriteUint32(otLinkGetPollPeriod(mInstance));