From 31b317d133c3ead7778725ee42f1f5ce0e30eee0 Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Wed, 15 Jun 2016 15:45:16 -0700 Subject: [PATCH] ncp: Updates to use the new state changed flag mechanism. (#155) This change makes use of the general-purpose state changed flags to induce the NCP to push out updates for various properties. --- src/ncp/ncp_base.cpp | 82 +++++++++++++++++++++++++++++++++++++------- src/ncp/ncp_base.hpp | 10 +++--- 2 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 8b3a2d826..54ad0e71b 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -224,12 +224,13 @@ static spinel_status_t ThreadErrorToSpinelStatus(ThreadError error) // ---------------------------------------------------------------------------- NcpBase::NcpBase(): - mUpdateAddressesTask(&RunUpdateAddressesTask, this) + mUpdateChangedPropsTask(&UpdateChangedProps, this) { mSupportedChannelMask = (0xFFFF << 11); // Default to 2.4GHz 802.15.4 channels. mChannelMask = mSupportedChannelMask; mScanPeriod = 200; // ms sNcpContext = this; + mChangedFlags = 0; assert(sThreadNetif != NULL); otSetStateChangedCallback(&HandleNetifStateChanged, this); @@ -368,25 +369,73 @@ exit: void NcpBase::HandleNetifStateChanged(uint32_t flags, void *context) { NcpBase *obj = reinterpret_cast(context); - if ((flags & (OT_IP6_ADDRESS_ADDED | OT_IP6_ADDRESS_REMOVED)) != 0) - { - obj->mUpdateAddressesTask.Post(); + + obj->mChangedFlags |= flags; + + if (!obj->mSending) { + obj->mUpdateChangedPropsTask.Post(); } } -void NcpBase::RunUpdateAddressesTask(void *context) +void NcpBase::UpdateChangedProps(void *context) { NcpBase *obj = reinterpret_cast(context); - obj->RunUpdateAddressesTask(); + obj->UpdateChangedProps(); } -void NcpBase::RunUpdateAddressesTask() +void NcpBase::UpdateChangedProps() { - // It would really be preferable to have inserted/removed notifications - // for the individual addresses, rather than a single "changed" event. - HandleCommandPropertyGet(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_PROP_IPV6_ADDRESS_TABLE); - - HandleCommandPropertyGet(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, SPINEL_PROP_NET_STATE); + if (!mSending) { + if ((mChangedFlags & OT_NET_STATE) != 0) + { + mChangedFlags &= ~OT_NET_STATE; + HandleCommandPropertyGet( + SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, + SPINEL_PROP_NET_STATE + ); + } + else if ((mChangedFlags & OT_NET_ROLE) != 0) + { + mChangedFlags &= ~OT_NET_ROLE; + HandleCommandPropertyGet( + SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, + SPINEL_PROP_NET_ROLE + ); + } + else if ((mChangedFlags & OT_NET_PARTITION_ID) != 0) + { + mChangedFlags &= ~OT_NET_PARTITION_ID; + HandleCommandPropertyGet( + SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, + SPINEL_PROP_NET_PARTITION_ID + ); + } + else if ((mChangedFlags & OT_NET_KEY_SEQUENCE) != 0) + { + mChangedFlags &= ~OT_NET_KEY_SEQUENCE; + HandleCommandPropertyGet( + SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, + SPINEL_PROP_NET_KEY_SEQUENCE + ); + } + else if ((mChangedFlags & (OT_IP6_ADDRESS_ADDED | OT_IP6_ADDRESS_REMOVED)) != 0) + { + mChangedFlags &= ~(OT_IP6_ADDRESS_ADDED | OT_IP6_ADDRESS_REMOVED); + HandleCommandPropertyGet( + SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, + SPINEL_PROP_IPV6_ADDRESS_TABLE + ); + } + else if ((mChangedFlags & (OT_THREAD_CHILD_ADDED | OT_THREAD_CHILD_REMOVED)) != 0) + { + mChangedFlags &= ~(OT_THREAD_CHILD_ADDED | OT_THREAD_CHILD_REMOVED); + // TODO: Uncomment this once we add support for this property. + //HandleCommandPropertyGet( + // SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, + // SPINEL_PROP_THREAD_CHILD_TABLE + //); + } + } } // ---------------------------------------------------------------------------- @@ -427,6 +476,10 @@ void NcpBase::HandleSendDone() HandleCommandPropertyGet(mQueuedGetHeader, mQueuedGetKey); mQueuedGetHeader = 0; } + + if (!mSending) { + UpdateChangedProps(); + } } @@ -900,11 +953,16 @@ void NcpBase::GetPropertyHandler_CAPS(uint8_t header, spinel_prop_key_t key) } // Begin adding capabilities ////////////////////////////////////////////// + OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_NET_THREAD_1_0); + + // TODO: Somehow get the following capability from the radio. OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_802_15_4_2450MHZ_OQPSK); + #if OPENTHREAD_CONFIG_MAX_CHILDREN > 0 OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_ROLE_ROUTER); #endif + // End adding capabilities ///////////////////////////////////////////////// if (errorCode == kThreadError_None) diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index cdb575cff..5ac84c59b 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -88,11 +88,11 @@ private: void HandleActiveScanResult(otActiveScanResult *result); /** - * Trampoline for RunUpdateAddressesTask(). + * Trampoline for UpdateChangedProps(). */ - static void RunUpdateAddressesTask(void *context); + static void UpdateChangedProps(void *context); - void RunUpdateAddressesTask(void); + void UpdateChangedProps(void); static void HandleNetifStateChanged(uint32_t flags, void *context); @@ -290,10 +290,12 @@ private: spinel_prop_key_t mQueuedGetKey; - Tasklet mUpdateAddressesTask; + Tasklet mUpdateChangedPropsTask; MessageQueue mSendQueue; + uint32_t mChangedFlags; + protected: /** * Set to true when there is a send in progress. Set and cleared