You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

601 lines
27 KiB

/**
* @file zigbee.h
* @brief Zigbee header file.
* @author Exegin Technologies
* @copyright Copyright [2009 - 2021] Exegin Technologies Limited. All rights reserved.
*
* This file groups global/external definitions from all the layer specific header files
* e.g, aps, nwk, zdo etc... into a single place, so that one can just include zigbee.h for
* all the global definitions eliminating the header file inclusion clutter from source files.
*/
#ifndef ZIGBEE_H
# define ZIGBEE_H
#if defined(__GNUC__)
# define ZB_WARN_UNUSED __attribute__((warn_unused_result))
#elif defined(_MSC_VER) && (_MSC_VER >= 1800)
# define ZB_WARN_UNUSED
#else
# define ZB_WARN_UNUSED
#endif
#ifdef __CDT_PARSER__
/* Eclipse indexer only code */
#include "zb_make_config.h"
#endif
/* stdarg is required for the logging (ZbSetLogging) */
/*lint -save -e829 [ 'stdarg.h' usage should be deprecated - Rule 17.1 REQUIRED] */
/*lint -save -e451 [ header file included withoutstandard guard - Dir 4.10 REQUIRED] */
#include <stdarg.h>
/*lint -restore */
/*lint -restore */
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stddef.h> /* NULL */
#include "pletoh.h" /* Little endian conversion */
#include "llist.h" /* Link list */
#include "ieee802154_enums.h"
/* Zigbee instance */
struct ZigBeeT;
/* MAC instance */
struct WpanPublicT;
/* ZigBee Protocol Versions as related to the spec version. */
#if 0 /* deprecated */
#define ZB_PROTOCOL_VERSION_2004 0x0001U
#endif
#define ZB_PROTOCOL_VERSION_2007 0x0002U
/* Channel Mask / Page Helpers */
#define ZB_CHANNELMASK_GETPAGE(x) (uint8_t)(((x) >> WPAN_PAGE_CHANNELS_MAX) & 0x1FU)
#define ZB_CHANNELMASK(mask, page) ((page != 0U) ? \
((mask) | ((((uint32_t)page) & 0x1FU) << WPAN_PAGE_CHANNELS_MAX)) : (mask))
/* A value of 0xffff means the device is not associated. */
#define ZB_PANID_MAX 0xfffeU
#define ZB_EPID_MIN 0x0000000000000001ULL
#define ZB_EPID_MAX 0xfffffffffffffffeULL
/* The ZigBee distributed trust center address. */
#define ZB_DISTRIBUTED_TC_ADDR 0xffffffffffffffffULL
/* A subset of WPAN_CHANNELMASK_2400MHZ (HA and SE preferred channels) */
#define ZB_CHANNELMASK_2400MHZ_HA 0x0318C800U /* Channels 11, 14, 15, 19, 20, 24, 25 */
/* A predefined time to let the stack run in order to send a response, before
* proceeding to the next step. This is used to either prevent potential contention
* on the RF or if a packet must be sent before the stack parameters are modified
* or reset. */
#define ZB_TIMER_DELAY_FOR_RESPONSE 200U
/* ZigBee Status Codes */
enum ZbStatusCodeT {
/* General Status Codes */
ZB_STATUS_SUCCESS = 0x00,
ZB_STATUS_ALLOC_FAIL = 0x70, /* Memory allocation failure. */
/* ZDP Status Codes */
ZB_ZDP_STATUS_SUCCESS = ZB_STATUS_SUCCESS,
ZB_ZDP_STATUS_INV_REQTYPE = 0x80,
ZB_ZDP_STATUS_DEVNOTFOUND = 0x81,
ZB_ZDP_STATUS_INVALID_EP = 0x82,
ZB_ZDP_STATUS_NOT_ACTIVE = 0x83,
ZB_ZDP_STATUS_NOT_SUPPORTED = 0x84,
ZB_ZDP_STATUS_TIMEOUT = 0x85,
ZB_ZDP_STATUS_NO_MATCH = 0x86,
ZB_ZDP_STATUS_NO_ENTRY = 0x88,
ZB_ZDP_STATUS_NO_DESCRIPTOR = 0x89,
ZB_ZDP_STATUS_INSUFFICIENT_SPACE = 0x8a,
ZB_ZDP_STATUS_NOT_PERMITTED = 0x8b,
ZB_ZDP_STATUS_TABLE_FULL = 0x8c,
ZB_ZDP_STATUS_NOT_AUTHORIZED = 0x8d,
ZB_ZDP_STATUS_DEVICE_BINDING_TABLE_FULL = 0x8e,
ZB_ZDP_STATUS_INVALID_INDEX = 0x8f,
/* APS Status Codes. */
ZB_APS_STATUS_SUCCESS = ZB_STATUS_SUCCESS,
ZB_APS_STATUS_ASDU_TOO_LONG = 0xa0,
ZB_APS_STATUS_DEFRAG_DEFERRED = 0xa1,
ZB_APS_STATUS_DEFRAG_UNSUPPORTED = 0xa2,
ZB_APS_STATUS_ILLEGAL_REQUEST = 0xa3,
ZB_APS_STATUS_INVALID_BINDING = 0xa4,
ZB_APS_STATUS_INVALID_GROUP = 0xa5,
ZB_APS_STATUS_INVALID_PARAMETER = 0xa6,
ZB_APS_STATUS_NO_ACK = 0xa7,
ZB_APS_STATUS_NO_BOUND_DEVICE = 0xa8,
ZB_APS_STATUS_NO_SHORT_ADDRESS = 0xa9,
ZB_APS_STATUS_NOT_SUPPORTED = 0xaa,
ZB_APS_STATUS_SECURED_LINK_KEY = 0xab,
ZB_APS_STATUS_SECURED_NWK_KEY = 0xac,
ZB_APS_STATUS_SECURITY_FAIL = 0xad,
ZB_APS_STATUS_TABLE_FULL = 0xae,
ZB_APS_STATUS_UNSECURED = 0xaf,
ZB_APS_STATUS_UNSUPPORTED_ATTRIBUTE = 0xb0,
/* These values used in case of internal errors. */
ZB_APS_STATUS_INVALID_INDEX = 0xbd,
/* NWK Status Codes. */
ZB_NWK_STATUS_SUCCESS = ZB_STATUS_SUCCESS,
ZB_NWK_STATUS_INVALID_PARAMETER = 0xc1,
ZB_NWK_STATUS_INVALID_REQUEST = 0xc2,
ZB_NWK_STATUS_NOT_PERMITTED = 0xc3,
ZB_NWK_STATUS_STARTUP_FAILURE = 0xc4,
ZB_NWK_STATUS_ALREADY_PRESENT = 0xc5,
ZB_NWK_STATUS_SYNC_FAILURE = 0xc6,
ZB_NWK_STATUS_TABLE_FULL = 0xc7,
ZB_NWK_STATUS_UNKNOWN_DEVICE = 0xc8,
ZB_NWK_STATUS_UNSUPPORTED_ATTRIBUTE = 0xc9,
ZB_NWK_STATUS_NO_NETWORKS = 0xca,
ZB_NWK_STATUS_LEAVE_UNCONFIRMED = 0xcb,
ZB_NWK_STATUS_MAX_FRM_CNTR = 0xcc,
ZB_NWK_STATUS_NO_KEY = 0xcd,
ZB_NWK_STATUS_BAD_CCM_OUTPUT = 0xce,
ZB_NWK_STATUS_NO_ROUTING_CAPACITY = 0xcf,
ZB_NWK_STATUS_ROUTE_DISCOVERY_FAILED = 0xd0,
ZB_NWK_STATUS_ROUTE_ERROR = 0xd1,
ZB_NWK_STATUS_BT_TABLE_FULL = 0xd2,
ZB_NWK_STATUS_FRAME_NOT_BUFFERED = 0xd3,
/* Exegin Custom Status Values. */
ZB_NWK_STATUS_INVALID_INDEX = 0xd4,
ZB_NWK_STATUS_INTERNAL_ERR = 0xd6,
/* WPAN Status Codes (copied from mcp_enums.h to here for MISRA) */
ZB_WPAN_STATUS_SUCCESS = ZB_STATUS_SUCCESS,
ZB_WPAN_STATUS_COUNTER_ERROR = mcp_STATUS_COUNTER_ERROR,
ZB_WPAN_STATUS_IMPROPER_KEY_TYPE = mcp_STATUS_IMPROPER_KEY_TYPE,
ZB_WPAN_STATUS_IMPROPER_SECURITY_LEVEL = mcp_STATUS_IMPROPER_SECURITY_LEVEL,
ZB_WPAN_STATUS_UNSUPPORTED_LEGACY = mcp_STATUS_UNSUPPORTED_LEGACY,
ZB_WPAN_STATUS_UNSUPPORTED_SECURITY = mcp_STATUS_UNSUPPORTED_SECURITY,
ZB_WPAN_STATUS_BEACON_LOSS = mcp_STATUS_BEACON_LOSS,
ZB_WPAN_STATUS_CHANNEL_ACCESS_FAILURE = mcp_STATUS_CHANNEL_ACCESS_FAILURE,
ZB_WPAN_STATUS_DENIED = mcp_STATUS_DENIED,
ZB_WPAN_STATUS_DISABLE_TRX_FAILURE = mcp_STATUS_DISABLE_TRX_FAILURE,
ZB_WPAN_STATUS_SECURITY_ERROR = mcp_STATUS_SECURITY_ERROR,
ZB_WPAN_STATUS_FRAME_TOO_LONG = mcp_STATUS_FRAME_TOO_LONG,
ZB_WPAN_STATUS_INVALID_GTS = mcp_STATUS_INVALID_GTS,
ZB_WPAN_STATUS_INVALID_HANDLE = mcp_STATUS_INVALID_HANDLE,
ZB_WPAN_STATUS_INVALID_PARAMETER = mcp_STATUS_INVALID_PARAMETER,
ZB_WPAN_STATUS_NO_ACK = mcp_STATUS_NO_ACK,
ZB_WPAN_STATUS_NO_BEACON = mcp_STATUS_NO_BEACON,
ZB_WPAN_STATUS_NO_DATA = mcp_STATUS_NO_DATA,
ZB_WPAN_STATUS_NO_SHORT_ADDRESS = mcp_STATUS_NO_SHORT_ADDRESS,
ZB_WPAN_STATUS_OUT_OF_CAP = mcp_STATUS_OUT_OF_CAP,
ZB_WPAN_STATUS_PAN_ID_CONFLICT = mcp_STATUS_PAN_ID_CONFLICT,
ZB_WPAN_STATUS_REALIGNMENT = mcp_STATUS_REALIGNMENT,
ZB_WPAN_STATUS_TRANSACTION_EXPIRED = mcp_STATUS_TRANSACTION_EXPIRED,
ZB_WPAN_STATUS_TRANSACTION_OVERFLOW = mcp_STATUS_TRANSACTION_OVERFLOW,
ZB_WPAN_STATUS_TX_ACTIVE = mcp_STATUS_TX_ACTIVE,
ZB_WPAN_STATUS_UNAVAILABLE_KEY = mcp_STATUS_UNAVAILABLE_KEY,
ZB_WPAN_STATUS_UNSUPPORTED_ATTRIBUTE = mcp_STATUS_UNSUPPORTED_ATTRIBUTE,
ZB_WPAN_STATUS_INVALID_ADDRESS = mcp_STATUS_INVALID_ADDRESS,
ZB_WPAN_STATUS_ON_TIME_TOO_LONG = mcp_STATUS_ON_TIME_TOO_LONG,
ZB_WPAN_STATUS_PAST_TIME = mcp_STATUS_PAST_TIME,
ZB_WPAN_STATUS_TRACKING_OFF = mcp_STATUS_TRACKING_OFF,
ZB_WPAN_STATUS_INVALID_INDEX = mcp_STATUS_INVALID_INDEX,
ZB_WPAN_STATUS_LIMIT_REACHED = mcp_STATUS_LIMIT_REACHED,
ZB_WPAN_STATUS_READ_ONLY = mcp_STATUS_READ_ONLY,
ZB_WPAN_STATUS_SCAN_IN_PROGRESS = mcp_STATUS_SCAN_IN_PROGRESS,
ZB_WPAN_STATUS_SUPERFRAME_OVERLAP = mcp_STATUS_SUPERFRAME_OVERLAP,
ZB_WPAN_STATUS_DRIVER_ERROR = mcp_STATUS_DRIVER_ERROR,
ZB_WPAN_STATUS_DEVICE_ERROR = mcp_STATUS_DEVICE_ERROR
};
/* Trust Center Swap Out status codes */
enum ZbTcsoStatusT {
ZB_TCSO_STATUS_SUCCESS = 0x00, /* Successfully performed TCSO with new TC */
ZB_TCSO_STATUS_DISCOVERY_UNDERWAY, /* ZCL Keepalive has initiated TCSO, because of three consecutive failures. */
ZB_TCSO_STATUS_REJOIN_PREV, /* Found previous TC and rejoined to it. */
ZB_TCSO_STATUS_NOT_FOUND, /* Didn't find new or old TC, or process was aborted, resumed previous operation. */
ZB_TCSO_STATUS_FATAL /* TCSO failed and unable to restore previous operation. */
};
/*---------------------------------------------------------------
* Stack Logging
*---------------------------------------------------------------
*/
/* Debugging log mask. */
#define ZB_LOG_MASK_FATAL 0x00000001U /* Unrecoverable errors. */
#define ZB_LOG_MASK_ERROR 0x00000002U /* Recoverable internal errors. */
#define ZB_LOG_MASK_WARNING 0x00000004U /* Misused API calls, network problems, etc... */
#define ZB_LOG_MASK_INFO 0x00000008U /* Basic debugging info. Less verbose than ZB_LOG_MASK_DEBUG. */
#define ZB_LOG_MASK_DEBUG 0x00000010U /* General debug info */
#define ZB_LOG_MASK_PERSIST 0x00000020U /* Persistence */
/* NWK */
#define ZB_LOG_MASK_NWK_ROUTING 0x00000040U /* Network routing details. */
#define ZB_LOG_MASK_NWK_LQI 0x00000080U /* Network link status and lqi updates. */
#define ZB_LOG_MASK_NWK_SECURITY 0x00000100U /* Network security. */
#define ZB_LOG_MASK_NWK_ADDR_MAP 0x00000200U /* Network address map changes */
/* APS */
#define ZB_LOG_MASK_APS_SEND 0x00000400U /* APS packet transmission */
#define ZB_LOG_MASK_APS_FRAG 0x00000800U /* APS fragmentation debugging */
/* ZDO */
#define ZB_LOG_MASK_ZDO_ANNCE 0x00001000U /* Print on reception of ZDO Device_Annce */
/* ZCL */
#define ZB_LOG_MASK_ZCL 0x00002000U
/* Green Power */
#define ZB_LOG_MASK_GREENPOWER 0x00004000U
/* Diagnostics */
#define ZB_LOG_MASK_DIAG 0x00008000U
/* Reserved 0x0fff0000U */
/* MAC */
#define ZB_LOG_MASK_MAC_RSSI 0x10000000U /* Print debug message per MCPS-DATA.indication showing RSSI */
/* Log mask helpers */
#define ZB_LOG_MASK_LEVEL_0 0x00000000U
#define ZB_LOG_MASK_LEVEL_1 (ZB_LOG_MASK_FATAL)
#define ZB_LOG_MASK_LEVEL_2 (ZB_LOG_MASK_LEVEL_1 | ZB_LOG_MASK_ERROR)
#define ZB_LOG_MASK_LEVEL_3 (ZB_LOG_MASK_LEVEL_2 | ZB_LOG_MASK_WARNING)
#define ZB_LOG_MASK_LEVEL_4 (ZB_LOG_MASK_LEVEL_3 | ZB_LOG_MASK_INFO)
#define ZB_LOG_MASK_LEVEL_5 (ZB_LOG_MASK_LEVEL_4 | ZB_LOG_MASK_DEBUG)
#define ZB_LOG_MASK_LEVEL_6 (ZB_LOG_MASK_LEVEL_5 | ZB_LOG_MASK_ZCL)
#define ZB_LOG_MASK_LEVEL_ALL 0xFFFFFFFFU
/* Specifies the level of logging to use, and a callback that outputs the log information. */
void ZbSetLogging(struct ZigBeeT *zb, uint32_t mask,
void (*func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr, const char *fmt, va_list argptr));
void ZbGetLogging(struct ZigBeeT *zb, uint32_t *mask,
void(**func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr, const char *fmt, va_list argptr));
/*---------------------------------------------------------------
* Exegin Manufacturing ID
*---------------------------------------------------------------
*/
/* The Exegin manufacturer ID. */
#define ZB_MFG_CODE_EXEGIN 0x10D7U
#define ZB_MFG_CODE_WILDCARD 0xFFFFU
/*---------------------------------------------------------------
* Channel List Structure
*---------------------------------------------------------------
*/
/* One 2.4 GHz mask + one North American mask + five EU masks + four GB-868 masks. */
#define MAX_CHANNEL_LIST_ENTRIES 11U
struct ZbChannelListT {
/* Number of channel masks in 'list' */
uint8_t count;
struct {
/* 802.15.4 Channel Page */
uint8_t page;
/* e.g. WPAN_CHANNELMASK_2400MHZ or ZB_CHANNELMASK_2400MHZ_HA for Page 0. */
uint32_t channelMask;
} list[MAX_CHANNEL_LIST_ENTRIES];
};
/*---------------------------------------------------------------
* Stack Initialization
*---------------------------------------------------------------
*/
/* Opaque stack structures. */
struct ZigBeeT;
struct ZbMsgFilterT;
typedef unsigned long ZbUptimeT;
unsigned int ZbTimeoutRemaining(ZbUptimeT now, ZbUptimeT expire_time);
/* A pointer to this struct type is passed to ZbInit to define the various
* ZigBee tables used in the stack. If the pointer to ZbInit is NULL, the
* default sizes are used. */
struct ZbInitTblSizesT {
void *heapPtr;
/**< Pointer to memory to use for stack's run-time heap. Size equals heapSz bytes.
* If NULL, buffer will be allocated using ZbMalloc(). If stack built with
* CONFIG_ZB_ALLOC_STATIC, then ZbInit() will fail if either heapPtr is NULL
* or heapSz is zero.
*/
unsigned int heapSz;
/**< Size of heapPtr, if not NULL, or size of memory to allocate using ZbMalloc().
* If heapSz is zero, default is 32 kB for FFD or 8 kB for RFD (if stack built
* with CONFIG_ZB_ENDNODE). */
/* NWK Table Sizes */
unsigned int nwkNeighborTblSz;
/**< Network Neighbor Table (NNT) number of entries.
* Default is 64. */
unsigned int nwkRouteTblSz;
/**<
* Default is 32. */
unsigned int nwkAddrMapTblSz;
/**<
* Default is 32. */
unsigned int nwkBttSz;
/**<
* Default is 32. */
unsigned int nwkRReqSz;
/**<
* Default is 16. */
/* APS Table Sizes */
unsigned int apsPeerLinkKeyTblSz; /* Default: 32 */
};
/* Same parameters as ZbSetLogging takes. Allows debug log output
* as stack is being initialized. */
struct ZbInitSetLoggingT {
uint32_t mask; /**< e.g. ZB_LOG_MASK_LEVEL_2 */
void (*func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr,
const char *fmt, va_list argptr);
/**< Callback function to print log messages. */
};
/**
* This is called to create a new Zigbee stack instance. One of the parameters provided
* is an optional pointer to a struct that defines the sizes of some of the tables
* within the stack (e.g. NNT, Routing Table, Security Keys Table). This lets the
* application developer tailor the memory usage depending on the type of device
* being developed.
* @param extAddr EUI to be assigned to this Zigbee stack instance.
* @param tblSizes Optional pointer to a 'struct ZbInitTblSizesT' data structure defining
* some of the table sizes to be allocated.
* @param setLogging Optional pointer to a 'struct ZbInitSetLoggingT' data structure
* defining the log mask and callback to call to print log messages.
* @return Pointer to Zigbee stack instance, or NULL if there was a problem
* (e.g. not enough memory)
*/
struct ZigBeeT * ZbInit(uint64_t extAddr, struct ZbInitTblSizesT *tblSizes, struct ZbInitSetLoggingT *setLogging);
/* Deallocates a Zigbee stack instance. */
void ZbDestroy(struct ZigBeeT *zb);
/* Help seed the stack's PRNG. If the data has real entropy, set the has_entropy flag to true. */
void ZbSeedRand(struct ZigBeeT *zb, uint8_t *randBuf, unsigned int len, bool has_entropy);
/* Called periodically to run the stack. */
void ZbTimerWork(struct ZigBeeT *zb);
/* Returns the length of time (in milliseconds) until the next scheduled timer will elapse,
* or UINT_MAX if there are no scheduled timers. */
unsigned int ZbCheckTime(struct ZigBeeT *zb);
/* Configure a callback to wakeup the application if there's a new stack event to
* process. Not all stack ports require this. */
void ZbWakeupCallbackConfig(struct ZigBeeT *zb, void (*wakeup_cb)(void));
/* Called to get the file descriptor to be used to wake-up the stack thread that is
* calling ZbTimerWork if something in the stack needs attention. This is only required
* in multi-threaded environments. Without this event, it is possible for a user thread
* to initiate a stack function which* doesn't tickle the MAC layer, which in turn would
* wake up the stack thread. */
int ZbPortStackEventFd(struct ZigBeeT *zb);
void ZbChangeExtAddr(struct ZigBeeT *zb, uint64_t extAddr);
struct ZbNlmeLeaveConfT;
enum ZbStatusCodeT ZB_WARN_UNUSED ZbLeaveReq(struct ZigBeeT *zb,
void (*callback)(struct ZbNlmeLeaveConfT *conf, void *arg), void *cbarg);
/* Helper function to perform an APS and NWK reset */
void ZbReset(struct ZigBeeT *zb);
/* Attaches an IEEE 802.15.4 device driver to the ZigBee stack. Uses the link pointers
* within the device structure for linking. */
bool ZbIfAttach(struct ZigBeeT *zb, struct WpanPublicT *dev);
/* Detaches an IEEE 802.15.4 device driver from the ZigBee stack. */
void ZbIfDetach(struct ZigBeeT *zb, struct WpanPublicT *dev);
/*---------------------------------------------------------------
* ZCL Basic Server API
*---------------------------------------------------------------
*/
/* Basic Cluster maximum string lengths. */
#define ZCL_BASIC_MANUFACTURER_NAME_LENGTH 32U
#define ZCL_BASIC_MODEL_IDENTIFIER_LENGTH 32U
#define ZCL_BASIC_DATE_CODE_LENGTH 16U
#define ZCL_BASIC_LOCATION_DESC_LENGTH 16U
#define ZCL_BASIC_SW_BUILD_ID_LENGTH 16U
/**
* This data structure is used to configure the default attribute values
* for the Basic Server. All values are in ZCL data format (i.e. strings
* are prefixed with the length byte)
*/
struct ZbZclBasicServerDefaults {
uint8_t app_version; /**< ZCL_BASIC_ATTR_APP_VERSION */
uint8_t stack_version; /**< ZCL_BASIC_ATTR_STACK_VERSION */
uint8_t hw_version; /**< ZCL_BASIC_ATTR_HARDWARE_VERSION */
uint8_t mfr_name[ZCL_BASIC_MANUFACTURER_NAME_LENGTH + 1U]; /**< ZCL_BASIC_ATTR_MFR_NAME (First byte length) */
uint8_t model_name[ZCL_BASIC_MODEL_IDENTIFIER_LENGTH + 1U]; /**< ZCL_BASIC_ATTR_MODEL_NAME (First byte length) */
uint8_t date_code[ZCL_BASIC_DATE_CODE_LENGTH + 1U]; /**< ZCL_BASIC_ATTR_DATE_CODE (First byte length) */
uint8_t power_source; /**< ZCL_BASIC_ATTR_POWER_SOURCE (e.g. ZCL_BASIC_POWER_UNKNOWN) */
uint8_t sw_build_id[ZCL_BASIC_SW_BUILD_ID_LENGTH + 1U]; /**< ZCL_BASIC_ATTR_SW_BUILD_ID (First byte length) */
};
/**
* Configure the default ZCL Basic Server attribute values. The Basic Server
* is integral to the stack in order for the attribute values to be made "global"
* and shared between all Basic Server instances on all endpoints.
* This should be called after calling ZbInit and before creating any ZCL endpoints.
* @param zb Zigbee instance
* @param defaults Pointer to the default configuration data structure
* @return None
*/
void ZbZclBasicServerConfigDefaults(struct ZigBeeT *zb, const struct ZbZclBasicServerDefaults *defaults);
/* Controls whether the Basic Server is allowed to process the ZCL_BASIC_RESET_FACTORY command. */
void ZbZclBasicServerResetCmdConfig(struct ZigBeeT *zb, bool allow_reset);
/* Write to the local attributes (e.g. ZCL_BASIC_ATTR_MFR_NAME) */
/**
* Write to a Basic Server attribute
* @param zb Zigbee instance
* @param endpoint Specify the endpoint of the Basic Server, or use ZB_ENDPOINT_BCAST to find and use
* the first endpoint that contains a Basic Server. Since the attributes are shared between all
* instances of the Basic Server, it doesn't matter which endpoint is chosen.
* @param attributeId The attribute Id to modify
* @param ptr Pointer to the attribute data, in the ZCL defined format.
* @param len Maximum length of the attribute data. May exceed the length of the particular attribute.
* @return ZCL Status Code
*/
enum ZclStatusCodeT ZbZclBasicWriteDirect(struct ZigBeeT *zb, uint8_t endpoint, uint16_t attributeId,
const uint8_t *ptr, unsigned int len);
/* Post an alarm code to the Basic Cluster */
bool ZbZclBasicPostAlarm(struct ZigBeeT *zb, uint8_t endpoint, uint8_t alarm_code);
/*---------------------------------------------------------------
* ZigBee Timer
*---------------------------------------------------------------
*/
/* Opaque timer structure. */
struct ZbTimerT;
/* Creates a ZigBee timer structure. */
struct ZbTimerT * ZbTimerAlloc(struct ZigBeeT *zb, void (*callback)(struct ZigBeeT *zb, void *cb_arg), void *arg);
void ZbTimerChangeCallback(struct ZbTimerT *timer, void (*callback)(struct ZigBeeT *zb, void *cb_arg), void *arg);
void ZbTimerStop(struct ZbTimerT *timer);
void ZbTimerFree(struct ZbTimerT *timer);
/* Resets and schedules a ZigBee timer. */
void ZbTimerReset(struct ZbTimerT *timer, unsigned int timeout);
bool ZbTimerRunning(struct ZbTimerT *timer);
/* ZbTimerRemaining returns time remaining in mS for the given timer. */
unsigned int ZbTimerRemaining(struct ZbTimerT *timer);
/*---------------------------------------------------------------
* Asynchronous messaging filter API
*---------------------------------------------------------------
*/
/* Asynchronous message filter mask. */
/* NWK Indications */
#define ZB_MSG_FILTER_JOIN_IND 0x00000001U /* NLME-JOIN.indication (struct ZbNlmeJoinIndT) */
#define ZB_MSG_FILTER_LEAVE_IND 0x00000002U /* NLME-LEAVE.indication (struct ZbNlmeLeaveIndT) */
#define ZB_MSG_FILTER_STATUS_IND 0x00000004U /* NLME-NETWORK-STATUS.indication (struct ZbNlmeNetworkStatusIndT) */
/* APS Indications */
#define ZB_MSG_FILTER_TRANSPORT_KEY_IND 0x00000008U /* APSME-TRANSPORT-KEY.indication (struct ZbApsmeTransKeyIndT) */
#define ZB_MSG_FILTER_UPDATE_DEVICE_IND 0x00000010U /* APSME-UPDATE-DEVICE.indication (struct ZbApsmeUpdateDeviceIndT) */
#define ZB_MSG_FILTER_REMOVE_DEVICE_IND 0x00000020U /* APSME-REMOVE-DEVICE.indication (struct ZbApsmeRemoveDeviceIndT) */
#define ZB_MSG_FILTER_REQUEST_KEY_IND 0x00000040U /* APSME-REQUEST-KEY.indication (struct ZbApsmeRequestKeyIndT) */
#define ZB_MSG_FILTER_SWITCH_KEY_IND 0x00000080U /* APSME-SWITCH-KEY.indication (struct ZbApsmeSwitchKeyIndT) */
#define ZB_MSG_FILTER_VERIFY_KEY_IND 0x00000100U /* APSME-VERIFY-KEY.indication (struct ZbApsmeVerifyKeyIndT) */
#define ZB_MSG_FILTER_CONFIRM_KEY_IND 0x00000200U /* APSME-CONFIRM-KEY.indication (struct ZbApsmeConfirmKeyIndT) */
/* Data Indications */
#define ZB_MSG_FILTER_MCPS_DATA_IND 0x00000400U /* MCPS-DATA.indication (struct wpan_data_ind) */
#define ZB_MSG_FILTER_NLDE_DATA_IND 0x00000800U /* NLDE-DATA.indication (struct ZbNldeDataIndT) */
#define ZB_MSG_FILTER_APSDE_DATA_IND 0x00001000U /* APSDE-DATA.indication (struct ZbApsdeDataIndT) */
/* Startup Indications */
#define ZB_MSG_FILTER_STARTUP_IND 0x00002000U /* (struct ZbMsgStartupInd) */
/* Reset to Factory Defaults (e.g. Basic Server ZCL_BASIC_RESET_FACTORY command) */
#define ZB_MSG_FILTER_FACTORY_RESET 0x00004000U
#define ZB_MSG_FILTER_RESET_REPORTS 0x00008000U
/* Note, max filter bit we can specify here is 0x00080000U */
/* Groups of messages that are filterable. */
#define ZB_MSG_FILTER_NLME \
(ZB_MSG_FILTER_JOIN_IND | ZB_MSG_FILTER_LEAVE_IND | ZB_MSG_FILTER_STATUS_IND)
#define ZB_MSG_FILTER_APSME \
(ZB_MSG_FILTER_TRANSPORT_KEY_IND | ZB_MSG_FILTER_UPDATE_DEVICE_IND | ZB_MSG_FILTER_REMOVE_DEVICE_IND | \
ZB_MSG_FILTER_REQUEST_KEY_IND | ZB_MSG_FILTER_SWITCH_KEY_IND | ZB_MSG_FILTER_VERIFY_KEY_IND | \
ZB_MSG_FILTER_CONFIRM_KEY_IND)
/* Message filter priorities (255 = highest, 0 = lowest) */
#define ZB_MSG_INTERNAL_PRIO 128 /* default stack priority */
#define ZB_MSG_DEFAULT_PRIO 64 /* default application priority */
/* Message filter return values. */
enum zb_msg_filter_rc {
ZB_MSG_CONTINUE = 0, /* Continue processing any further filter callbacks. */
ZB_MSG_DISCARD /* Stop processing further filter callbacks. */
};
struct ZbApsFilterT;
struct ZbMsgFilterT * ZbMsgFilterRegister(struct ZigBeeT *zb, uint32_t mask, uint8_t prio,
enum zb_msg_filter_rc (*callback)(struct ZigBeeT *zb, uint32_t id, void *msg, void *cbarg), void *arg);
void ZbMsgFilterRemove(struct ZigBeeT *zb, struct ZbMsgFilterT *filter);
struct ZbMsgStartupInd {
enum ZbStatusCodeT status;
};
/*---------------------------------------------------------
* Persistence
*---------------------------------------------------------
*/
unsigned int ZbPersistGet(struct ZigBeeT *zb, uint8_t *buf, unsigned int maxlen);
bool ZbPersistNotifyRegister(struct ZigBeeT *zb, void (*callback)(struct ZigBeeT *zb, void *cbarg), void *cbarg);
/*---------------------------------------------------------
* ZED Shutdown
*---------------------------------------------------------
*/
/* This API moves the stack to shutdown mode, used in case of a sleepy end device to conserve power. */
void ZbShutdown(struct ZigBeeT *zb);
/*---------------------------------------------------------------
* Test Case Hooks
*---------------------------------------------------------------
*/
/* These represent bits in a 32-bit bitmask. */
enum ZbTestcaseT {
ZB_TESTCASE_NONE = 0,
ZB_TESTCASE_SE1X_15_47, /* Server sends a truncated INITIATE_KEY response */
ZB_TESTCASE_SE1X_15_48, /* Client sends a truncated EPHEMERAL_DATA request */
ZB_TESTCASE_CBKE_DELAY_EPH_DATA, /* e.g. SE 1.4 test case 15.25 */
ZB_TESTCASE_CBKE_DELAY_RESPONSE, /* e.g. SE 1.4 test case 15.26 */
ZB_TESTCASE_GB868_EBR_06, /* Bogus EBR */
/* Override tx power management in the MAC and always set a minimum
* power level. Useful for co-ax testing to prevent cross-talk. */
ZB_TESTCASE_GB868_MIN_TX_POWER,
ZB_TESTCASE_LINKPOWER_DROP_NOTIFY,
ZB_TESTCASE_LINKPOWER_DROP_REQUEST,
ZB_TESTCASE_REJOIN_DROP_RSP,
ZB_TESTCASE_REJOIN_RETURN_FULL,
ZB_TESTCASE_EDKA_DROP_REQUEST,
ZB_TESTCASE_ASSOC_RSP_FULL,
ZB_TESTCASE_TOUCHLINK_DEBUG_KEY,
ZB_TESTCASE_ZED_STACK_SHUTDOWN,
ZB_TESTCASE_REQUEST_KEY_DROP
};
/* External API */
void ZbTestCaseEnable(struct ZigBeeT *zb, enum ZbTestcaseT testcase);
void ZbTestCaseDisable(struct ZigBeeT *zb, enum ZbTestcaseT testcase);
void ZbTestCaseClear(struct ZigBeeT *zb);
uint32_t ZbTestCaseCurrent(struct ZigBeeT *zb);
/* Should only be required for the stack */
bool ZbTestCaseIsEnabled(struct ZigBeeT *zb, enum ZbTestcaseT testcase);
/*---------------------------------------------------------------
* Misc. Helper Functions
*---------------------------------------------------------------
*/
uint64_t ZbExtendedAddress(struct ZigBeeT *zb);
uint16_t ZbShortAddress(struct ZigBeeT *zb);
/* Total memory allocated from the heap. */
unsigned int ZbMallocTotalSz(void);
/* Memory allocated from the internal ZigBee heap. */
unsigned long ZbHeapUsed(struct ZigBeeT *zb);
unsigned long ZbHeapHighWaterMark(struct ZigBeeT *zb);
/* String conversion */
int zb_hex_str_to_bin(const char *string, void *out, unsigned int maxlen);
unsigned int zb_hex_bin_to_str(const uint8_t *in_data, unsigned int in_len, char *out_str, unsigned int max_len,
const char delimiter, unsigned int interval);
/*---------------------------------------------------------------
* Additional Layer Includes
*---------------------------------------------------------------
*/
#include "zigbee.security.h"
#include "zigbee.hash.h"
#include "zigbee.bdb.h"
#include "zigbee.aps.h"
#include "zigbee.nwk.h"
#include "zigbee.startup.h"
#include "zigbee.zdo.h"
#endif