diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index a0ab110cf..20693f16d 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -2094,6 +2094,27 @@ template <> otError NcpBase::HandlePropertyGet(v return mEncoder.WriteInt8(otPlatRadioGetReceiveSensitivity(mInstance)); } +template <> otError NcpBase::HandlePropertyGet(void) +{ + uint32_t freq_khz(0); + const uint8_t chan(otLinkGetChannel(mInstance)); + + if (chan == 0) + { + freq_khz = 868300; + } + else if (chan < 11) + { + freq_khz = 906000 - (2000 * 1) + 2000 * (chan); + } + else if (chan < 26) + { + freq_khz = 2405000 - (5000 * 11) + 5000 * (chan); + } + + return mEncoder.WriteUint32(freq_khz); +} + template <> otError NcpBase::HandlePropertyGet(void) { int8_t threshold; diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index 7a0b810c9..b2fe2f95a 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -202,14 +202,27 @@ protected: uint32_t mPropKeyOrStatus : 24; ///< 3 bytes for either property key or spinel status. }; + struct HandlerEntry + { + spinel_prop_key_t mKey; + NcpBase::PropertyHandler mHandler; + }; + NcpFrameBuffer::FrameTag GetLastOutboundFrameTag(void); otError HandleCommand(uint8_t aHeader); - PropertyHandler FindGetPropertyHandler(spinel_prop_key_t aKey); - PropertyHandler FindSetPropertyHandler(spinel_prop_key_t aKey); - PropertyHandler FindInsertPropertyHandler(spinel_prop_key_t aKey); - PropertyHandler FindRemovePropertyHandler(spinel_prop_key_t aKey); +#if __cplusplus >= 201103L + static constexpr bool IsHandlerEntriesSorted(const HandlerEntry *aHandlerEntries, size_t aSize); +#endif + + static PropertyHandler FindPropertyHandler(const HandlerEntry *aHandlerEntries, + size_t aSize, + spinel_prop_key_t aKey); + static PropertyHandler FindGetPropertyHandler(spinel_prop_key_t aKey); + static PropertyHandler FindSetPropertyHandler(spinel_prop_key_t aKey); + static PropertyHandler FindInsertPropertyHandler(spinel_prop_key_t aKey); + static PropertyHandler FindRemovePropertyHandler(spinel_prop_key_t aKey); bool HandlePropertySetForSpecialProperties(uint8_t aHeader, spinel_prop_key_t aKey, otError &aError); otError HandleCommandPropertySet(uint8_t aHeader, spinel_prop_key_t aKey); diff --git a/src/ncp/ncp_base_dispatcher.cpp b/src/ncp/ncp_base_dispatcher.cpp index 4ba3e324e..c3a33222d 100644 --- a/src/ncp/ncp_base_dispatcher.cpp +++ b/src/ncp/ncp_base_dispatcher.cpp @@ -35,1030 +35,543 @@ namespace ot { namespace Ncp { -NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey) +#if __cplusplus >= 201103L +constexpr bool NcpBase::IsHandlerEntriesSorted(const HandlerEntry *aHandlerEntries, size_t aSize) { - NcpBase::PropertyHandler handler; + bool rval = true; - switch (aKey) + for (size_t i = 1; i < aSize; ++i) { - // -------------------------------------------------------------------------- - // Common Properties (Get Handler) - - case SPINEL_PROP_CAPS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_DEBUG_TEST_ASSERT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_DEBUG_TEST_WATCHDOG: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_DEBUG_NCP_LOG_LEVEL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_HWADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_HOST_POWER_STATE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_INTERFACE_COUNT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_INTERFACE_TYPE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_LAST_STATUS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_LOCK: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_CHAN: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_RSSI: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_RX_SENSITIVITY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_CCA_THRESHOLD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_TX_POWER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_POWER_STATE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MCU_POWER_STATE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PROTOCOL_VERSION: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_15_4_PANID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_15_4_LADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_15_4_SADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_RAW_STREAM_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_PROMISCUOUS_MODE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_SCAN_STATE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_SCAN_MASK: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_SCAN_PERIOD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NCP_VERSION: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_UNSOL_UPDATE_FILTER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_UNSOL_UPDATE_LIST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_VENDOR_ID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_CHAN_SUPPORTED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_CHAN_PREFERRED: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE - case SPINEL_PROP_RADIO_COEX_METRICS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_RADIO_COEX_ENABLE: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - - // -------------------------------------------------------------------------- - // MTD (or FTD) Properties (Get Handler) - -#if OPENTHREAD_MTD || OPENTHREAD_FTD - case SPINEL_PROP_PHY_PCAP_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_DATA_POLL_PERIOD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_EXTENDED_ADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_CCA_FAILURE_RATE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_MAX_RETRY_NUMBER_DIRECT: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE - case SPINEL_PROP_MAC_BLACKLIST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_BLACKLIST_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_FIXED_RSS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_WHITELIST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_WHITELIST_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - case SPINEL_PROP_MSG_BUFFER_COUNTERS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_PHY_FREQ: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_IF_UP: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_KEY_SEQUENCE_COUNTER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_KEY_SWITCH_GUARDTIME: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_MASTER_KEY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_NETWORK_NAME: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_PARTITION_ID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_ROLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_SAVED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_STACK_UP: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_XPANID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ASSISTING_PORTS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_CHILD_TIMEOUT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_DISCOVERY_SCAN_JOINER_FLAG: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_DISCOVERY_SCAN_ENABLE_FILTERING: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_DISCOVERY_SCAN_PANID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_LEADER_ADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_LEADER_NETWORK_DATA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_LEADER_RID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_MODE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_NEIGHBOR_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_ENABLE_TX_ERROR_RATE_TRACKING - case SPINEL_PROP_THREAD_NEIGHBOR_TABLE_ERROR_RATES: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - case SPINEL_PROP_THREAD_NETWORK_DATA_VERSION: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_OFF_MESH_ROUTES: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ON_MESH_NETS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_PARENT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_RLOC16: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_STABLE_LEADER_NETWORK_DATA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_STABLE_NETWORK_DATA_VERSION: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE - case SPINEL_PROP_THREAD_NETWORK_DATA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_STABLE_NETWORK_DATA: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - case SPINEL_PROP_THREAD_ACTIVE_DATASET: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_PENDING_DATASET: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_ADDRESS_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD_MODE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_LL_ADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_ML_PREFIX: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_ML_ADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_MULTICAST_ADDRESS_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_IPV6_ROUTE_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_JAM_DETECTION_ENABLE - case SPINEL_PROP_JAM_DETECT_ENABLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_JAM_DETECTED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_JAM_DETECT_RSSI_THRESHOLD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_JAM_DETECT_WINDOW: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_JAM_DETECT_BUSY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_JAM_DETECT_HISTORY_BITMAP: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE - case SPINEL_PROP_CHANNEL_MONITOR_SAMPLE_INTERVAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MONITOR_RSSI_THRESHOLD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MONITOR_SAMPLE_WINDOW: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MONITOR_SAMPLE_COUNT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MONITOR_CHANNEL_OCCUPANCY: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_LEGACY_ENABLE - case SPINEL_PROP_NEST_LEGACY_ULA_PREFIX: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NEST_LEGACY_LAST_NODE_JOINED: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - // MAC counters - case SPINEL_PROP_CNTR_TX_PKT_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_ACK_REQ: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_ACKED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_NO_ACK_REQ: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_DATA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_DATA_POLL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_BEACON: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_BEACON_REQ: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_OTHER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_RETRY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_UNICAST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_PKT_BROADCAST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_ERR_CCA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_ERR_ABORT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_DATA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_DATA_POLL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_BEACON: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_BEACON_REQ: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_OTHER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_FILT_WL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_FILT_DA: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_UNICAST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_BROADCAST: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_ERR_EMPTY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_ERR_UKWN_NBR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_ERR_NVLD_SADDR: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_ERR_SECURITY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_ERR_BAD_FCS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_ERR_OTHER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_PKT_DUP: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_ALL_MAC_COUNTERS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_MLE_COUNTERS: - handler = &NcpBase::HandlePropertyGet; - break; - // NCP counters - case SPINEL_PROP_CNTR_TX_IP_SEC_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_IP_INSEC_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_IP_DROPPED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_IP_SEC_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_IP_INSEC_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_IP_DROPPED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_TX_SPINEL_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_SPINEL_TOTAL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_RX_SPINEL_ERR: - handler = &NcpBase::HandlePropertyGet; - break; - // IP counters - case SPINEL_PROP_CNTR_IP_TX_SUCCESS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_IP_RX_SUCCESS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_IP_TX_FAILURE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_IP_RX_FAILURE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CNTR_ALL_IP_COUNTERS: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE - case SPINEL_PROP_THREAD_NETWORK_TIME: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE - case SPINEL_PROP_CHILD_SUPERVISION_CHECK_TIMEOUT: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_PLATFORM_POSIX_APP - case SPINEL_PROP_RCP_VERSION: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE - case SPINEL_PROP_SLAAC_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE - case SPINEL_PROP_SERVER_ALLOW_LOCAL_DATA_CHANGE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_SERVER_SERVICES: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - case SPINEL_PROP_SERVER_LEADER_SERVICES: - handler = &NcpBase::HandlePropertyGet; - break; -#endif // OPENTHREAD_MTD || OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // FTD Only Properties (Get Handler) - -#if OPENTHREAD_FTD - case SPINEL_PROP_MAC_MAX_RETRY_NUMBER_INDIRECT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_NET_PSKC: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_LEADER_WEIGHT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_CHILD_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_CHILD_TABLE_ADDRESSES: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ROUTER_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_CHILD_COUNT_MAX: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_NEW_DATASET: - handler = &NcpBase::HandlePropertyGet; - break; -#if OPENTHREAD_CONFIG_JOINER_ENABLE - case SPINEL_PROP_MESHCOP_JOINER_STATE: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE - case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_THREAD_COMMISSIONER_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE - case SPINEL_PROP_THREAD_STEERING_DATA: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE - case SPINEL_PROP_CHILD_SUPERVISION_INTERVAL: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE - case SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_DELAY: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_SUPPORTED_CHANNELS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_FAVORED_CHANNELS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_CHANNEL_SELECT: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_INTERVAL: - handler = &NcpBase::HandlePropertyGet; - break; -#endif -#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE - case SPINEL_PROP_TIME_SYNC_PERIOD: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_TIME_SYNC_XTAL_THRESHOLD: - handler = &NcpBase::HandlePropertyGet; - break; -#endif // OPENTHREAD_CONFIG_TIME_SYNC_ENABLE -#endif // OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // Raw Link or Radio Mode Properties (Get Handler) - -#if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE - case SPINEL_PROP_RADIO_CAPS: - handler = &NcpBase::HandlePropertyGet; - break; - case SPINEL_PROP_MAC_SRC_MATCH_ENABLED: - handler = &NcpBase::HandlePropertyGet; - break; -#endif - - default: - handler = NULL; + if (aHandlerEntries[i].mKey <= aHandlerEntries[i - 1].mKey) + { + rval = false; + } } - return handler; + return rval; +} +#endif + +NcpBase::PropertyHandler NcpBase::FindGetPropertyHandler(spinel_prop_key_t aKey) +{ +#if __cplusplus >= 201103L + constexpr +#else + const +#endif + static HandlerEntry sHandlerEntries[] = + { {SPINEL_PROP_LAST_STATUS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PROTOCOL_VERSION, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NCP_VERSION, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_INTERFACE_TYPE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_VENDOR_ID, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CAPS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_INTERFACE_COUNT, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_POWER_STATE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_HWADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_LOCK, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_HOST_POWER_STATE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MCU_POWER_STATE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_ENABLED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_CHAN, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_CHAN_SUPPORTED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_FREQ, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_CCA_THRESHOLD, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_TX_POWER, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_RSSI, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_PHY_RX_SENSITIVITY, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_PHY_PCAP_ENABLED, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_PHY_CHAN_PREFERRED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_SCAN_STATE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_SCAN_MASK, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_SCAN_PERIOD, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_15_4_LADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_15_4_SADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_15_4_PANID, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_RAW_STREAM_ENABLED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_PROMISCUOUS_MODE, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_MAC_DATA_POLL_PERIOD, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_SAVED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_IF_UP, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_STACK_UP, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_ROLE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_NETWORK_NAME, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_XPANID, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_MASTER_KEY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_KEY_SEQUENCE_COUNTER, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_PARTITION_ID, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NET_KEY_SWITCH_GUARDTIME, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_NET_PSKC, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_LEADER_ADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_PARENT, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_CHILD_TABLE, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_LEADER_RID, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_LEADER_WEIGHT, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE + {SPINEL_PROP_THREAD_NETWORK_DATA, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_NETWORK_DATA_VERSION, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE + {SPINEL_PROP_THREAD_STABLE_NETWORK_DATA, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_STABLE_NETWORK_DATA_VERSION, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_OFF_MESH_ROUTES, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_MODE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_LL_ADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_ML_ADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_ADDRESS_TABLE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_ROUTE_TABLE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_MULTICAST_ADDRESS_TABLE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD_MODE, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_JOINER_ENABLE + {SPINEL_PROP_MESHCOP_JOINER_STATE, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_MESHCOP_COMMISSIONER_STATE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_SESSION_ID, + &NcpBase::HandlePropertyGet}, +#endif +#endif // OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE + {SPINEL_PROP_SERVER_ALLOW_LOCAL_DATA_CHANGE, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_SERVER_SERVICES, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_SERVER_LEADER_SERVICES, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_ACK_REQ, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_ACKED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_NO_ACK_REQ, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_DATA, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_DATA_POLL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_BEACON, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_BEACON_REQ, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_OTHER, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_RETRY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_ERR_CCA, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_UNICAST, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_PKT_BROADCAST, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_ERR_ABORT, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_DATA, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_DATA_POLL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_BEACON, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_BEACON_REQ, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_OTHER, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_FILT_WL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_FILT_DA, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_ERR_EMPTY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_ERR_UKWN_NBR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_ERR_NVLD_SADDR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_ERR_SECURITY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_ERR_BAD_FCS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_ERR_OTHER, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_DUP, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_UNICAST, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_PKT_BROADCAST, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_IP_SEC_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_IP_INSEC_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_IP_DROPPED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_IP_SEC_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_IP_INSEC_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_IP_DROPPED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_TX_SPINEL_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_SPINEL_TOTAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_RX_SPINEL_ERR, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_IP_TX_SUCCESS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_IP_RX_SUCCESS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_IP_TX_FAILURE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_IP_RX_FAILURE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MSG_BUFFER_COUNTERS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_ALL_MAC_COUNTERS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_MLE_COUNTERS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CNTR_ALL_IP_COUNTERS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_UNSOL_UPDATE_FILTER, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_UNSOL_UPDATE_LIST, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_CONFIG_JAM_DETECTION_ENABLE + {SPINEL_PROP_JAM_DETECT_ENABLE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_JAM_DETECTED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_JAM_DETECT_RSSI_THRESHOLD, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_JAM_DETECT_WINDOW, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_JAM_DETECT_BUSY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_JAM_DETECT_HISTORY_BITMAP, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE + {SPINEL_PROP_CHANNEL_MONITOR_SAMPLE_INTERVAL, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MONITOR_RSSI_THRESHOLD, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MONITOR_SAMPLE_WINDOW, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MONITOR_SAMPLE_COUNT, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MONITOR_CHANNEL_OCCUPANCY, + &NcpBase::HandlePropertyGet}, +#endif +#endif // OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE + {SPINEL_PROP_RADIO_CAPS, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE + {SPINEL_PROP_RADIO_COEX_METRICS, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_RADIO_COEX_ENABLE, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_WHITELIST, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_EXTENDED_ADDR, &NcpBase::HandlePropertyGet}, +#endif +#endif // OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE + {SPINEL_PROP_MAC_SRC_MATCH_ENABLED, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_BLACKLIST, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_BLACKLIST_ENABLED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_FIXED_RSS, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_MAC_CCA_FAILURE_RATE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_MAC_MAX_RETRY_NUMBER_DIRECT, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_MAC_MAX_RETRY_NUMBER_INDIRECT, + &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_RLOC16, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_NEIGHBOR_TABLE, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_CHILD_COUNT_MAX, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_LEADER_NETWORK_DATA, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_STABLE_LEADER_NETWORK_DATA, + &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_THREAD_COMMISSIONER_ENABLED, &NcpBase::HandlePropertyGet}, +#endif +#endif + {SPINEL_PROP_THREAD_DISCOVERY_SCAN_JOINER_FLAG, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_DISCOVERY_SCAN_ENABLE_FILTERING, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_DISCOVERY_SCAN_PANID, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE + {SPINEL_PROP_THREAD_STEERING_DATA, &NcpBase::HandlePropertyGet}, +#endif + {SPINEL_PROP_THREAD_ROUTER_TABLE, &NcpBase::HandlePropertyGet}, +#endif // OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ACTIVE_DATASET, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_PENDING_DATASET, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_CHILD_TABLE_ADDRESSES, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_ENABLE_TX_ERROR_RATE_TRACKING + {SPINEL_PROP_THREAD_NEIGHBOR_TABLE_ERROR_RATES, + &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_THREAD_NEW_DATASET, &NcpBase::HandlePropertyGet}, +#if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE + {SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MANAGER_DELAY, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MANAGER_SUPPORTED_CHANNELS, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MANAGER_FAVORED_CHANNELS, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MANAGER_CHANNEL_SELECT, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_ENABLED, + &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_INTERVAL, + &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE + {SPINEL_PROP_THREAD_NETWORK_TIME, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_TIME_SYNC_PERIOD, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_TIME_SYNC_XTAL_THRESHOLD, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE + {SPINEL_PROP_CHILD_SUPERVISION_INTERVAL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_CHILD_SUPERVISION_CHECK_TIMEOUT, + &NcpBase::HandlePropertyGet}, +#endif +#endif // OPENTHREAD_FTD +#if OPENTHREAD_PLATFORM_POSIX_APP + {SPINEL_PROP_RCP_VERSION, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE + {SPINEL_PROP_SLAAC_ENABLED, &NcpBase::HandlePropertyGet}, +#endif +#if OPENTHREAD_CONFIG_LEGACY_ENABLE + {SPINEL_PROP_NEST_LEGACY_ULA_PREFIX, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_NEST_LEGACY_LAST_NODE_JOINED, &NcpBase::HandlePropertyGet}, +#endif +#endif // OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_DEBUG_TEST_ASSERT, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_DEBUG_NCP_LOG_LEVEL, &NcpBase::HandlePropertyGet}, + {SPINEL_PROP_DEBUG_TEST_WATCHDOG, &NcpBase::HandlePropertyGet}, + }; + +#if __cplusplus >= 201103L + static_assert(IsHandlerEntriesSorted(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries))); +#endif + + return FindPropertyHandler(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries), aKey); } NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey) { - NcpBase::PropertyHandler handler; - - switch (aKey) - { - // -------------------------------------------------------------------------- - // Common Properties (Set Handler) - - case SPINEL_PROP_POWER_STATE: - handler = &NcpBase::HandlePropertySet; - break; +#if __cplusplus >= 201103L + constexpr +#else + const +#endif + static HandlerEntry sHandlerEntries[] = + { {SPINEL_PROP_POWER_STATE, &NcpBase::HandlePropertySet}, #if OPENTHREAD_CONFIG_NCP_ENABLE_MCU_POWER_STATE_CONTROL - case SPINEL_PROP_MCU_POWER_STATE: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_MCU_POWER_STATE, &NcpBase::HandlePropertySet}, #endif - case SPINEL_PROP_UNSOL_UPDATE_FILTER: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_PHY_CCA_THRESHOLD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_PHY_TX_POWER: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_PHY_CHAN: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_PROMISCUOUS_MODE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_15_4_PANID: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_15_4_LADDR: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_RAW_STREAM_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_SCAN_MASK: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_SCAN_STATE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_SCAN_PERIOD: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE - case SPINEL_PROP_RADIO_COEX_ENABLE: - handler = &NcpBase::HandlePropertySet; - break; +#if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE + {SPINEL_PROP_PHY_ENABLED, &NcpBase::HandlePropertySet}, #endif - - // -------------------------------------------------------------------------- - // MTD (or FTD) Properties (Set Handler) - + {SPINEL_PROP_PHY_CHAN, &NcpBase::HandlePropertySet}, #if OPENTHREAD_MTD || OPENTHREAD_FTD - case SPINEL_PROP_PHY_PCAP_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_PHY_CHAN_SUPPORTED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_DATA_POLL_PERIOD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_MAX_RETRY_NUMBER_DIRECT: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_IF_UP: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_STACK_UP: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_ROLE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_NETWORK_NAME: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_XPANID: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_MASTER_KEY: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_KEY_SEQUENCE_COUNTER: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_KEY_SWITCH_GUARDTIME: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_ASSISTING_PORTS: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_STREAM_NET_INSECURE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_STREAM_NET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_IPV6_ML_PREFIX: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD_MODE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_CHILD_TIMEOUT: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_JOINER_ENABLE - case SPINEL_PROP_MESHCOP_JOINER_COMMISSIONING: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_PHY_CHAN_SUPPORTED, &NcpBase::HandlePropertySet}, #endif - case SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE - case SPINEL_PROP_MAC_WHITELIST: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_WHITELIST_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_BLACKLIST: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_BLACKLIST_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_FIXED_RSS: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_PHY_CCA_THRESHOLD, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_PHY_TX_POWER, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_PHY_PCAP_ENABLED, &NcpBase::HandlePropertySet}, #endif - case SPINEL_PROP_THREAD_MODE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_ENABLE_DYNAMIC_LOG_LEVEL - case SPINEL_PROP_DEBUG_NCP_LOG_LEVEL: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_MAC_SCAN_STATE, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_SCAN_MASK, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_SCAN_PERIOD, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_15_4_LADDR, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE + {SPINEL_PROP_MAC_15_4_SADDR, &NcpBase::HandlePropertySet}, #endif - case SPINEL_PROP_THREAD_DISCOVERY_SCAN_JOINER_FLAG: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_DISCOVERY_SCAN_ENABLE_FILTERING: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_DISCOVERY_SCAN_PANID: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_MAC_15_4_PANID, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_RAW_STREAM_ENABLED, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_PROMISCUOUS_MODE, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_MAC_DATA_POLL_PERIOD, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_IF_UP, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_STACK_UP, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_ROLE, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_NETWORK_NAME, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_XPANID, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_MASTER_KEY, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_KEY_SEQUENCE_COUNTER, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_NET_PARTITION_ID, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_NET_KEY_SWITCH_GUARDTIME, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_NET_PSKC, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::HandlePropertySet}, #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE - case SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, + &NcpBase::HandlePropertySet}, #endif - - case SPINEL_PROP_THREAD_ACTIVE_DATASET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_PENDING_DATASET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_MGMT_SET_ACTIVE_DATASET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_MGMT_GET_ACTIVE_DATASET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_MGMT_GET_PENDING_DATASET: - handler = &NcpBase::HandlePropertySet; - break; - -#if OPENTHREAD_CONFIG_JAM_DETECTION_ENABLE - case SPINEL_PROP_JAM_DETECT_ENABLE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_JAM_DETECT_RSSI_THRESHOLD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_JAM_DETECT_WINDOW: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_JAM_DETECT_BUSY: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_THREAD_MODE, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_IPV6_ICMP_PING_OFFLOAD_MODE, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_STREAM_NET, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_STREAM_NET_INSECURE, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_CONFIG_JOINER_ENABLE + {SPINEL_PROP_MESHCOP_JOINER_COMMISSIONING, &NcpBase::HandlePropertySet}, #endif -#if OPENTHREAD_CONFIG_LEGACY_ENABLE - case SPINEL_PROP_NEST_LEGACY_ULA_PREFIX: - handler = &NcpBase::HandlePropertySet; - break; -#endif - case SPINEL_PROP_CNTR_RESET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CNTR_ALL_MAC_COUNTERS: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CNTR_MLE_COUNTERS: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CNTR_ALL_IP_COUNTERS: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE - case SPINEL_PROP_CHILD_SUPERVISION_CHECK_TIMEOUT: - handler = &NcpBase::HandlePropertySet; - break; -#endif -#if OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE - case SPINEL_PROP_SLAAC_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; +#if OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_MESHCOP_COMMISSIONER_STATE, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL, + &NcpBase::HandlePropertySet}, #endif +#endif // OPENTHREAD_FTD #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE - case SPINEL_PROP_SERVER_ALLOW_LOCAL_DATA_CHANGE: - handler = &NcpBase::HandlePropertySet; - break; + {SPINEL_PROP_SERVER_ALLOW_LOCAL_DATA_CHANGE, + &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_CNTR_RESET, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CNTR_ALL_MAC_COUNTERS, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CNTR_MLE_COUNTERS, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CNTR_ALL_IP_COUNTERS, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_UNSOL_UPDATE_FILTER, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_CONFIG_JAM_DETECTION_ENABLE + {SPINEL_PROP_JAM_DETECT_ENABLE, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_JAM_DETECT_RSSI_THRESHOLD, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_JAM_DETECT_WINDOW, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_JAM_DETECT_BUSY, &NcpBase::HandlePropertySet}, #endif #endif // OPENTHREAD_MTD || OPENTHREAD_FTD - // -------------------------------------------------------------------------- - // FTD Only Properties (Set Handler) +#if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE + {SPINEL_PROP_RADIO_COEX_ENABLE, &NcpBase::HandlePropertySet}, +#endif -#if OPENTHREAD_FTD - case SPINEL_PROP_MAC_MAX_RETRY_NUMBER_INDIRECT: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_PSKC: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_NET_PARTITION_ID: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_CHILD_COUNT_MAX: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE - case SPINEL_PROP_THREAD_STEERING_DATA: - handler = &NcpBase::HandlePropertySet; - break; +#if OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_WHITELIST, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::HandlePropertySet}, #endif -#if OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE - case SPINEL_PROP_THREAD_UDP_FORWARD_STREAM: - handler = &NcpBase::HandlePropertySet; - break; -#endif -#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE - case SPINEL_PROP_CHILD_SUPERVISION_INTERVAL: - handler = &NcpBase::HandlePropertySet; - break; -#endif -#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE - case SPINEL_PROP_MESHCOP_COMMISSIONER_STATE: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_PROVISIONING_URL: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET: - handler = &NcpBase::HandlePropertySet; - break; -#endif -#if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE - case SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_DELAY: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_SUPPORTED_CHANNELS: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_FAVORED_CHANNELS: - handler = &NcpBase::HandlePropertySet; - break; -#if OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE - case SPINEL_PROP_CHANNEL_MANAGER_CHANNEL_SELECT: - handler = &NcpBase::HandlePropertySet; - break; -#endif - case SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_INTERVAL: - handler = &NcpBase::HandlePropertySet; - break; -#endif -#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE - case SPINEL_PROP_TIME_SYNC_PERIOD: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_TIME_SYNC_XTAL_THRESHOLD: - handler = &NcpBase::HandlePropertySet; - break; -#endif -#endif // #if OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // Raw Link API Properties (Set Handler) +#endif // OPENTHREAD_MTD || OPENTHREAD_FTD #if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE - case SPINEL_PROP_MAC_15_4_SADDR: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_SRC_MATCH_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES: - handler = &NcpBase::HandlePropertySet; - break; - case SPINEL_PROP_PHY_ENABLED: - handler = &NcpBase::HandlePropertySet; - break; -#endif // #if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE + {SPINEL_PROP_MAC_SRC_MATCH_ENABLED, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES, + &NcpBase::HandlePropertySet}, +#endif - default: - handler = NULL; - } +#if OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_BLACKLIST, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_BLACKLIST_ENABLED, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MAC_FIXED_RSS, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_MAC_MAX_RETRY_NUMBER_DIRECT, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_MAC_MAX_RETRY_NUMBER_INDIRECT, + &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_CHILD_COUNT_MAX, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_THREAD_DISCOVERY_SCAN_JOINER_FLAG, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_DISCOVERY_SCAN_ENABLE_FILTERING, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_DISCOVERY_SCAN_PANID, &NcpBase::HandlePropertySet}, +#if OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE + {SPINEL_PROP_THREAD_STEERING_DATA, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_THREAD_ACTIVE_DATASET, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_PENDING_DATASET, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_MGMT_SET_ACTIVE_DATASET, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_MGMT_SET_PENDING_DATASET, + &NcpBase::HandlePropertySet}, +#if OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE + {SPINEL_PROP_THREAD_UDP_FORWARD_STREAM, &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_THREAD_MGMT_GET_ACTIVE_DATASET, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_THREAD_MGMT_GET_PENDING_DATASET, + &NcpBase::HandlePropertySet}, +#if OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_MESHCOP_COMMISSIONER_ANNOUNCE_BEGIN, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_ENERGY_SCAN, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_PAN_ID_QUERY, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_GET, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET, + &NcpBase::HandlePropertySet}, +#endif +#if OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE + {SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CHANNEL_MANAGER_DELAY, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CHANNEL_MANAGER_SUPPORTED_CHANNELS, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CHANNEL_MANAGER_FAVORED_CHANNELS, + &NcpBase::HandlePropertySet}, +#if OPENTHREAD_CONFIG_CHANNEL_MONITOR_ENABLE + {SPINEL_PROP_CHANNEL_MANAGER_CHANNEL_SELECT, + &NcpBase::HandlePropertySet}, +#endif + {SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_ENABLED, + &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CHANNEL_MANAGER_AUTO_SELECT_INTERVAL, + &NcpBase::HandlePropertySet}, +#endif // OPENTHREAD_CONFIG_CHANNEL_MANAGER_ENABLE +#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE + {SPINEL_PROP_TIME_SYNC_PERIOD, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_TIME_SYNC_XTAL_THRESHOLD, &NcpBase::HandlePropertySet}, +#endif +#if OPENTHREAD_CONFIG_CHILD_SUPERVISION_ENABLE + {SPINEL_PROP_CHILD_SUPERVISION_INTERVAL, &NcpBase::HandlePropertySet}, + {SPINEL_PROP_CHILD_SUPERVISION_CHECK_TIMEOUT, + &NcpBase::HandlePropertySet}, +#endif +#endif // OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE + {SPINEL_PROP_SLAAC_ENABLED, &NcpBase::HandlePropertySet}, +#endif +#if OPENTHREAD_CONFIG_LEGACY_ENABLE + {SPINEL_PROP_NEST_LEGACY_ULA_PREFIX, &NcpBase::HandlePropertySet}, +#endif +#endif // OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_ENABLE_DYNAMIC_LOG_LEVEL + {SPINEL_PROP_DEBUG_NCP_LOG_LEVEL, &NcpBase::HandlePropertySet}, +#endif + }; - return handler; +#if __cplusplus >= 201103L + static_assert(IsHandlerEntriesSorted(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries))); +#endif + + return FindPropertyHandler(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries), aKey); } NcpBase::PropertyHandler NcpBase::FindInsertPropertyHandler(spinel_prop_key_t aKey) @@ -1231,5 +744,30 @@ NcpBase::PropertyHandler NcpBase::FindRemovePropertyHandler(spinel_prop_key_t aK return handler; } +NcpBase::PropertyHandler NcpBase::FindPropertyHandler(const HandlerEntry *aHandlerEntries, + size_t aSize, + spinel_prop_key_t aKey) +{ + size_t l = 0; + + assert(aSize > 0); + + for (size_t r = aSize - 1; l < r;) + { + size_t m = (l + r) / 2; + + if (aHandlerEntries[m].mKey < aKey) + { + l = m + 1; + } + else + { + r = m; + } + } + + return aHandlerEntries[l].mKey == aKey ? aHandlerEntries[l].mHandler : NULL; +} + } // namespace Ncp } // namespace ot diff --git a/src/ncp/ncp_base_mtd.cpp b/src/ncp/ncp_base_mtd.cpp index 494c488fb..694618f33 100644 --- a/src/ncp/ncp_base_mtd.cpp +++ b/src/ncp/ncp_base_mtd.cpp @@ -230,27 +230,6 @@ exit: return error; } -template <> otError NcpBase::HandlePropertyGet(void) -{ - uint32_t freq_khz(0); - const uint8_t chan(otLinkGetChannel(mInstance)); - - if (chan == 0) - { - freq_khz = 868300; - } - else if (chan < 11) - { - freq_khz = 906000 - (2000 * 1) + 2000 * (chan); - } - else if (chan < 26) - { - freq_khz = 2405000 - (5000 * 11) + 5000 * (chan); - } - - return mEncoder.WriteUint32(freq_khz); -} - template <> otError NcpBase::HandlePropertySet(void) { uint32_t newMask = 0;