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.
 
 

841 lines
32 KiB

/**
* @file zigbee.nwk.h
* @brief NWK header file
* @author Exegin Technologies
* @copyright Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved.
*/
#ifndef ZIGBEE_NWK_H
# define ZIGBEE_NWK_H
/*---------------------------------------------------------------
* Misc. Definitions and Structures
*---------------------------------------------------------------
*/
#define ZbNwkAddrIsBcast(_addr_) (((_addr_) >= (uint16_t)ZB_NWK_ADDR_BCAST_MIN) && ((_addr_) != (uint16_t)ZB_NWK_ADDR_USE_EXT))
/* Special NWK addresses. */
#define ZB_NWK_ADDR_COORDINATOR (uint16_t)0x0000U
#define ZB_NWK_ADDR_BCAST_MIN (uint16_t)0xfff8U
#define ZB_NWK_ADDR_BCAST_LOW_POWER_ROUTERS (uint16_t)0xfffbU
#define ZB_NWK_ADDR_BCAST_ROUTERS (uint16_t)0xfffcU
#define ZB_NWK_ADDR_BCAST_RXON (uint16_t)0xfffdU
#define ZB_NWK_ADDR_USE_EXT (uint16_t)0xfffeU /* IEEE802154_ADDR_SHORT_NONE */
#define ZB_NWK_ADDR_BCAST_ALL (uint16_t)0xffffU /* IEEE802154_ADDR_SHORT_BCAST */
#define ZB_NWK_ADDR_UNDEFINED (uint16_t)0xffffU /* IEEE802154_ADDR_SHORT_BCAST */
/* ZigBee Stack Profiles (StackProfile or nwkStackProfile) */
enum {
ZB_NWK_STACK_PROFILE_NWKSPFC = 0x00,
ZB_NWK_STACK_PROFILE_HOME = 0x01,
ZB_NWK_STACK_PROFILE_PRO = 0x02,
ZB_NWK_STACK_PROFILE_PLANTCTRL = 0x03
};
/* Address allocation methods (nwkAddrAlloc) */
enum nwkAddrAllocMethod {
ZB_NWK_ADDR_ALLOC_DISTRIB = 0x00,
ZB_NWK_ADDR_ALLOC_RESERVED = 0x01,
ZB_NWK_ADDR_ALLOC_STOCHASTIC = 0x02
};
/* Status codes for network status indications. */
enum ZbNwkNetworkStatusCodeT {
ZB_NWK_STATUS_CODE_NO_ROUTE_AVAILABLE = 0x00, /**< No route available */
ZB_NWK_STATUS_CODE_TREE_LINK_FAILURE = 0x01, /**< Tree link failure */
ZB_NWK_STATUS_CODE_NON_TREE_LINK_FAILURE = 0x02, /**< Non-tree link failure */
ZB_NWK_STATUS_CODE_LOW_BATTERY = 0x03, /**< Low battery level */
ZB_NWK_STATUS_CODE_NO_ROUTING_CAPACITY = 0x04, /**< No routing capacity */
ZB_NWK_STATUS_CODE_NO_INDIRECT_CAPACITY = 0x05, /**< No indirect capacity */
ZB_NWK_STATUS_CODE_INDIRECT_EXPIRY = 0x06, /**< Indirect transaction expiry */
ZB_NWK_STATUS_CODE_TARGET_UNAVAILABLE = 0x07, /**< Target device unavailable */
ZB_NWK_STATUS_CODE_TARGET_UNALLOCATED = 0x08, /**< Target address unallocated */
ZB_NWK_STATUS_CODE_PARENT_LINK_FAILURE = 0x09, /**< Parent link failure */
ZB_NWK_STATUS_CODE_VALIDATE_ROUTE = 0x0a, /**< Validate route */
ZB_NWK_STATUS_CODE_SOURCE_ROUTE_FAILURE = 0x0b, /**< Source route failure */
ZB_NWK_STATUS_CODE_MANY_TO_ONE_FAILURE = 0x0c, /**< Many-to-one route failure */
ZB_NWK_STATUS_CODE_ADDRESS_CONFLICT = 0x0d, /**< Address conflict */
ZB_NWK_STATUS_CODE_VERIFY_ADDRESS = 0x0e, /**< Verify address */
ZB_NWK_STATUS_CODE_PANID_UPDATE = 0x0f, /**< PAN identifier update */
ZB_NWK_STATUS_CODE_ADDRESS_UPDATE = 0x10, /**< Network address update */
ZB_NWK_STATUS_CODE_BAD_FRAME_COUNTER = 0x11, /**< Bad frame counter */
ZB_NWK_STATUS_CODE_BAD_KEY_SEQNUM = 0x12, /**< Bad key sequence number */
ZB_NWK_STATUS_CODE_UNKNOWN_COMMAND = 0x13, /**< Unknown Command */
/* 0x14 - 0xff = Reserved */
/* Custom Exegin status codes */
ZB_NWK_STATUS_CODE_INCOMING_FRAME_COUNTER = 0xff /**< (Exegin custom) An incoming frame counter is greater than 0x80000000 */
};
/* NWK DstAddrMode values */
enum ZbNwkAddrModeT {
ZB_NWK_ADDRMODE_NONE = 0,
ZB_NWK_ADDRMODE_MCAST, /* 1 - deprecated by R23 */
ZB_NWK_ADDRMODE_SHORT, /* 2 */
ZB_NWK_ADDRMODE_EXT /* 3 - for InterPAN */
};
/* NWK IB Attributes */
enum ZbNwkNibAttrIdT {
ZB_NWK_NIB_ID_PanId = 0x80, /* 0x80 ZigBee 2007+ */
ZB_NWK_NIB_ID_SequenceNumber = 0x81,
ZB_NWK_NIB_ID_PassiveAckTimeout = 0x82,
ZB_NWK_NIB_ID_MaxBroadcastRetries = 0x83,
ZB_NWK_NIB_ID_MaxChildren = 0x84,
ZB_NWK_NIB_ID_MaxDepth = 0x85,
ZB_NWK_NIB_ID_MaxRouters = 0x86,
/* Warning, the stack implements the NNT as a sorted list by NWK Address.
* If an entry is set through the NIB, it is inserted into the list sorted.
* It is generally a bad idea for an application to modify the NNT directly.
* Use ZbNwkNeighborClearAll to clear all entries (or all except parent, e.g.
* before end-device rejoin).
* EXEGIN - This NIB should be made read-only. */
ZB_NWK_NIB_ID_NeighborTable = 0x87,
/* Time duration in seconds (Note, the Spec defines this as OctetDurations) */
ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime = 0x88,
ZB_NWK_NIB_ID_ReportConstantCost = 0x89,
ZB_NWK_NIB_ID_RouteDiscoveryRetriesPermitted = 0x8a,
ZB_NWK_NIB_ID_RouteTable = 0x8b,
ZB_NWK_NIB_ID_TimeStamp = 0x8c,
ZB_NWK_NIB_ID_TxTotal = 0x8d, /* EXEGIN - make TxTotal a per interface thing */
ZB_NWK_NIB_ID_SymLink = 0x8e,
ZB_NWK_NIB_ID_CapabilityInformation = 0x8f,
ZB_NWK_NIB_ID_AddrAlloc = 0x90,
/* was ZB_NWK_NIB_ID_UseTreeRouting = 0x91 */
ZB_NWK_NIB_ID_ManagerAddr = 0x92,
ZB_NWK_NIB_ID_MaxSourceRoute = 0x93,
ZB_NWK_NIB_ID_UpdateId = 0x94,
ZB_NWK_NIB_ID_TransactionPersistenceTime = 0x95,
/* ZigBee 2006+ Attributes */
ZB_NWK_NIB_ID_NetworkAddress = 0x96,
ZB_NWK_NIB_ID_StackProfile = 0x97,
ZB_NWK_NIB_ID_BroadcastTransactionTable = 0x98,
ZB_NWK_NIB_ID_GroupIdTable = 0x99,
ZB_NWK_NIB_ID_ExtendedPanId = 0x9a,
/* ZigBee 2007+ Attributes */
ZB_NWK_NIB_ID_RouteRecordTable = 0x9c,
ZB_NWK_NIB_ID_IsConcentrator = 0x9d,
ZB_NWK_NIB_ID_ConcentratorRadius = 0x9e,
ZB_NWK_NIB_ID_ConcentratorDiscoveryTime = 0x9f, /* units: seconds */
/* ZigBee Security Attributes */
ZB_NWK_NIB_ID_SecurityLevel = 0xa0,
ZB_NWK_NIB_ID_SecurityMaterialSet = 0xa1,
ZB_NWK_NIB_ID_ActiveKeySeqNumber = 0xa2,
/* nwkAllFresh has been deprecated (0xa3) */
/* ...discontinuity... */
ZB_NWK_NIB_ID_SecureAllFrames = 0xa5,
/* ZigBee 2007+ Attributes (cont'd). */
ZB_NWK_NIB_ID_LinkStatusPeriod = 0xa6,
ZB_NWK_NIB_ID_RouterAgeLimit = 0xa7,
ZB_NWK_NIB_ID_UniqueAddr = 0xa8,
ZB_NWK_NIB_ID_AddressMap = 0xa9,
/* ...continued in zigbee.aps.h with ZB_APS_IB_ID_DEVICE_KEY_PAIR_SET... */
ZB_NWK_NIB_ID_DiscoveryTable = 0xb4, /* ZbNwkDiscoveryInfoT - Get only. */
/* 0x400 to 0x4ff reserved for custom NIBs. */
ZB_NWK_NIB_ID_Depth = 0x0400,
ZB_NWK_NIB_ID_FrameCounterSet,
/* Adds a delay in milliseconds between receiving the first RREP
* and sending any pending packets awaiting the completion of route
* discovery. Default is 0, meaning packets are sent after the
* first RREP is received. If a better route is discovered later on,
* subsequent packets will use the better route. */
ZB_NWK_NIB_ID_RouteDiscoverySendDelay,
ZB_NWK_NIB_ID_FastPollPeriod, /* Only used as sleepy end devices to set the fast polling inverval. */
ZB_NWK_NIB_ID_SlowPollPeriod,
ZB_NWK_NIB_ID_FrameCounterCooldown, /* Cooldown timer (in seconds) to apply to frame counter resets. */
ZB_NWK_NIB_ID_OutgoingCounter, /* Global outgoing frame counter. */
ZB_NWK_NIB_ID_PersistCounter, /* Persisted outgoing frame counter. */
/* R21+ attributes */
/* EXEGIN - The following NIBs should have IDs from 0xaa to 0xad, but
* these are already being used by APS security. I think the only place
* this would be a problem is the Gateway API which has a single generic
* GET/SET API, which means attribute IDs must be unique and not overlap. */
ZB_NWK_NIB_ID_LeaveRequestAllowed,
ZB_NWK_NIB_ID_ParentInformation,
ZB_NWK_NIB_ID_EndDeviceTimeoutDefault,
ZB_NWK_NIB_ID_EdkaFailThreshold, /* Number of consecutive EDKA request failures before triggering a PARENT_LINK_FAILURE. Valid range is 1 to 4. Default is 1. */
ZB_NWK_NIB_ID_LeaveRequestWithoutRejoinAllowed,
ZB_NWK_NIB_ID_DisablePeriodicTimers, /* If set, NWK layer disables edka & link power timers. Default is 0 (enabled). */
/* R22+ attributes */
/* EXEGIN - nwkIeeeAddress (should be 0xae, but already being used by APS security) */
/* EXEGIN - nwkMacInterfaceTable (should be 0xaf, but already being used by APS security) */
ZB_NWK_NIB_ID_TxPowerMgmtSupported, /* not affected by nwk_reset_nib, keeps value. */
ZB_NWK_NIB_ID_LinkPowerDeltaPeriod,
/* R22 MAC PIB Attributes that are maintained by our NWK layer, since we support multiple interfaces. */
ZB_NWK_NIB_ID_JoiningListUpdateId, /* IeeeJoiningListUpdateID [uint8_t] */
ZB_NWK_NIB_ID_JoiningPolicy, /* mibJoiningPolicy [uint8_t] */
ZB_NWK_NIB_ID_JoiningListTotal, /* IeeeJoiningListTotal [uint8_t] */
ZB_NWK_NIB_ID_JoiningListExpiryInterval, /* mibIeeeExpiryInterval minutes [uint16_t] */
/* mibIeeeExpiryIntervalCountdown is not externally accessible */
ZB_NWK_NIB_ID_ActiveChannelList, /* struct ZbChannelListT - Get only. */
ZB_NWK_NIB_ID_PermitJoinCounter, /* uint8_t - Get only. Set through ZbNlmePermitJoinReq */
ZB_NWK_NIB_ID_PassiveAckEnabled /* uint8_t - Enable/Disable Broadcast Passive ACK */
};
/* Possible values for struct ZbNlmeJoinReqT.rejoinNetwork */
enum ZbNwkRejoinTypeT {
ZB_NWK_REJOIN_TYPE_ASSOC = 0x00,
ZB_NWK_REJOIN_TYPE_ORPHAN,
ZB_NWK_REJOIN_TYPE_NWKREJOIN
};
/* R22 (GB-868) Joining Policies */
enum WpanJoinPolicyT {
WPAN_JOIN_POLICY_ALL = 0, /* 0x00 = ALL_JOIN */
WPAN_JOIN_POLICY_IEEELIST, /* 0x01 = IEEELIST_JOIN */
WPAN_JOIN_POLICY_NONE /* 0x02 = NO_JOIN */
};
/* Maximum link cost. */
#define ZB_NWK_LINK_COST_MAX 7U
/* NWK Constants */
#if 0 /* not used */
#define ZB_NWK_CONST_COORDINATOR_CAPABLE true
#endif
#define ZB_NWK_CONST_SECURITY_LEVEL 0x05U
#define ZB_NWK_CONST_DISCOVERY_RETRY_LIMIT 0x03U
#define ZB_NWK_CONST_MAX_DEPTH 0x0fU
#define ZB_NWK_CONST_MIN_HEADER_OVERHEAD 0x08U
#define ZB_NWK_CONST_PROTOCOL_VERSION ZB_PROTOCOL_VERSION_2007
#define ZB_NWK_CONST_WAIT_BEFORE_VALIDATION 0x500U /* In ms. */
#define ZB_NWK_CONST_REPAIR_THRESHOLD 0x03U
#define ZB_NWK_CONST_ROUTE_DISCOVERY_TIME 0x2710U /* In ms. (10 seconds) */
#define ZB_NWK_CONST_MAX_BROADCAST_JITTER 0x40U /* In ms. */
#define ZB_NWK_CONST_INITIAL_RREQ_RETRIES 0x03U
#define ZB_NWK_CONST_RREQ_RETRIES 0x02U
#define ZB_NWK_CONST_RREQ_RETRY_INTERVAL 0xfeU /* In ms. */
#define ZB_NWK_CONST_MIN_RREQ_JITTER 0x01U /* In 2 ms slots. */
#define ZB_NWK_CONST_MAX_RREQ_JITTER 0x40U /* In 2 ms slots. */
#define ZB_NWK_CONST_MAC_FRAME_OVERHEAD 0x0bU /* See D.4 of 053474r17. */
/* The following are added by Exegin */
#define ZB_NWK_CONST_SECURITY_OVERHEAD (14U + ZB_SEC_MIC_LENGTH_5)
/* 127 - 8 - 11 = 108 bytes */
#define ZB_NWK_CONST_MAX_PAYLOAD_SIZE (WPAN_CONST_MAX_PHY_PACKET_SIZE - ZB_NWK_CONST_MIN_HEADER_OVERHEAD - ZB_NWK_CONST_MAC_FRAME_OVERHEAD)
#define ZB_NWK_BCNPAYLOAD_MIN_SIZE 15U
#define ZB_NWK_ENH_BCNPAYLOAD_SIZE 19U
/* Upper bound on nwkMaxSourceRoute */
#define ZB_NWK_CONST_MAX_SOURCE_ROUTE 12U /* 0x0c */
/* The smaller the potential hop count, the larger packets we can send. */
#define ZB_NWK_CONST_DEFAULT_SOURCE_ROUTE 6U
#define ZB_NWK_CONST_ENDDEV_TIMEOUT_MAX 14U
#define ZB_NWK_CONST_ENDDEV_TIMEOUT_DEFAULT 8U
#define ZB_NWK_CONST_ENDDEV_TIMEOUT_DISABLED 0xffU
/* NWK Security Material Set (ZB_NWK_NIB_ID_SecurityMaterialSet) */
struct ZbNwkSecMaterialT {
bool valid;
uint8_t keySeqNumber;
uint8_t key[ZB_SEC_KEYSIZE];
enum ZbSecKeyTypeT keyType;
};
/* Frame Counter Attribute Set (ZB_NWK_NIB_ID_FrameCounterSet) */
struct ZbNwkFrameCounterT {
uint8_t keySeqNumber;
uint64_t senderAddr;
uint32_t counter;
ZbUptimeT cooldown; /* Cooldown timer for counter resets. */
ZbUptimeT lastUsed; /* Timer for LRU evictions. */
uint32_t persistCounter; /* Last saved counter value */
};
struct ZbNwkRouteRecordInfoT {
unsigned int recordsSent;
bool doSendNext; /* Send Route Record before next tx */
bool doRenew; /* Whether to renew sending a Route Record after renewTime. */
ZbUptimeT renewTime;
};
/* NNT Discovery Parameters (ZB_NWK_NIB_ID_DiscoveryTable) */
struct ZbNwkDiscoveryInfoT {
uint16_t panId;
uint64_t epid;
uint8_t channelPage;
uint16_t logicalChannel;
uint8_t protocolVersion;
uint8_t stackProfile;
uint8_t nwkDepth;
bool useSecurity;
bool permitJoin;
bool routerCapacity;
bool endDevCapacity;
bool potentialParent;
uint8_t updateId;
uint8_t lqi; /* mirror of struct ZbNwkNeighborT.lqi value */
/* Exegin add-ons */
uint8_t beaconOrder;
uint8_t superframeOrder;
/* Duplicates of struct ZbNwkNeighborT. Only used by ZB_NWK_NIB_ID_DiscoveryTable */
uint16_t nwkAddr; /* Entry is empty if == ZB_NWK_ADDR_UNDEFINED */
};
/*
* Neighbor Table Entry
*
* Contains all the mandatory fields that are used during normal
* network operation. This is maintained in the NIB, all entries
* are assumed to be on the same network as the local device.
*/
/* Device Type definitions. */
enum ZbNwkNeighborTypeT {
ZB_NWK_NEIGHBOR_TYPE_COORD = 0x00,
ZB_NWK_NEIGHBOR_TYPE_ROUTER = 0x01,
ZB_NWK_NEIGHBOR_TYPE_END_DEV = 0x02,
ZB_NWK_NEIGHBOR_TYPE_UNKNOWN = 0x03
};
/* Device Relationship definitions. */
enum ZbNwkNeighborRelT {
ZB_NWK_NEIGHBOR_REL_PARENT = 0x00,
ZB_NWK_NEIGHBOR_REL_CHILD = 0x01,
ZB_NWK_NEIGHBOR_REL_SIBLING = 0x02,
ZB_NWK_NEIGHBOR_REL_NONE = 0x03,
ZB_NWK_NEIGHBOR_REL_PREV_CHILD = 0x04,
/* Exegin Custom Values follow here */
ZB_NWK_NEIGHBOR_REL_UNAUTH_CHILD = 0x05,
/* Temporary values to use during association. */
ZB_NWK_NEIGHBOR_REL_PEND_ASSOCIATE = 0x06,
ZB_NWK_NEIGHBOR_REL_PEND_ORPHAN = 0x07
};
/* Parent Information is one byte. We extend it to two bytes for internal state. */
#define ZB_NWK_PARENT_INFO_MASK 0x0007U
#define ZB_NWK_PARENT_INFO_DATA_POLL 0x0001U /* MAC Data Poll Keepalive Supported */
#define ZB_NWK_PARENT_INFO_KEEP_ALIVE 0x0002U /* End Device Timeout Request Keepalive Supported */
#define ZB_NWK_PARENT_INFO_POWER_NEGOT 0x0004U /* Power Negotiation Supported (R22: Link Power Delta) */
/* Exegin add-on to track the status of parent info */
#define ZB_NWK_PARENT_INFO_START 0x0100U
/* Exegin add-on to track a manual EDKA request. */
#define ZB_NWK_PARENT_INFO_MANUAL_EDKA_REQ 0x0200U
#define ZB_NWK_NEIGHBOR_TIMEOUT_SECONDS(_x_) ((_x_ != 0U) ? ((ZbUptimeT)60U << (_x_)) : (ZbUptimeT)10U)
#define ZB_NWK_NEIGHBOR_TIMEOUT_MAX 14U
#define ZB_NWK_NEIGHBOR_IFINDEX_UNKNOWN 0xffU
struct ZbNwkNeighborT {
/*** Mandatory Neighbor Table Entries */
uint64_t extAddr;
uint16_t nwkAddr; /* Set to ZB_NWK_ADDR_UNDEFINED to invalidate entry */
uint8_t capability;
enum ZbNwkNeighborTypeT deviceType;
bool rxOnWhenIdle; /* EXEGIN - why not just use capability? */
enum ZbNwkNeighborRelT relationship;
uint8_t txFailure;
uint8_t lqi; /* Average LQI. */
int8_t unicastRssi; /* Average RSSI when sent as unicast. For power control. */
uint8_t outgoingCost; /* ZigBee 2007. */
uint8_t age; /* ZigBee 2007. */
uint8_t interval; /* R21 draft. */
ZbUptimeT timeout; /* R21 draft. Disabled if zero. */
uint8_t ifc_index; /* R22 - set to ZB_NWK_NEIGHBOR_IFINDEX_UNKNOWN if not known (e.g. after persistence) */
};
/*
* Routing Table Entry
*/
/* Route status values (2.7.3.2) */
enum ZbNwkRouteStatusT {
ZB_NWK_ROUTE_STATUS_ACTIVE = 0x00,
ZB_NWK_ROUTE_STATUS_DISCOVERY_UNDERWAY = 0x01,
ZB_NWK_ROUTE_STATUS_DISCOVERY_FAILED = 0x02,
ZB_NWK_ROUTE_STATUS_INACTIVE = 0x03
};
#define ZB_NWK_ROUTE_RECORD_RENEWAL_TIMEOUT (60U * 1000U) /* ms */
#define ZB_NWK_ROUTE_RECORD_POST_SLEEP (20U) /* ms */
struct ZbNwkRouteEntryT {
enum ZbNwkRouteStatusT status;
bool noCache; /* flag indicating destination doesn't store source routes. */
bool isManyToOne; /* flag indicating if destination is a concentrator */
struct ZbNwkRouteRecordInfoT routeRecord;
uint16_t destAddr;
uint16_t nextAddr;
ZbUptimeT lastUsed; /* Used to measure route table ageing. */
uint8_t cost; /* Currently not being used. */
};
/*---------------------------------------------------------------
* NLDE
*---------------------------------------------------------------
*/
/* NLDE-DATA.request */
struct ZbNldeDataReqT {
enum ZbNwkAddrModeT dstAddrMode;
uint8_t nonMemberRadius;
uint16_t dstAddr;
const void *nsdu;
uint8_t nsduLength;
uint32_t handle;
uint8_t radius;
bool discoverRoute;
bool security;
/* Alias */
bool useAlias;
uint16_t aliasAddr;
uint8_t aliasSeqnum;
};
/* NLDE-DATA.confirm */
struct ZbNldeDataConfT {
uint32_t handle;
enum ZbStatusCodeT status;
};
/* NLDE-DATA.indication */
struct ZbNldeDataIndT {
enum ZbNwkAddrModeT dstAddrMode;
uint16_t dstAddr;
uint16_t srcAddr;
uint16_t linkAddr; /* Exegin add-on for Intra-PAN portability. */
uint8_t nsdu[ZB_NWK_CONST_MAX_PAYLOAD_SIZE];
uint8_t nsduLength;
uint8_t linkQuality;
int8_t rssi;
bool useSecurity;
};
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeDataReqCallback(struct ZigBeeT *zb, struct ZbNldeDataReqT *req,
void (*callback)(struct ZbNldeDataConfT *dataConf, void *cb_arg), void *arg);
/* NLDE-FRAME.request */
/* Exegin addon for RAW MAC frame transmission. */
struct ZbNldeFrameReqT {
enum ZbNwkAddrModeT dstAddrMode;
enum ZbNwkAddrModeT srcAddrMode;
uint16_t dstAddr16;
uint64_t dstAddr64;
uint16_t dstPanId;
uint8_t txOptions;
const void *msdu;
uint8_t msduLength;
uint32_t handle;
};
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeFrameReqCallback(struct ZigBeeT *zb, struct ZbNldeFrameReqT *req,
void (*callback)(struct ZbNldeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
* NLME
*---------------------------------------------------------------
*/
/* NLME-GET.request */
struct ZbNlmeGetReqT {
enum ZbNwkNibAttrIdT attrId;
void *attr; /* Buffer for attribute data */
unsigned int attrLength; /* Max length of input, actual length returned */
unsigned int attrIndex;
};
/* NLME-GET.confirm */
struct ZbNlmeGetConfT {
enum ZbStatusCodeT status;
enum ZbNwkNibAttrIdT attrId;
};
/* NLME-SET.request */
struct ZbNlmeSetReqT {
enum ZbNwkNibAttrIdT attrId;
const void *attr;
unsigned int attrLength;
unsigned int attrIndex;
};
/* NLME-SET.confirm */
struct ZbNlmeSetConfT {
enum ZbStatusCodeT status;
enum ZbNwkNibAttrIdT attrId;
};
/* NLME-RESET.request */
struct ZbNlmeResetReqT {
bool warmStart;
};
/* NLME-RESET.confirm */
struct ZbNlmeResetConfT {
enum ZbStatusCodeT status;
};
/* NLME-SYNC.request */
struct ZbNlmeSyncReqT {
bool track;
};
/* NLME-SYNC.confirm */
struct ZbNlmeSyncConfT {
enum ZbStatusCodeT status;
};
/* NLME-SYNC.indication */
struct ZbNlmeSyncIndT {
void *voidPtr; /* empty */
};
/* NLME-NETWORK-FORMATION.request */
struct ZbNlmeNetFormReqT {
/* A network form always uses the standard MCP_SCAN_ACTIVE scan type
* in order to elicit all Beacons to check for existing PAN Ids. */
struct ZbChannelListT scanChannels;
uint8_t scanDuration;
uint8_t beaconOrder;
uint8_t superframeOrder;
uint8_t batteryLifeExtension;
bool distributed;
};
/* NLME-NETWORK-FORMATION.confirm */
struct ZbNlmeNetFormConfT {
enum ZbStatusCodeT status;
};
/* NLME-NETWORK-DISCOVERY.request */
struct ZbNlmeNetDiscReqT {
struct ZbChannelListT scanChannels;
uint8_t scanDuration;
};
/* NLME-NETWORK-DISCOVERY.confirm */
struct ZbNlmeNetDiscConfT {
enum ZbStatusCodeT status;
/* Use ZB_NWK_NIB_ID_DiscoveryTable to retrieve the discovery table entries. */
};
/* NLME-PERMIT-JOIN.request */
struct ZbNlmePermitJoinReqT {
uint8_t permitDuration;
};
/* NLME-PERMIT-JOIN.confirm */
struct ZbNlmePermitJoinConfT {
enum ZbStatusCodeT status;
};
/* NLME-JOIN.request */
struct ZbNlmeJoinReqT {
uint64_t epid;
enum ZbNwkRejoinTypeT rejoinNetwork;
struct ZbChannelListT scanChannels;
uint8_t scanDuration;
uint8_t capabilityInformation; /* e.g. MCP_ASSOC_CAP_DEV_TYPE */
bool securityEnable;
};
/* NLME-JOIN.confirm */
struct ZbNlmeJoinConfT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
};
/* NLME-JOIN.indication */
struct ZbNlmeJoinIndT {
uint16_t nwkAddr;
uint64_t extAddr;
uint8_t capabilityInfo;
enum ZbNwkRejoinTypeT rejoinNetwork;
bool secureRejoin;
};
/* NLME-DIRECT-JOIN.request */
struct ZbNlmeDirectJoinReqT {
uint64_t deviceAddr;
uint16_t nwkAddr; /* Exegin addon - set to ZB_NWK_ADDR_UNDEFINED if not used. */
uint8_t capabilityInfo;
uint8_t interval;
};
/* NLME-DIRECT-JOIN.confirm */
struct ZbNlmeDirectJoinConfT {
uint64_t deviceAddr;
enum ZbStatusCodeT status;
};
/* NLME-LEAVE.request */
struct ZbNlmeLeaveReqT {
uint64_t deviceAddr;
bool removeChildren;
bool rejoin;
};
/* NLME-LEAVE.confirm */
struct ZbNlmeLeaveConfT {
uint64_t deviceAddr;
enum ZbStatusCodeT status;
};
/* NLME-LEAVE.indication */
struct ZbNlmeLeaveIndT {
uint64_t deviceAddr;
bool rejoin;
/* Exegin extension */
uint16_t shortAddr;
/* Is one of our children leaving? By the time the NHLE has received this, the device
* has likely been removed as one of our children from the NNT. */
enum ZbNwkNeighborRelT relationship;
};
/* NLME-START-ROUTER.request */
struct ZbNlmeStartRouterReqT {
uint8_t beaconOrder;
uint8_t superframeOrder;
uint8_t battLifeExtension;
struct ZbChannelListT scanChannels;
};
/* NLME-START-ROUTER.confirm */
struct ZbNlmeStartRouterConfT {
enum ZbStatusCodeT status;
};
/* NLME-ED-SCAN.request */
struct ZbNlmeEdScanReqT {
uint32_t channelMask; /* Channel Page Structure [PAGE|MASK] */
uint8_t scanDuration;
};
/* NLME-ED-SCAN.confirm */
struct ZbNlmeEdScanConfT {
uint32_t unscannedChannels;
uint8_t energyDetectList[WPAN_PAGE_CHANNELS_MAX];
enum ZbStatusCodeT status;
};
/* NLME-ROUTE-DISCOVERY.request */
struct ZbNlmeRouteDiscReqT {
enum ZbNwkAddrModeT dstAddrMode;
uint16_t dstAddr;
uint8_t radius;
uint8_t noRouteCache;
};
/* NLME-ROUTE-DISCOVERY.confirm */
struct ZbNlmeRouteDiscConfT {
enum ZbStatusCodeT status;
};
/* NLME-NETWORK-STATUS.indication */
struct ZbNlmeNetworkStatusIndT {
uint16_t shortAddr;
enum ZbNwkNetworkStatusCodeT status;
};
/* NLME-SET-INTERFACE.request */
struct ZbNlmeSetInterfaceReqT {
uint8_t ifcIndex;
uint8_t state;
uint32_t channelInUse;
struct ZbChannelListT supportedChannels;
bool routersAllowed;
};
struct ZbNlmeSetInterfaceConfT {
enum ZbStatusCodeT status;
};
/* NLME-GET-INTERFACE.request */
struct ZbNlmeGetInterfaceReqT {
uint8_t ifcIndex;
};
struct ZbNlmeGetInterfaceConfT {
enum ZbStatusCodeT status;
uint8_t ifcIndex;
uint8_t state;
uint32_t channelInUse;
struct ZbChannelListT supportedChannels;
bool routersAllowed;
bool powerNegotSupported;
/* Exegin add-on */
struct WpanPublicT *mac;
};
/* Broadcast transaction table entry */
struct ZbNwkBttEntryT {
uint16_t srcAddr;
uint8_t seqnum;
/* EXEGIN - replace pAckCount with a list of router neighbors */
uint8_t pAckCount; /* passive ack count for flood limiting. */
ZbUptimeT expireTime; /* expiration time relative to ZbUptime. */
};
/** Commissioning configuration. */
struct ZbNwkCommissioningInfo {
uint8_t ifc_index; /**< NWK interface index. Starts at 0. */
uint16_t nwk_addr; /**< Network Address to configure (default is ZB_NWK_ADDR_UNDEFINED) */
uint16_t pan_id; /**< PAN Id to configure (default is ZB_NWK_ADDR_UNDEFINED) */
uint8_t rx_on; /**< Configures RxOnWhenIdle to MAC */
uint8_t page; /**< Channge Page to configure */
uint8_t channel; /**< Channel to configure */
};
/**
* Configures the MAC interface to be able to send and receive commissioning InterPAN packets.
* This API is provided so the stack doesn't need to expose the MLME-SET API.
* This should be called before the stack has been started (i.e. ZbStartup).
* @param zb Zigbee instance.
* @param commission_info Pointer to commissioning configuration data structure.
* @return True if configuration was successfully applied, false otherwise.
*/
bool ZbNwkCommissioningConfig(struct ZigBeeT *zb, struct ZbNwkCommissioningInfo *commission_info);
/* NLME-GET.request */
void ZbNlmeGetReq(struct ZigBeeT *zb, struct ZbNlmeGetReqT *getReqPtr, struct ZbNlmeGetConfT *getConfPtr);
/* NLME-SET.request */
void ZbNlmeSetReq(struct ZigBeeT *zb, struct ZbNlmeSetReqT *setReqPtr, struct ZbNlmeSetConfT *setConfPtr);
/* NLME-RESET.request */
void ZbNlmeResetReq(struct ZigBeeT *zb, struct ZbNlmeResetReqT *resetReqPtr, struct ZbNlmeResetConfT *resetConfPtr);
/* NLME-SYNC.request */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeSyncReq(struct ZigBeeT *zb, struct ZbNlmeSyncReqT *syncReqPtr,
void (*callback)(struct ZbNlmeSyncConfT *syncConfPtr, void *arg), void *arg);
/* NLME-NETWORK-DISCOVERY.request */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeNetDiscReq(struct ZigBeeT *zb, struct ZbNlmeNetDiscReqT *req,
void (*callback)(struct ZbNlmeNetDiscConfT *conf, void *cbarg), void *cbarg);
/* NLME-NETWORK-FORMATION.request */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeNetFormReq(struct ZigBeeT *zb, struct ZbNlmeNetFormReqT *req,
void (*callback)(struct ZbNlmeNetFormConfT *formConf, void *arg), void *cbarg);
/* NLME-PERMIT-JOIN.request */
void ZbNlmePermitJoinReq(struct ZigBeeT *zb, struct ZbNlmePermitJoinReqT *permitReq, struct ZbNlmePermitJoinConfT *permitConf);
/* Exegin Custom API to manage the IEEE Joining List in the NWK layer.
* Let the NWK layer manage configuring the individual MACs. */
enum WpanJoinPolicyT ZbNlmeJoiningPolicyGet(struct ZigBeeT *zb);
bool ZbNlmeJoiningPolicyConfigure(struct ZigBeeT *zb, enum WpanJoinPolicyT policy, uint64_t *extAddrList,
unsigned int numExtAddr, uint8_t *updateIdOverride);
void ZbNlmeJoinPolicyTimeoutRefresh(struct ZigBeeT *zb);
void ZbNlmeIeeeJoiningListClear(struct ZigBeeT *zb);
bool ZbNlmeIeeeJoiningListRemove(struct ZigBeeT *zb, uint64_t extAddr);
bool ZbNwkIeeeJoiningListEnabled(struct ZigBeeT *zb);
/* NLME-JOIN.request */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeJoinReq(struct ZigBeeT *zb, struct ZbNlmeJoinReqT *joinReqPtr,
void (*callback)(struct ZbNlmeJoinConfT *joinConf, void *arg), void *cbarg);
/* NLME-DIRECT-JOIN.request */
void ZbNlmeDirectJoinReq(struct ZigBeeT *zb, struct ZbNlmeDirectJoinReqT *directJoinReqPtr, struct ZbNlmeDirectJoinConfT
*directJoinConfPtr);
/* NLME-START-ROUTER.request */
void ZbNlmeStartRouterReq(struct ZigBeeT *zb, struct ZbNlmeStartRouterReqT *req, struct ZbNlmeStartRouterConfT *conf);
/* NLME-ED-SCAN.request */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeEdScanReq(struct ZigBeeT *zb, struct ZbNlmeEdScanReqT *req,
void (*callback)(struct ZbNlmeEdScanConfT *scanConf, void *arg), void *cbarg);
/* NLME-LEAVE.request. */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeLeaveReq(struct ZigBeeT *zb, struct ZbNlmeLeaveReqT *leaveReqPtr,
void (*callback)(struct ZbNlmeLeaveConfT *leaveConfPtr, void *arg), void *cbarg);
/* NLME-ROUTE-DISCOVERY.request */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeRouteDiscReq(struct ZigBeeT *zb, struct ZbNlmeRouteDiscReqT *routeDiscReqPtr,
void (*callback)(struct ZbNlmeRouteDiscConfT *discConf, void *cbarg), void *arg);
/* NLME-SET-INTERFACE.request */
void ZbNlmeSetInterface(struct ZigBeeT *zb, struct ZbNlmeSetInterfaceReqT *req, struct ZbNlmeSetInterfaceConfT *conf);
/* NLME-GET-INTERFACE.request */
void ZbNlmeGetInterface(struct ZigBeeT *zb, struct ZbNlmeGetInterfaceReqT *req, struct ZbNlmeGetInterfaceConfT *conf);
/* Helper to enable/disable interface */
bool ZbNwkIfToggleByName(struct ZigBeeT *zb, const char *name, bool enable);
bool ZbNwkIfSetTxPower(struct ZigBeeT *zb, const char *name, int8_t tx_power);
bool ZbNwkIfGetTxPower(struct ZigBeeT *zb, const char *name, int8_t *tx_power);
/* ZbNwkToggleDutyCycle - Enable or disable Duty Cycle management in the MAC.
* Disabling duty cycle will also clear the duty cycle history and set the status to
* MCP_DUTYCYCLE_STATUS_NORMAL.
* This function would typically be used in conjunction with ZB_NWK_NIB_ID_TxPowerMgmtSupported,
* which configures TX Power Control in the NWK and MAC. */
bool ZbNwkToggleDutyCycle(struct ZigBeeT *zb, bool enable);
/* Network end device keep alive request command. */
bool ZbNwkSendEdkaReq(struct ZigBeeT *zb);
/* Network Link power delta request & notify commands. */
bool ZbNwkSendLinkPowerDeltaReq(struct ZigBeeT *zb);
bool ZbNwkSendLinkPowerDeltaNotify(struct ZigBeeT *zb);
/*---------------------------------------------------------------
* NLME-GET and NLME-SET Helper Functions
*---------------------------------------------------------------
*/
/* ZbNwkGet and ZbNwkSet return the confirm status byte (SUCCESS == 0x00) */
enum ZbStatusCodeT ZbNwkGet(struct ZigBeeT *zb, enum ZbNwkNibAttrIdT attrId, void *attrPtr, unsigned int attrSz);
enum ZbStatusCodeT ZbNwkSet(struct ZigBeeT *zb, enum ZbNwkNibAttrIdT attrId, void *attrPtr, unsigned int attrSz);
enum ZbStatusCodeT ZbNwkGetIndex(struct ZigBeeT *zb, enum ZbNwkNibAttrIdT attrId, void *attrPtr, unsigned int attrSz, unsigned int attrIndex);
enum ZbStatusCodeT ZbNwkSetIndex(struct ZigBeeT *zb, enum ZbNwkNibAttrIdT attrId, void *attrPtr, unsigned int attrSz, unsigned int attrIndex);
/*---------------------------------------------------------------
* NIB Attribute Helper Functions
*---------------------------------------------------------------
*/
unsigned int ZbNwkAddrMapFreeSpace(struct ZigBeeT *zb);
bool ZbNwkAddrStoreMap(struct ZigBeeT *zb, uint16_t nwkAddr, uint64_t extAddr, bool resolve_conflict);
void ZbNwkAddrClearMap(struct ZigBeeT *zb, bool isShortAddr, uint64_t addr);
/* Returns the network address that corresponds to the extended address
* if known, otherwise returns ZB_NWK_ADDR_UNDEFINED. */
uint16_t ZbNwkAddrLookupNwk(struct ZigBeeT *zb, uint64_t extAddr);
/* Returns the extended address that corresponds to the network address
* if known, otherwise returns 0. */
uint64_t ZbNwkAddrLookupExt(struct ZigBeeT *zb, uint16_t nwkAddr);
bool ZbNwkGetSecMaterial(struct ZigBeeT *zb, uint8_t keySeqno, struct ZbNwkSecMaterialT *material);
bool ZbNwkSetFrameCounter(struct ZigBeeT *zb, uint8_t keySeqno, uint64_t srcAddr, uint32_t newFrameCount);
bool ZbNwkGetActiveKey(struct ZigBeeT *zb, struct ZbNwkSecMaterialT *active_key);
bool ZbNwkClearActiveKey(struct ZigBeeT *zb);
/*---------------------------------------------------------------
* NNT Helper Functions
*---------------------------------------------------------------
*/
const char * ZbNwkNeighborRelationshipToStr(enum ZbNwkNeighborRelT relationship);
const char * ZbNwkNeighborDeviceTypeToStr(enum ZbNwkNeighborTypeT deviceType);
/* Parent Functions */
uint64_t ZbNwkGetParentExtAddr(struct ZigBeeT *zb);
uint16_t ZbNwkGetParentShortAddr(struct ZigBeeT *zb);
/* Clear the NNT. For example, as a zigbee end-device performing a
* network discovery scan before rejoin, it needs to first clear the
* NNT except for it's parent entry (keep_parent = true). This way,
* only potential parents that responded to the network discovery
* scan will be attempted to rejoin the network to. */
void ZbNwkNeighborClearAll(struct ZigBeeT *zb, bool keep_parent, bool keep_children);
/*---------------------------------------------------------------
* Fast Polling
*---------------------------------------------------------------
*/
/* NLME-SYNC.request parent polling */
bool ZB_WARN_UNUSED ZbNwkFastPollRequest(struct ZigBeeT *zb);
bool ZbNwkFastPollRelease(struct ZigBeeT *zb);
unsigned int ZbNwkFastPollResourceCount(struct ZigBeeT *zb);
/*---------------------------------------------------------------
* Status Code to String
*---------------------------------------------------------------
*/
const char * ZbNwkStatusCodeStr(enum ZbNwkNetworkStatusCodeT status);
const char * ZbNwkStackProfileIdToStr(uint8_t stackProfile);
const char * ZbNwkRouteStatusToStr(enum ZbNwkRouteStatusT status);
#endif /* ZIGBEE_NWK_H */