| /** |
| * |
| * Copyright (c) 2020 Project CHIP Authors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #pragma once |
| |
| #include <string.h> // For mem* functions. |
| |
| #include <app/chip-zcl-zpro-codec.h> // For EmberApsFrame |
| |
| #include <app/util/basic-types.h> |
| #include <lib/core/Optional.h> |
| |
| #include <transport/raw/MessageHeader.h> |
| static_assert(sizeof(chip::NodeId) == sizeof(uint64_t), "Unexpected node if size"); |
| |
| #include <zap-generated/endpoint_config.h> |
| #include <zap-generated/gen_config.h> |
| |
| /** |
| * @brief Defines binding types. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberBindingType |
| #else |
| typedef uint8_t EmberBindingType; |
| enum |
| #endif |
| { |
| /** A binding that is currently not in use. */ |
| EMBER_UNUSED_BINDING = 0, |
| /** A unicast binding whose 64-bit identifier is the destination EUI64. */ |
| EMBER_UNICAST_BINDING = 1, |
| /** A unicast binding whose 64-bit identifier is the many-to-one |
| * destination EUI64. Route discovery should be disabled when sending |
| * unicasts via many-to-one bindings. */ |
| EMBER_MANY_TO_ONE_BINDING = 2, |
| /** A multicast binding whose 64-bit identifier is the group address. This |
| * binding can be used to send messages to the group and to receive |
| * messages sent to the group. */ |
| EMBER_MULTICAST_BINDING = 3, |
| }; |
| /** @brief The type of method used for joining. |
| * |
| */ |
| |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberJoinMethod |
| #else |
| typedef uint8_t EmberJoinMethod; |
| enum |
| #endif |
| { |
| /** Devices normally use MAC association to join a network, which respects |
| * the "permit joining" flag in the MAC beacon. |
| * This value should be used by default. |
| */ |
| EMBER_USE_MAC_ASSOCIATION = 0, |
| |
| /** For networks where the "permit joining" flag is never turned |
| * on, devices will need to use a ZigBee NWK Rejoin. This value causes the |
| * rejoin to be sent withOUT NWK security and the Trust Center will be |
| * asked to send the NWK key to the device. The NWK key sent to the device |
| * can be encrypted with the device's corresponding Trust Center link key. |
| * That is determined by the ::EmberJoinDecision on the Trust Center |
| * returned by the ::emberTrustCenterJoinHandler(). |
| */ |
| EMBER_USE_NWK_REJOIN = 1, |
| |
| /* For networks where the "permit joining" flag is never turned |
| * on, devices will need to use a NWK Rejoin. If those devices have been |
| * preconfigured with the NWK key (including sequence number), they can use |
| * a secured rejoin. This is only necessary for end devices since they need |
| * a parent. Routers can simply use the ::EMBER_USE_CONFIGURED_NWK_STATE |
| * join method below. |
| */ |
| EMBER_USE_NWK_REJOIN_HAVE_NWK_KEY = 2, |
| |
| /** For networks where all network and security information is known |
| ahead of time, a router device may be commissioned such that it does |
| not need to send any messages to begin communicating on the network. |
| */ |
| EMBER_USE_CONFIGURED_NWK_STATE = 3, |
| }; |
| |
| /** |
| * @brief Type of Ember software version |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberVersionType |
| #else |
| typedef uint8_t EmberVersionType; |
| enum |
| #endif |
| { |
| EMBER_VERSION_TYPE_PRE_RELEASE = 0x00, |
| |
| // Alpha, should be used rarely |
| EMBER_VERSION_TYPE_ALPHA_1 = 0x11, |
| EMBER_VERSION_TYPE_ALPHA_2 = 0x12, |
| EMBER_VERSION_TYPE_ALPHA_3 = 0x13, |
| // Leave space in case we decide to add other types in the future. |
| EMBER_VERSION_TYPE_BETA_1 = 0x21, |
| EMBER_VERSION_TYPE_BETA_2 = 0x22, |
| EMBER_VERSION_TYPE_BETA_3 = 0x23, |
| |
| // Anything other than 0xAA is considered pre-release |
| // Silicon Labs may define other types in the future (e.g. beta, alpha) |
| // Silicon Labs chose an arbitrary number (0xAA) to allow for expansion, but |
| // to prevent ambiguity in case 0x00 or 0xFF is accidentally retrieved |
| // as the version type. |
| EMBER_VERSION_TYPE_GA = 0xAA, |
| }; |
| |
| /** |
| * @brief Either marks an event as inactive or specifies the units for the |
| * event execution time. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberEventUnits |
| #else |
| typedef uint8_t EmberEventUnits; |
| enum |
| #endif |
| { |
| /** The event is not scheduled to run. */ |
| EMBER_EVENT_INACTIVE = 0, |
| /** The execution time is in approximate milliseconds. */ |
| EMBER_EVENT_MS_TIME, |
| /** The execution time is in 'binary' quarter seconds (256 timer ticks). */ |
| EMBER_EVENT_QS_TIME, |
| /** The execution time is in 'binary' minutes (65536 timer ticks). */ |
| EMBER_EVENT_MINUTE_TIME, |
| /** The event is scheduled to run at the earliest opportunity. */ |
| EMBER_EVENT_ZERO_DELAY |
| }; |
| /** @brief An identifier for a task */ |
| typedef uint8_t EmberTaskId; |
| |
| /** |
| * @brief Options to use when sending a message. |
| * |
| * The discover-route, APS-retry, and APS-indirect options may be used together. |
| * Poll response cannot be combined with any other options. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberApsOption |
| #else |
| typedef uint16_t EmberApsOption; |
| enum |
| #endif |
| { |
| /** No options. */ |
| EMBER_APS_OPTION_NONE = 0x0000, |
| |
| #ifndef DOXYGEN_SHOULD_SKIP_THIS |
| EMBER_APS_OPTION_ENCRYPT_WITH_TRANSIENT_KEY = 0x0001, |
| EMBER_APS_OPTION_USE_ALIAS_SEQUENCE_NUMBER = 0x0002, |
| #endif |
| |
| /** This signs the application layer message body (APS Frame not included) |
| and appends the ECDSA signature to the end of the message, which is needed by |
| Smart Energy applications and requires the CBKE and ECC libraries. |
| The ::emberDsaSignHandler() function is called after DSA signing |
| is complete but before the message has been sent by the APS layer. |
| Note that when passing a buffer to the stack for DSA signing, the final |
| byte in the buffer has a special significance as an indicator of how many |
| leading bytes should be ignored for signature purposes. See the API |
| documentation of emberDsaSign() or the dsaSign EZSP command for more |
| details about this requirement. |
| */ |
| EMBER_APS_OPTION_DSA_SIGN = 0x0010, |
| /** Resend the message using the APS retry mechanism. |
| This option and the enable route discovery option must be enabled for |
| an existing route to be repaired automatically. */ |
| EMBER_APS_OPTION_RETRY = 0x0040, |
| /** Send the message with the NWK 'enable route discovery' flag, which |
| causes a route discovery to be initiated if no route to the destination |
| is known. Note that in the mesh stack, this option and the APS retry |
| option must be enabled an existing route to be repaired |
| automatically. */ |
| EMBER_APS_OPTION_ENABLE_ROUTE_DISCOVERY = 0x0100, |
| /** Send the message with the NWK 'force route discovery' flag, which causes |
| a route discovery to be initiated even if one is known. */ |
| EMBER_APS_OPTION_FORCE_ROUTE_DISCOVERY = 0x0200, |
| /** Include the source EUI64 in the network frame. */ |
| EMBER_APS_OPTION_SOURCE_EUI64 = 0x0400, |
| /** Include the destination EUI64 in the network frame. */ |
| EMBER_APS_OPTION_DESTINATION_EUI64 = 0x0800, |
| /** Send a ZDO request to discover the node ID of the destination if it is |
| not already known. */ |
| EMBER_APS_OPTION_ENABLE_ADDRESS_DISCOVERY = 0x1000, |
| /** This message is being sent in response to a call to |
| ::emberPollHandler(). It causes the message to be sent |
| immediately instead of being queued up until the next poll from the |
| (end device) destination. */ |
| EMBER_APS_OPTION_POLL_RESPONSE = 0x2000, |
| /** This incoming message is a valid ZDO request and the application |
| * is responsible for sending a ZDO response. This flag is used only |
| * within emberIncomingMessageHandler() when |
| * EMBER_APPLICATION_RECEIVES_UNSUPPORTED_ZDO_REQUESTS is defined. */ |
| EMBER_APS_OPTION_ZDO_RESPONSE_REQUIRED = 0x4000, |
| /** This message is part of a fragmented message. This option may only |
| be set for unicasts. The groupId field gives the index of this |
| fragment in the low-order byte. If the low-order byte is zero this |
| is the first fragment and the high-order byte contains the number |
| of fragments in the message. */ |
| EMBER_APS_OPTION_FRAGMENT = 0x8000 |
| }; |
| |
| /** |
| * @brief Size of EUI64 (an IEEE address) in bytes (8). |
| */ |
| #define EUI64_SIZE 8 |
| |
| /** |
| * @brief Size of an encryption key in bytes (16). |
| */ |
| #define EMBER_ENCRYPTION_KEY_SIZE 16 |
| |
| /** |
| * @brief Size of an extended PAN identifier in bytes (8). |
| */ |
| #define EXTENDED_PAN_ID_SIZE 8 |
| |
| /** |
| * @brief EUI 64-bit ID (an IEEE address). |
| */ |
| typedef uint8_t EmberEUI64[EUI64_SIZE]; |
| |
| /** |
| * @brief 16-bit ZigBee network address. |
| */ |
| typedef uint16_t EmberNodeId; |
| |
| /** |
| * @brief 802.15.4 PAN ID. |
| */ |
| typedef uint16_t EmberPanId; |
| |
| /** @brief This enumeration determines whether or not a Trust Center |
| * answers trust center link key requests. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberTcLinkKeyRequestPolicy |
| #else |
| typedef uint8_t EmberTcLinkKeyRequestPolicy; |
| enum |
| #endif |
| { |
| EMBER_DENY_TC_LINK_KEY_REQUESTS = 0x00, |
| EMBER_ALLOW_TC_LINK_KEY_REQUEST_AND_SEND_CURRENT_KEY = 0x01, |
| // When using the following mode a unique random link key is created. |
| // The key which is generated due to this mode is added to the link |
| // key table. Therefore make sure that the link key table size is not |
| // zero as this can result in the newly generated key not being saved |
| // and communication breaking between the trust center and the nodes. |
| EMBER_ALLOW_TC_LINK_KEY_REQUEST_AND_GENERATE_NEW_KEY = 0x02 |
| }; |
| |
| /** @brief This enumeration determines whether or not a Trust Center |
| * answers app link key requests. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberAppLinkKeyRequestPolicy |
| #else |
| typedef uint8_t EmberAppLinkKeyRequestPolicy; |
| enum |
| #endif |
| { |
| EMBER_DENY_APP_LINK_KEY_REQUESTS = 0x00, |
| EMBER_ALLOW_APP_LINK_KEY_REQUEST = 0x01 |
| }; |
| |
| /** @brief This data structure contains the key data that is passed |
| * into various other functions. */ |
| typedef struct |
| { |
| /** This is the key byte data. */ |
| uint8_t contents[EMBER_ENCRYPTION_KEY_SIZE]; |
| } EmberKeyData; |
| /** |
| * @brief Defines the possible types of nodes and the roles that a |
| * node might play in a network. |
| */ |
| |
| /** |
| * @brief Defines the possible incoming message types. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberIncomingMessageType |
| #else |
| typedef uint8_t EmberIncomingMessageType; |
| enum |
| #endif |
| { |
| /** Unicast. */ |
| EMBER_INCOMING_UNICAST, |
| /** Unicast reply. */ |
| EMBER_INCOMING_UNICAST_REPLY, |
| /** Multicast. */ |
| EMBER_INCOMING_MULTICAST, |
| /** Multicast sent by the local device. */ |
| EMBER_INCOMING_MULTICAST_LOOPBACK, |
| /** Broadcast. */ |
| EMBER_INCOMING_BROADCAST, |
| /** Broadcast sent by the local device. */ |
| EMBER_INCOMING_BROADCAST_LOOPBACK |
| }; |
| |
| /** @brief Endpoint information (a ZigBee Simple Descriptor). |
| * |
| * This is a ZigBee Simple Descriptor and contains information |
| * about an endpoint. This information is shared with other nodes in the |
| * network by the ZDO. |
| */ |
| |
| typedef struct |
| { |
| /** The endpoint's device ID within the application profile. */ |
| uint16_t deviceId; |
| /** The endpoint's device version. */ |
| uint8_t deviceVersion; |
| /** The number of input clusters. */ |
| uint8_t inputClusterCount; |
| /** The number of output clusters. */ |
| uint8_t outputClusterCount; |
| } EmberEndpointDescription; |
| |
| /** @brief A type of packet received by the stack |
| * |
| * This enum provides a way to indicate which protocol layer in the Ember |
| * stack an incoming packet is meant for, or from which protocol layer |
| * an outgoing command is being sent from. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberZigbeePacketType |
| #else |
| typedef uint8_t EmberZigbeePacketType; |
| enum |
| #endif |
| { |
| /** Describes an 802.15.4 raw MAC message, unprocessed by the stack. */ |
| EMBER_ZIGBEE_PACKET_TYPE_RAW_MAC, |
| /** Describes an 802.15.4 MAC layer command. */ |
| EMBER_ZIGBEE_PACKET_TYPE_MAC_COMMAND, |
| /** Describes a ZigBee Network layer data message. */ |
| EMBER_ZIGBEE_PACKET_TYPE_NWK_DATA, |
| /** Describes a ZigBee Network layer command. */ |
| EMBER_ZIGBEE_PACKET_TYPE_NWK_COMMAND, |
| /** Describes a ZigBee Application Support layer data message. */ |
| EMBER_ZIGBEE_PACKET_TYPE_APS_DATA, |
| /** Describes a ZigBee Application Support layer command. */ |
| EMBER_ZIGBEE_PACKET_TYPE_APS_COMMAND, |
| /** Describes a ZigBee Device Object command. */ |
| EMBER_ZIGBEE_PACKET_TYPE_ZDO, |
| /** Describes a ZigBee Cluster Library command. */ |
| EMBER_ZIGBEE_PACKET_TYPE_ZCL, |
| |
| /** Distinguishing between raw MAC and beacons for simplicity */ |
| EMBER_ZIGBEE_PACKET_TYPE_BEACON, |
| }; |
| |
| /** |
| * @brief Defines a ZigBee network and the associated parameters. |
| */ |
| typedef struct |
| { |
| uint16_t panId; |
| uint8_t channel; |
| bool allowingJoin; |
| uint8_t extendedPanId[EXTENDED_PAN_ID_SIZE]; |
| uint8_t stackProfile; |
| uint8_t nwkUpdateId; |
| } EmberZigbeeNetwork; |
| |
| /** @brief indication of the action taken on a packet */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberPacketAction |
| #else |
| typedef uint8_t EmberPacketAction; |
| enum |
| #endif |
| { |
| EMBER_DROP_PACKET = 0, |
| EMBER_ACCEPT_PACKET = 1, |
| EMBER_MANGLE_PACKET, |
| }; |
| |
| /** |
| * @name ZigBee Device Object (ZDO) Definitions |
| */ |
| //@{ |
| |
| /** @name ZDO response status. |
| * |
| * Most responses to ZDO commands contain a status byte. |
| * The meaning of this byte is defined by the ZigBee Device Profile. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberZdoStatus |
| #else |
| typedef uint8_t EmberZdoStatus; |
| enum |
| #endif |
| { |
| // These values are taken from Table 48 of ZDP Errata 043238r003 and Table 2 |
| // of NWK 02130r10. |
| EMBER_ZDP_SUCCESS = 0x00, |
| // 0x01 to 0x7F are reserved |
| EMBER_ZDP_INVALID_REQUEST_TYPE = 0x80, |
| EMBER_ZDP_DEVICE_NOT_FOUND = 0x81, |
| EMBER_ZDP_INVALID_ENDPOINT = 0x82, |
| EMBER_ZDP_NOT_ACTIVE = 0x83, |
| EMBER_ZDP_NOT_SUPPORTED = 0x84, |
| EMBER_ZDP_TIMEOUT = 0x85, |
| EMBER_ZDP_NO_MATCH = 0x86, |
| // 0x87 is reserved = 0x87, |
| EMBER_ZDP_NO_ENTRY = 0x88, |
| EMBER_ZDP_NO_DESCRIPTOR = 0x89, |
| EMBER_ZDP_INSUFFICIENT_SPACE = 0x8a, |
| EMBER_ZDP_NOT_PERMITTED = 0x8b, |
| EMBER_ZDP_TABLE_FULL = 0x8c, |
| EMBER_ZDP_NOT_AUTHORIZED = 0x8d, |
| EMBER_ZDP_DEVICE_BINDING_TABLE_FULL = 0x8e, |
| EMBER_ZDP_INVALID_INDEX = 0x8f, |
| |
| EMBER_NWK_ALREADY_PRESENT = 0xC5, |
| EMBER_NWK_TABLE_FULL = 0xC7, |
| EMBER_NWK_UNKNOWN_DEVICE = 0xC8 |
| }; |
| |
| /** @brief Defines an entry in the binding table. |
| * |
| * A binding entry specifies a local endpoint, a remote endpoint, a |
| * cluster ID and either the destination EUI64 (for unicast bindings) or the |
| * 64-bit group address (for multicast bindings). |
| */ |
| struct EmberBindingTableEntry |
| { |
| EmberBindingTableEntry() = default; |
| |
| static EmberBindingTableEntry ForNode(chip::FabricIndex fabric, chip::NodeId node, chip::EndpointId localEndpoint, |
| chip::EndpointId remoteEndpoint, chip::Optional<chip::ClusterId> cluster) |
| { |
| EmberBindingTableEntry entry = { |
| .type = EMBER_UNICAST_BINDING, |
| .fabricIndex = fabric, |
| .local = localEndpoint, |
| .clusterId = cluster, |
| .remote = remoteEndpoint, |
| .nodeId = node, |
| }; |
| return entry; |
| } |
| |
| static EmberBindingTableEntry ForGroup(chip::FabricIndex fabric, chip::GroupId group, chip::EndpointId localEndpoint, |
| chip::Optional<chip::ClusterId> cluster) |
| { |
| EmberBindingTableEntry entry = { |
| .type = EMBER_MULTICAST_BINDING, |
| .fabricIndex = fabric, |
| .local = localEndpoint, |
| .clusterId = cluster, |
| .remote = 0, |
| .groupId = group, |
| }; |
| return entry; |
| } |
| |
| /** The type of binding. */ |
| EmberBindingType type = EMBER_UNUSED_BINDING; |
| |
| chip::FabricIndex fabricIndex; |
| /** The endpoint on the local node. */ |
| chip::EndpointId local; |
| /** A cluster ID that matches one from the local endpoint's simple descriptor. |
| * This cluster ID is set by the provisioning application to indicate which |
| * part an endpoint's functionality is bound to this particular remote node |
| * and is used to distinguish between unicast and multicast bindings. Note |
| * that a binding can be used to to send messages with any cluster ID, not |
| * just that listed in the binding. |
| */ |
| chip::Optional<chip::ClusterId> clusterId; |
| /** The endpoint on the remote node (specified by \c identifier). */ |
| chip::EndpointId remote; |
| /** A 64-bit destination identifier. This is either: |
| * - The destination chip::NodeId, for unicasts. |
| * - A multicast ChipGroupId, for multicasts. |
| * Which one is being used depends on the type of this binding. |
| */ |
| union |
| { |
| chip::NodeId nodeId; |
| chip::GroupId groupId; |
| }; |
| |
| bool operator==(EmberBindingTableEntry const & other) const |
| { |
| if (type != other.type) |
| { |
| return false; |
| } |
| |
| if (type == EMBER_MULTICAST_BINDING && groupId != other.groupId) |
| { |
| return false; |
| } |
| |
| if (type == EMBER_UNICAST_BINDING && (nodeId != other.nodeId || remote != other.remote)) |
| { |
| return false; |
| } |
| |
| return fabricIndex == other.fabricIndex && local == other.local && clusterId == other.clusterId; |
| } |
| }; |
| |
| /** |
| * @brief The decision made by the Trust Center when a node attempts to join. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberJoinDecision |
| #else |
| typedef uint8_t EmberJoinDecision; |
| enum |
| #endif |
| { |
| /** Allow the node to join. The node has the key. */ |
| EMBER_USE_PRECONFIGURED_KEY = 0, |
| /** Allow the node to join. Send the key to the node. */ |
| EMBER_SEND_KEY_IN_THE_CLEAR, |
| /** Deny join. */ |
| EMBER_DENY_JOIN, |
| /** Take no action. */ |
| EMBER_NO_ACTION |
| }; |
| |
| /** @brief This denotes the status of an attempt to establish |
| * a key with another device. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberKeyStatus |
| #else |
| typedef uint8_t EmberKeyStatus; |
| enum |
| #endif |
| { |
| EMBER_KEY_STATUS_NONE = 0x00, |
| EMBER_APP_LINK_KEY_ESTABLISHED = 0x01, |
| EMBER_TRUST_CENTER_LINK_KEY_ESTABLISHED = 0x03, |
| |
| EMBER_KEY_ESTABLISHMENT_TIMEOUT = 0x04, |
| EMBER_KEY_TABLE_FULL = 0x05, |
| |
| // These are success status values applying only to the |
| // Trust Center answering key requests. |
| EMBER_TC_RESPONDED_TO_KEY_REQUEST = 0x06, |
| EMBER_TC_APP_KEY_SENT_TO_REQUESTER = 0x07, |
| |
| // These are failure status values applying only to the |
| // Trust Center answering key requests. |
| EMBER_TC_RESPONSE_TO_KEY_REQUEST_FAILED = 0x08, |
| EMBER_TC_REQUEST_KEY_TYPE_NOT_SUPPORTED = 0x09, |
| EMBER_TC_NO_LINK_KEY_FOR_REQUESTER = 0x0A, |
| EMBER_TC_REQUESTER_EUI64_UNKNOWN = 0x0B, |
| EMBER_TC_RECEIVED_FIRST_APP_KEY_REQUEST = 0x0C, |
| EMBER_TC_TIMEOUT_WAITING_FOR_SECOND_APP_KEY_REQUEST = 0x0D, |
| EMBER_TC_NON_MATCHING_APP_KEY_REQUEST_RECEIVED = 0x0E, |
| EMBER_TC_FAILED_TO_SEND_APP_KEYS = 0x0F, |
| EMBER_TC_FAILED_TO_STORE_APP_KEY_REQUEST = 0x10, |
| EMBER_TC_REJECTED_APP_KEY_REQUEST = 0x11, |
| EMBER_TC_FAILED_TO_GENERATE_NEW_KEY = 0x12, |
| EMBER_TC_FAILED_TO_SEND_TC_KEY = 0x13, |
| |
| // These are generic status values for a key requester. |
| EMBER_TRUST_CENTER_IS_PRE_R21 = 0x1E, |
| |
| // These are status values applying only to the Trust Center |
| // verifying link keys. |
| EMBER_TC_REQUESTER_VERIFY_KEY_TIMEOUT = 0x32, |
| EMBER_TC_REQUESTER_VERIFY_KEY_FAILURE = 0x33, |
| EMBER_TC_REQUESTER_VERIFY_KEY_SUCCESS = 0x34, |
| |
| // These are status values applying only to the key requester |
| // verifying link keys. |
| EMBER_VERIFY_LINK_KEY_FAILURE = 0x64, |
| EMBER_VERIFY_LINK_KEY_SUCCESS = 0x65, |
| }; |
| |
| typedef uint8_t EmberAfPluginNetworkSteeringJoiningState; |
| |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum SleepModes |
| #else |
| typedef uint8_t SleepModes; |
| enum |
| #endif |
| { |
| SLEEPMODE_IDLE = 1, |
| }; |
| |
| /** |
| * @brief Defines the possible join states for a node. |
| */ |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberNetworkStatus |
| #else |
| typedef uint8_t EmberNetworkStatus; |
| enum |
| #endif |
| { |
| /** The node is not associated with a network in any way. */ |
| EMBER_NO_NETWORK, |
| /** The node is currently attempting to join a network. */ |
| EMBER_JOINING_NETWORK, |
| /** The node is joined to a network. */ |
| EMBER_JOINED_NETWORK, |
| /** The node is an end device joined to a network but its parent |
| is not responding. */ |
| EMBER_JOINED_NETWORK_NO_PARENT, |
| /** The node is in the process of leaving its current network. */ |
| EMBER_LEAVING_NETWORK |
| }; |
| |
| /** @brief Holds network parameters. |
| * |
| * For information about power settings and radio channels, |
| * see the technical specification for the |
| * RF communication module in your Developer Kit. |
| */ |
| typedef struct |
| { |
| /** The network's extended PAN identifier.*/ |
| uint8_t extendedPanId[EXTENDED_PAN_ID_SIZE]; |
| /** The network's PAN identifier.*/ |
| uint16_t panId; |
| /** A power setting, in dBm.*/ |
| int8_t radioTxPower; |
| /** A radio channel. Be sure to specify a channel supported by the radio. */ |
| uint8_t radioChannel; |
| /** Join method: The protocol messages used to establish an initial parent. It is |
| * ignored when forming a ZigBee network, or when querying the stack for its |
| network parameters. |
| */ |
| EmberJoinMethod joinMethod; |
| |
| /** NWK Manager ID. The ID of the network manager in the current network. |
| This may only be set at joining when using EMBER_USE_CONFIGURED_NWK_STATE |
| as the join method. |
| */ |
| EmberNodeId nwkManagerId; |
| /** An NWK Update ID. The value of the ZigBee nwkUpdateId known by the stack. |
| It is used to determine the newest instance of the network after a PAN |
| ID or channel change. This may only be set at joining when using |
| EMBER_USE_CONFIGURED_NWK_STATE as the join method. |
| */ |
| uint8_t nwkUpdateId; |
| /** The NWK channel mask. The list of preferred channels that the NWK manager |
| has told this device to use when searching for the network. |
| This may only be set at joining when using EMBER_USE_CONFIGURED_NWK_STATE |
| as the join method. |
| */ |
| uint32_t channels; |
| } EmberNetworkParameters; |
| |
| /** |
| * @brief Incoming and outgoing messages are stored in buffers. |
| * These buffers are allocated and freed as needed. |
| * |
| * Buffers are 32 bytes in length and can be linked together to hold |
| * longer messages. |
| * |
| * See packet-buffer.h for APIs related to stack and linked buffers. |
| */ |
| typedef uint8_t EmberMessageBuffer; |
| |
| /** |
| * @brief A version structure containing all version information. |
| */ |
| typedef struct |
| { |
| uint16_t build; |
| uint8_t major; |
| uint8_t minor; |
| uint8_t patch; |
| uint8_t special; |
| EmberVersionType type; |
| } EmberVersion; |
| |
| /** |
| * @brief A distinguished network ID that will never be assigned |
| * to any node. This value is used when getting the remote node ID |
| * from the address or binding tables. It indicates that the address |
| * or binding table entry is currently in use but the node ID |
| * corresponding to the EUI64 in the table is currently unknown. |
| */ |
| #define EMBER_UNKNOWN_NODE_ID 0xFFFD |
| |
| /** |
| * @brief A distinguished network ID that will never be assigned |
| * to any node. Used to indicate the absence of a node ID. |
| */ |
| #define EMBER_NULL_NODE_ID 0xFFFF |
| |
| #ifdef DOXYGEN_SHOULD_SKIP_THIS |
| enum EmberStatus |
| #else |
| typedef uint8_t EmberStatus; |
| enum |
| #endif // DOXYGEN_SHOULD_SKIP_THIS |
| { |
| /** |
| * @name Generic Messages |
| * These messages are system wide. |
| */ |
| //@{ |
| |
| /** |
| * @brief The generic "no error" message. |
| */ |
| EMBER_SUCCESS = 0x00, |
| |
| /** |
| * @brief The generic "fatal error" message. |
| */ |
| EMBER_ERR_FATAL = 0x01, |
| |
| /** |
| * @brief An invalid value was passed as an argument to a function. |
| */ |
| EMBER_BAD_ARGUMENT = 0x02, |
| |
| /** |
| * @brief The requested information was not found. |
| */ |
| EMBER_NOT_FOUND = 0x03, |
| |
| /** |
| * @brief The manufacturing and stack token format in non-volatile memory |
| * is different than what the stack expects (returned at initialization). |
| */ |
| EMBER_EEPROM_MFG_STACK_VERSION_MISMATCH = 0x04, |
| |
| /** |
| * @brief The static memory definitions in ember-static-memory.h |
| * are incompatible with this stack version. |
| */ |
| EMBER_INCOMPATIBLE_STATIC_MEMORY_DEFINITIONS = 0x05, |
| |
| /** |
| * @brief The manufacturing token format in non-volatile memory is |
| * different than what the stack expects (returned at initialization). |
| */ |
| EMBER_EEPROM_MFG_VERSION_MISMATCH = 0x06, |
| |
| /** |
| * @brief The stack token format in non-volatile memory is different |
| * than what the stack expects (returned at initialization). |
| */ |
| EMBER_EEPROM_STACK_VERSION_MISMATCH = 0x07, |
| |
| //@} // END Generic Messages |
| |
| /** |
| * @name Packet Buffer Module Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief There are no more buffers. |
| */ |
| EMBER_NO_BUFFERS = 0x18, |
| |
| //@} / END Packet Buffer Module Errors |
| |
| /** |
| * @name Serial Manager Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief Specifies an invalid baud rate. |
| */ |
| EMBER_SERIAL_INVALID_BAUD_RATE = 0x20, |
| |
| /** |
| * @brief Specifies an invalid serial port. |
| */ |
| EMBER_SERIAL_INVALID_PORT = 0x21, |
| |
| /** |
| * @brief Tried to send too much data. |
| */ |
| EMBER_SERIAL_TX_OVERFLOW = 0x22, |
| |
| /** |
| * @brief There wasn't enough space to store a received character |
| * and the character was dropped. |
| */ |
| EMBER_SERIAL_RX_OVERFLOW = 0x23, |
| |
| /** |
| * @brief Detected a UART framing error. |
| */ |
| EMBER_SERIAL_RX_FRAME_ERROR = 0x24, |
| |
| /** |
| * @brief Detected a UART parity error. |
| */ |
| EMBER_SERIAL_RX_PARITY_ERROR = 0x25, |
| |
| /** |
| * @brief There is no received data to process. |
| */ |
| EMBER_SERIAL_RX_EMPTY = 0x26, |
| |
| /** |
| * @brief The receive interrupt was not handled in time and a |
| * character was dropped. |
| */ |
| EMBER_SERIAL_RX_OVERRUN_ERROR = 0x27, |
| |
| //@} |
| |
| /** |
| * @name MAC Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The MAC transmit queue is full. |
| */ |
| EMBER_MAC_TRANSMIT_QUEUE_FULL = 0x39, |
| // Internal |
| |
| /** |
| * @brief MAC header FCF error on receive. |
| */ |
| EMBER_MAC_UNKNOWN_HEADER_TYPE = 0x3A, |
| |
| /** |
| * @brief MAC ACK header received. |
| */ |
| EMBER_MAC_ACK_HEADER_TYPE = 0x3B, |
| |
| /** |
| * @brief The MAC can't complete this task because it is scanning. |
| */ |
| EMBER_MAC_SCANNING = 0x3D, |
| |
| /** |
| * @brief No pending data exists for a data poll. |
| */ |
| EMBER_MAC_NO_DATA = 0x31, |
| |
| /** |
| * @brief Attempts to scan when joined to a network. |
| */ |
| EMBER_MAC_JOINED_NETWORK = 0x32, |
| |
| /** |
| * @brief Scan duration must be 0 to 14 inclusive. Tried to |
| * scan with an incorrect duration value. |
| */ |
| EMBER_MAC_BAD_SCAN_DURATION = 0x33, |
| |
| /** |
| * @brief emberStartScan was called with an incorrect scan type. |
| */ |
| EMBER_MAC_INCORRECT_SCAN_TYPE = 0x34, |
| |
| /** |
| * @brief emberStartScan was called with an invalid channel mask. |
| */ |
| EMBER_MAC_INVALID_CHANNEL_MASK = 0x35, |
| |
| /** |
| * @brief Failed to scan the current channel because |
| * the relevant MAC command could not be transmitted. |
| */ |
| EMBER_MAC_COMMAND_TRANSMIT_FAILURE = 0x36, |
| |
| /** |
| * @brief An ACK was expected following the transmission but |
| * the MAC level ACK was never received. |
| */ |
| EMBER_MAC_NO_ACK_RECEIVED = 0x40, |
| |
| /** |
| * @brief MAC failed to transmit a message because it could not successfully |
| * perform a radio network switch. |
| */ |
| EMBER_MAC_RADIO_NETWORK_SWITCH_FAILED = 0x41, |
| |
| /** |
| * @brief An indirect data message timed out before a poll requested it. |
| */ |
| EMBER_MAC_INDIRECT_TIMEOUT = 0x42, |
| |
| //@} |
| |
| /** |
| * @name Simulated EEPROM Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The Simulated EEPROM is telling the application that |
| * at least one flash page to be erased. The GREEN status means the |
| * current page has not filled above the ::ERASE_CRITICAL_THRESHOLD. |
| * |
| * The application should call the function ::halSimEepromErasePage() |
| * when it can to erase a page. |
| */ |
| EMBER_SIM_EEPROM_ERASE_PAGE_GREEN = 0x43, |
| |
| /** |
| * @brief The Simulated EEPROM is telling the application that |
| * at least one flash page must be erased. The RED status means the |
| * current page has filled above the ::ERASE_CRITICAL_THRESHOLD. |
| * |
| * Due to the shrinking availability of write space, data could |
| * be lost. The application must call the function ::halSimEepromErasePage() |
| * as soon as possible to erase a page. |
| */ |
| EMBER_SIM_EEPROM_ERASE_PAGE_RED = 0x44, |
| |
| /** |
| * @brief The Simulated EEPROM has run out of room to write new data |
| * and the data trying to be set has been lost. This error code is the |
| * result of ignoring the ::SIM_EEPROM_ERASE_PAGE_RED error code. |
| * |
| * The application must call the function ::halSimEepromErasePage() to make room for |
| * any further calls to set a token. |
| */ |
| EMBER_SIM_EEPROM_FULL = 0x45, |
| |
| // Errors 46 and 47 are now defined below in the |
| // flash error block (was attempting to prevent renumbering). |
| |
| /** |
| * @brief Attempt 1 to initialize the Simulated EEPROM has failed. |
| * |
| * This failure means the information already stored in the Flash (or a lack |
| * thereof), is fatally incompatible with the token information compiled |
| * into the code image being run. |
| */ |
| EMBER_SIM_EEPROM_INIT_1_FAILED = 0x48, |
| |
| /** |
| * @brief Attempt 2 to initialize the Simulated EEPROM has failed. |
| * |
| * This failure means Attempt 1 failed, and the token system failed to |
| * properly reload default tokens and reset the Simulated EEPROM. |
| */ |
| EMBER_SIM_EEPROM_INIT_2_FAILED = 0x49, |
| |
| /** |
| * @brief Attempt 3 to initialize the Simulated EEPROM has failed. |
| * |
| * This failure means one or both of the tokens ::TOKEN_MFG_NVDATA_VERSION or |
| * ::TOKEN_STACK_NVDATA_VERSION were incorrect and the token system failed to |
| * properly reload default tokens and reset the Simulated EEPROM. |
| */ |
| EMBER_SIM_EEPROM_INIT_3_FAILED = 0x4A, |
| |
| /** |
| * @brief The Simulated EEPROM is repairing itself. |
| * |
| * While there's nothing for an app to do when the SimEE is going to |
| * repair itself (SimEE has to be fully functional for the rest of the |
| * system to work), alert the application to the fact that repair |
| * is occurring. There are debugging scenarios where an app might want |
| * to know that repair is happening, such as monitoring frequency. |
| * @note Common situations will trigger an expected repair, such as |
| * using an erased chip or changing token definitions. |
| */ |
| EMBER_SIM_EEPROM_REPAIRING = 0x4D, |
| |
| //@} |
| |
| /** |
| * @name Flash Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief A fatal error has occurred while trying to write data to the |
| * Flash. The target memory attempting to be programmed is already programmed. |
| * The flash write routines were asked to flip a bit from a 0 to 1, which is |
| * physically impossible and the write was therefore inhibited. The data in |
| * the Flash cannot be trusted after this error. |
| */ |
| EMBER_ERR_FLASH_WRITE_INHIBITED = 0x46, |
| |
| /** |
| * @brief A fatal error has occurred while trying to write data to the |
| * Flash and the write verification has failed. Data in the Flash |
| * cannot be trusted after this error and it is possible this error is the |
| * result of exceeding the life cycles of the Flash. |
| */ |
| EMBER_ERR_FLASH_VERIFY_FAILED = 0x47, |
| |
| /** |
| * @description A fatal error has occurred while trying to write data to the |
| * Flash possibly due to write protection or an invalid address. Data in |
| * the Flash cannot be trusted after this error and it is possible this error |
| * is the result of exceeding the life cycles of the Flash. |
| */ |
| EMBER_ERR_FLASH_PROG_FAIL = 0x4B, |
| |
| /** |
| * @description A fatal error has occurred while trying to erase the Flash possibly |
| * due to write protection. Data in the Flash cannot be trusted after |
| * this error and it is possible this error is the result of exceeding the |
| * life cycles of the Flash. |
| */ |
| EMBER_ERR_FLASH_ERASE_FAIL = 0x4C, |
| |
| //@} |
| |
| /** |
| * @name Bootloader Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The bootloader received an invalid message (failed attempt |
| * to go into bootloader). |
| */ |
| EMBER_ERR_BOOTLOADER_TRAP_TABLE_BAD = 0x58, |
| |
| /** |
| * @brief The bootloader received an invalid message (failed attempt to go |
| * into the bootloader). |
| */ |
| EMBER_ERR_BOOTLOADER_TRAP_UNKNOWN = 0x59, |
| |
| /** |
| * @brief The bootloader cannot complete the bootload operation because |
| * either an image was not found or the image exceeded memory bounds. |
| */ |
| EMBER_ERR_BOOTLOADER_NO_IMAGE = 0x05A, |
| |
| //@} |
| |
| /** |
| * @name Transport Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The APS layer attempted to send or deliver a message |
| * and failed. |
| */ |
| EMBER_DELIVERY_FAILED = 0x66, |
| |
| /** |
| * @brief This binding index is out of range for the current binding table. |
| */ |
| EMBER_BINDING_INDEX_OUT_OF_RANGE = 0x69, |
| |
| /** |
| * @brief This address table index is out of range for the current |
| * address table. |
| */ |
| EMBER_ADDRESS_TABLE_INDEX_OUT_OF_RANGE = 0x6A, |
| |
| /** |
| * @brief An invalid binding table index was given to a function. |
| */ |
| EMBER_INVALID_BINDING_INDEX = 0x6C, |
| |
| /** |
| * @brief The API call is not allowed given the current state of the |
| * stack. |
| */ |
| EMBER_INVALID_CALL = 0x70, |
| |
| /** |
| * @brief The link cost to a node is not known. |
| */ |
| EMBER_COST_NOT_KNOWN = 0x71, |
| |
| /** |
| * @brief The maximum number of in-flight messages = i.e., |
| * ::EMBER_APS_UNICAST_MESSAGE_COUNT, has been reached. |
| */ |
| EMBER_MAX_MESSAGE_LIMIT_REACHED = 0x72, |
| |
| /** |
| * @brief The message to be transmitted is too big to fit into a |
| * single over-the-air packet. |
| */ |
| EMBER_MESSAGE_TOO_LONG = 0x74, |
| |
| /** |
| * @brief The application is trying to delete or overwrite a binding |
| * that is in use. |
| */ |
| EMBER_BINDING_IS_ACTIVE = 0x75, |
| |
| /** |
| * @brief The application is trying to overwrite an address table entry |
| * that is in use. |
| */ |
| EMBER_ADDRESS_TABLE_ENTRY_IS_ACTIVE = 0x76, |
| |
| /** |
| * @brief An attempt was made to transmit during the suspend period. |
| */ |
| EMBER_TRANSMISSION_SUSPENDED = 0x77, |
| |
| //@} |
| // |
| |
| /** |
| * @name Green Power status codes |
| */ |
| //@{ |
| |
| /** |
| * @brief Security match. |
| */ |
| EMBER_MATCH = 0x78, |
| /** |
| * @brief Drop frame. |
| */ |
| EMBER_DROP_FRAME = 0x79, |
| EMBER_PASS_UNPROCESSED = 0x7A, |
| EMBER_TX_THEN_DROP = 0x7B, |
| EMBER_NO_SECURITY = 0x7C, |
| EMBER_COUNTER_FAILURE = 0x7D, |
| EMBER_AUTH_FAILURE = 0x7E, |
| EMBER_UNPROCESSED = 0x7F, |
| |
| //@} |
| // |
| |
| /** |
| * @name HAL Module Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The conversion is complete. |
| */ |
| EMBER_ADC_CONVERSION_DONE = 0x80, |
| |
| /** |
| * @brief The conversion cannot be done because a request is being |
| * processed. |
| */ |
| EMBER_ADC_CONVERSION_BUSY = 0x81, |
| |
| /** |
| * @brief The conversion is deferred until the current request has been |
| * processed. |
| */ |
| EMBER_ADC_CONVERSION_DEFERRED = 0x82, |
| |
| /** |
| * @brief No results are pending. |
| */ |
| EMBER_ADC_NO_CONVERSION_PENDING = 0x84, |
| |
| /** |
| * @brief Sleeping (for a duration) has been abnormally interrupted |
| * and exited prematurely. |
| */ |
| EMBER_SLEEP_INTERRUPTED = 0x85, |
| |
| //@} |
| |
| /** |
| * @name PHY Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The transmit attempt failed because the radio scheduler could not find |
| * a slot to transmit this packet in or a higher priority event interrupted it. |
| */ |
| EMBER_PHY_TX_SCHED_FAIL = 0x87, |
| |
| /** |
| * @brief The transmit hardware buffer underflowed. |
| */ |
| EMBER_PHY_TX_UNDERFLOW = 0x88, |
| |
| /** |
| * @brief The transmit hardware did not finish transmitting a packet. |
| */ |
| EMBER_PHY_TX_INCOMPLETE = 0x89, |
| |
| /** |
| * @brief An unsupported channel setting was specified. |
| */ |
| EMBER_PHY_INVALID_CHANNEL = 0x8A, |
| |
| /** |
| * @brief An unsupported power setting was specified. |
| */ |
| EMBER_PHY_INVALID_POWER = 0x8B, |
| |
| /** |
| * @brief The requested operation cannot be completed because the radio |
| * is currently busy, either transmitting a packet or performing calibration. |
| */ |
| EMBER_PHY_TX_BUSY = 0x8C, |
| |
| /** |
| * @brief The transmit attempt failed because all CCA attempts indicated that |
| * the channel was busy. |
| */ |
| EMBER_PHY_TX_CCA_FAIL = 0x8D, |
| |
| /** |
| * @brief The transmit attempt was blocked from going over the air. Typically |
| * this is due to the Radio Hold Off (RHO) or Coexistence plugins as they can |
| * prevent transmits based on external signals. |
| */ |
| EMBER_PHY_TX_BLOCKED = 0x8E, |
| |
| /** |
| * @brief The expected ACK was received after the last transmission. |
| */ |
| EMBER_PHY_ACK_RECEIVED = 0x8F, |
| |
| //@} |
| |
| /** |
| * @name Return Codes Passed to emberStackStatusHandler() |
| * See also ::emberStackStatusHandler = ,. |
| */ |
| //@{ |
| |
| /** |
| * @brief The stack software has completed initialization and is ready |
| * to send and receive packets over the air. |
| */ |
| EMBER_NETWORK_UP = 0x90, |
| |
| /** |
| * @brief The network is not operating. |
| */ |
| EMBER_NETWORK_DOWN = 0x91, |
| |
| /** |
| * @brief An attempt to join a network failed. |
| */ |
| EMBER_JOIN_FAILED = 0x94, |
| |
| /** |
| * @brief After moving, a mobile node's attempt to re-establish contact |
| * with the network failed. |
| */ |
| EMBER_MOVE_FAILED = 0x96, |
| |
| /** |
| * @brief An attempt to join as a router failed due to a Zigbee |
| * versus Zigbee Pro incompatibility. Zigbee devices joining Zigbee Pro networks |
| * (or vice versa) must join as End Devices, not Routers. |
| */ |
| EMBER_CANNOT_JOIN_AS_ROUTER = 0x98, |
| |
| /** @brief The local node ID has changed. The application can get the new |
| * node ID by calling ::emberGetNodeId(). |
| */ |
| EMBER_NODE_ID_CHANGED = 0x99, |
| |
| /** @brief The local PAN ID has changed. The application can get the new PAN |
| * ID by calling ::emberGetPanId(). |
| */ |
| EMBER_PAN_ID_CHANGED = 0x9A, |
| |
| /** @brief The channel has changed. |
| */ |
| EMBER_CHANNEL_CHANGED = 0x9B, |
| |
| /** @brief An attempt to join or rejoin the network failed because |
| * no router beacons could be heard by the joining node. |
| */ |
| EMBER_NO_BEACONS = 0xAB, |
| |
| /** @brief An attempt was made to join a Secured Network using a pre-configured |
| * key, but the Trust Center sent back a Network Key in-the-clear when |
| * an encrypted Network Key was required. (::EMBER_REQUIRE_ENCRYPTED_KEY). |
| */ |
| EMBER_RECEIVED_KEY_IN_THE_CLEAR = 0xAC, |
| |
| /** @brief An attempt was made to join a Secured Network, but the device did |
| * not receive a Network Key. |
| */ |
| EMBER_NO_NETWORK_KEY_RECEIVED = 0xAD, |
| |
| /** @brief After a device joined a Secured Network, a Link Key was requested |
| * (::EMBER_GET_LINK_KEY_WHEN_JOINING) but no response was ever received. |
| */ |
| EMBER_NO_LINK_KEY_RECEIVED = 0xAE, |
| |
| /** @brief An attempt was made to join a Secured Network without a |
| * pre-configured key, but the Trust Center sent encrypted data using a |
| * pre-configured key. |
| */ |
| EMBER_PRECONFIGURED_KEY_REQUIRED = 0xAF, |
| |
| //@} |
| |
| /** |
| * @name Security Errors |
| */ |
| /** |
| * @brief The passed key data is not valid. A key of all zeros or |
| * all F's are reserved values and cannot be used. |
| */ |
| EMBER_KEY_INVALID = 0xB2, |
| |
| /** |
| * @brief The chosen security level (the value of ::EMBER_SECURITY_LEVEL) |
| * is not supported by the stack. |
| */ |
| EMBER_INVALID_SECURITY_LEVEL = 0x95, |
| |
| /** |
| * @brief An error occurred when trying to encrypt at the APS Level. |
| * |
| * In order to APS encrypt an outgoing packet, the sender |
| * needs to know the EUI64 of the destination. This error occurs because |
| * the EUI64 of the destination can't be determined from |
| * the short address (no entry in the neighbor, child, binding |
| * or address tables). |
| * |
| * Everytime this error code is seen, note that the stack initiates an |
| * IEEE address discovery request behind the scenes. Responses |
| * to the request are stored in the trust center cache portion of the |
| * address table. Note that you need at least 1 entry allocated for |
| * TC cache in the address table plugin. Depending on the available rows in |
| * the table, newly discovered addresses may replace old ones. The address |
| * table plugin is enabled by default on the host. If you are using an SoC |
| * platform, please be sure to add the address table plugin. |
| * |
| * When customers choose to send APS messages by using short addresses, |
| * they should incorporate a retry mechanism and try again, no sooner than |
| * 2 seconds later, to resend the APS message. If the app always |
| * receives 0xBE (EMBER_IEEE_ADDR_DISCOVERY_IN_PROGRESS) after |
| * multiple retries, that might indicate that: |
| * a) destination node is not on the network |
| * b) there are problems with the health of the network |
| * c) there may not be any space set asidein the address table for |
| * the newly discovered address - this can be rectified by reserving |
| * more entries for the trust center cache in the address table plugin |
| */ |
| EMBER_IEEE_ADDRESS_DISCOVERY_IN_PROGRESS = 0xBE, |
| /** |
| * @brief An error occurred when trying to encrypt at the APS Level. |
| * |
| * This error occurs either because the long address of the recipient can't be |
| * determined from the short address (no entry in the binding table) |
| * or there is no link key entry in the table associated with the destination, |
| * or there was a failure to load the correct key into the encryption core. |
| */ |
| EMBER_APS_ENCRYPTION_ERROR = 0xA6, |
| |
| /** @brief There was an attempt to form or join a network with security |
| * without calling ::emberSetInitialSecurityState() first. |
| */ |
| EMBER_SECURITY_STATE_NOT_SET = 0xA8, |
| |
| /** @brief There was an attempt to set an entry in the key table using |
| * an invalid long address. Invalid addresses include: |
| * - The local device's IEEE address |
| * - Trust Center's IEEE address |
| * - An existing table entry's IEEE address |
| * - An address consisting of all zeros or all F's |
| */ |
| EMBER_KEY_TABLE_INVALID_ADDRESS = 0xB3, |
| |
| /** @brief There was an attempt to set a security configuration that |
| * is not valid given the other security settings. |
| */ |
| EMBER_SECURITY_CONFIGURATION_INVALID = 0xB7, |
| |
| /** @brief There was an attempt to broadcast a key switch too quickly after |
| * broadcasting the next network key. The Trust Center must wait at |
| * least a period equal to the broadcast timeout so that all routers |
| * have a chance to receive the broadcast of the new network key. |
| */ |
| EMBER_TOO_SOON_FOR_SWITCH_KEY = 0xB8, |
| |
| /** @brief The received signature corresponding to the message that was passed |
| to the CBKE Library failed verification and is not valid. |
| */ |
| EMBER_SIGNATURE_VERIFY_FAILURE = 0xB9, |
| |
| /** @brief The message could not be sent because the link key corresponding |
| to the destination is not authorized for use in APS data messages. |
| APS Commands (sent by the stack) are allowed. To use it for encryption |
| of APS data messages it must be authorized using a key agreement protocol |
| (such as CBKE). |
| */ |
| EMBER_KEY_NOT_AUTHORIZED = 0xBB, |
| |
| /** @brief The security data provided was not valid, or an |
| * integrity check failed. |
| */ |
| EMBER_SECURITY_DATA_INVALID = 0xBD, |
| |
| //@} |
| |
| /** |
| * @name Miscellaneous Network Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief The node has not joined a network. |
| */ |
| EMBER_NOT_JOINED = 0x93, |
| |
| /** |
| * @brief A message cannot be sent because the network is currently |
| * overloaded. |
| */ |
| EMBER_NETWORK_BUSY = 0xA1, |
| |
| /** |
| * @brief The application tried to send a message using an |
| * endpoint that it has not defined. |
| */ |
| EMBER_INVALID_ENDPOINT = 0xA3, |
| |
| /** |
| * @brief The application tried to use a binding that has been remotely |
| * modified and the change has not yet been reported to the application. |
| */ |
| EMBER_BINDING_HAS_CHANGED = 0xA4, |
| |
| /** |
| * @brief An attempt to generate random bytes failed because of |
| * insufficient random data from the radio. |
| */ |
| EMBER_INSUFFICIENT_RANDOM_DATA = 0xA5, |
| |
| /** A Zigbee route error command frame was received indicating |
| * that a source routed message from this node failed en route. |
| */ |
| EMBER_SOURCE_ROUTE_FAILURE = 0xA9, |
| |
| /** A Zigbee route error command frame was received indicating |
| * that a message sent to this node along a many-to-one route |
| * failed en route. The route error frame was delivered by |
| * an ad-hoc search for a functioning route. |
| */ |
| EMBER_MANY_TO_ONE_ROUTE_FAILURE = 0xAA, |
| |
| //@} |
| |
| /** |
| * @name Miscellaneous Utility Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief A critical and fatal error indicating that the version of the |
| * stack trying to run does not match with the chip it's running on. The |
| * software (stack) on the chip must be replaced with software |
| * compatible with the chip. |
| */ |
| EMBER_STACK_AND_HARDWARE_MISMATCH = 0xB0, |
| |
| /** |
| * @brief An index was passed into the function that was larger |
| * than the valid range. |
| */ |
| EMBER_INDEX_OUT_OF_RANGE = 0xB1, |
| |
| /** |
| * @brief There are no empty entries left in the table. |
| */ |
| EMBER_TABLE_FULL = 0xB4, |
| |
| /** |
| * @brief The requested table entry has been erased and contains |
| * no valid data. |
| */ |
| EMBER_TABLE_ENTRY_ERASED = 0xB6, |
| |
| /** |
| * @brief The requested function cannot be executed because |
| * the library that contains the necessary functionality is not present. |
| */ |
| EMBER_LIBRARY_NOT_PRESENT = 0xB5, |
| |
| /** |
| * @brief The stack accepted the command and is currently processing |
| * the request. The results will be returned via an appropriate handler. |
| */ |
| EMBER_OPERATION_IN_PROGRESS = 0xBA, |
| |
| /** |
| * @brief The EUI of the Trust center has changed due to a successful rejoin. |
| * The device may need to perform other authentication to verify the new TC |
| * is authorized to take over. |
| */ |
| EMBER_TRUST_CENTER_EUI_HAS_CHANGED = 0xBC, |
| |
| //@} |
| |
| /** |
| * @name NVM3 Token Errors |
| */ |
| //@{ |
| |
| /** |
| * @brief NVM3 is telling the application that the initialization was aborted |
| * as no valid NVM3 page was found. |
| */ |
| EMBER_NVM3_TOKEN_NO_VALID_PAGES = 0xC0, |
| |
| /** |
| * @brief NVM3 is telling the application that the initialization was aborted |
| * as the NVM3 instance was already opened with other parameters. |
| */ |
| EMBER_NVM3_ERR_OPENED_WITH_OTHER_PARAMETERS = 0xC1, |
| |
| /** |
| * @brief NVM3 is telling the application that the initialization was aborted |
| * as the NVM3 instance is not aligned properly in memory. |
| */ |
| EMBER_NVM3_ERR_ALIGNMENT_INVALID = 0xC2, |
| |
| /** |
| * @brief NVM3 is telling the application that the initialization was aborted |
| * as the size of the NVM3 instance is too small. |
| */ |
| EMBER_NVM3_ERR_SIZE_TOO_SMALL = 0xC3, |
| |
| /** |
| * @brief NVM3 is telling the application that the initialization was aborted |
| * as the NVM3 page size is not supported. |
| */ |
| EMBER_NVM3_ERR_PAGE_SIZE_NOT_SUPPORTED = 0xC4, |
| |
| /** |
| * @brief NVM3 is telling the application that there was an error initializing |
| * some of the tokens. |
| */ |
| EMBER_NVM3_ERR_TOKEN_INIT = 0xC5, |
| |
| /** |
| * @brief NVM3 is telling the application there has been an error when |
| * attempting to upgrade SimEE tokens. |
| */ |
| EMBER_NVM3_ERR_UPGRADE = 0xC6, |
| |
| /** |
| * @brief NVM3 is telling the application that there has been an unknown |
| * error. |
| */ |
| EMBER_NVM3_ERR_UNKNOWN = 0xC7, |
| |
| //@} |
| |
| /** |
| * @name Application Errors |
| * These error codes are available for application use. |
| */ |
| //@{ |
| |
| /** |
| * @brief This error is reserved for customer application use. |
| * This will never be returned from any portion of the network stack or HAL. |
| */ |
| EMBER_APPLICATION_ERROR_0 = 0xF0, |
| EMBER_APPLICATION_ERROR_1 = 0xF1, |
| EMBER_APPLICATION_ERROR_2 = 0xF2, |
| EMBER_APPLICATION_ERROR_3 = 0xF3, |
| EMBER_APPLICATION_ERROR_4 = 0xF4, |
| EMBER_APPLICATION_ERROR_5 = 0xF5, |
| EMBER_APPLICATION_ERROR_6 = 0xF6, |
| EMBER_APPLICATION_ERROR_7 = 0xF7, |
| EMBER_APPLICATION_ERROR_8 = 0xF8, |
| EMBER_APPLICATION_ERROR_9 = 0xF9, |
| EMBER_APPLICATION_ERROR_10 = 0xFA, |
| EMBER_APPLICATION_ERROR_11 = 0xFB, |
| EMBER_APPLICATION_ERROR_12 = 0xFC, |
| EMBER_APPLICATION_ERROR_13 = 0xFD, |
| EMBER_APPLICATION_ERROR_14 = 0xFE, |
| EMBER_APPLICATION_ERROR_15 = 0xFF, |
| }; |
| |
| /** |
| * @brief Function pointer for timer callback |
| */ |
| typedef void (*TimerCallback)(chip::EndpointId); |
| |
| /** @brief The control structure for events. |
| * |
| * It holds the event status (one of the @e EMBER_EVENT_ values) |
| * and the callback and it's parameters |
| */ |
| typedef struct |
| { |
| /** The event's status, either inactive or the units for timeToExecute. */ |
| EmberEventUnits status; |
| |
| /* Callback information */ |
| TimerCallback callback; |
| chip::EndpointId endpoint; |
| |
| } EmberEventControl; |
| |
| /** |
| * @name ZigBee Broadcast Addresses |
| *@{ |
| * ZigBee specifies three different broadcast addresses that |
| * reach different collections of nodes. Broadcasts are normally sent only |
| * to routers. Broadcasts can also be forwarded to end devices, either |
| * all of them or only those that do not sleep. Broadcasting to end |
| * devices is both significantly more resource-intensive and significantly |
| * less reliable than broadcasting to routers. |
| */ |
| |
| /** Broadcast to all routers. */ |
| #define EMBER_BROADCAST_ADDRESS 0xFFFC |
| |
| /** |
| * @description Useful macro for avoiding compiler warnings related to unused |
| * function arguments or unused variables. |
| */ |
| #define UNUSED_VAR(x) (void) (x) |
| |
| /** |
| * @brief The maximum 802.15.4 channel number is 26. |
| */ |
| #define EMBER_MAX_802_15_4_CHANNEL_NUMBER 26 |
| |
| /** |
| * @brief The minimum 2.4GHz 802.15.4 channel number is 11. |
| */ |
| #define EMBER_MIN_802_15_4_CHANNEL_NUMBER 11 |
| |
| /** |
| * @brief The maximum SubGhz channel number on pages 28, 30, 31 is 26. |
| */ |
| #define EMBER_MAX_SUBGHZ_CHANNEL_NUMBER_ON_PAGES_28_30_31 26 |
| |
| /** |
| * @brief The maximum SubGhz channel number on page 29 is 8. |
| */ |
| #define EMBER_MAX_SUBGHZ_CHANNEL_NUMBER_ON_PAGE_29 8 |
| |
| /** |
| * @brief The broadcast endpoint, as defined in the ZigBee spec. |
| */ |
| #define EMBER_BROADCAST_ENDPOINT (chip::kInvalidEndpointId) |
| |
| /** |
| * @brief Useful to reference a single bit of a byte. |
| */ |
| #define EMBER_BIT(nr) (1UL << (nr)) // Unsigned avoids compiler warnings re EMBER_BIT(15) |
| |
| /** |
| * @brief Returns the low byte of the 16-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_LOW_BYTE(n) ((uint8_t)((n) &0xFF)) |
| |
| /** |
| * @brief Returns the high byte of the 16-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_HIGH_BYTE(n) ((uint8_t)(EMBER_LOW_BYTE((n) >> 8))) |
| /** |
| * @brief Returns the low byte of the 32-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_0(n) ((uint8_t)((n) &0xFF)) |
| |
| /** |
| * @brief Returns the second byte of the 32-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_1(n) EMBER_BYTE_0((n) >> 8) |
| |
| /** |
| * @brief Returns the third byte of the 32-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_2(n) EMBER_BYTE_0((n) >> 16) |
| |
| /** |
| * @brief Returns the high byte of the 32-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_3(n) EMBER_BYTE_0((n) >> 24) |
| |
| /** |
| * @brief Returns the fifth byte of the 64-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_4(n) EMBER_BYTE_0((n) >> 32) |
| |
| /** |
| * @brief Returns the sixth byte of the 64-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_5(n) EMBER_BYTE_0((n) >> 40) |
| |
| /** |
| * @brief Returns the seventh byte of the 64-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_6(n) EMBER_BYTE_0((n) >> 48) |
| |
| /** |
| * @brief Returns the high byte of the 64-bit value \c n as an \c uint8_t. |
| */ |
| #define EMBER_BYTE_7(n) EMBER_BYTE_0((n) >> 56) |
| |
| /** |
| * @brief Returns the value built from the two \c uint8_t |
| * values \c high and \c low. |
| */ |
| #define EMBER_HIGH_LOW_TO_INT(high, low) (((uint16_t)(((uint16_t)(high)) << 8)) + ((uint16_t)((low) &0xFF))) |
| |
| /** |
| * @brief The kind of arguments the main function takes |
| */ |
| #define MAIN_FUNCTION_PARAMETERS void |
| #define MAIN_FUNCTION_ARGUMENTS |
| |
| // Stubs to just silence some compile errors |
| |
| #define emberAfPrintEnabled(...) false |
| |
| #define emberAfPrintActiveArea EMBER_AF_PRINT_CORE |
| |
| /** |
| * @brief Returns the value of \c bit within the register or byte \c reg. |
| */ |
| #define READBIT(reg, bit) ((reg) & (EMBER_BIT(bit))) |
| |
| /** |
| * @brief Returns the value of the bitmask \c bits within |
| * the register or byte \c reg. |
| */ |
| #define READBITS(reg, bits) ((reg) & (bits)) |
| |
| #define MILLISECOND_TICKS_PER_SECOND 1000 |
| #define MILLISECOND_TICKS_PER_DECISECOND (MILLISECOND_TICKS_PER_SECOND / 10) |
| |
| /** |
| * @brief Macro that copies the token value from non-volatile storage into a RAM |
| * location. This macro can only be used with tokens that are defined using |
| * DEFINE_INDEXED_TOKEN. |
| * |
| * @note To better understand the parameters of this macro, refer to the |
| * example of token usage above. |
| * |
| * @param data A pointer to where the token data should be placed. |
| * |
| * @param token The token name used in <code>DEFINE_*_TOKEN</code>, |
| * prepended with <code>TOKEN_</code>. |
| * @param index The index to access in the indexed token. |
| */ |
| #define halCommonGetIndexedToken(data, token, index) |
| |
| /** |
| * @brief Macro that sets the value of a token in non-volatile storage. This |
| * macro can only be used with tokens that are defined using |
| * DEFINE_INDEXED_TOKEN. |
| * |
| * @note To better understand the parameters of this macro, refer to the |
| * example of token usage above. |
| * |
| * @param token The token name used in <code>DEFINE_*_TOKEN</code>, |
| * prepended with <code>TOKEN_</code>. |
| * |
| * @param index The index to access in the indexed token. |
| * |
| * @param data A pointer to where the token data should be placed. |
| */ |
| #define halCommonSetIndexedToken(token, index, data) |