From 597e11225942425df1113e54f94b120b0cdbdb72 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 24 Dec 2019 19:38:17 -0800 Subject: [PATCH] [ncp-base] use array and binary search for insert/remove prop handlers (#4448) --- src/ncp/ncp_base_dispatcher.cpp | 227 ++++++++++++-------------------- 1 file changed, 81 insertions(+), 146 deletions(-) diff --git a/src/ncp/ncp_base_dispatcher.cpp b/src/ncp/ncp_base_dispatcher.cpp index 46879b5b0..89124a0e8 100644 --- a/src/ncp/ncp_base_dispatcher.cpp +++ b/src/ncp/ncp_base_dispatcher.cpp @@ -576,172 +576,107 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey) NcpBase::PropertyHandler NcpBase::FindInsertPropertyHandler(spinel_prop_key_t aKey) { - NcpBase::PropertyHandler handler; - - switch (aKey) - { - // -------------------------------------------------------------------------- - // Common Properties (Insert Handler) - - case SPINEL_PROP_UNSOL_UPDATE_FILTER: - handler = &NcpBase::HandlePropertyInsert; - break; - - // -------------------------------------------------------------------------- - // MTD (or FTD) Properties (Insert Handler) - -#if OPENTHREAD_MTD || OPENTHREAD_FTD - case SPINEL_PROP_IPV6_ADDRESS_TABLE: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_IPV6_MULTICAST_ADDRESS_TABLE: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_THREAD_ASSISTING_PORTS: - handler = &NcpBase::HandlePropertyInsert; - break; -#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE - case SPINEL_PROP_THREAD_OFF_MESH_ROUTES: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_THREAD_ON_MESH_NETS: - handler = &NcpBase::HandlePropertyInsert; - break; +#if __cplusplus >= 201103L + constexpr +#else + const #endif -#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE - case SPINEL_PROP_MAC_WHITELIST: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_MAC_BLACKLIST: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_MAC_FIXED_RSS: - handler = &NcpBase::HandlePropertyInsert; - break; + static HandlerEntry sHandlerEntries[] = { +#if OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE + {SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::HandlePropertyInsert}, + {SPINEL_PROP_THREAD_OFF_MESH_ROUTES, &NcpBase::HandlePropertyInsert}, +#endif + {SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::HandlePropertyInsert}, + {SPINEL_PROP_IPV6_ADDRESS_TABLE, &NcpBase::HandlePropertyInsert}, + {SPINEL_PROP_IPV6_MULTICAST_ADDRESS_TABLE, + &NcpBase::HandlePropertyInsert}, +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS, + &NcpBase::HandlePropertyInsert}, #endif #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE - case SPINEL_PROP_SERVER_SERVICES: - handler = &NcpBase::HandlePropertyInsert; - break; + {SPINEL_PROP_SERVER_SERVICES, &NcpBase::HandlePropertyInsert}, #endif -#endif // OPENTHREAD_MTD || OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // FTD Only Properties (Insert Handler) - -#if OPENTHREAD_FTD -#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE - case SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_THREAD_JOINERS: - handler = &NcpBase::HandlePropertyInsert; - break; +#endif // #if OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_UNSOL_UPDATE_FILTER, &NcpBase::HandlePropertyInsert}, +#if (OPENTHREAD_MTD || OPENTHREAD_FTD) && OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_WHITELIST, &NcpBase::HandlePropertyInsert}, #endif -#endif // OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // Raw Link API Properties (Insert Handler) - #if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE - case SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES: - handler = &NcpBase::HandlePropertyInsert; - break; - case SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES: - handler = &NcpBase::HandlePropertyInsert; - break; + {SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES, + &NcpBase::HandlePropertyInsert}, + {SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES, + &NcpBase::HandlePropertyInsert}, +#endif +#if (OPENTHREAD_MTD || OPENTHREAD_FTD) && OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_BLACKLIST, &NcpBase::HandlePropertyInsert}, + {SPINEL_PROP_MAC_FIXED_RSS, &NcpBase::HandlePropertyInsert}, +#endif +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_THREAD_JOINERS, &NcpBase::HandlePropertyInsert}, +#endif + }; + +#if __cplusplus >= 201103L + static_assert(AreHandlerEntriesSorted(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries)), + "NCP property setter entries not sorted!"); #endif - default: - handler = NULL; - } - - return handler; + return FindPropertyHandler(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries), aKey); } NcpBase::PropertyHandler NcpBase::FindRemovePropertyHandler(spinel_prop_key_t aKey) { - NcpBase::PropertyHandler handler; - - switch (aKey) - { - // -------------------------------------------------------------------------- - // Common Properties (Remove Handler) - - case SPINEL_PROP_UNSOL_UPDATE_FILTER: - handler = &NcpBase::HandlePropertyRemove; - break; - - // -------------------------------------------------------------------------- - // MTD (or FTD) Properties (Remove Handler) - -#if OPENTHREAD_MTD || OPENTHREAD_FTD - case SPINEL_PROP_IPV6_ADDRESS_TABLE: - handler = &NcpBase::HandlePropertyRemove; - break; - case SPINEL_PROP_IPV6_MULTICAST_ADDRESS_TABLE: - handler = &NcpBase::HandlePropertyRemove; - break; -#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE - case SPINEL_PROP_THREAD_OFF_MESH_ROUTES: - handler = &NcpBase::HandlePropertyRemove; - break; - case SPINEL_PROP_THREAD_ON_MESH_NETS: - handler = &NcpBase::HandlePropertyRemove; - break; +#if __cplusplus >= 201103L + constexpr +#else + const #endif - case SPINEL_PROP_THREAD_ASSISTING_PORTS: - handler = &NcpBase::HandlePropertyRemove; - break; -#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE - case SPINEL_PROP_MAC_WHITELIST: - handler = &NcpBase::HandlePropertyRemove; - break; - case SPINEL_PROP_MAC_BLACKLIST: - handler = &NcpBase::HandlePropertyRemove; - break; - case SPINEL_PROP_MAC_FIXED_RSS: - handler = &NcpBase::HandlePropertyRemove; - break; + static HandlerEntry sHandlerEntries[] = { +#if OPENTHREAD_MTD || OPENTHREAD_FTD +#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE + {SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::HandlePropertyRemove}, + {SPINEL_PROP_THREAD_OFF_MESH_ROUTES, &NcpBase::HandlePropertyRemove}, +#endif + {SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::HandlePropertyRemove}, + {SPINEL_PROP_IPV6_ADDRESS_TABLE, &NcpBase::HandlePropertyRemove}, + {SPINEL_PROP_IPV6_MULTICAST_ADDRESS_TABLE, + &NcpBase::HandlePropertyRemove}, +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE + {SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS, + &NcpBase::HandlePropertyRemove}, #endif #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE - case SPINEL_PROP_SERVER_SERVICES: - handler = &NcpBase::HandlePropertyRemove; - break; + {SPINEL_PROP_SERVER_SERVICES, &NcpBase::HandlePropertyRemove}, #endif -#endif // OPENTHREAD_MTD || OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // FTD Only Properties (Remove Handler) - -#if OPENTHREAD_FTD - case SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS: - handler = &NcpBase::HandlePropertyRemove; - break; -#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE - case SPINEL_PROP_MESHCOP_COMMISSIONER_JOINERS: - handler = &NcpBase::HandlePropertyRemove; - break; +#endif // #if OPENTHREAD_MTD || OPENTHREAD_FTD + {SPINEL_PROP_UNSOL_UPDATE_FILTER, &NcpBase::HandlePropertyRemove}, +#if (OPENTHREAD_MTD || OPENTHREAD_FTD) && OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_WHITELIST, &NcpBase::HandlePropertyRemove}, #endif -#endif // OPENTHREAD_FTD - - // -------------------------------------------------------------------------- - // Raw Link API Properties (Remove Handler) - #if OPENTHREAD_RADIO || OPENTHREAD_CONFIG_LINK_RAW_ENABLE - case SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES: - handler = &NcpBase::HandlePropertyRemove; - break; - case SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES: - handler = &NcpBase::HandlePropertyRemove; - break; + {SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES, + &NcpBase::HandlePropertyRemove}, + {SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES, + &NcpBase::HandlePropertyRemove}, +#endif +#if (OPENTHREAD_MTD || OPENTHREAD_FTD) && OPENTHREAD_CONFIG_MAC_FILTER_ENABLE + {SPINEL_PROP_MAC_BLACKLIST, &NcpBase::HandlePropertyRemove}, + {SPINEL_PROP_MAC_FIXED_RSS, &NcpBase::HandlePropertyRemove}, +#endif +#if OPENTHREAD_FTD + {SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS, + &NcpBase::HandlePropertyRemove}, +#endif + }; + +#if __cplusplus >= 201103L + static_assert(AreHandlerEntriesSorted(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries)), + "NCP property setter entries not sorted!"); #endif - default: - handler = NULL; - } - - return handler; + return FindPropertyHandler(sHandlerEntries, OT_ARRAY_LENGTH(sHandlerEntries), aKey); } NcpBase::PropertyHandler NcpBase::FindPropertyHandler(const HandlerEntry *aHandlerEntries,