From 90d62a4e2266738e601783470f4d7c5a759b16a0 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Mon, 1 May 2017 11:46:22 +0800 Subject: [PATCH] Remove some Leader/Router related features from MTD build (#1680) * Unify the location of "#if OPENTHREAD_FTD" which include/exclude the whole file Also correct some comments in xxx_api.cpp * Remove Address Resolver related features from MTD build * Remove some Leader/Router related features from MTD build * Remove Leader/Router related APIs from MTD build * Remove Leader/Router related functions from MTD build --- examples/apps/windows/otAdapter.h | 1 + include/openthread/thread.h | 317 +----------------- include/openthread/thread_ftd.h | 345 ++++++++++++++++++++ src/cli/cli.cpp | 39 ++- src/cli/cli.hpp | 24 +- src/core/Makefile.am | 2 - src/core/api/commissioner_api.cpp | 2 +- src/core/api/dataset_ftd_api.cpp | 4 +- src/core/api/dhcp6_api.cpp | 2 +- src/core/api/icmp6_api.cpp | 2 +- src/core/api/ip6_api.cpp | 2 +- src/core/api/joiner_api.cpp | 2 +- src/core/api/link_raw_api.cpp | 2 +- src/core/api/thread_api.cpp | 184 ----------- src/core/api/thread_ftd_api.cpp | 188 ++++++++++- src/core/meshcop/dataset_manager_ftd.cpp | 4 +- src/core/meshcop/joiner_router.cpp | 4 +- src/core/meshcop/leader.cpp | 4 +- src/core/thread/address_resolver.hpp | 187 ++++++++++- src/core/thread/address_resolver_ftd.hpp | 210 ------------ src/core/thread/address_resolver_mtd.hpp | 53 --- src/core/thread/mesh_forwarder.cpp | 193 +++++------ src/core/thread/mle.cpp | 15 - src/core/thread/mle.hpp | 21 -- src/core/thread/mle_router.cpp | 18 +- src/core/thread/mle_router_ftd.hpp | 20 ++ src/core/thread/mle_router_mtd.hpp | 26 -- src/core/thread/network_data_leader_mtd.hpp | 5 - src/core/thread/network_data_local.cpp | 4 +- src/core/thread/thread_netif.cpp | 2 +- src/core/thread/thread_netif.hpp | 91 +++++- src/ncp/ncp_base.cpp | 76 +++-- src/ncp/ncp_base.hpp | 39 ++- 33 files changed, 1080 insertions(+), 1008 deletions(-) delete mode 100644 src/core/thread/address_resolver_ftd.hpp delete mode 100644 src/core/thread/address_resolver_mtd.hpp diff --git a/examples/apps/windows/otAdapter.h b/examples/apps/windows/otAdapter.h index 66cc56706..71ac906f4 100644 --- a/examples/apps/windows/otAdapter.h +++ b/examples/apps/windows/otAdapter.h @@ -30,6 +30,7 @@ #define OTDLL 1 #include +#include #include #include diff --git a/include/openthread/thread.h b/include/openthread/thread.h index b79c04dde..a9401a584 100644 --- a/include/openthread/thread.h +++ b/include/openthread/thread.h @@ -29,7 +29,7 @@ /** * @file * @brief - * This file defines the OpenThread Thread API. + * This file defines the OpenThread Thread API (for both FTD and MTD). */ #ifndef OPENTHREAD_THREAD_H_ @@ -144,34 +144,6 @@ OTAPI bool OTCALL otThreadIsDiscoverInProgress(otInstance *aInstance); * */ -/** - * Get the maximum number of children currently allowed. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The maximum number of children currently allowed. - * - * @sa otThreadSetMaxAllowedChildren - */ -OTAPI uint8_t OTCALL otThreadGetMaxAllowedChildren(otInstance *aInstance); - -/** - * Set the maximum number of children currently allowed. - * - * This parameter can only be set when Thread protocol operation - * has been stopped. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aMaxChildren The maximum allowed children. - * - * @retval kThreadErrorNone Successfully set the max. - * @retval kThreadError_InvalidArgs If @p aMaxChildren is not in the range [1, OPENTHREAD_CONFIG_MAX_CHILDREN]. - * @retval kThreadError_InvalidState If Thread isn't stopped. - * - * @sa otThreadGetMaxAllowedChildren, otThreadStop - */ -OTAPI ThreadError OTCALL otThreadSetMaxAllowedChildren(otInstance *aInstance, uint8_t aMaxChildren); - /** * Get the Thread Child Timeout used when operating in the Child role. * @@ -380,97 +352,10 @@ OTAPI const char *OTCALL otThreadGetNetworkName(otInstance *aInstance); */ OTAPI ThreadError OTCALL otThreadSetNetworkName(otInstance *aInstance, const char *aNetworkName); -/** - * This function indicates whether or not the Router Role is enabled. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @retval TRUE If the Router Role is enabled. - * @retval FALSE If the Router Role is not enabled. - * - */ -OTAPI bool OTCALL otThreadIsRouterRoleEnabled(otInstance *aInstance); - -/** - * This function sets whether or not the Router Role is enabled. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aEnabled TRUE if the Router Role is enabled, FALSE otherwise. - * - */ -OTAPI void OTCALL otThreadSetRouterRoleEnabled(otInstance *aInstance, bool aEnabled); - -/** - * Set the preferred Router Id. - * - * Upon becoming a router/leader the node attempts to use this Router Id. If the - * preferred Router Id is not set or if it can not be used, a randomly generated - * router id is picked. This property can be set only when the device role is - * either detached or disabled. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aRouterId The preferred Router Id. - * - * @retval kThreadError_None Successfully set the preferred Router Id. - * @retval kThreadError_InvalidState Could not set (role is not detached or disabled) - * - */ -OTAPI ThreadError OTCALL otThreadSetPreferredRouterId(otInstance *aInstance, uint8_t aRouterId); - /** * @} */ -/** - * @defgroup config-router Router/Leader - * - * @brief - * This module includes functions that manage configuration parameters for the Thread Router and Leader roles. - * - * @{ - * - */ - -/** - * Get the Thread Leader Weight used when operating in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The Thread Leader Weight value. - * - * @sa otThreadSetLeaderWeight - */ -OTAPI uint8_t OTCALL otThreadGetLocalLeaderWeight(otInstance *aInstance); - -/** - * Set the Thread Leader Weight used when operating in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aWeight The Thread Leader Weight value.. - * - * @sa otThreadGetLeaderWeight - */ -OTAPI void OTCALL otThreadSetLocalLeaderWeight(otInstance *aInstance, uint8_t aWeight); - -/** - * Get the Thread Leader Partition Id used when operating in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The Thread Leader Partition Id value. - * - */ -OTAPI uint32_t OTCALL otThreadGetLocalLeaderPartitionId(otInstance *aInstance); - -/** - * Set the Thread Leader Partition Id used when operating in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aPartitionId The Thread Leader Partition Id value. - * - */ -OTAPI void OTCALL otThreadSetLocalLeaderPartitionId(otInstance *aInstance, uint32_t aPartitionId); - /** * @} */ @@ -485,27 +370,6 @@ OTAPI void OTCALL otThreadSetLocalLeaderPartitionId(otInstance *aInstance, uint3 * */ -/** - * Get the CONTEXT_ID_REUSE_DELAY parameter used in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The CONTEXT_ID_REUSE_DELAY value. - * - * @sa otThreadSetContextIdReuseDelay - */ -OTAPI uint32_t OTCALL otThreadGetContextIdReuseDelay(otInstance *aInstance); - -/** - * Set the CONTEXT_ID_REUSE_DELAY parameter used in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aDelay The CONTEXT_ID_REUSE_DELAY value. - * - * @sa otThreadGetContextIdReuseDelay - */ -OTAPI void OTCALL otThreadSetContextIdReuseDelay(otInstance *aInstance, uint32_t aDelay); - /** * Get the thrKeySequenceCounter. * @@ -548,59 +412,6 @@ OTAPI uint32_t OTCALL otThreadGetKeySwitchGuardTime(otInstance *aInstance); */ OTAPI void OTCALL otThreadSetKeySwitchGuardTime(otInstance *aInstance, uint32_t aKeySwitchGuardTime); - -/** - * Get the NETWORK_ID_TIMEOUT parameter used in the Router role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The NETWORK_ID_TIMEOUT value. - * - * @sa otThreadSetNetworkIdTimeout - */ -OTAPI uint8_t OTCALL otThreadGetNetworkIdTimeout(otInstance *aInstance); - -/** - * Set the NETWORK_ID_TIMEOUT parameter used in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aTimeout The NETWORK_ID_TIMEOUT value. - * - * @sa otThreadGetNetworkIdTimeout - */ -OTAPI void OTCALL otThreadSetNetworkIdTimeout(otInstance *aInstance, uint8_t aTimeout); - -/** - * Get the ROUTER_UPGRADE_THRESHOLD parameter used in the REED role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The ROUTER_UPGRADE_THRESHOLD value. - * - * @sa otThreadSetRouterUpgradeThreshold - */ -OTAPI uint8_t OTCALL otThreadGetRouterUpgradeThreshold(otInstance *aInstance); - -/** - * Set the ROUTER_UPGRADE_THRESHOLD parameter used in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aThreshold The ROUTER_UPGRADE_THRESHOLD value. - * - * @sa otThreadGetRouterUpgradeThreshold - */ -OTAPI void OTCALL otThreadSetRouterUpgradeThreshold(otInstance *aInstance, uint8_t aThreshold); - -/** - * Release a Router ID that has been allocated by the device in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aRouterId The Router ID to release. Valid range is [0, 62]. - * - * @retval kThreadErrorNone Successfully released the Router ID specified by aRouterId. - */ -OTAPI ThreadError OTCALL otThreadReleaseRouterId(otInstance *aInstance, uint8_t aRouterId); - /** * Detach from the Thread network. * @@ -622,68 +433,6 @@ OTAPI ThreadError OTCALL otThreadBecomeDetached(otInstance *aInstance); */ OTAPI ThreadError OTCALL otThreadBecomeChild(otInstance *aInstance, otMleAttachFilter aFilter); -/** - * Attempt to become a router. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @retval kThreadErrorNone Successfully begin attempt to become a router. - * @retval kThreadErrorInvalidState Thread is disabled. - */ -OTAPI ThreadError OTCALL otThreadBecomeRouter(otInstance *aInstance); - -/** - * Become a leader and start a new partition. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @retval kThreadErrorNone Successfully became a leader and started a new partition. - * @retval kThreadErrorInvalidState Thread is disabled. - */ -OTAPI ThreadError OTCALL otThreadBecomeLeader(otInstance *aInstance); - -/** - * Get the ROUTER_DOWNGRADE_THRESHOLD parameter used in the Router role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The ROUTER_DOWNGRADE_THRESHOLD value. - * - * @sa otThreadSetRouterDowngradeThreshold - */ -OTAPI uint8_t OTCALL otThreadGetRouterDowngradeThreshold(otInstance *aInstance); - -/** - * Set the ROUTER_DOWNGRADE_THRESHOLD parameter used in the Leader role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aThreshold The ROUTER_DOWNGRADE_THRESHOLD value. - * - * @sa otThreadGetRouterDowngradeThreshold - */ -OTAPI void OTCALL otThreadSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold); - -/** - * Get the ROUTER_SELECTION_JITTER parameter used in the REED/Router role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The ROUTER_SELECTION_JITTER value. - * - * @sa otThreadSetRouterSelectionJitter - */ -OTAPI uint8_t OTCALL otThreadGetRouterSelectionJitter(otInstance *aInstance); - -/** - * Set the ROUTER_SELECTION_JITTER parameter used in the REED/Router role. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aRouterJitter The ROUTER_SELECTION_JITTER value. - * - * @sa otThreadGetRouterSelectionJitter - */ -OTAPI void OTCALL otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter); - /** * @} * @@ -704,38 +453,6 @@ OTAPI void OTCALL otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_ * */ -/** - * The function retains diagnostic information for an attached Child by its Child ID or RLOC16. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aChildId The Child ID or RLOC16 for the attached child. - * @param[out] aChildInfo A pointer to where the child information is placed. - * - * @retavl kThreadError_None @p aChildInfo was successfully updated with the info for the given ID. - * @retval kThreadError_NotFound No valid child with this Child ID. - * @retavl kThreadError_InvalidArgs If @p aChildInfo is NULL. - * - */ -OTAPI ThreadError OTCALL otThreadGetChildInfoById(otInstance *aInstance, uint16_t aChildId, otChildInfo *aChildInfo); - -/** - * The function retains diagnostic information for an attached Child by the internal table index. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aChildIndex The table index. - * @param[out] aChildInfo A pointer to where the child information is placed. - * - * @retavl kThreadError_None @p aChildInfo was successfully updated with the info for the given index. - * @retval kThreadError_NotFound No valid child at this index. - * @retavl kThreadError_InvalidArgs Either @p aChildInfo is NULL, or @p aChildIndex is out of range (higher - * than max table index). - * - * @sa otGetMaxAllowedChildren - * - */ -OTAPI ThreadError OTCALL otThreadGetChildInfoByIndex(otInstance *aInstance, uint8_t aChildIndex, - otChildInfo *aChildInfo); - /** * This function gets the next neighbor information. It is used to go through the entries of * the neighbor table. @@ -766,19 +483,6 @@ OTAPI ThreadError OTCALL otThreadGetNextNeighborInfo(otInstance *aInstance, otNe */ OTAPI otDeviceRole OTCALL otThreadGetDeviceRole(otInstance *aInstance); -/** - * This function gets an EID cache entry. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aIndex An index into the EID cache table. - * @param[out] aEntry A pointer to where the EID information is placed. - * - * @retval kThreadError_None Successfully retrieved the EID cache entry. - * @retval kThreadError_InvalidArgs @p aIndex was out of bounds or @p aEntry was NULL. - * - */ -OTAPI ThreadError OTCALL otThreadGetEidCacheEntry(otInstance *aInstance, uint8_t aIndex, otEidCacheEntry *aEntry); - /** * This function get the Thread Leader Data. * @@ -828,25 +532,6 @@ OTAPI uint32_t OTCALL otThreadGetPartitionId(otInstance *aInstance); */ OTAPI uint16_t OTCALL otThreadGetRloc16(otInstance *aInstance); -/** - * Get the current Router ID Sequence. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * - * @returns The Router ID Sequence. - */ -OTAPI uint8_t OTCALL otThreadGetRouterIdSequence(otInstance *aInstance); - -/** - * The function retains diagnostic information for a given Thread Router. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aRouterId The router ID or RLOC16 for a given router. - * @param[out] aRouterInfo A pointer to where the router information is placed. - * - */ -OTAPI ThreadError OTCALL otThreadGetRouterInfo(otInstance *aInstance, uint16_t aRouterId, otRouterInfo *aRouterInfo); - /** * The function retrieves diagnostic information for a Thread Router as parent. * diff --git a/include/openthread/thread_ftd.h b/include/openthread/thread_ftd.h index 7c8f3983a..2d9ef64f4 100644 --- a/include/openthread/thread_ftd.h +++ b/include/openthread/thread_ftd.h @@ -53,6 +53,132 @@ extern "C" { * */ +/** + * @defgroup config-general General + * + * @brief + * This module includes functions that manage configuration parameters for the Thread Router, and Leader roles. + * + * @{ + * + */ + +/** + * Get the maximum number of children currently allowed. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The maximum number of children currently allowed. + * + * @sa otThreadSetMaxAllowedChildren + */ +OTAPI uint8_t OTCALL otThreadGetMaxAllowedChildren(otInstance *aInstance); + +/** + * Set the maximum number of children currently allowed. + * + * This parameter can only be set when Thread protocol operation + * has been stopped. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aMaxChildren The maximum allowed children. + * + * @retval kThreadErrorNone Successfully set the max. + * @retval kThreadError_InvalidArgs If @p aMaxChildren is not in the range [1, OPENTHREAD_CONFIG_MAX_CHILDREN]. + * @retval kThreadError_InvalidState If Thread isn't stopped. + * + * @sa otThreadGetMaxAllowedChildren, otThreadStop + */ +OTAPI ThreadError OTCALL otThreadSetMaxAllowedChildren(otInstance *aInstance, uint8_t aMaxChildren); + +/** + * This function indicates whether or not the Router Role is enabled. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @retval TRUE If the Router Role is enabled. + * @retval FALSE If the Router Role is not enabled. + * + */ +OTAPI bool OTCALL otThreadIsRouterRoleEnabled(otInstance *aInstance); + +/** + * This function sets whether or not the Router Role is enabled. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aEnabled TRUE if the Router Role is enabled, FALSE otherwise. + * + */ +OTAPI void OTCALL otThreadSetRouterRoleEnabled(otInstance *aInstance, bool aEnabled); + +/** + * Set the preferred Router Id. + * + * Upon becoming a router/leader the node attempts to use this Router Id. If the + * preferred Router Id is not set or if it can not be used, a randomly generated + * router id is picked. This property can be set only when the device role is + * either detached or disabled. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aRouterId The preferred Router Id. + * + * @retval kThreadError_None Successfully set the preferred Router Id. + * @retval kThreadError_InvalidState Could not set (role is not detached or disabled) + * + */ +OTAPI ThreadError OTCALL otThreadSetPreferredRouterId(otInstance *aInstance, uint8_t aRouterId); + + +/** + * @defgroup config-router Router/Leader + * + * @brief + * This module includes functions that manage configuration parameters for the Thread Router and Leader roles. + * + * @{ + * + */ + +/** + * Get the Thread Leader Weight used when operating in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The Thread Leader Weight value. + * + * @sa otThreadSetLeaderWeight + */ +OTAPI uint8_t OTCALL otThreadGetLocalLeaderWeight(otInstance *aInstance); + +/** + * Set the Thread Leader Weight used when operating in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aWeight The Thread Leader Weight value. + * + * @sa otThreadGetLeaderWeight + */ +OTAPI void OTCALL otThreadSetLocalLeaderWeight(otInstance *aInstance, uint8_t aWeight); + +/** + * Get the Thread Leader Partition Id used when operating in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The Thread Leader Partition Id value. + * + */ +OTAPI uint32_t OTCALL otThreadGetLocalLeaderPartitionId(otInstance *aInstance); + +/** + * Set the Thread Leader Partition Id used when operating in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aPartitionId The Thread Leader Partition Id value. + * + */ +OTAPI void OTCALL otThreadSetLocalLeaderPartitionId(otInstance *aInstance, uint32_t aPartitionId); + /** * Get the Joiner UDP Port. * @@ -76,6 +202,225 @@ OTAPI uint16_t OTCALL otThreadGetJoinerUdpPort(otInstance *aInstance); */ OTAPI ThreadError OTCALL otThreadSetJoinerUdpPort(otInstance *aInstance, uint16_t aJoinerUdpPort); +/** + * @defgroup config-test Test + * + * @brief + * This module includes functions that manage configuration parameters required for Thread Certification testing. + * + * @{ + * + */ + +/** + * Get the CONTEXT_ID_REUSE_DELAY parameter used in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The CONTEXT_ID_REUSE_DELAY value. + * + * @sa otThreadSetContextIdReuseDelay + */ +OTAPI uint32_t OTCALL otThreadGetContextIdReuseDelay(otInstance *aInstance); + +/** + * Set the CONTEXT_ID_REUSE_DELAY parameter used in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aDelay The CONTEXT_ID_REUSE_DELAY value. + * + * @sa otThreadGetContextIdReuseDelay + */ +OTAPI void OTCALL otThreadSetContextIdReuseDelay(otInstance *aInstance, uint32_t aDelay); + +/** + * Get the NETWORK_ID_TIMEOUT parameter used in the Router role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The NETWORK_ID_TIMEOUT value. + * + * @sa otThreadSetNetworkIdTimeout + */ +OTAPI uint8_t OTCALL otThreadGetNetworkIdTimeout(otInstance *aInstance); + +/** + * Set the NETWORK_ID_TIMEOUT parameter used in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aTimeout The NETWORK_ID_TIMEOUT value. + * + * @sa otThreadGetNetworkIdTimeout + */ +OTAPI void OTCALL otThreadSetNetworkIdTimeout(otInstance *aInstance, uint8_t aTimeout); + +/** + * Get the ROUTER_UPGRADE_THRESHOLD parameter used in the REED role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The ROUTER_UPGRADE_THRESHOLD value. + * + * @sa otThreadSetRouterUpgradeThreshold + */ +OTAPI uint8_t OTCALL otThreadGetRouterUpgradeThreshold(otInstance *aInstance); + +/** + * Set the ROUTER_UPGRADE_THRESHOLD parameter used in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aThreshold The ROUTER_UPGRADE_THRESHOLD value. + * + * @sa otThreadGetRouterUpgradeThreshold + */ +OTAPI void OTCALL otThreadSetRouterUpgradeThreshold(otInstance *aInstance, uint8_t aThreshold); + +/** + * Release a Router ID that has been allocated by the device in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aRouterId The Router ID to release. Valid range is [0, 62]. + * + * @retval kThreadErrorNone Successfully released the Router ID specified by aRouterId. + */ +OTAPI ThreadError OTCALL otThreadReleaseRouterId(otInstance *aInstance, uint8_t aRouterId); + +/** + * Attempt to become a router. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @retval kThreadErrorNone Successfully begin attempt to become a router. + * @retval kThreadErrorInvalidState Thread is disabled. + */ +OTAPI ThreadError OTCALL otThreadBecomeRouter(otInstance *aInstance); + +/** + * Become a leader and start a new partition. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @retval kThreadErrorNone Successfully became a leader and started a new partition. + * @retval kThreadErrorInvalidState Thread is disabled. + */ +OTAPI ThreadError OTCALL otThreadBecomeLeader(otInstance *aInstance); + +/** + * Get the ROUTER_DOWNGRADE_THRESHOLD parameter used in the Router role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The ROUTER_DOWNGRADE_THRESHOLD value. + * + * @sa otThreadSetRouterDowngradeThreshold + */ +OTAPI uint8_t OTCALL otThreadGetRouterDowngradeThreshold(otInstance *aInstance); + +/** + * Set the ROUTER_DOWNGRADE_THRESHOLD parameter used in the Leader role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aThreshold The ROUTER_DOWNGRADE_THRESHOLD value. + * + * @sa otThreadGetRouterDowngradeThreshold + */ +OTAPI void OTCALL otThreadSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold); + +/** + * Get the ROUTER_SELECTION_JITTER parameter used in the REED/Router role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The ROUTER_SELECTION_JITTER value. + * + * @sa otThreadSetRouterSelectionJitter + */ +OTAPI uint8_t OTCALL otThreadGetRouterSelectionJitter(otInstance *aInstance); + +/** + * Set the ROUTER_SELECTION_JITTER parameter used in the REED/Router role. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aRouterJitter The ROUTER_SELECTION_JITTER value. + * + * @sa otThreadGetRouterSelectionJitter + */ +OTAPI void OTCALL otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter); + +/** + * @addtogroup diags Diagnostics + * + * @brief + * This module includes functions that expose internal state. + * + * @{ + * + */ + +/** + * The function retains diagnostic information for an attached Child by its Child ID or RLOC16. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aChildId The Child ID or RLOC16 for the attached child. + * @param[out] aChildInfo A pointer to where the child information is placed. + * + * @retavl kThreadError_None @p aChildInfo was successfully updated with the info for the given ID. + * @retval kThreadError_NotFound No valid child with this Child ID. + * @retavl kThreadError_InvalidArgs If @p aChildInfo is NULL. + * + */ +OTAPI ThreadError OTCALL otThreadGetChildInfoById(otInstance *aInstance, uint16_t aChildId, otChildInfo *aChildInfo); + +/** + * The function retains diagnostic information for an attached Child by the internal table index. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aChildIndex The table index. + * @param[out] aChildInfo A pointer to where the child information is placed. + * + * @retavl kThreadError_None @p aChildInfo was successfully updated with the info for the given index. + * @retval kThreadError_NotFound No valid child at this index. + * @retavl kThreadError_InvalidArgs Either @p aChildInfo is NULL, or @p aChildIndex is out of range (higher + * than max table index). + * + * @sa otGetMaxAllowedChildren + * + */ +OTAPI ThreadError OTCALL otThreadGetChildInfoByIndex(otInstance *aInstance, uint8_t aChildIndex, + otChildInfo *aChildInfo); + +/** + * Get the current Router ID Sequence. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * + * @returns The Router ID Sequence. + */ +OTAPI uint8_t OTCALL otThreadGetRouterIdSequence(otInstance *aInstance); + +/** + * The function retains diagnostic information for a given Thread Router. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aRouterId The router ID or RLOC16 for a given router. + * @param[out] aRouterInfo A pointer to where the router information is placed. + * + */ +OTAPI ThreadError OTCALL otThreadGetRouterInfo(otInstance *aInstance, uint16_t aRouterId, otRouterInfo *aRouterInfo); + +/** + * This function gets an EID cache entry. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aIndex An index into the EID cache table. + * @param[out] aEntry A pointer to where the EID information is placed. + * + * @retval kThreadError_None Successfully retrieved the EID cache entry. + * @retval kThreadError_InvalidArgs @p aIndex was out of bounds or @p aEntry was NULL. + * + */ +OTAPI ThreadError OTCALL otThreadGetEidCacheEntry(otInstance *aInstance, uint8_t aIndex, otEidCacheEntry *aEntry); + /** * @} * diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 6a18649e0..4b2796dc9 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -89,8 +89,10 @@ const struct Command Interpreter::sCommands[] = { "blacklist", &Interpreter::ProcessBlacklist }, { "bufferinfo", &Interpreter::ProcessBufferInfo }, { "channel", &Interpreter::ProcessChannel }, +#if OPENTHREAD_FTD { "child", &Interpreter::ProcessChild }, { "childmax", &Interpreter::ProcessChildMax }, +#endif { "childtimeout", &Interpreter::ProcessChildTimeout }, #if OPENTHREAD_ENABLE_APPLICATION_COAP { "coap", &Interpreter::ProcessCoap }, @@ -98,7 +100,9 @@ const struct Command Interpreter::sCommands[] = #if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD { "commissioner", &Interpreter::ProcessCommissioner }, #endif +#if OPENTHREAD_FTD { "contextreusedelay", &Interpreter::ProcessContextIdReuseDelay }, +#endif { "counter", &Interpreter::ProcessCounters }, { "dataset", &Interpreter::ProcessDataset }, #if OPENTHREAD_FTD @@ -111,7 +115,9 @@ const struct Command Interpreter::sCommands[] = #if OPENTHREAD_ENABLE_DNS_CLIENT { "dns", &Interpreter::ProcessDns }, #endif +#if OPENTHREAD_FTD { "eidcache", &Interpreter::ProcessEidCache }, +#endif { "eui64", &Interpreter::ProcessEui64 }, #ifdef OPENTHREAD_EXAMPLES_POSIX { "exit", &Interpreter::ProcessExit }, @@ -137,14 +143,18 @@ const struct Command Interpreter::sCommands[] = #endif { "keysequence", &Interpreter::ProcessKeySequence }, { "leaderdata", &Interpreter::ProcessLeaderData }, +#if OPENTHREAD_FTD { "leaderpartitionid", &Interpreter::ProcessLeaderPartitionId }, { "leaderweight", &Interpreter::ProcessLeaderWeight }, +#endif { "linkquality", &Interpreter::ProcessLinkQuality }, { "masterkey", &Interpreter::ProcessMasterKey }, { "mode", &Interpreter::ProcessMode }, { "netdataregister", &Interpreter::ProcessNetworkDataRegister }, { "networkdiagnostic", &Interpreter::ProcessNetworkDiagnostic }, +#if OPENTHREAD_FTD { "networkidtimeout", &Interpreter::ProcessNetworkIdTimeout }, +#endif { "networkname", &Interpreter::ProcessNetworkName }, { "panid", &Interpreter::ProcessPanId }, { "parent", &Interpreter::ProcessParent }, @@ -158,16 +168,18 @@ const struct Command Interpreter::sCommands[] = { "prefix", &Interpreter::ProcessPrefix }, #if OPENTHREAD_FTD { "pskc", &Interpreter::ProcessPSKc }, -#endif { "releaserouterid", &Interpreter::ProcessReleaseRouterId }, +#endif { "reset", &Interpreter::ProcessReset }, { "rloc16", &Interpreter::ProcessRloc16 }, { "route", &Interpreter::ProcessRoute }, +#if OPENTHREAD_FTD { "router", &Interpreter::ProcessRouter }, { "routerdowngradethreshold", &Interpreter::ProcessRouterDowngradeThreshold }, { "routerrole", &Interpreter::ProcessRouterRole }, { "routerselectionjitter", &Interpreter::ProcessRouterSelectionJitter }, { "routerupgradethreshold", &Interpreter::ProcessRouterUpgradeThreshold }, +#endif { "scan", &Interpreter::ProcessScan }, { "singleton", &Interpreter::ProcessSingleton }, { "state", &Interpreter::ProcessState }, @@ -476,6 +488,7 @@ exit: AppendResult(error); } +#if OPENTHREAD_FTD void Interpreter::ProcessChild(int argc, char *argv[]) { ThreadError error = kThreadError_None; @@ -610,6 +623,7 @@ void Interpreter::ProcessChildMax(int argc, char *argv[]) exit: AppendResult(error); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessChildTimeout(int argc, char *argv[]) { @@ -641,6 +655,7 @@ void Interpreter::ProcessCoap(int argc, char *argv[]) #endif // OPENTHREAD_ENABLE_APPLICATION_COAP +#if OPENTHREAD_FTD void Interpreter::ProcessContextIdReuseDelay(int argc, char *argv[]) { ThreadError error = kThreadError_None; @@ -659,6 +674,7 @@ void Interpreter::ProcessContextIdReuseDelay(int argc, char *argv[]) exit: AppendResult(error); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessCounters(int argc, char *argv[]) { @@ -851,6 +867,7 @@ void Interpreter::HandleDnsResponse(const char *aHostname, Ip6::Address &aAddres } #endif +#if OPENTHREAD_FTD void Interpreter::ProcessEidCache(int argc, char *argv[]) { otEidCacheEntry entry; @@ -881,6 +898,7 @@ exit: (void)argv; AppendResult(kThreadError_None); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessEui64(int argc, char *argv[]) { @@ -1231,6 +1249,7 @@ exit: AppendResult(error); } +#if OPENTHREAD_FTD void Interpreter::ProcessLeaderPartitionId(int argc, char *argv[]) { ThreadError error = kThreadError_None; @@ -1268,6 +1287,7 @@ void Interpreter::ProcessLeaderWeight(int argc, char *argv[]) exit: AppendResult(error); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessLinkQuality(int argc, char *argv[]) { @@ -1431,6 +1451,7 @@ exit: AppendResult(error); } +#if OPENTHREAD_FTD void Interpreter::ProcessNetworkIdTimeout(int argc, char *argv[]) { ThreadError error = kThreadError_None; @@ -1449,6 +1470,7 @@ void Interpreter::ProcessNetworkIdTimeout(int argc, char *argv[]) exit: AppendResult(error); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessNetworkName(int argc, char *argv[]) { @@ -1977,6 +1999,7 @@ exit: AppendResult(error); } +#if OPENTHREAD_FTD void Interpreter::ProcessReleaseRouterId(int argc, char *argv[]) { ThreadError error = kThreadError_None; @@ -1990,6 +2013,7 @@ void Interpreter::ProcessReleaseRouterId(int argc, char *argv[]) exit: AppendResult(error); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessReset(int argc, char *argv[]) { @@ -2124,6 +2148,7 @@ exit: AppendResult(error); } +#if OPENTHREAD_FTD void Interpreter::ProcessRouter(int argc, char *argv[]) { ThreadError error = kThreadError_None; @@ -2299,6 +2324,7 @@ void Interpreter::ProcessRouterUpgradeThreshold(int argc, char *argv[]) exit: AppendResult(error); } +#endif // OPENTHREAD_FTD void Interpreter::ProcessScan(int argc, char *argv[]) { @@ -2396,6 +2422,8 @@ void Interpreter::ProcessState(int argc, char *argv[]) sServer->OutputFormat("child\r\n"); break; +#if OPENTHREAD_FTD + case kDeviceRoleRouter: sServer->OutputFormat("router\r\n"); break; @@ -2403,6 +2431,11 @@ void Interpreter::ProcessState(int argc, char *argv[]) case kDeviceRoleLeader: sServer->OutputFormat("leader\r\n"); break; +#endif // OPENTHREAD_FTD + + default: + sServer->OutputFormat("invalid state\r\n"); + break; } } else @@ -2415,6 +2448,8 @@ void Interpreter::ProcessState(int argc, char *argv[]) { SuccessOrExit(error = otThreadBecomeChild(mInstance, kMleAttachSamePartition1)); } + +#if OPENTHREAD_FTD else if (strcmp(argv[0], "router") == 0) { SuccessOrExit(error = otThreadBecomeRouter(mInstance)); @@ -2423,6 +2458,8 @@ void Interpreter::ProcessState(int argc, char *argv[]) { SuccessOrExit(error = otThreadBecomeLeader(mInstance)); } + +#endif // OPENTHREAD_FTD else { ExitNow(error = kThreadError_Parse); diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index e523212fa..c1fd1fb02 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -163,19 +163,25 @@ private: void ProcessBufferInfo(int argc, char *argv[]); void ProcessBlacklist(int argc, char *argv[]); void ProcessChannel(int argc, char *argv[]); +#if OPENTHREAD_FTD void ProcessChild(int argc, char *argv[]); - void ProcessChildTimeout(int argc, char *argv[]); void ProcessChildMax(int argc, char *argv[]); +#endif + void ProcessChildTimeout(int argc, char *argv[]); #if OPENTHREAD_ENABLE_APPLICATION_COAP void ProcessCoap(int argc, char *argv[]); #endif //OPENTHREAD_ENABLE_APPLICATION_COAP #if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD void ProcessCommissioner(int argc, char *argv[]); #endif // OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD +#if OPENTHREAD_FTD void ProcessContextIdReuseDelay(int argc, char *argv[]); +#endif void ProcessCounters(int argc, char *argv[]); void ProcessDataset(int argc, char *argv[]); +#if OPENTHREAD_FTD void ProcessDelayTimerMin(int argc, char *argv[]); +#endif #if OPENTHREAD_ENABLE_DIAG void ProcessDiag(int argc, char *argv[]); #endif // OPENTHREAD_ENABLE_DIAG @@ -183,7 +189,9 @@ private: #if OPENTHREAD_ENABLE_DNS_CLIENT void ProcessDns(int argc, char *argv[]); #endif +#if OPENTHREAD_FTD void ProcessEidCache(int argc, char *argv[]); +#endif void ProcessEui64(int argc, char *argv[]); #ifdef OPENTHREAD_EXAMPLES_POSIX void ProcessExit(int argc, char *argv[]); @@ -205,17 +213,23 @@ private: #if OPENTHREAD_ENABLE_JOINER void ProcessJoiner(int argc, char *argv[]); #endif // OPENTHREAD_ENABLE_JOINER +#if OPENTHREAD_FTD void ProcessJoinerPort(int argc, char *argv[]); +#endif void ProcessKeySequence(int argc, char *argv[]); void ProcessLeaderData(int argc, char *argv[]); +#if OPENTHREAD_FTD void ProcessLeaderPartitionId(int argc, char *argv[]); void ProcessLeaderWeight(int argc, char *argv[]); +#endif void ProcessLinkQuality(int argc, char *argv[]); void ProcessMasterKey(int argc, char *argv[]); void ProcessMode(int argc, char *argv[]); void ProcessNetworkDataRegister(int argc, char *argv[]); void ProcessNetworkDiagnostic(int argc, char *argv[]); +#if OPENTHREAD_FTD void ProcessNetworkIdTimeout(int argc, char *argv[]); +#endif void ProcessNetworkName(int argc, char *argv[]); void ProcessPanId(int argc, char *argv[]); void ProcessParent(int argc, char *argv[]); @@ -228,17 +242,19 @@ private: void ProcessPromiscuous(int argc, char *argv[]); #if OPENTHREAD_FTD void ProcessPSKc(int argc, char *argv[]); -#endif void ProcessReleaseRouterId(int argc, char *argv[]); +#endif void ProcessReset(int argc, char *argv[]); void ProcessRoute(int argc, char *argv[]); + ThreadError ProcessRouteAdd(int argc, char *argv[]); + ThreadError ProcessRouteRemove(int argc, char *argv[]); +#if OPENTHREAD_FTD void ProcessRouter(int argc, char *argv[]); void ProcessRouterDowngradeThreshold(int argc, char *argv[]); void ProcessRouterRole(int argc, char *argv[]); void ProcessRouterSelectionJitter(int argc, char *argv[]); - ThreadError ProcessRouteAdd(int argc, char *argv[]); - ThreadError ProcessRouteRemove(int argc, char *argv[]); void ProcessRouterUpgradeThreshold(int argc, char *argv[]); +#endif void ProcessRloc16(int argc, char *argv[]); void ProcessScan(int argc, char *argv[]); void ProcessSingleton(int argc, char *argv[]); diff --git a/src/core/Makefile.am b/src/core/Makefile.am index ace31f20e..248e34cda 100644 --- a/src/core/Makefile.am +++ b/src/core/Makefile.am @@ -264,8 +264,6 @@ HEADERS_COMMON = \ net/tcp.hpp \ net/udp6.hpp \ thread/address_resolver.hpp \ - thread/address_resolver_ftd.hpp \ - thread/address_resolver_mtd.hpp \ thread/announce_begin_server.hpp \ thread/data_poll_manager.hpp \ thread/energy_scan_server.hpp \ diff --git a/src/core/api/commissioner_api.cpp b/src/core/api/commissioner_api.cpp index 25c145ba5..c7b669cab 100644 --- a/src/core/api/commissioner_api.cpp +++ b/src/core/api/commissioner_api.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements the OpenThread UDP API. + * This file implements the OpenThread Commissioner API. */ #include "openthread/commissioner.h" diff --git a/src/core/api/dataset_ftd_api.cpp b/src/core/api/dataset_ftd_api.cpp index 9846f1743..477254559 100644 --- a/src/core/api/dataset_ftd_api.cpp +++ b/src/core/api/dataset_ftd_api.cpp @@ -31,14 +31,14 @@ * This file implements the OpenThread Operational Dataset API (FTD only). */ +#if OPENTHREAD_FTD + #include "openthread/dataset_ftd.h" #include "openthread-instance.h" using namespace ot; -#if OPENTHREAD_FTD - ThreadError otDatasetSetActive(otInstance *aInstance, const otOperationalDataset *aDataset) { ThreadError error; diff --git a/src/core/api/dhcp6_api.cpp b/src/core/api/dhcp6_api.cpp index 832a57822..de0ea40aa 100644 --- a/src/core/api/dhcp6_api.cpp +++ b/src/core/api/dhcp6_api.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements the OpenThread UDP API. + * This file implements the OpenThread DHCPv6 API. */ #include "openthread/dhcp6_client.h" diff --git a/src/core/api/icmp6_api.cpp b/src/core/api/icmp6_api.cpp index 1d2325e90..38d60c76a 100644 --- a/src/core/api/icmp6_api.cpp +++ b/src/core/api/icmp6_api.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements the OpenThread UDP API. + * This file implements the OpenThread ICMPv6 API. */ #include "openthread/icmp6.h" diff --git a/src/core/api/ip6_api.cpp b/src/core/api/ip6_api.cpp index b1027587e..188397013 100644 --- a/src/core/api/ip6_api.cpp +++ b/src/core/api/ip6_api.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements the OpenThread UDP API. + * This file implements the OpenThread IPv6 API. */ #define WPP_NAME "ip6_api.tmh" diff --git a/src/core/api/joiner_api.cpp b/src/core/api/joiner_api.cpp index 869f5d2a7..3df669b5c 100644 --- a/src/core/api/joiner_api.cpp +++ b/src/core/api/joiner_api.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements the OpenThread UDP API. + * This file implements the OpenThread Joiner API. */ #include "openthread/joiner.h" diff --git a/src/core/api/link_raw_api.cpp b/src/core/api/link_raw_api.cpp index d53bea741..51238ef95 100644 --- a/src/core/api/link_raw_api.cpp +++ b/src/core/api/link_raw_api.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements blacklist IEEE 802.15.4 frame filtering based on MAC address. + * This file implements the OpenThread Link Raw API. */ #include diff --git a/src/core/api/thread_api.cpp b/src/core/api/thread_api.cpp index 5baaa2fcc..206b9ace7 100644 --- a/src/core/api/thread_api.cpp +++ b/src/core/api/thread_api.cpp @@ -42,20 +42,6 @@ using namespace ot; -uint8_t otThreadGetMaxAllowedChildren(otInstance *aInstance) -{ - uint8_t aNumChildren; - - (void)aInstance->mThreadNetif.GetMle().GetChildren(&aNumChildren); - - return aNumChildren; -} - -ThreadError otThreadSetMaxAllowedChildren(otInstance *aInstance, uint8_t aMaxChildren) -{ - return aInstance->mThreadNetif.GetMle().SetMaxAllowedChildren(aMaxChildren); -} - uint32_t otThreadGetChildTimeout(otInstance *aInstance) { return aInstance->mThreadNetif.GetMle().GetTimeout(); @@ -249,46 +235,6 @@ exit: return error; } -bool otThreadIsRouterRoleEnabled(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().IsRouterRoleEnabled(); -} - -void otThreadSetRouterRoleEnabled(otInstance *aInstance, bool aEnabled) -{ - aInstance->mThreadNetif.GetMle().SetRouterRoleEnabled(aEnabled); -} - -uint8_t otThreadGetLocalLeaderWeight(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetLeaderWeight(); -} - -void otThreadSetLocalLeaderWeight(otInstance *aInstance, uint8_t aWeight) -{ - aInstance->mThreadNetif.GetMle().SetLeaderWeight(aWeight); -} - -uint32_t otThreadGetLocalLeaderPartitionId(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetLeaderPartitionId(); -} - -void otThreadSetLocalLeaderPartitionId(otInstance *aInstance, uint32_t aPartitionId) -{ - return aInstance->mThreadNetif.GetMle().SetLeaderPartitionId(aPartitionId); -} - -uint32_t otThreadGetContextIdReuseDelay(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetNetworkDataLeader().GetContextIdReuseDelay(); -} - -void otThreadSetContextIdReuseDelay(otInstance *aInstance, uint32_t aDelay) -{ - aInstance->mThreadNetif.GetNetworkDataLeader().SetContextIdReuseDelay(aDelay); -} - uint32_t otThreadGetKeySequenceCounter(otInstance *aInstance) { return aInstance->mThreadNetif.GetKeyManager().GetCurrentKeySequence(); @@ -309,31 +255,6 @@ void otThreadSetKeySwitchGuardTime(otInstance *aInstance, uint32_t aKeySwitchGua aInstance->mThreadNetif.GetKeyManager().SetKeySwitchGuardTime(aKeySwitchGuardTime); } -uint8_t otThreadGetNetworkIdTimeout(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetNetworkIdTimeout(); -} - -void otThreadSetNetworkIdTimeout(otInstance *aInstance, uint8_t aTimeout) -{ - aInstance->mThreadNetif.GetMle().SetNetworkIdTimeout((uint8_t)aTimeout); -} - -uint8_t otThreadGetRouterUpgradeThreshold(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetRouterUpgradeThreshold(); -} - -void otThreadSetRouterUpgradeThreshold(otInstance *aInstance, uint8_t aThreshold) -{ - aInstance->mThreadNetif.GetMle().SetRouterUpgradeThreshold(aThreshold); -} - -ThreadError otThreadReleaseRouterId(otInstance *aInstance, uint8_t aRouterId) -{ - return aInstance->mThreadNetif.GetMle().ReleaseRouterId(aRouterId); -} - ThreadError otThreadBecomeDetached(otInstance *aInstance) { return aInstance->mThreadNetif.GetMle().BecomeDetached(); @@ -344,78 +265,6 @@ ThreadError otThreadBecomeChild(otInstance *aInstance, otMleAttachFilter aFilter return aInstance->mThreadNetif.GetMle().BecomeChild(aFilter); } -ThreadError otThreadBecomeRouter(otInstance *aInstance) -{ - ThreadError error = kThreadError_InvalidState; - - switch (aInstance->mThreadNetif.GetMle().GetDeviceState()) - { - case Mle::kDeviceStateDisabled: - case Mle::kDeviceStateDetached: - break; - - case Mle::kDeviceStateChild: - error = aInstance->mThreadNetif.GetMle().BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); - break; - - case Mle::kDeviceStateRouter: - case Mle::kDeviceStateLeader: - error = kThreadError_None; - break; - } - - return error; -} - -ThreadError otThreadBecomeLeader(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().BecomeLeader(); -} - -uint8_t otThreadGetRouterDowngradeThreshold(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetRouterDowngradeThreshold(); -} - -void otThreadSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold) -{ - aInstance->mThreadNetif.GetMle().SetRouterDowngradeThreshold(aThreshold); -} - -uint8_t otThreadGetRouterSelectionJitter(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetRouterSelectionJitter(); -} - -void otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter) -{ - aInstance->mThreadNetif.GetMle().SetRouterSelectionJitter(aRouterJitter); -} - -ThreadError otThreadGetChildInfoById(otInstance *aInstance, uint16_t aChildId, otChildInfo *aChildInfo) -{ - ThreadError error = kThreadError_None; - - VerifyOrExit(aChildInfo != NULL, error = kThreadError_InvalidArgs); - - error = aInstance->mThreadNetif.GetMle().GetChildInfoById(aChildId, *aChildInfo); - -exit: - return error; -} - -ThreadError otThreadGetChildInfoByIndex(otInstance *aInstance, uint8_t aChildIndex, otChildInfo *aChildInfo) -{ - ThreadError error = kThreadError_None; - - VerifyOrExit(aChildInfo != NULL, error = kThreadError_InvalidArgs); - - error = aInstance->mThreadNetif.GetMle().GetChildInfoByIndex(aChildIndex, *aChildInfo); - -exit: - return error; -} - ThreadError otThreadGetNextNeighborInfo(otInstance *aInstance, otNeighborInfoIterator *aIterator, otNeighborInfo *aInfo) { ThreadError error = kThreadError_None; @@ -458,17 +307,6 @@ otDeviceRole otThreadGetDeviceRole(otInstance *aInstance) return rval; } -ThreadError otThreadGetEidCacheEntry(otInstance *aInstance, uint8_t aIndex, otEidCacheEntry *aEntry) -{ - ThreadError error; - - VerifyOrExit(aEntry != NULL, error = kThreadError_InvalidArgs); - error = aInstance->mThreadNetif.GetAddressResolver().GetEntry(aIndex, *aEntry); - -exit: - return error; -} - ThreadError otThreadGetLeaderData(otInstance *aInstance, otLeaderData *aLeaderData) { ThreadError error; @@ -501,23 +339,6 @@ uint16_t otThreadGetRloc16(otInstance *aInstance) return aInstance->mThreadNetif.GetMle().GetRloc16(); } -uint8_t otThreadGetRouterIdSequence(otInstance *aInstance) -{ - return aInstance->mThreadNetif.GetMle().GetRouterIdSequence(); -} - -ThreadError otThreadGetRouterInfo(otInstance *aInstance, uint16_t aRouterId, otRouterInfo *aRouterInfo) -{ - ThreadError error = kThreadError_None; - - VerifyOrExit(aRouterInfo != NULL, error = kThreadError_InvalidArgs); - - error = aInstance->mThreadNetif.GetMle().GetRouterInfo(aRouterId, *aRouterInfo); - -exit: - return error; -} - ThreadError otThreadGetParentInfo(otInstance *aInstance, otRouterInfo *aParentInfo) { ThreadError error = kThreadError_None; @@ -613,11 +434,6 @@ const char *otGetVersionString(void) return sVersion; } -ThreadError otThreadSetPreferredRouterId(otInstance *aInstance, uint8_t aRouterId) -{ - return aInstance->mThreadNetif.GetMle().SetPreferredRouterId(aRouterId); -} - void otThreadSetReceiveDiagnosticGetCallback(otInstance *aInstance, otReceiveDiagnosticGetCallback aCallback, void *aCallbackContext) { diff --git a/src/core/api/thread_ftd_api.cpp b/src/core/api/thread_ftd_api.cpp index 7a29e57af..a4b44c959 100644 --- a/src/core/api/thread_ftd_api.cpp +++ b/src/core/api/thread_ftd_api.cpp @@ -31,6 +31,8 @@ * This file implements the OpenThread Thread API (FTD only). */ +#if OPENTHREAD_FTD + #define WPP_NAME "thread_ftd_api.tmh" #include "openthread/thread_ftd.h" @@ -39,7 +41,55 @@ using namespace ot; -#if OPENTHREAD_FTD +uint8_t otThreadGetMaxAllowedChildren(otInstance *aInstance) +{ + uint8_t aNumChildren; + + (void)aInstance->mThreadNetif.GetMle().GetChildren(&aNumChildren); + + return aNumChildren; +} + +ThreadError otThreadSetMaxAllowedChildren(otInstance *aInstance, uint8_t aMaxChildren) +{ + return aInstance->mThreadNetif.GetMle().SetMaxAllowedChildren(aMaxChildren); +} + +bool otThreadIsRouterRoleEnabled(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().IsRouterRoleEnabled(); +} + +void otThreadSetRouterRoleEnabled(otInstance *aInstance, bool aEnabled) +{ + aInstance->mThreadNetif.GetMle().SetRouterRoleEnabled(aEnabled); +} + +ThreadError otThreadSetPreferredRouterId(otInstance *aInstance, uint8_t aRouterId) +{ + return aInstance->mThreadNetif.GetMle().SetPreferredRouterId(aRouterId); +} + + +uint8_t otThreadGetLocalLeaderWeight(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetLeaderWeight(); +} + +void otThreadSetLocalLeaderWeight(otInstance *aInstance, uint8_t aWeight) +{ + aInstance->mThreadNetif.GetMle().SetLeaderWeight(aWeight); +} + +uint32_t otThreadGetLocalLeaderPartitionId(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetLeaderPartitionId(); +} + +void otThreadSetLocalLeaderPartitionId(otInstance *aInstance, uint32_t aPartitionId) +{ + return aInstance->mThreadNetif.GetMle().SetLeaderPartitionId(aPartitionId); +} uint16_t otThreadGetJoinerUdpPort(otInstance *aInstance) { @@ -51,4 +101,140 @@ ThreadError otThreadSetJoinerUdpPort(otInstance *aInstance, uint16_t aJoinerUdpP return aInstance->mThreadNetif.GetJoinerRouter().SetJoinerUdpPort(aJoinerUdpPort); } +uint32_t otThreadGetContextIdReuseDelay(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetNetworkDataLeader().GetContextIdReuseDelay(); +} + +void otThreadSetContextIdReuseDelay(otInstance *aInstance, uint32_t aDelay) +{ + aInstance->mThreadNetif.GetNetworkDataLeader().SetContextIdReuseDelay(aDelay); +} + +uint8_t otThreadGetNetworkIdTimeout(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetNetworkIdTimeout(); +} + +void otThreadSetNetworkIdTimeout(otInstance *aInstance, uint8_t aTimeout) +{ + aInstance->mThreadNetif.GetMle().SetNetworkIdTimeout((uint8_t)aTimeout); +} + +uint8_t otThreadGetRouterUpgradeThreshold(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetRouterUpgradeThreshold(); +} + +void otThreadSetRouterUpgradeThreshold(otInstance *aInstance, uint8_t aThreshold) +{ + aInstance->mThreadNetif.GetMle().SetRouterUpgradeThreshold(aThreshold); +} + +ThreadError otThreadReleaseRouterId(otInstance *aInstance, uint8_t aRouterId) +{ + return aInstance->mThreadNetif.GetMle().ReleaseRouterId(aRouterId); +} + +ThreadError otThreadBecomeRouter(otInstance *aInstance) +{ + ThreadError error = kThreadError_InvalidState; + + switch (aInstance->mThreadNetif.GetMle().GetDeviceState()) + { + case Mle::kDeviceStateDisabled: + case Mle::kDeviceStateDetached: + break; + + case Mle::kDeviceStateChild: + error = aInstance->mThreadNetif.GetMle().BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); + break; + + case Mle::kDeviceStateRouter: + case Mle::kDeviceStateLeader: + error = kThreadError_None; + break; + } + + return error; +} + +ThreadError otThreadBecomeLeader(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().BecomeLeader(); +} + +uint8_t otThreadGetRouterDowngradeThreshold(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetRouterDowngradeThreshold(); +} + +void otThreadSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold) +{ + aInstance->mThreadNetif.GetMle().SetRouterDowngradeThreshold(aThreshold); +} + +uint8_t otThreadGetRouterSelectionJitter(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetRouterSelectionJitter(); +} + +void otThreadSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter) +{ + aInstance->mThreadNetif.GetMle().SetRouterSelectionJitter(aRouterJitter); +} + +ThreadError otThreadGetChildInfoById(otInstance *aInstance, uint16_t aChildId, otChildInfo *aChildInfo) +{ + ThreadError error = kThreadError_None; + + VerifyOrExit(aChildInfo != NULL, error = kThreadError_InvalidArgs); + + error = aInstance->mThreadNetif.GetMle().GetChildInfoById(aChildId, *aChildInfo); + +exit: + return error; +} + +ThreadError otThreadGetChildInfoByIndex(otInstance *aInstance, uint8_t aChildIndex, otChildInfo *aChildInfo) +{ + ThreadError error = kThreadError_None; + + VerifyOrExit(aChildInfo != NULL, error = kThreadError_InvalidArgs); + + error = aInstance->mThreadNetif.GetMle().GetChildInfoByIndex(aChildIndex, *aChildInfo); + +exit: + return error; +} + +uint8_t otThreadGetRouterIdSequence(otInstance *aInstance) +{ + return aInstance->mThreadNetif.GetMle().GetRouterIdSequence(); +} + +ThreadError otThreadGetRouterInfo(otInstance *aInstance, uint16_t aRouterId, otRouterInfo *aRouterInfo) +{ + ThreadError error = kThreadError_None; + + VerifyOrExit(aRouterInfo != NULL, error = kThreadError_InvalidArgs); + + error = aInstance->mThreadNetif.GetMle().GetRouterInfo(aRouterId, *aRouterInfo); + +exit: + return error; +} + + +ThreadError otThreadGetEidCacheEntry(otInstance *aInstance, uint8_t aIndex, otEidCacheEntry *aEntry) +{ + ThreadError error; + + VerifyOrExit(aEntry != NULL, error = kThreadError_InvalidArgs); + error = aInstance->mThreadNetif.GetAddressResolver().GetEntry(aIndex, *aEntry); + +exit: + return error; +} + #endif // OPENTHREAD_FTD diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index f2a86a285..cd2c3c0a4 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -32,6 +32,8 @@ * */ +#if OPENTHREAD_FTD + #define WPP_NAME "dataset_manager.tmh" #ifdef OPENTHREAD_CONFIG_FILE @@ -60,8 +62,6 @@ #include #include -#if OPENTHREAD_FTD - namespace ot { namespace MeshCoP { diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index 7940fa00f..81736cd59 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -31,6 +31,8 @@ * This file implements the Joiner Router role. */ +#if OPENTHREAD_FTD + #define WPP_NAME "joiner_router.tmh" #ifdef OPENTHREAD_CONFIG_FILE @@ -39,8 +41,6 @@ #include #endif -#if OPENTHREAD_FTD - #include #include diff --git a/src/core/meshcop/leader.cpp b/src/core/meshcop/leader.cpp index ea0947ad3..1c2f63aa2 100644 --- a/src/core/meshcop/leader.cpp +++ b/src/core/meshcop/leader.cpp @@ -31,6 +31,8 @@ * This file implements a MeshCoP Leader. */ +#if OPENTHREAD_FTD + #define WPP_NAME "leader.tmh" #ifdef OPENTHREAD_CONFIG_FILE @@ -39,8 +41,6 @@ #include #endif -#if OPENTHREAD_FTD - #include #include "openthread/platform/random.h" diff --git a/src/core/thread/address_resolver.hpp b/src/core/thread/address_resolver.hpp index e48648ac0..e7623290f 100644 --- a/src/core/thread/address_resolver.hpp +++ b/src/core/thread/address_resolver.hpp @@ -26,12 +26,185 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#if OPENTHREAD_MTD -#include "address_resolver_mtd.hpp" -#elif OPENTHREAD_FTD -#include "address_resolver_ftd.hpp" -#else -#error "Please define OPENTHREAD_MTD=1 or OPENTHREAD_FTD=1" -#endif +/** + * @file + * This file includes definitions for Thread EID-to-RLOC mapping and caching. + */ +#ifndef ADDRESS_RESOLVER_HPP_ +#define ADDRESS_RESOLVER_HPP_ +#include + +#include "openthread/types.h" + +#include +#include +#include +#include +#include +#include + +namespace ot { + +class MeshForwarder; +class ThreadLastTransactionTimeTlv; +class ThreadMeshLocalEidTlv; +class ThreadNetif; +class ThreadTargetTlv; + +/** + * @addtogroup core-arp + * + * @brief + * This module includes definitions for Thread EID-to-RLOC mapping and caching. + * + * @{ + */ + +/** + * This class implements the EID-to-RLOC mapping and caching. + * + */ +class AddressResolver +{ +public: + /** + * This constructor initializes the object. + * + */ + explicit AddressResolver(ThreadNetif &aThreadNetif); + + /** + * This method returns the pointer to the parent otInstance structure. + * + * @returns The pointer to the parent otInstance structure. + * + */ + otInstance *GetInstance(void); + + /** + * This method clears the EID-to-RLOC cache. + * + */ + void Clear(void); + + /** + * This method gets an EID cache entry. + * + * @param[in] aIndex An index into the EID cache table. + * @param[out] aEntry A pointer to where the EID information is placed. + * + * @retval kThreadError_None Successfully retrieved the EID cache entry. + * @retval kThreadError_InvalidArgs @p aIndex was out of bounds or @p aEntry was NULL. + * + */ + ThreadError GetEntry(uint8_t aIndex, otEidCacheEntry &aEntry) const; + + /** + * This method removes a Router ID from the EID-to-RLOC cache. + * + * @param[in] aRouterId The Router ID. + * + */ + void Remove(uint8_t aRouterId); + + /** + * This method returns the RLOC16 for a given EID, or initiates an Address Query if the mapping is not known. + * + * @param[in] aEid A reference to the EID. + * @param[out] aRloc16 The RLOC16 corresponding to @p aEid. + * + * @retval kTheradError_None Successfully provided the RLOC16. + * @retval kThreadError_AddressQuery Initiated an Address Query. + * + */ + ThreadError Resolve(const Ip6::Address &aEid, Mac::ShortAddress &aRloc16); + +private: + enum + { + kCacheEntries = OPENTHREAD_CONFIG_ADDRESS_CACHE_ENTRIES, + kStateUpdatePeriod = 1000u, ///< State update period in milliseconds. + }; + + /** + * Thread Protocol Parameters and Constants + * + */ + enum + { + kAddressQueryTimeout = 3, ///< ADDRESS_QUERY_TIMEOUT (seconds) + kAddressQueryInitialRetryDelay = 15, ///< ADDRESS_QUERY_INITIAL_RETRY_DELAY (seconds) + kAddressQueryMaxRetryDelay = 28800, ///< ADDRESS_QUERY_MAX_RETRY_DELAY (seconds) + }; + + struct Cache + { + Ip6::Address mTarget; + uint8_t mMeshLocalIid[Ip6::Address::kInterfaceIdentifierSize]; + uint32_t mLastTransactionTime; + Mac::ShortAddress mRloc16; + uint16_t mRetryTimeout; + uint8_t mTimeout; + uint8_t mFailures; + uint8_t mAge; + + enum State + { + kStateInvalid, + kStateQuery, + kStateCached, + }; + State mState; + }; + + Cache *NewCacheEntry(void); + void MarkCacheEntryAsUsed(Cache &aEntry); + void InvalidateCacheEntry(Cache &aEntry); + + ThreadError SendAddressQuery(const Ip6::Address &aEid); + ThreadError SendAddressError(const ThreadTargetTlv &aTarget, const ThreadMeshLocalEidTlv &aEid, + const Ip6::Address *aDestination); + void SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv, const ThreadMeshLocalEidTlv &aMlEidTlv, + const ThreadLastTransactionTimeTlv *aLastTransactionTimeTlv, + const Ip6::Address &aDestination); + + static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo); + + static void HandleAddressError(void *aContext, otCoapHeader *aHeader, otMessage *aMessage, + const otMessageInfo *aMessageInfo); + void HandleAddressError(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + + static void HandleAddressQuery(void *aContext, otCoapHeader *aHeader, otMessage *aMessage, + const otMessageInfo *aMessageInfo); + void HandleAddressQuery(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + + static void HandleAddressNotification(void *aContext, otCoapHeader *aHeader, otMessage *aMessage, + const otMessageInfo *aMessageInfo); + void HandleAddressNotification(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + + static void HandleIcmpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo, + const otIcmp6Header *aIcmpHeader); + void HandleIcmpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Ip6::IcmpHeader &aIcmpHeader); + + static void HandleTimer(void *aContext); + void HandleTimer(void); + + Coap::Resource mAddressError; + Coap::Resource mAddressQuery; + Coap::Resource mAddressNotification; + Cache mCache[kCacheEntries]; + Ip6::IcmpHandler mIcmpHandler; + Timer mTimer; + + ThreadNetif &mNetif; +}; + +/** + * @} + */ + +} // namespace ot + +#endif // ADDRESS_RESOLVER_HPP_ diff --git a/src/core/thread/address_resolver_ftd.hpp b/src/core/thread/address_resolver_ftd.hpp deleted file mode 100644 index e7623290f..000000000 --- a/src/core/thread/address_resolver_ftd.hpp +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 2016, The OpenThread Authors. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * This file includes definitions for Thread EID-to-RLOC mapping and caching. - */ - -#ifndef ADDRESS_RESOLVER_HPP_ -#define ADDRESS_RESOLVER_HPP_ - -#include - -#include "openthread/types.h" - -#include -#include -#include -#include -#include -#include - -namespace ot { - -class MeshForwarder; -class ThreadLastTransactionTimeTlv; -class ThreadMeshLocalEidTlv; -class ThreadNetif; -class ThreadTargetTlv; - -/** - * @addtogroup core-arp - * - * @brief - * This module includes definitions for Thread EID-to-RLOC mapping and caching. - * - * @{ - */ - -/** - * This class implements the EID-to-RLOC mapping and caching. - * - */ -class AddressResolver -{ -public: - /** - * This constructor initializes the object. - * - */ - explicit AddressResolver(ThreadNetif &aThreadNetif); - - /** - * This method returns the pointer to the parent otInstance structure. - * - * @returns The pointer to the parent otInstance structure. - * - */ - otInstance *GetInstance(void); - - /** - * This method clears the EID-to-RLOC cache. - * - */ - void Clear(void); - - /** - * This method gets an EID cache entry. - * - * @param[in] aIndex An index into the EID cache table. - * @param[out] aEntry A pointer to where the EID information is placed. - * - * @retval kThreadError_None Successfully retrieved the EID cache entry. - * @retval kThreadError_InvalidArgs @p aIndex was out of bounds or @p aEntry was NULL. - * - */ - ThreadError GetEntry(uint8_t aIndex, otEidCacheEntry &aEntry) const; - - /** - * This method removes a Router ID from the EID-to-RLOC cache. - * - * @param[in] aRouterId The Router ID. - * - */ - void Remove(uint8_t aRouterId); - - /** - * This method returns the RLOC16 for a given EID, or initiates an Address Query if the mapping is not known. - * - * @param[in] aEid A reference to the EID. - * @param[out] aRloc16 The RLOC16 corresponding to @p aEid. - * - * @retval kTheradError_None Successfully provided the RLOC16. - * @retval kThreadError_AddressQuery Initiated an Address Query. - * - */ - ThreadError Resolve(const Ip6::Address &aEid, Mac::ShortAddress &aRloc16); - -private: - enum - { - kCacheEntries = OPENTHREAD_CONFIG_ADDRESS_CACHE_ENTRIES, - kStateUpdatePeriod = 1000u, ///< State update period in milliseconds. - }; - - /** - * Thread Protocol Parameters and Constants - * - */ - enum - { - kAddressQueryTimeout = 3, ///< ADDRESS_QUERY_TIMEOUT (seconds) - kAddressQueryInitialRetryDelay = 15, ///< ADDRESS_QUERY_INITIAL_RETRY_DELAY (seconds) - kAddressQueryMaxRetryDelay = 28800, ///< ADDRESS_QUERY_MAX_RETRY_DELAY (seconds) - }; - - struct Cache - { - Ip6::Address mTarget; - uint8_t mMeshLocalIid[Ip6::Address::kInterfaceIdentifierSize]; - uint32_t mLastTransactionTime; - Mac::ShortAddress mRloc16; - uint16_t mRetryTimeout; - uint8_t mTimeout; - uint8_t mFailures; - uint8_t mAge; - - enum State - { - kStateInvalid, - kStateQuery, - kStateCached, - }; - State mState; - }; - - Cache *NewCacheEntry(void); - void MarkCacheEntryAsUsed(Cache &aEntry); - void InvalidateCacheEntry(Cache &aEntry); - - ThreadError SendAddressQuery(const Ip6::Address &aEid); - ThreadError SendAddressError(const ThreadTargetTlv &aTarget, const ThreadMeshLocalEidTlv &aEid, - const Ip6::Address *aDestination); - void SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv, const ThreadMeshLocalEidTlv &aMlEidTlv, - const ThreadLastTransactionTimeTlv *aLastTransactionTimeTlv, - const Ip6::Address &aDestination); - - static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo); - - static void HandleAddressError(void *aContext, otCoapHeader *aHeader, otMessage *aMessage, - const otMessageInfo *aMessageInfo); - void HandleAddressError(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - - static void HandleAddressQuery(void *aContext, otCoapHeader *aHeader, otMessage *aMessage, - const otMessageInfo *aMessageInfo); - void HandleAddressQuery(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - - static void HandleAddressNotification(void *aContext, otCoapHeader *aHeader, otMessage *aMessage, - const otMessageInfo *aMessageInfo); - void HandleAddressNotification(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - - static void HandleIcmpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo, - const otIcmp6Header *aIcmpHeader); - void HandleIcmpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Ip6::IcmpHeader &aIcmpHeader); - - static void HandleTimer(void *aContext); - void HandleTimer(void); - - Coap::Resource mAddressError; - Coap::Resource mAddressQuery; - Coap::Resource mAddressNotification; - Cache mCache[kCacheEntries]; - Ip6::IcmpHandler mIcmpHandler; - Timer mTimer; - - ThreadNetif &mNetif; -}; - -/** - * @} - */ - -} // namespace ot - -#endif // ADDRESS_RESOLVER_HPP_ diff --git a/src/core/thread/address_resolver_mtd.hpp b/src/core/thread/address_resolver_mtd.hpp deleted file mode 100644 index 6436d496b..000000000 --- a/src/core/thread/address_resolver_mtd.hpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2016, The OpenThread Authors. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * This file includes definitions for Thread EID-to-RLOC mapping and caching. - */ - -#ifndef ADDRESS_RESOLVER_HPP_ -#define ADDRESS_RESOLVER_HPP_ - -#include "openthread/types.h" - -namespace ot { - -class AddressResolver -{ -public: - explicit AddressResolver(ThreadNetif &) { } - void Clear(void) { } - ThreadError GetEntry(uint8_t, otEidCacheEntry &) const { return kThreadError_NotImplemented; } - void Remove(uint8_t) { } - ThreadError Resolve(const Ip6::Address &, Mac::ShortAddress &) { return kThreadError_NotImplemented; } -}; - -} // namespace ot - -#endif // ADDRESS_RESOLVER_HPP_ diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index a675db465..7e173b2d0 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -620,9 +620,6 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage) { ThreadError error = kThreadError_None; Ip6::Header ip6Header; - uint16_t rloc16; - uint16_t aloc16; - Neighbor *neighbor; mAddMeshHeader = false; @@ -672,106 +669,116 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage) break; - case Mle::kDeviceStateRouter: - case Mle::kDeviceStateLeader: - if (ip6Header.GetDestination().IsLinkLocal() || ip6Header.GetDestination().IsMulticast()) +#if OPENTHREAD_FTD { - GetMacDestinationAddress(ip6Header.GetDestination(), mMacDest); - GetMacSourceAddress(ip6Header.GetSource(), mMacSource); - } - else - { - if (mNetif.GetMle().IsRoutingLocator(ip6Header.GetDestination())) + case Mle::kDeviceStateRouter: + case Mle::kDeviceStateLeader: + uint16_t rloc16; + uint16_t aloc16; + Neighbor *neighbor; + + if (ip6Header.GetDestination().IsLinkLocal() || ip6Header.GetDestination().IsMulticast()) { - rloc16 = HostSwap16(ip6Header.GetDestination().mFields.m16[7]); - VerifyOrExit(mNetif.GetMle().IsRouterIdValid(mNetif.GetMle().GetRouterId(rloc16)), - error = kThreadError_Drop); - mMeshDest = rloc16; - } - else if (mNetif.GetMle().IsAnycastLocator(ip6Header.GetDestination())) - { - // only support Leader ALOC for now - aloc16 = HostSwap16(ip6Header.GetDestination().mFields.m16[7]); - - if (aloc16 == Mle::kAloc16Leader) - { - mMeshDest = mNetif.GetMle().GetRloc16(mNetif.GetMle().GetLeaderId()); - } - -#if OPENTHREAD_ENABLE_DHCP6_SERVER || OPENTHREAD_ENABLE_DHCP6_CLIENT - else if ((aloc16 & Mle::kAloc16DhcpAgentMask) != 0) - { - uint16_t agentRloc16; - uint8_t routerId; - VerifyOrExit((mNetif.GetNetworkDataLeader().GetRlocByContextId( - static_cast(aloc16 & Mle::kAloc16DhcpAgentMask), - agentRloc16) == kThreadError_None), - error = kThreadError_Drop); - - routerId = mNetif.GetMle().GetRouterId(agentRloc16); - - // if agent is active router or the child of the device - if ((mNetif.GetMle().IsActiveRouter(agentRloc16)) || - (mNetif.GetMle().GetRloc16(routerId) == mNetif.GetMle().GetRloc16())) - { - mMeshDest = agentRloc16; - } - else - { - // use the parent of the ED Agent as Dest - mMeshDest = mNetif.GetMle().GetRloc16(routerId); - } - } - -#endif // OPENTHREAD_ENABLE_DHCP6_SERVER || OPENTHREAD_ENABLE_DHCP6_CLIENT - else - { - // TODO: support ALOC for DHCPv6 Agent, Service, Commissioner, Neighbor Discovery Agent - ExitNow(error = kThreadError_Drop); - } - } - else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL) - { - mMeshDest = neighbor->GetRloc16(); - } - else if (mNetif.GetNetworkDataLeader().IsOnMesh(ip6Header.GetDestination())) - { - SuccessOrExit(error = mNetif.GetAddressResolver().Resolve(ip6Header.GetDestination(), mMeshDest)); - } - else - { - mNetif.GetNetworkDataLeader().RouteLookup( - ip6Header.GetSource(), - ip6Header.GetDestination(), - NULL, - &mMeshDest - ); - } - - VerifyOrExit(mMeshDest != Mac::kShortAddrInvalid, error = kThreadError_Drop); - - if (mNetif.GetMle().GetNeighbor(mMeshDest) != NULL) - { - // destination is neighbor - mMacDest.mLength = sizeof(mMacDest.mShortAddress); - mMacDest.mShortAddress = mMeshDest; + GetMacDestinationAddress(ip6Header.GetDestination(), mMacDest); GetMacSourceAddress(ip6Header.GetSource(), mMacSource); } else { - // destination is not neighbor - mMeshSource = mNetif.GetMac().GetShortAddress(); + if (mNetif.GetMle().IsRoutingLocator(ip6Header.GetDestination())) + { + rloc16 = HostSwap16(ip6Header.GetDestination().mFields.m16[7]); + VerifyOrExit(mNetif.GetMle().IsRouterIdValid(mNetif.GetMle().GetRouterId(rloc16)), + error = kThreadError_Drop); + mMeshDest = rloc16; + } + else if (mNetif.GetMle().IsAnycastLocator(ip6Header.GetDestination())) + { + aloc16 = HostSwap16(ip6Header.GetDestination().mFields.m16[7]); - SuccessOrExit(error = mNetif.GetMle().CheckReachability(mMeshSource, mMeshDest, ip6Header)); + if (aloc16 == Mle::kAloc16Leader) + { + mMeshDest = mNetif.GetMle().GetRloc16(mNetif.GetMle().GetLeaderId()); + } - mMacDest.mLength = sizeof(mMacDest.mShortAddress); - mMacDest.mShortAddress = mNetif.GetMle().GetNextHop(mMeshDest); - mMacSource.mLength = sizeof(mMacSource.mShortAddress); - mMacSource.mShortAddress = mMeshSource; - mAddMeshHeader = true; +#if OPENTHREAD_ENABLE_DHCP6_SERVER || OPENTHREAD_ENABLE_DHCP6_CLIENT + else if ((aloc16 & Mle::kAloc16DhcpAgentMask) != 0) + { + uint16_t agentRloc16; + uint8_t routerId; + VerifyOrExit((mNetif.GetNetworkDataLeader().GetRlocByContextId( + static_cast(aloc16 & Mle::kAloc16DhcpAgentMask), + agentRloc16) == kThreadError_None), + error = kThreadError_Drop); + + routerId = mNetif.GetMle().GetRouterId(agentRloc16); + + // if agent is active router or the child of the device + if ((mNetif.GetMle().IsActiveRouter(agentRloc16)) || + (mNetif.GetMle().GetRloc16(routerId) == mNetif.GetMle().GetRloc16())) + { + mMeshDest = agentRloc16; + } + else + { + // use the parent of the ED Agent as Dest + mMeshDest = mNetif.GetMle().GetRloc16(routerId); + } + } + +#endif // OPENTHREAD_ENABLE_DHCP6_SERVER || OPENTHREAD_ENABLE_DHCP6_CLIENT + else + { + // TODO: support ALOC for Service, Commissioner, Neighbor Discovery Agent + ExitNow(error = kThreadError_Drop); + } + } + else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL) + { + mMeshDest = neighbor->GetRloc16(); + } + else if (mNetif.GetNetworkDataLeader().IsOnMesh(ip6Header.GetDestination())) + { + SuccessOrExit(error = mNetif.GetAddressResolver().Resolve(ip6Header.GetDestination(), mMeshDest)); + } + else + { + mNetif.GetNetworkDataLeader().RouteLookup( + ip6Header.GetSource(), + ip6Header.GetDestination(), + NULL, + &mMeshDest + ); + } + + VerifyOrExit(mMeshDest != Mac::kShortAddrInvalid, error = kThreadError_Drop); + + if (mNetif.GetMle().GetNeighbor(mMeshDest) != NULL) + { + // destination is neighbor + mMacDest.mLength = sizeof(mMacDest.mShortAddress); + mMacDest.mShortAddress = mMeshDest; + GetMacSourceAddress(ip6Header.GetSource(), mMacSource); + } + else + { + // destination is not neighbor + mMeshSource = mNetif.GetMac().GetShortAddress(); + + SuccessOrExit(error = mNetif.GetMle().CheckReachability(mMeshSource, mMeshDest, ip6Header)); + + mMacDest.mLength = sizeof(mMacDest.mShortAddress); + mMacDest.mShortAddress = mNetif.GetMle().GetNextHop(mMeshDest); + mMacSource.mLength = sizeof(mMacSource.mShortAddress); + mMacSource.mShortAddress = mMeshSource; + mAddMeshHeader = true; + } } - } + break; + } +#endif // OPENTHREAD_FTD + + default: break; } diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index cf2948563..2255c8b88 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -77,8 +77,6 @@ Mle::Mle(ThreadNetif &aThreadNetif) : mReattachState(kReattachStop), mParentRequestTimer(aThreadNetif.GetIp6().mTimerScheduler, &Mle::HandleParentRequestTimer, this), mDelayedResponseTimer(aThreadNetif.GetIp6().mTimerScheduler, &Mle::HandleDelayedResponseTimer, this), - mRouterSelectionJitter(kRouterSelectionJitter), - mRouterSelectionJitterTimeout(0), mLastPartitionRouterIdSequence(0), mLastPartitionId(0), mParentRequestMode(kMleAttachAnyPartition), @@ -552,7 +550,6 @@ ThreadError Mle::SetStateDetached(void) mNetif.RemoveUnicastAddress(mLeaderAloc); } - mNetif.GetAddressResolver().Clear(); mDeviceState = kDeviceStateDetached; mParentRequestState = kParentIdle; mParentRequestTimer.Stop(); @@ -899,18 +896,6 @@ void Mle::SetAssignLinkQuality(const Mac::ExtAddress aMacAddr, uint8_t aLinkQual } } -ThreadError Mle::SetRouterSelectionJitter(uint8_t aRouterJitter) -{ - ThreadError error = kThreadError_None; - - VerifyOrExit(aRouterJitter > 0, error = kThreadError_InvalidArgs); - - mRouterSelectionJitter = aRouterJitter; - -exit: - return error; -} - void Mle::GenerateNonce(const Mac::ExtAddress &aMacAddr, uint32_t aFrameCounter, uint8_t aSecurityLevel, uint8_t *aNonce) { diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index f30d0201f..b89acf2a6 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -48,7 +48,6 @@ namespace ot { class ThreadNetif; -class AddressResolver; class KeyManager; class MeshForwarder; @@ -846,22 +845,6 @@ public: */ void SetAssignLinkQuality(const Mac::ExtAddress aMacAddr, uint8_t aLinkQuality); - /** - * This method returns the ROUTER_SELECTION_JITTER value. - * - * @returns The ROUTER_SELECTION_JITTER value. - * - */ - uint8_t GetRouterSelectionJitter(void) const { return mRouterSelectionJitter; } - - /** - * This method sets the ROUTER_SELECTION_JITTER value. - * - * @returns The ROUTER_SELECTION_JITTER value. - * - */ - ThreadError SetRouterSelectionJitter(uint8_t aRouterJitter); - /** * This method returns the Child ID portion of an RLOC16. * @@ -1374,10 +1357,6 @@ protected: Timer mParentRequestTimer; ///< The timer for driving the Parent Request process. Timer mDelayedResponseTimer; ///< The timer to delay MLE responses. - - uint8_t mRouterSelectionJitter; ///< The variable to save the assigned jitter value. - uint8_t mRouterSelectionJitterTimeout; ///< The Timeout prior to request/release Router ID. - uint8_t mLastPartitionRouterIdSequence; uint32_t mLastPartitionId; diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index ba3309c33..8229c9bec 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -65,7 +65,9 @@ MleRouter::MleRouter(ThreadNetif &aThreadNetif): mAdvertiseTimer(aThreadNetif.GetIp6().mTimerScheduler, &MleRouter::HandleAdvertiseTimer, NULL, this), mStateUpdateTimer(aThreadNetif.GetIp6().mTimerScheduler, &MleRouter::HandleStateUpdateTimer, this), mAddressSolicit(OPENTHREAD_URI_ADDRESS_SOLICIT, &MleRouter::HandleAddressSolicit, this), - mAddressRelease(OPENTHREAD_URI_ADDRESS_RELEASE, &MleRouter::HandleAddressRelease, this) + mAddressRelease(OPENTHREAD_URI_ADDRESS_RELEASE, &MleRouter::HandleAddressRelease, this), + mRouterSelectionJitter(kRouterSelectionJitter), + mRouterSelectionJitterTimeout(0) { mDeviceMode |= ModeTlv::kModeFFD | ModeTlv::kModeFullNetworkData; @@ -334,6 +336,8 @@ ThreadError MleRouter::HandleDetachStart(void) { ThreadError error = kThreadError_None; + mNetif.GetAddressResolver().Clear(); + for (int i = 0; i <= kMaxRouterId; i++) { mRouters[i].SetState(Neighbor::kStateInvalid); @@ -1131,6 +1135,18 @@ exit: return rval; } +ThreadError MleRouter::SetRouterSelectionJitter(uint8_t aRouterJitter) +{ + ThreadError error = kThreadError_None; + + VerifyOrExit(aRouterJitter > 0, error = kThreadError_InvalidArgs); + + mRouterSelectionJitter = aRouterJitter; + +exit: + return error; +} + ThreadError MleRouter::ProcessRouteTlv(const RouteTlv &aRoute) { ThreadError error = kThreadError_None; diff --git a/src/core/thread/mle_router_ftd.hpp b/src/core/thread/mle_router_ftd.hpp index 9bf936369..0d0a25bd8 100644 --- a/src/core/thread/mle_router_ftd.hpp +++ b/src/core/thread/mle_router_ftd.hpp @@ -52,6 +52,7 @@ namespace ot { namespace Mle { +class AddressResolver; class MeshForwarder; class NetworkDataLeader; @@ -274,6 +275,22 @@ public: */ uint8_t GetLinkCost(uint8_t aRouterId); + /** + * This method returns the ROUTER_SELECTION_JITTER value. + * + * @returns The ROUTER_SELECTION_JITTER value. + * + */ + uint8_t GetRouterSelectionJitter(void) const { return mRouterSelectionJitter; } + + /** + * This method sets the ROUTER_SELECTION_JITTER value. + * + * @returns The ROUTER_SELECTION_JITTER value. + * + */ + ThreadError SetRouterSelectionJitter(uint8_t aRouterJitter); + /** * This method returns the current Router ID Sequence value. * @@ -745,6 +762,9 @@ private: uint8_t mRouterId; uint8_t mPreviousRouterId; uint32_t mPreviousPartitionId; + + uint8_t mRouterSelectionJitter; ///< The variable to save the assigned jitter value. + uint8_t mRouterSelectionJitterTimeout; ///< The Timeout prior to request/release Router ID. }; } // namespace Mle diff --git a/src/core/thread/mle_router_mtd.hpp b/src/core/thread/mle_router_mtd.hpp index 41352d837..ad2cfd100 100644 --- a/src/core/thread/mle_router_mtd.hpp +++ b/src/core/thread/mle_router_mtd.hpp @@ -50,9 +50,6 @@ class MleRouter: public Mle public: explicit MleRouter(ThreadNetif &aThreadNetif) : Mle(aThreadNetif) { } - bool IsRouterRoleEnabled(void) const { return false; } - void SetRouterRoleEnabled(bool) { } - bool IsSingleton(void) { return false; } ThreadError BecomeRouter(ThreadStatusTlv::Status) { return kThreadError_NotCapable; } @@ -62,13 +59,6 @@ public: uint32_t GetLeaderAge(void) const { return 0; } - uint8_t GetLeaderWeight(void) const { return 0; } - void SetLeaderWeight(uint8_t) { } - - uint32_t GetLeaderPartitionId(void) const { return 0; } - void SetLeaderPartitionId(uint32_t) { } - - ThreadError SetPreferredRouterId(uint8_t) { return kThreadError_NotImplemented; } uint32_t GetPreviousPartitionId(void) const { return 0; } void SetPreviousPartitionId(uint32_t) { } void SetRouterId(uint8_t) { } @@ -76,21 +66,12 @@ public: uint16_t GetNextHop(uint16_t aDestination) const { return Mle::GetNextHop(aDestination); } uint8_t GetNetworkIdTimeout(void) const { return 0; } - void SetNetworkIdTimeout(uint8_t) { } uint8_t GetRouteCost(uint16_t) const { return 0; } uint8_t GetLinkCost(uint16_t) { return 0; } uint8_t GetRouterIdSequence(void) const { return 0; } - uint8_t GetRouterUpgradeThreshold(void) const { return 0; } - void SetRouterUpgradeThreshold(uint8_t) { } - - uint8_t GetRouterDowngradeThreshold(void) const { return 0; } - void SetRouterDowngradeThreshold(uint8_t) { } - - ThreadError ReleaseRouterId(uint8_t) { return kThreadError_NotImplemented; } - ThreadError RemoveNeighbor(const Mac::Address &) { return BecomeDetached(); } ThreadError RemoveNeighbor(Neighbor &) { return BecomeDetached(); } @@ -108,8 +89,6 @@ public: return NULL; } - ThreadError SetMaxAllowedChildren(uint8_t) { return kThreadError_NotImplemented; } - ThreadError RestoreChildren(void) {return kThreadError_NotImplemented; } ThreadError RemoveStoredChild(uint16_t) {return kThreadError_NotImplemented; } ThreadError StoreChild(uint16_t) {return kThreadError_NotImplemented; } @@ -120,9 +99,6 @@ public: Neighbor *GetNeighbor(const Mac::Address &aAddress) { return Mle::GetNeighbor(aAddress); } Neighbor *GetNeighbor(const Ip6::Address &aAddress) { return Mle::GetNeighbor(aAddress); } - ThreadError GetChildInfoById(uint16_t, otChildInfo &) { return kThreadError_NotImplemented; } - ThreadError GetChildInfoByIndex(uint8_t, otChildInfo &) { return kThreadError_NotImplemented; } - ThreadError GetNextNeighborInfo(otNeighborInfoIterator &, otNeighborInfo &) { return kThreadError_NotImplemented; } Router *GetRouters(uint8_t *aNumRouters) { @@ -133,8 +109,6 @@ public: return NULL; } - ThreadError GetRouterInfo(uint16_t, otRouterInfo &) { return kThreadError_NotImplemented; } - static int ComparePartitions(bool, const LeaderDataTlv &, bool, const LeaderDataTlv &) { return 0; } void ResolveRoutingLoops(uint16_t, uint16_t) { } diff --git a/src/core/thread/network_data_leader_mtd.hpp b/src/core/thread/network_data_leader_mtd.hpp index 65426c1ab..1e72e718f 100644 --- a/src/core/thread/network_data_leader_mtd.hpp +++ b/src/core/thread/network_data_leader_mtd.hpp @@ -53,11 +53,6 @@ public: void IncrementVersion(void) { } void IncrementStableVersion(void) { } - uint32_t GetContextIdReuseDelay(void) const { return 0; } - ThreadError SetContextIdReuseDelay(uint32_t) { return kThreadError_NotImplemented; } - - void RemoveBorderRouter(uint16_t) { } - ThreadError SendServerDataNotification(uint16_t) { return kThreadError_NotImplemented; } }; diff --git a/src/core/thread/network_data_local.cpp b/src/core/thread/network_data_local.cpp index f16545340..fdcdbc791 100644 --- a/src/core/thread/network_data_local.cpp +++ b/src/core/thread/network_data_local.cpp @@ -31,6 +31,8 @@ * This file implements the local Thread Network Data. */ +#if OPENTHREAD_FTD + #ifdef OPENTHREAD_CONFIG_FILE #include OPENTHREAD_CONFIG_FILE #else @@ -44,8 +46,6 @@ #include #include -#if OPENTHREAD_FTD - namespace ot { namespace NetworkData { diff --git a/src/core/thread/thread_netif.cpp b/src/core/thread/thread_netif.cpp index 3ffdfa63c..930dba857 100644 --- a/src/core/thread/thread_netif.cpp +++ b/src/core/thread/thread_netif.cpp @@ -64,7 +64,6 @@ ThreadNetif::ThreadNetif(Ip6::Ip6 &aIp6): Netif(aIp6, OT_NETIF_INTERFACE_ID_THREAD), mCoapServer(*this, kCoapUdpPort), mCoapClient(*this), - mAddressResolver(*this), #if OPENTHREAD_ENABLE_DHCP6_CLIENT mDhcp6Client(*this), #endif // OPENTHREAD_ENABLE_DHCP6_CLIENT @@ -104,6 +103,7 @@ ThreadNetif::ThreadNetif(Ip6::Ip6 &aIp6): #endif // OPENTHREAD_ENABLE_BORDER_AGENT_PROXY mJoinerRouter(*this), mLeader(*this), + mAddressResolver(*this), #endif // OPENTHREAD_FTD mAnnounceBegin(*this), mPanIdQuery(*this), diff --git a/src/core/thread/thread_netif.hpp b/src/core/thread/thread_netif.hpp index 6e7347e2b..2d414076f 100644 --- a/src/core/thread/thread_netif.hpp +++ b/src/core/thread/thread_netif.hpp @@ -161,14 +161,6 @@ public: */ virtual ThreadError RouteLookup(const Ip6::Address &aSource, const Ip6::Address &aDestination, uint8_t *aPrefixMatch); - /** - * This method returns a reference to the address resolver object. - * - * @returns A reference to the address resolver object. - * - */ - AddressResolver &GetAddressResolver(void) { return mAddressResolver; } - /** * This method returns a reference to the network diagnostic object. * @@ -287,31 +279,99 @@ public: */ NetworkData::Leader &GetNetworkDataLeader(void) { return mNetworkDataLeader; } + /** + * This method returns a reference to the active dataset object. + * + * @returns A reference to the active dataset object. + * + */ MeshCoP::ActiveDataset &GetActiveDataset(void) { return mActiveDataset; } + /** + * This method returns a reference to the pending dataset object. + * + * @returns A reference to the pending dataset object. + * + */ MeshCoP::PendingDataset &GetPendingDataset(void) { return mPendingDataset; } #if OPENTHREAD_FTD + /** + * This method returns a reference to the joiner router object. + * + * @returns A reference to the joiner router object. + * + */ MeshCoP::JoinerRouter &GetJoinerRouter(void) { return mJoinerRouter; } + /** + * This method returns a reference to the MeshCoP leader object. + * + * @returns A reference to the MeshCoP leader object. + * + */ MeshCoP::Leader &GetLeader(void) { return mLeader; } + + /** + * This method returns a reference to the address resolver object. + * + * @returns A reference to the address resolver object. + * + */ + AddressResolver &GetAddressResolver(void) { return mAddressResolver; } #endif // OPENTHREAD_FTD + /** + * This method returns a reference to the announce begin server object. + * + * @returns A reference to the announce begin server object. + * + */ AnnounceBeginServer &GetAnnounceBeginServer(void) { return mAnnounceBegin; } #if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD + /** + * This method returns a reference to the commissioner object. + * + * @returns A reference to the commissioenr object. + * + */ MeshCoP::Commissioner &GetCommissioner(void) { return mCommissioner; } + /** + * This method returns a reference to the secure CoAP server object. + * + * @returns A reference to the secure CoAP server object. + * + */ Coap::SecureServer &GetSecureCoapServer(void) { return mSecureCoapServer; } #endif // OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD #if OPENTHREAD_ENABLE_DTLS + /** + * This method returns a reference to the Dtls object. + * + * @returns A reference to the Dtls object. + * + */ MeshCoP::Dtls &GetDtls(void) { return mDtls; } #endif // OPENTHREAD_ENABLE_DTLS #if OPENTHREAD_ENABLE_JOINER + /** + * This method returns a reference to the joiner object. + * + * @returns A reference to the joiner object. + * + */ MeshCoP::Joiner &GetJoiner(void) { return mJoiner; } + /** + * This method returns a reference to the secure CoAP client object. + * + * @returns A reference to the secure CoAP client object. + * + */ Coap::SecureClient &GetSecureCoapClient(void) { return mSecureCoapClient; } #endif // OPENTHREAD_ENABLE_JOINER @@ -326,6 +386,12 @@ public: #endif // OPENTHREAD_ENABLE_JAM_DETECTION #if OPENTHREAD_ENABLE_BORDER_AGENT_PROXY && OPENTHREAD_FTD + /** + * This method returns the border agent proxy object. + * + * @returns Reference to the border agent proxy object. + * + */ MeshCoP::BorderAgentProxy &GetBorderAgentProxy(void) { return mBorderAgentProxy; } #endif // OPENTHREAD_ENABLE_BORDER_AGENT_PROXY && OPENTHREAD_FTD @@ -342,7 +408,6 @@ private: Coap::Server mCoapServer; Coap::Client mCoapClient; - AddressResolver mAddressResolver; #if OPENTHREAD_ENABLE_DHCP6_CLIENT Dhcp6::Dhcp6Client mDhcp6Client; #endif // OPENTHREAD_ENABLE_DHCP6_CLIENT @@ -383,12 +448,14 @@ private: Utils::JamDetector mJamDetector; #endif // OPENTHREAD_ENABLE_JAM_DETECTION -#if OPENTHREAD_FTD -#if OPENTHREAD_ENABLE_BORDER_AGENT_PROXY +#if OPENTHREAD_ENABLE_BORDER_AGENT_PROXY && OPENTHREAD_FTD MeshCoP::BorderAgentProxy mBorderAgentProxy; -#endif // OPENTHREAD_ENABLE_BORDER_AGENT_PROXY +#endif // OPENTHREAD_ENABLE_BORDER_AGENT_PROXY && OPENTHREAD_FTD + +#if OPENTHREAD_FTD MeshCoP::JoinerRouter mJoinerRouter; MeshCoP::Leader mLeader; + AddressResolver mAddressResolver; #endif // OPENTHREAD_FTD AnnounceBeginServer mAnnounceBegin; diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 5b8cc89da..7a3ec4fed 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -47,6 +47,10 @@ #include "openthread/border_agent_proxy.h" #endif +#if OPENTHREAD_FTD +#include "openthread/thread_ftd.h" +#endif + #if OPENTHREAD_ENABLE_JAM_DETECTION #include "openthread/jam_detection.h" #endif @@ -141,17 +145,12 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] = { SPINEL_PROP_NET_KEY_SEQUENCE_COUNTER, &NcpBase::GetPropertyHandler_NET_KEY_SEQUENCE_COUNTER }, { SPINEL_PROP_NET_PARTITION_ID, &NcpBase::GetPropertyHandler_NET_PARTITION_ID }, { SPINEL_PROP_NET_KEY_SWITCH_GUARDTIME, &NcpBase::GetPropertyHandler_NET_KEY_SWITCH_GUARDTIME}, -#if OPENTHREAD_FTD - { SPINEL_PROP_NET_PSKC, &NcpBase::GetPropertyHandler_NET_PSKC }, -#endif { SPINEL_PROP_THREAD_LEADER_ADDR, &NcpBase::GetPropertyHandler_THREAD_LEADER_ADDR }, { SPINEL_PROP_THREAD_PARENT, &NcpBase::GetPropertyHandler_THREAD_PARENT }, - { SPINEL_PROP_THREAD_CHILD_TABLE, &NcpBase::GetPropertyHandler_THREAD_CHILD_TABLE }, { SPINEL_PROP_THREAD_NEIGHBOR_TABLE, &NcpBase::GetPropertyHandler_THREAD_NEIGHBOR_TABLE }, { SPINEL_PROP_THREAD_LEADER_RID, &NcpBase::GetPropertyHandler_THREAD_LEADER_RID }, { SPINEL_PROP_THREAD_LEADER_WEIGHT, &NcpBase::GetPropertyHandler_THREAD_LEADER_WEIGHT }, - { SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT, &NcpBase::GetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT }, { SPINEL_PROP_THREAD_NETWORK_DATA, &NcpBase::GetPropertyHandler_THREAD_NETWORK_DATA }, { SPINEL_PROP_THREAD_NETWORK_DATA_VERSION, &NcpBase::GetPropertyHandler_THREAD_NETWORK_DATA_VERSION }, { SPINEL_PROP_THREAD_STABLE_NETWORK_DATA, &NcpBase::GetPropertyHandler_THREAD_STABLE_NETWORK_DATA }, @@ -161,7 +160,6 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] = { SPINEL_PROP_THREAD_LOCAL_ROUTES, &NcpBase::GetPropertyHandler_THREAD_LOCAL_ROUTES }, { SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::GetPropertyHandler_THREAD_ASSISTING_PORTS }, { SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, &NcpBase::GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE }, - { SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED }, #if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD { SPINEL_PROP_THREAD_COMMISSIONER_ENABLED, &NcpBase::GetPropertyHandler_THREAD_COMMISSIONER_ENABLED }, @@ -170,16 +168,10 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] = { SPINEL_PROP_MAC_WHITELIST, &NcpBase::GetPropertyHandler_MAC_WHITELIST }, { SPINEL_PROP_MAC_WHITELIST_ENABLED, &NcpBase::GetPropertyHandler_MAC_WHITELIST_ENABLED }, { SPINEL_PROP_THREAD_MODE, &NcpBase::GetPropertyHandler_THREAD_MODE }, - { SPINEL_PROP_THREAD_CHILD_COUNT_MAX, &NcpBase::GetPropertyHandler_THREAD_CHILD_COUNT_MAX }, { SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::GetPropertyHandler_THREAD_CHILD_TIMEOUT }, { SPINEL_PROP_THREAD_RLOC16, &NcpBase::GetPropertyHandler_THREAD_RLOC16 }, - { SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD }, - { SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_DOWNGRADE_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_THREAD_ON_MESH_NETS, &NcpBase::GetPropertyHandler_THREAD_ON_MESH_NETS }, { SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING, &NcpBase::GetPropertyHandler_NET_REQUIRE_JOIN_EXISTING }, - { SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER, &NcpBase::GetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER }, { SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::GetPropertyHandler_IPV6_ML_PREFIX }, { SPINEL_PROP_IPV6_ML_ADDR, &NcpBase::GetPropertyHandler_IPV6_ML_ADDR }, @@ -191,6 +183,19 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] = { SPINEL_PROP_STREAM_NET, &NcpBase::GetPropertyHandler_STREAM_NET }, +#if OPENTHREAD_FTD + { SPINEL_PROP_THREAD_CHILD_TABLE, &NcpBase::GetPropertyHandler_THREAD_CHILD_TABLE }, + { SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT, &NcpBase::GetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT }, + { SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED }, + { SPINEL_PROP_NET_PSKC, &NcpBase::GetPropertyHandler_NET_PSKC }, + { SPINEL_PROP_THREAD_CHILD_COUNT_MAX, &NcpBase::GetPropertyHandler_THREAD_CHILD_COUNT_MAX }, + { SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD }, + { SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_DOWNGRADE_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_THREAD_ROUTER_SELECTION_JITTER, &NcpBase::GetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER }, +#endif + #if OPENTHREAD_ENABLE_JAM_DETECTION { SPINEL_PROP_JAM_DETECT_ENABLE, &NcpBase::GetPropertyHandler_JAM_DETECT_ENABLE }, { SPINEL_PROP_JAM_DETECTED, &NcpBase::GetPropertyHandler_JAM_DETECTED }, @@ -283,15 +288,8 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] = { SPINEL_PROP_NET_MASTER_KEY, &NcpBase::SetPropertyHandler_NET_MASTER_KEY }, { SPINEL_PROP_NET_KEY_SEQUENCE_COUNTER, &NcpBase::SetPropertyHandler_NET_KEY_SEQUENCE_COUNTER }, { SPINEL_PROP_NET_KEY_SWITCH_GUARDTIME, &NcpBase::SetPropertyHandler_NET_KEY_SWITCH_GUARDTIME}, -#if OPENTHREAD_FTD - { SPINEL_PROP_NET_PSKC, &NcpBase::SetPropertyHandler_NET_PSKC }, -#endif - { 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_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::SetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED }, { SPINEL_PROP_STREAM_NET_INSECURE, &NcpBase::SetPropertyHandler_STREAM_NET_INSECURE }, { SPINEL_PROP_STREAM_NET, &NcpBase::SetPropertyHandler_STREAM_NET }, @@ -308,15 +306,23 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] = { SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES, &NcpBase::SetPropertyHandler_MAC_SRC_MATCH_EXTENDED_ADDRESSES }, #endif { SPINEL_PROP_THREAD_MODE, &NcpBase::SetPropertyHandler_THREAD_MODE }, - { SPINEL_PROP_THREAD_CHILD_COUNT_MAX, &NcpBase::SetPropertyHandler_THREAD_CHILD_COUNT_MAX }, + { SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING, &NcpBase::SetPropertyHandler_NET_REQUIRE_JOIN_EXISTING }, + { SPINEL_PROP_DEBUG_NCP_LOG_LEVEL, &NcpBase::SetPropertyHandler_DEBUG_NCP_LOG_LEVEL }, + +#if OPENTHREAD_FTD + { SPINEL_PROP_NET_PSKC, &NcpBase::SetPropertyHandler_NET_PSKC }, { SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::SetPropertyHandler_THREAD_CHILD_TIMEOUT }, + { SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT, &NcpBase::SetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT }, + { SPINEL_PROP_THREAD_LOCAL_LEADER_WEIGHT, &NcpBase::SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT }, + { SPINEL_PROP_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE, &NcpBase::SetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE }, + { SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED, &NcpBase::SetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED }, + { SPINEL_PROP_THREAD_CHILD_COUNT_MAX, &NcpBase::SetPropertyHandler_THREAD_CHILD_COUNT_MAX }, { SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD }, { SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, &NcpBase::SetPropertyHandler_THREAD_ROUTER_DOWNGRADE_THRESHOLD }, { SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY }, - { SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING, &NcpBase::SetPropertyHandler_NET_REQUIRE_JOIN_EXISTING }, { SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER, &NcpBase::SetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER }, { SPINEL_PROP_THREAD_PREFERRED_ROUTER_ID, &NcpBase::SetPropertyHandler_THREAD_PREFERRED_ROUTER_ID }, - { SPINEL_PROP_DEBUG_NCP_LOG_LEVEL, &NcpBase::SetPropertyHandler_DEBUG_NCP_LOG_LEVEL }, +#endif #if OPENTHREAD_ENABLE_JAM_DETECTION { SPINEL_PROP_JAM_DETECT_ENABLE, &NcpBase::SetPropertyHandler_JAM_DETECT_ENABLE }, @@ -374,7 +380,9 @@ const NcpBase::RemovePropertyHandlerEntry NcpBase::mRemovePropertyHandlerTable[] { SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::RemovePropertyHandler_THREAD_ON_MESH_NETS }, { SPINEL_PROP_THREAD_ASSISTING_PORTS, &NcpBase::RemovePropertyHandler_THREAD_ASSISTING_PORTS }, { SPINEL_PROP_MAC_WHITELIST, &NcpBase::RemovePropertyHandler_MAC_WHITELIST }, +#if OPENTHREAD_FTD { SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS, &NcpBase::RemovePropertyHandler_THREAD_ACTIVE_ROUTER_IDS }, +#endif }; // ---------------------------------------------------------------------------- @@ -2418,6 +2426,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_LEADER_RID(uint8_t header, spinel ); } +#if OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key) { return SendPropertyUpdate( @@ -2428,6 +2437,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t heade otThreadGetLocalLeaderWeight(mInstance) ); } +#endif // OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key) { @@ -2491,6 +2501,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_PARENT(uint8_t header, spinel_pro return errorCode; } +#if OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_CHILD_TABLE(uint8_t header, spinel_prop_key_t key) { ThreadError errorCode = kThreadError_None; @@ -2567,6 +2578,7 @@ exit: mDisableStreamWrite = false; return errorCode; } +#endif // OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_NEIGHBOR_TABLE(uint8_t header, spinel_prop_key_t key) { @@ -2669,6 +2681,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE(uint8 ); } +#if OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED(uint8_t header, spinel_prop_key_t key) { return SendPropertyUpdate( @@ -2679,6 +2692,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED(uint8_t heade otThreadIsRouterRoleEnabled(mInstance) ); } +#endif // OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_prop_key_t key) { @@ -3390,6 +3404,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_ ); } +#if OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_CHILD_COUNT_MAX(uint8_t header, spinel_prop_key_t key) { return SendPropertyUpdate( @@ -3400,6 +3415,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_CHILD_COUNT_MAX(uint8_t header, s otThreadGetMaxAllowedChildren(mInstance) ); } +#endif // OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key) { @@ -3423,6 +3439,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_RLOC16(uint8_t header, spinel_pro ); } +#if OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key) { return SendPropertyUpdate( @@ -3477,6 +3494,7 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header otThreadGetNetworkIdTimeout(mInstance) ); } +#endif // OPENTHREAD_FTD #if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD ThreadError NcpBase::GetPropertyHandler_THREAD_COMMISSIONER_ENABLED(uint8_t header, spinel_prop_key_t key) @@ -4292,6 +4310,7 @@ ThreadError NcpBase::SetPropertyHandler_NET_ROLE(uint8_t header, spinel_prop_key errorCode = otThreadBecomeDetached(mInstance); break; +#if OPENTHREAD_FTD case SPINEL_NET_ROLE_ROUTER: errorCode = otThreadBecomeRouter(mInstance); break; @@ -4299,6 +4318,7 @@ ThreadError NcpBase::SetPropertyHandler_NET_ROLE(uint8_t header, spinel_prop_key case SPINEL_NET_ROLE_LEADER: errorCode = otThreadBecomeLeader(mInstance); break; +#endif // OPENTHREAD_FTD case SPINEL_NET_ROLE_CHILD: errorCode = otThreadBecomeChild(mInstance, kMleAttachAnyPartition); @@ -4480,6 +4500,7 @@ ThreadError NcpBase::SetPropertyHandler_NET_KEY_SWITCH_GUARDTIME(uint8_t header, return errorCode; } +#if OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) { @@ -4514,8 +4535,7 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t heade return errorCode; } - - +#endif // OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_STREAM_NET_INSECURE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) @@ -4891,6 +4911,7 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, s return errorCode; } +#if OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) { @@ -4962,6 +4983,7 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED(uint8_t heade return errorCode; } +#endif // OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_CNTR_RESET(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) @@ -5376,6 +5398,7 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_ return errorCode; } +#if OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_THREAD_CHILD_COUNT_MAX(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) { @@ -5556,6 +5579,7 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_PREFERRED_ROUTER_ID(uint8_t heade return errorCode; } +#endif // OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) @@ -5633,6 +5657,7 @@ ThreadError NcpBase::SetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spin return errorCode; } +#if OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) { @@ -5688,6 +5713,7 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header return errorCode; } +#endif // OPENTHREAD_FTD #if OPENTHREAD_ENABLE_BORDER_AGENT_PROXY && OPENTHREAD_FTD ThreadError NcpBase::SetPropertyHandler_BA_PROXY_ENABLED(uint8_t header, spinel_prop_key_t key, @@ -6709,6 +6735,7 @@ ThreadError NcpBase::RemovePropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header return errorCode; } +#if OPENTHREAD_FTD ThreadError NcpBase::RemovePropertyHandler_THREAD_ACTIVE_ROUTER_IDS(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) { @@ -6749,6 +6776,7 @@ ThreadError NcpBase::RemovePropertyHandler_THREAD_ACTIVE_ROUTER_IDS(uint8_t head return errorCode; } +#endif // OPENTHREAD_FTD ThreadError NcpBase::RemovePropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index 76dc87d57..ab1388832 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -372,11 +372,9 @@ private: ThreadError GetPropertyHandler_MAC_SCAN_PERIOD(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_LEADER_ADDR(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_PARENT(uint8_t header, spinel_prop_key_t key); - ThreadError GetPropertyHandler_THREAD_CHILD_TABLE(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_NEIGHBOR_TABLE(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_LEADER_RID(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key); - ThreadError GetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_NETWORK_DATA(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_NETWORK_DATA_VERSION(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_STABLE_NETWORK_DATA(uint8_t header, spinel_prop_key_t key); @@ -386,28 +384,31 @@ private: ThreadError GetPropertyHandler_MAC_PROMISCUOUS_MODE(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE(uint8_t header, spinel_prop_key_t key); - ThreadError GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_MAC_CNTR(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_NCP_CNTR(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_MSG_BUFFER_COUNTERS(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key); -#if OPENTHREAD_FTD - ThreadError GetPropertyHandler_NET_PSKC(uint8_t header, spinel_prop_key_t key); -#endif - ThreadError GetPropertyHandler_THREAD_CHILD_COUNT_MAX(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_RLOC16(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_NET_REQUIRE_JOIN_EXISTING(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_DEBUG_TEST_ASSERT(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key); + +#if OPENTHREAD_FTD + ThreadError GetPropertyHandler_THREAD_CHILD_TABLE(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_NET_PSKC(uint8_t header, spinel_prop_key_t key); + ThreadError GetPropertyHandler_THREAD_CHILD_COUNT_MAX(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_ROUTER_DOWNGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key); ThreadError GetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER(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 GetPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_prop_key_t key); - ThreadError GetPropertyHandler_NET_REQUIRE_JOIN_EXISTING(uint8_t header, spinel_prop_key_t key); - ThreadError GetPropertyHandler_DEBUG_TEST_ASSERT(uint8_t header, spinel_prop_key_t key); - ThreadError GetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t header, spinel_prop_key_t key); +#endif #if OPENTHREAD_ENABLE_COMMISSIONER ThreadError GetPropertyHandler_THREAD_COMMISSIONER_ENABLED(uint8_t header, spinel_prop_key_t key); @@ -490,8 +491,6 @@ private: uint16_t value_len); ThreadError SetPropertyHandler_MAC_SCAN_PERIOD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); - ThreadError SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key, - const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t header, spinel_prop_key_t key, @@ -510,6 +509,10 @@ private: #endif ThreadError SetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); + +#if OPENTHREAD_FTD + ThreadError SetPropertyHandler_THREAD_LOCAL_LEADER_WEIGHT(uint8_t header, spinel_prop_key_t key, + const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_CHILD_COUNT_MAX(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, @@ -526,13 +529,14 @@ private: const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_PREFERRED_ROUTER_ID(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, - const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_THREAD_ROUTER_ROLE_ENABLED(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); +#endif + + ThreadError SetPropertyHandler_THREAD_ASSISTING_PORTS(uint8_t header, spinel_prop_key_t key, + const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_NET_REQUIRE_JOIN_EXISTING(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); ThreadError SetPropertyHandler_CNTR_RESET(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, @@ -604,8 +608,11 @@ private: const uint8_t *value_ptr, uint16_t value_len); ThreadError RemovePropertyHandler_MAC_WHITELIST(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); +#if OPENTHREAD_FTD ThreadError RemovePropertyHandler_THREAD_ACTIVE_ROUTER_IDS(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); +#endif + public: ThreadError StreamWrite(int aStreamId, const uint8_t *aDataPtr, int aDataLen);