/** * @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 */