/************************************************************************************************** Filename: nwk_util.h Revised: $Date: 2011-01-06 16:37:10 -0800 (Thu, 06 Jan 2011) $ Revision: $Revision: 24739 $ Description: Network layer utility functions. Copyright 2004-2011 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ #ifndef NWK_UTIL_H #define NWK_UTIL_H #ifdef __cplusplus extern "C" { #endif /********************************************************************* * INCLUDES */ #include "NLMEDE.h" #include "nwk.h" /********************************************************************* * MACROS */ /********************************************************************* * CONSTANTS */ /********************************************************************* * FRAME FORMAT CONSTANTS */ // Command identifiers #define CMD_ID_RREQ 0x01 #define CMD_ID_RREP 0x02 #define CMD_ID_NETWORK_STATUS 0x03 // New name for Route Error (CMD_ID_RERR) #define CMD_ID_LEAVE 0x04 #define CMD_ID_RREC 0x05 #define CMD_ID_REJOIN_REQ 0x06 #define CMD_ID_REJOIN_RSP 0x07 #define CMD_ID_LINK_STATUS 0x08 #define CMD_ID_NETWORK_REPORT 0x09 #define CMD_ID_NETWORK_UPDATE 0x0A #define CMD_ID_PING 7 #define CMD_ID_PING_RSP 8 #define CMD_ID_TREE_REQ 9 #define CMD_ID_TREE_RSP 10 #define CMD_ID_PARENT_REQ 11 #define CMD_ID_PARENT_RSP 12 // header fields #define NWK_HDR_FRAME_CTRL_LSB 0 #define NWK_HDR_FRAME_CTRL_MSB 1 #define NWK_HDR_DST_ADDR_LSB 2 #define NWK_HDR_DST_ADDR_MSB 3 #define NWK_HDR_SRC_ADDR_LSB 4 #define NWK_HDR_SRC_ADDR_MSB 5 #define NWK_HDR_RADIUS 6 #define NWK_HDR_SEQ_NUM 7 #define NWK_HDR_LEN 8 // optional header fields #define NWK_HDR_DST_EXTADDR_LEN Z_EXTADDR_LEN #define NWK_HDR_SRC_EXTADDR_LEN Z_EXTADDR_LEN #define NWK_HDR_MULTICAST_CTRL_LEN 1 #define NWK_HDR_SRC_ROUTE_SUBFRAME_LEN 0 #define NWK_HDR_SRCRTG_CNT_LEN 1 // frame control fields #define NWK_FC_FRAME_TYPE 0 #define NWK_FC_PROT_VERSION 2 #define NWK_FC_DISC_ROUTE 6 #define NWK_FC_MULTICAST 8 #define NWK_FC_SECURE 9 #define NWK_FC_SRC_ROUTE 10 #define NWK_FC_DST_EXTADDR 11 #define NWK_FC_SRC_EXTADDR 12 #define NWK_FC_RESERVED 13 // frame control field masks #define NWK_FC_FRAME_TYPE_MASK 0x03 #define NWK_FC_PROT_VERSION_MASK 0x0F #define NWK_FC_DISC_ROUTE_MASK 0x03 #define NWK_FC_MULTICAST_MASK 0x01 #define NWK_FC_SECURE_MASK 0x01 #define NWK_FC_SRC_ROUTE_MASK 0x01 #define NWK_FC_DST_EXTADDR_MASK 0x01 #define NWK_FC_SRC_EXTADDR_MASK 0x01 #define NWK_FC_RESERVED_MASK 0x07 // Frame Type sub-field #define DATA_FRAME_TYPE 0x00 #define CMD_FRAME_TYPE 0x01 #define STUB_NWK_FRAME_TYPE 0x03 #define NWK_FC_ROUTE_DISC_ENABLED 0x01 // Network command fields #define NWK_CMD_LEAVE_OPTIONS 1 #define NWK_CMD_LEAVE_SIZE 2 #define NWK_CMD_LEAVE_RJ 0x20 // rejoin #define NWK_CMD_LEAVE_REQ 0x40 // request(1)/indication(0) #define NWK_CMD_LEAVE_RC 0x80 // remove children #define NWK_CMD_LEAVE_OPTIONS_RESERVE 0x1F #define NWK_CMD_REJOIN_REQ_SIZE 2 #define NWK_CMD_REJOIN_RSP_SIZE 4 // Command lengths #define NSDU_SIZE_RREQ 6 #define NSDU_SIZE_RREQ_EXT NSDU_SIZE_RREQ + 8 #define NSDU_SIZE_RREP 8 #define NSDU_SIZE_NETWORK_STATUS 4 #define NSDU_SIZE_LINK_STATUS_DEFAULT 2 #define NSDU_SIZE_NETWORK_REPORT 10 #define NSDU_SIZE_NETWORK_UPDATE 11 #define NWK_AUX_HDR_LEN 14 // Status Codes for Network Status Command Frame #define NWKSTAT_NO_ROUTE_AVAIL 0x00 #define NWKSTAT_TREE_LINK_FAILURE 0x01 #define NWKSTAT_NONTREE_LINK_FAILURE 0x02 #define NWKSTAT_LOW_BATTERY_LEVEL 0x03 #define NWKSTAT_NO_ROUTING_CAPACITY 0x04 #define NWKSTAT_NO_INDIRECT_CAPACITY 0x05 #define NWKSTAT_INDIRECT_TRANS_EXPIRY 0x06 #define NWKSTAT_TARGET_DEVICE_UNAVAIL 0x07 #define NWKSTAT_TARGET_ADDRESS_UNALLOCATED 0x08 #define NWKSTAT_PARENT_LINK_FAILURE 0x09 #define NWKSTAT_VALIDATE_ROUTE 0x0a #define NWKSTAT_SOURCE_ROUTE_FAILURE 0x0b #define NWKSTAT_MANY_TO_ONE_ROUTE_FAILURE 0x0c #define NWKSTAT_ADDRESS_CONFLICT 0x0d #define NWKSTAT_VERIFY_ADDRESSES 0x0e #define NWKSTAT_PANID_UPDATE 0x0f #define NWKSTAT_NWK_ADDRESS_UPDATE 0x10 #define NWKSTAT_BAD_FRAME_COUNT 0x11 #define NWKSTAT_BAD_KEY_SEQ_NUMBER 0x12 // Link Status Option Field definitions #define LS_OPTION_LAST_FRAME 0x40 #define LS_OPTION_FIRST_FRAME 0x20 #define LS_OPTION_ENTRY_COUNT_MASK 0x1F #define LS_OPTION_RESERVED 0x80 #define LS_ENTRY_COST_MASK 0x07 #define LS_ENTRY_TXCOST_SHIFT 4 #define LS_ENTRY_RESERVED 0x88 #define LS_TABLE_SIZE 3 // Multicast Control Fields #define NWK_MC_MODE_MASK 0x03 #define NWK_MC_MODE_NONMEMBER 0x00 #define NWK_MC_MODE_MEMBER 0x01 #define NWK_MC_RADIUS_MASK 0x1C #define NWK_MC_RADIUS_SHIFT 2 #define NWK_MC_MAXRADIUS_MASK 0xE0 #define NWK_MC_MAXRADIUS_SHIFT 5 #define NWK_MC_RESET_RADIUS_SHIFT (NWK_MC_MAXRADIUS_SHIFT - NWK_MC_RADIUS_SHIFT) #define NWK_MC_INFINITE_RADIUS 7 // Report Types for Network Report Command Frame #define NWKREPORT_PANID_CONFLICT 0x00 // Network Report Command Options Field bit mask #define NWKREPORT_INFO_CNT 0x1F #define NWKREPORT_CMD_ID 0xE0 // Update Types for Network Update Command Frame #define NWKUPDATE_PANID_UPDATE 0x00 // Network Update Command Options Field bit mask #define NWKUPDATE_INFO_CNT 0x1F #define NWKUPDATE_CMD_ID 0xE0 /********************************************************************* * TYPEDEFS */ typedef struct { uint16 dstAddr; uint8* extAddr; uint8 rejoin; uint8 request; uint8 removeChildren; uint8 cnf; } NLME_LeaveCmd_t; typedef struct { uint16 devAddr; uint8 txCost; uint8 rxCost; } linkStatusListItem_t; // Used for ED Scan Confirm message typedef struct { uint8 status; uint32 scannedChannels; uint8 *energyDetectList; } NLME_EDScanConfirm_t; // Used for Channel Interference detection message typedef struct { uint16 totalTransmissions; uint16 txFailures; } NLME_ChanInterference_t; /********************************************************************* * GLOBAL VARIABLES */ /********************************************************************* * FUNCTION PROTOTYPES */ /* * Build a NWK data indication and send to the next higher layer. */ extern ZStatus_t NLDE_DataIndSend( NLDE_DataReq_t* req ); /* * Build a NWK data service frame and send to the MAC. */ extern ZStatus_t NLDE_DataReqSend( NLDE_DataReq_t* req ); /* * Send an msdu */ extern ZStatus_t NLDE_SendMsg( uint8* msdu, uint16 nextHopAddr, uint16 macSrcAddr, uint8 msduLength, uint8 nsduHandle, uint16 nsduHandleOptions, nwkDB_UserData_t* ud ); /* * Call this function to parse an incoming message. */ extern uint8 NLDE_ParseMsg( byte *buf, byte bufLength, NLDE_FrameFormat_t *ff ); /* * Updates entry in the neighbor table */ extern void RTG_UpdateNeighborEntry( uint16 nodeAddress, uint16 panId, byte linkQuality, byte status, byte sent); /* * Remove all entries with short address only. */ extern void nwkNeighborRemoveAllStranded( void ); extern void NLME_SetAssocFlags( void ); extern void NLME_SetUpdateID( uint8 updateID ); /* * Send a simulated MAC->NWK Data Confirm message */ extern ZStatus_t nwkBuildDataCnf( byte handle, byte status ); /* * Send the NWK LEAVE cmd */ extern ZStatus_t NLME_LeaveCmdSend( NLME_LeaveCmd_t* cmd ); /* * Process the NWK LEAVE cmd */ extern uint8 NLME_LeaveCmdProcess( uint8 handle, NLDE_FrameFormat_t *ff ); /* * Handle NWK commands during MACCB_DATA_CNF_CMD processing */ extern void NLME_CmdCnf( NLDE_DataCnf_t* cnf ); /* * Check for NWK commands that can legally be broadcast */ extern uint8 NLME_CmdBcast( uint8 cmdID ); /* * Allocate a NLDE_DatatReq_t buffer for NWK commands */ extern NLDE_DataReq_t* NLME_CmdDataReqAlloc ( NLDE_DataReqAlloc_t* dra ); /* * Stub to load the next higher layer frame data */ extern void* NLDE_FrameDataLoad( NLDE_DataReq_t* req ); /* * Process Rejoin Rsp command pkt */ extern void NLME_RejoinRspCmdProcess( NLDE_FrameFormat_t* ff ); /* * Send Rejoin Rsp command pkt */ extern ZStatus_t NLME_RejoinRspSend( ZMacAssociateRsp_t *AssocRsp, byte relation, uint8 type ); /* * Process Rejoin Request command pkt */ extern void NLME_RejoinReqCmdProcess( NLDE_FrameFormat_t* ff ); /* * Build src routing header frame */ extern uint16 NLDE_BuildSrcRtgFrame( NLDE_SrcFrameFormat_t* sff, uint16 dstAddr ); /********************************************************************* * HELPERS FUNCTION PROTOTYPES */ /* * Returns a unique handle to identify a packet transaction */ extern byte NLDE_GetHandle( void ); extern byte NLME_GetProtocolVersion( void ); extern uint8 NLME_GetEnergyThreshold( void ); extern void NLME_SetEnergyThreshold( uint8 value ); extern void NLME_SetBroadcastFilter(byte capabilities); extern addr_filter_t NLME_IsAddressBroadcast(uint16 shortAddress); extern void NLME_RemoveChild( uint8* extAddr, uint8 dealloc ); extern uint8 nwk_multicast( NLDE_FrameFormat_t* ff ); extern void NLME_NwkStatusAddrConflictProcess( uint16 addr ); extern uint8 NLME_ProcessAddressConflictLocal( uint16 addr ); extern ZStatus_t NLDE_CheckForAddrConflict( NLDE_FrameFormat_t *ff ); extern ZStatus_t NLME_SendNetworkStatus( uint16 dstAddr, uint16 statusAddr, uint8 statusCode, uint8 forceSeqNum ); extern uint8 NLME_ProcessNetworkStatus( NLDE_FrameFormat_t *ff, uint8 handle ); extern void nwkHandleBrokenRoute( nwkDB_t *rec ); extern uint8 NLDE_ParseFrameControl( uint16 fc, NLDE_FrameFormat_t *ff ); // Functions for addressing schemes extern void NLME_AddressConflictAssignNewStochastic( void ); // Functions pointers for addressing schemes extern void (*pnwk_AssignNewAddr)( void ); extern ZStatus_t NLME_SendNetworkReport( uint16 dstAddr, uint8 reportType, uint8 *EPID, uint8 reportInfoCnt, uint16 *panIDs ); extern void NLME_ProcessNetworkReport( NLDE_FrameFormat_t *ff ); extern ZStatus_t NLME_SendNetworkUpdate( uint16 dstAddr, uint8 updateType, uint8 *EPID, uint8 updateId, uint16 newPID ); extern uint8 NLME_ProcessNetworkUpdate( uint8 handle, NLDE_FrameFormat_t *ff ); extern void nwkAddPanId( uint16 panID ); extern void nwkProcessPanIdScan( void ); extern void nwkChangePanID( void ); extern void nwkFreePanIdList( void ); extern uint16 nwkTransmissionFailures( uint8 reset ); extern uint8 nwk_ExtPANIDValid( byte *panID ); /**************************************************************************** * Link Status Functions ****************************************************************************/ extern void NLME_InitLinkStatus( void ); extern void NLME_UpdateLinkStatus( void ); extern void NLME_SetLinkStatusTimer( void ); extern ZStatus_t nwkSendLinkStatus( void ); extern ZStatus_t NLME_SendLinkStatus( uint8 neighbors, uint8 options, linkStatusListItem_t *pList ); extern void NLME_ProcessLinkStatus( NLDE_FrameFormat_t *ff ); extern void (*pNLME_SetLinkStatusTimer)( void ); extern void (*pNLME_UpdateLinkStatus)( void ); extern void (*pNLME_ProcessLinkStatus)( NLDE_FrameFormat_t *ff ); extern uint8 nwkConvertLqiToCost( uint8 lqi ); /**************************************************************************** * Neighbor Table Functions ****************************************************************************/ #define NWKNEIGHBOR_NOT_FOUND 0x00 // device not found #define NWKNEIGHBOR_FOUND_SHORT 0x0A // found matching short, but // extended address doesn't match #define NWKNEIGHBOR_FOUND_IEEE 0xA0 // found matching extended, but // short address doesn't match #define NWKNEIGHBOR_FOUND 0xAA // found matching extended and short // Neighbor table entry typedef struct { uint16 neighborAddress; uint8 neighborExtAddr[Z_EXTADDR_LEN]; uint16 panId; uint8 age; // number of nwkLinkStatusPeriod since last link status linkInfo_t linkInfo; } neighborEntry_t; extern neighborEntry_t neighborTable[]; extern neighborEntry_t *nwkNeighborFind( uint16 nwkAddr, uint16 panID ); extern neighborEntry_t *nwkNeighborFindEmptySlot( void ); extern uint16 nwkNeighborCount( void ); extern void nwkNeighborRemove( uint16 NeighborAddress, uint16 PanId ); extern neighborEntry_t *nwkNeighborGetWithIndex( uint16 Index ); extern void nwkNeighborInitTable( void ); extern void nwkNeighborClearEntry( neighborEntry_t *entry ); extern void nwkNeighborKeepPANID( uint16 PanID ); extern linkInfo_t *nwkNeighborGetLinkInfo( uint16 NeighborAddress, uint16 panId ); extern byte nwkNeighborCheckAddr( uint16 nwkAddr, uint8 *extAddr ); extern void nwkNeighborUpdateAge( void ); extern uint16 nwkNeighborFindRandom( uint16 skipAddr, uint16 skipAddr2, uint16 skipAddr3 ); extern void nwkNeighborUpdateNwkAddr( uint16 nwkAddr, uint8 *ieeeAddr ); extern void nwkNeighborAdd( uint16 nwkAddr, uint16 panId, uint8 linkQuality ); extern void nwkNeighborChangePANID( uint16 oldPanID, uint16 newPanID ); /********************************************************************* * Frequency Agility Functions ********************************************************************/ extern void (*pNwkFreqAgilityScanCfg)( ZMacScanCnf_t *param ); extern void (*pNwkFreqAgilityIncTotalTx)( void ); extern void (*pNwkFreqAgilityIncErrorCnt)( linkInfo_t *linkInfo, uint8 status ); extern void NwkFreqAgilityInit( void ); /**************************************************************************** ****************************************************************************/ #ifdef __cplusplus } #endif #endif /* NWK_UTIL_H */