From 582b4b396df6f4b5cf96ad5faef5b4d2d1f7a018 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Wed, 17 Aug 2016 14:33:43 -0700 Subject: [PATCH] ncp: Added support for `PROP_THREAD_NETWORK_ID_TIMEOUT` (#408) * ncp: Added support for `PROP_THREAD_NETWORK_ID_TIMEOUT` * ncp-spinel: Update PROTOCOL.md for PROP_THREAD_NETWORK_ID_TIMEOUT. --- src/ncp/PROTOCOL.md | 9 ++++++++- src/ncp/ncp_base.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/ncp/ncp_base.hpp | 2 ++ src/ncp/spinel.h | 7 +++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/ncp/PROTOCOL.md b/src/ncp/PROTOCOL.md index e4bf0f804..dcb87f16e 100644 --- a/src/ncp/PROTOCOL.md +++ b/src/ncp/PROTOCOL.md @@ -1,7 +1,7 @@ Spinel Host Controller Interface ================================ -Updated: 2016-08-10 +Updated: 2016-08-17 Written by: Robert Quattlebaum @@ -1609,6 +1609,13 @@ Used when operating in the Child role. * Type: Read-Write * Packed-Encoding: `L` +#### D.4.20. PROP 5380: `PROP_THREAD_NETWORK_ID_TIMEOUT` +* Type: Read-Write +* Packed-Encoding: `C` + +Allows you to get or set the Thread `NETWORK_ID_TIMEOUT` constant, as +defined by the Thread specification. + ### D.5. IPv6 Properties #### D.5.1. PROP 96: `PROP_IPV6_LL_ADDR` diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 37c5feb49..963c82a5e 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -131,6 +131,7 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] = { SPINEL_PROP_THREAD_RLOC16, &NcpBase::GetPropertyHandler_THREAD_RLOC16 }, { SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD }, { SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY }, + { SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT, &NcpBase::GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT }, { SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::GetPropertyHandler_IPV6_ML_PREFIX }, { SPINEL_PROP_IPV6_ML_ADDR, &NcpBase::GetPropertyHandler_IPV6_ML_ADDR }, @@ -192,6 +193,7 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] = { SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT, &NcpBase::SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT }, { SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::SetPropertyHandler_THREAD_ASSISTING_PORTS }, { SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, &NcpBase::SetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE}, + { SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT, &NcpBase::SetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT }, { SPINEL_PROP_STREAM_NET_INSECURE, &NcpBase::SetPropertyHandler_STREAM_NET_INSECURE }, { SPINEL_PROP_STREAM_NET, &NcpBase::SetPropertyHandler_STREAM_NET }, @@ -2029,6 +2031,17 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t heade ); } +ThreadError NcpBase::GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header, spinel_prop_key_t key) +{ + return SendPropertyUpdate( + header, + SPINEL_CMD_PROP_VALUE_IS, + key, + SPINEL_DATATYPE_UINT8_S, + otGetNetworkIdTimeout() + ); +} + // ---------------------------------------------------------------------------- // MARK: Individual Property Setters @@ -3187,6 +3200,33 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t heade return errorCode; } +ThreadError NcpBase::SetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) +{ + uint8_t i = 0; + spinel_ssize_t parsedLength; + ThreadError errorCode = kThreadError_None; + + parsedLength = spinel_datatype_unpack( + value_ptr, + value_len, + SPINEL_DATATYPE_UINT8_S, + &i + ); + + if (parsedLength > 0) + { + otSetNetworkIdTimeout(i); + + errorCode = HandleCommandPropertyGet(header, key); + } + else + { + errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR); + } + + return errorCode; +} + // ---------------------------------------------------------------------------- // MARK: Individual Property Inserters diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index d42866393..9671c1f09 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -299,6 +299,7 @@ private: ThreadError GetPropertyHandler_THREAD_RLOC16(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header, spinel_prop_key_t key); ThreadError SetPropertyHandler_POWER_STATE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); @@ -347,6 +348,7 @@ private: ThreadError SetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); + ThreadError SetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key, diff --git a/src/ncp/spinel.h b/src/ncp/spinel.h index 1d8d30aad..fb8f5a9a5 100644 --- a/src/ncp/spinel.h +++ b/src/ncp/spinel.h @@ -402,6 +402,13 @@ typedef enum */ SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY = SPINEL_PROP_THREAD_EXT__BEGIN + 3, + + /// Thread Network ID Timeout + /** Format: `C` + */ + SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT + = SPINEL_PROP_THREAD_EXT__BEGIN + 4, + SPINEL_PROP_THREAD_EXT__END = 0x1600, SPINEL_PROP_IPV6__BEGIN = 0x60,