/************************************************************************************************** Filename: MT_NWK.c Revised: $Date: 2010-05-06 16:49:18 -0700 (Thu, 06 May 2010) $ Revision: $Revision: 22409 $ Description: MonitorTest functions for the NWK layer. Copyright 2007-2010 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. **************************************************************************************************/ /*************************************************************************************************** * INCLUDES ***************************************************************************************************/ #include "ZComDef.h" #include "MT.h" #include "MT_NWK.h" #include "NLMEDE.h" #include "nwk.h" #include "nwk_globals.h" #include "nwk_util.h" #include "OSAL.h" #include "ZDApp.h" #if !defined( WIN32 ) #include "OnBoard.h" #endif /*************************************************************************************************** * GLOBAL VARIABLES ***************************************************************************************************/ uint16 _nwkCallbackSub; /********************************************************************* * TYPEDEFS */ /*************************************************************************************************** * LOCAL FUNCTIONS ***************************************************************************************************/ #if defined (MT_NWK_FUNC) void MT_NldeDataRequest(uint8 *pBuf); void MT_NlmeNetworkFormationRequest(uint8 *pBuf); void MT_NlmePermitJoiningRequest(uint8 *pBuf); void MT_NlmeStartRouterRequest(uint8 *pBuf); void MT_NlmeJoinRequest(uint8 *pBuf); void MT_NlmeLeaveRequest(uint8 *pBuf); void MT_NlmeResetRequest(uint8 *pBuf); void MT_NlmeGetRequest(uint8 *pBuf); void MT_NlmeSetRequest(uint8 *pBuf); void MT_NlmeNetworkDiscoveryRequest(uint8 *pBuf); void MT_NlmeRouteDiscoveryRequest(uint8 *pBuf); void MT_NlmeDirectJoinRequest(uint8 *pBuf); void MT_NlmeOrphanJoinRequest(uint8 *pBuf); uint8 MT_Nwk_DataRequest( uint16 dstAddr, uint8 nsduLen, uint8* nsdu, uint8 nsduHandle, uint16 nsduHandleOptions, uint8 secure, uint8 discoverRoute, uint8 radius); #endif /* MT_NWK_FUNC */ #if defined (MT_NWK_FUNC) /*************************************************************************************************** * @fn MT_NwkCommandProcessing * * @brief * * Process all the NWK commands that are issued by test tool * * @param cmd_id - Command ID * @param len - Length of received SPI data message * @param pData - pointer to received SPI data message * * @return status ***************************************************************************************************/ uint8 MT_NwkCommandProcessing(uint8 *pBuf) { uint8 status = MT_RPC_SUCCESS; switch (pBuf[MT_RPC_POS_CMD1]) { case MT_NWK_INIT: nwk_init(NWK_TaskID); break; case MT_NLDE_DATA_REQ: MT_NldeDataRequest(pBuf); break; case MT_NLME_NETWORK_FORMATION_REQ: MT_NlmeNetworkFormationRequest(pBuf); break; case MT_NLME_PERMIT_JOINING_REQ: MT_NlmePermitJoiningRequest(pBuf); break; case MT_NLME_JOIN_REQ: MT_NlmeJoinRequest(pBuf); break; case MT_NLME_LEAVE_REQ: MT_NlmeLeaveRequest(pBuf); break; case MT_NLME_RESET_REQ: MT_NlmeResetRequest(pBuf); break; case MT_NLME_GET_REQ: MT_NlmeGetRequest(pBuf); break; case MT_NLME_SET_REQ: MT_NlmeSetRequest(pBuf); break; case MT_NLME_NETWORK_DISCOVERY_REQ: MT_NlmeNetworkDiscoveryRequest(pBuf); break; case MT_NLME_ROUTE_DISCOVERY_REQ: MT_NlmeRouteDiscoveryRequest(pBuf); break; case MT_NLME_DIRECT_JOIN_REQ: MT_NlmeDirectJoinRequest(pBuf); break; case MT_NLME_ORPHAN_JOIN_REQ: MT_NlmeOrphanJoinRequest(pBuf); break; case MT_NLME_START_ROUTER_REQ: MT_NlmeStartRouterRequest(pBuf); break; default: status = MT_RPC_ERR_COMMAND_ID; break; } return status; } /*************************************************************************************************** * @fn MT_NldeDataReq * * @brief Process NLDE Data Request commands * * @param pBuf - pointer to received buffer * * @return void ***************************************************************************************************/ void MT_NldeDataRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint16 dstAddr; uint8 dataLen = 0; uint8 *dataPtr; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* First read the DstAddr */ dstAddr = BUILD_UINT16( pBuf[0], pBuf[1] ); pBuf += sizeof( dstAddr ); /* Get the NSDU details */ dataLen = *pBuf++; dataPtr = pBuf; /* Skip a length of ZTEST_DEFAULT_DATA_LEN */ pBuf += ZTEST_DEFAULT_DATA_LEN; /* Send out Data Request */ retValue = MT_Nwk_DataRequest(dstAddr, dataLen, dataPtr, pBuf[0], BUILD_UINT16(pBuf[1], pBuf[2]), pBuf[3], pBuf[4], pBuf[5]); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeNetworkFormationRequest * * @brief Network Formation Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeNetworkFormationRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint16 panId; uint32 channelList; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Build panId */ panId = BUILD_UINT16( pBuf[0], pBuf[1]); pBuf += sizeof(uint16); /* Build the channel list */ channelList = osal_build_uint32(pBuf, 4); pBuf += sizeof(uint32); if ( ZG_BUILD_COORDINATOR_TYPE && ZG_DEVICE_COORDINATOR_TYPE ) { retValue = NLME_NetworkFormationRequest( panId, NULL, channelList, pBuf[0], pBuf[1], pBuf[2], pBuf[3] ); } else { retValue = ZUnsupportedMode; } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmePermitJoiningRequest * * @brief Permit Joining Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmePermitJoiningRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; if (ZSTACK_ROUTER_BUILD) { retValue = NLME_PermitJoiningRequest(*pBuf); } else { retValue = ZUnsupportedMode; } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeStartRouterRequest * * @brief Start Router Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeStartRouterRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; if ( ZSTACK_ROUTER_BUILD ) { retValue = (uint8)NLME_StartRouterRequest(pBuf[0], pBuf[1], pBuf[2]); } else { retValue = ZUnsupportedMode; } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeJoinRequest * * @brief Join Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeJoinRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 dummyExPANID[Z_EXTADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint16 panID; uint8 cmdId; networkDesc_t *pNwkDesc; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; panID = BUILD_UINT16(pBuf[0], pBuf[1]); if((pNwkDesc = nwk_getNetworkDesc(dummyExPANID,panID, pBuf[2])) != NULL ) { if (pNwkDesc->chosenRouter == INVALID_NODE_ADDR ) { retValue = ZNwkNotPermitted; } else { retValue = NLME_JoinRequest( dummyExPANID, panID, pBuf[2], pBuf[3], pNwkDesc->chosenRouter, pNwkDesc->chosenRouterDepth ); } } else { retValue = ZNwkNotPermitted; } if ( pBuf[3] & CAPINFO_RCVR_ON_IDLE ) { /* The receiver is on, turn network layer polling off. */ NLME_SetPollRate( 0 ); NLME_SetQueuedPollRate( 0 ); NLME_SetResponseRate( 0 ); } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeLeaveRequest * * @brief Leave Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeLeaveRequest(uint8 *pBuf) { NLME_LeaveReq_t req; uint8 retValue = ZFailure; uint8 index, cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* If extAddr is all zeros, it means null pointer */ for(index=0;((index < Z_EXTADDR_LEN) && (pBuf[index] == 0));index++); if (index == Z_EXTADDR_LEN) { req.extAddr = NULL; } else { req.extAddr = pBuf; } /* Increment the pointer */ pBuf += Z_EXTADDR_LEN; req.removeChildren = FALSE; req.rejoin = FALSE; req.silent = FALSE; retValue = NLME_LeaveReq(&req); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeResetRequest * * @brief Leave Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeResetRequest(uint8 *pBuf) { uint8 retValue = NLME_ResetRequest(); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), MT_NLME_RESET_REQ, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeGetRequest * * @brief Get Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeGetRequest(uint8 *pBuf) { uint8 dataBuf[11]; uint8 attr, index, cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; attr = *pBuf++; index = *pBuf; dataBuf[0] = NLME_GetRequest((ZNwkAttributes_t )attr, index, &dataBuf[1]); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 11, dataBuf ); } /*************************************************************************************************** * @fn MT_NlmeSetRequest * * @brief Set Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeSetRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; retValue = NLME_SetRequest((ZNwkAttributes_t)pBuf[0], pBuf[1], &pBuf[2]); /* Update NV */ ZDApp_NVUpdate(); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_NlmeNetworkDiscoveryRequest * * @brief Network Discovery Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeNetworkDiscoveryRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 cmdId; uint32 scanChannels; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Scan channels */ scanChannels = osal_build_uint32(pBuf, 4); pBuf += sizeof(uint32); retValue = NLME_NetworkDiscoveryRequest(scanChannels, *pBuf); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_NlmeRouteDiscoveryRequest * * @brief Route Discovery Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeRouteDiscoveryRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; if ( ZSTACK_ROUTER_BUILD ) { retValue = NLME_RouteDiscoveryRequest(BUILD_UINT16(pBuf[0], pBuf[1]), pBuf[2], pBuf[3]); } else { retValue = ZUnsupportedMode; } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeDirectJoinRequest * * @brief Direct Join Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeDirectJoinRequest(uint8 *pBuf) { uint8 retValue = ZFailure; uint8 cmdId; /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; if ( ZSTACK_ROUTER_BUILD ) { retValue = NLME_DirectJoinRequest( pBuf, pBuf[8] ); } else { retValue = ZUnsupportedMode; } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_NlmeOrphanJoinRequest * * @brief Orphan Join Request * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ void MT_NlmeOrphanJoinRequest(uint8 *pBuf) { uint8 i, j, attr; uint8 retValue = ZFailure; uint32 channelList; uint8 cmdId; if ( ZSTACK_END_DEVICE_BUILD ) { /* parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Channel list bit mask */ channelList = osal_build_uint32(pBuf, 4); pBuf += sizeof(uint32); /* Count number of channels */ j = attr = 0; for (i = 0; i < ED_SCAN_MAXCHANNELS; i++) { if (channelList & (1 << i)) { j++; attr = i; } } /* If only one channel specified */ if (j == 1) { _NIB.scanDuration = *pBuf; _NIB.nwkLogicalChannel = attr; _NIB.channelList = channelList; if ( !_NIB.CapabilityFlags ) { _NIB.CapabilityFlags = ZDO_Config_Node_Descriptor.CapabilityFlags; } devState = DEV_NWK_ORPHAN; retValue = (uint8)NLME_OrphanJoinRequest(channelList, *pBuf); } else { retValue = ZNwkInvalidParam; } } else { retValue = ZUnsupportedMode; } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_Nwk_DataRequest * * @brief Nwk Data Request * * @param dstAddr, nsduLen, nsdu, nsduHandle, nsduHandleOptions, secure, discoverRoute, radius * * @return void ***************************************************************************************************/ uint8 MT_Nwk_DataRequest(uint16 dstAddr, uint8 nsduLen, uint8* nsdu, uint8 nsduHandle, uint16 nsduHandleOptions, uint8 secure, uint8 discoverRoute, uint8 radius) { uint8 status; NLDE_DataReqAlloc_t dra; NLDE_DataReq_t* req; dra.overhead = sizeof(NLDE_DataReq_t); dra.nsduLen = nsduLen; dra.secure = secure; req = NLDE_DataReqAlloc(&dra); if ( req != NULL ) { osal_memcpy(req->nfd.nsdu, nsdu, nsduLen); req->nfd.dstAddr = dstAddr; req->nfd.nsduHandleOptions = nsduHandleOptions; req->nfd.discoverRoute = discoverRoute; req->nfd.radius = radius; status = NLDE_DataReq( req ); } else { status = ZMemError; } return status; } #endif /* MT_NWK_FUNC */ #if defined ( MT_NWK_CB_FUNC ) //NWK callback commands /*************************************************************************************************** * @fn nwk_MTCallbackSubDataConfirm * * @brief Process the callback subscription for NLDE-DATA.confirm * * @param nsduHandle - APS handle * @param Status - result of data request * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubDataConfirm(uint8 nsduHandle, ZStatus_t status) { uint8 buf[2]; buf[0] = nsduHandle; buf[1] = (uint8)status; MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLDE_DATA_CONF, 2, buf ); } /*************************************************************************************************** * @fn nwk_MTCallbackSubDataIndication * * @brief Process the callback subscription for NLDE-DATA.indication * * @param SrcAddress - 16 bit address * @param nsduLength - Length of incoming data * @param nsdu - Pointer to incoming data * @param LinkQuality - Link quality measured during * reception. * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubDataIndication(uint16 SrcAddress, int16 nsduLength, uint8 *nsdu, uint8 LinkQuality) { uint8 *msgPtr; uint8 *msg; uint8 msgLen; msgLen = sizeof( uint16 ) + sizeof( uint8 ) + ZTEST_DEFAULT_DATA_LEN + sizeof( uint8); msgPtr = osal_mem_alloc( msgLen ); if ( msgPtr ) { //Fill up the data bytes msg = msgPtr; //First fill in details *msg++ = LO_UINT16( SrcAddress ); *msg++ = HI_UINT16( SrcAddress ); //Since the max packet size is less than 255 bytes, a byte is enough //to represent nsdu length *msg++ = ( uint8 ) nsduLength; osal_memset( msg, NULL, ZTEST_DEFAULT_DATA_LEN ); // Clear the mem osal_memcpy( msg, nsdu, nsduLength ); msg += ZTEST_DEFAULT_DATA_LEN; *msg++ = LinkQuality; MT_BuildAndSendZToolResponse( ((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLDE_DATA_IND, msgLen, msgPtr ); osal_mem_free( msgPtr ); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubInitCoordConfirm * * @brief Process the callback subscription for NLME-INIT-COORD.confirm * * @param Status - Result of NLME_InitCoordinatorRequest() * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubInitCoordConfirm( ZStatus_t Status ) { MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_NETWORK_FORMATION_CONF, sizeof(uint8), (uint8*)&Status); } /*************************************************************************************************** * @fn nwk_MTCallbackSubStartRouterConfirm * * @brief Process the callback subscription for NLME-START-ROUTER.confirm * * @param Status - Result of NLME_StartRouterRequest() * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubStartRouterConfirm( ZStatus_t Status ) { MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_START_ROUTER_CONF, sizeof(uint8), (uint8*)&Status); } /*************************************************************************************************** * @fn nwk_MTCallbackSubJoinConfirm * * @brief Process the callback subscription for NLME-JOIN.confirm * * @param Status - Result of NLME_JoinRequest() * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubJoinConfirm(uint16 PanId, ZStatus_t Status) { uint8 msg[Z_EXTADDR_LEN + 3]; /* This device's 64-bit address */ ZMacGetReq( ZMacExtAddr, msg ); msg[Z_EXTADDR_LEN + 0] = LO_UINT16(PanId); msg[Z_EXTADDR_LEN + 1] = HI_UINT16(PanId); msg[Z_EXTADDR_LEN + 2] = (uint8)Status; MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_JOIN_CONF, Z_EXTADDR_LEN + 3, msg ); } /*************************************************************************************************** * @fn nwk_MTCallbackSubNetworkDiscoveryConfirm * * @brief Process the callback subscription for NLME-NWK_DISC.confirm * * @param ResultCount - number of networks discovered * @param NetworkList - pointer to list of network descriptors * * @return void ***************************************************************************************************/ void nwk_MTCallbackSubNetworkDiscoveryConfirm( uint8 ResultCount, networkDesc_t *NetworkList ) { uint8 len; uint8 *msgPtr; uint8 *msg; uint8 i; // The message cannot be bigger then SPI_TX_BUFF_MAX. Reduce resultCount if necessary if (ResultCount * sizeof(networkDesc_t) > MT_UART_TX_BUFF_MAX - (1 + SPI_0DATA_MSG_LEN)) { ResultCount = (MT_UART_TX_BUFF_MAX - (1 + SPI_0DATA_MSG_LEN)) / sizeof(networkDesc_t); } len = 1 + ResultCount * sizeof(networkDesc_t); msgPtr = osal_mem_alloc( len ); if ( msgPtr ) { /* Fill up the data bytes */ msg = msgPtr; *msg++ = ResultCount; for ( i = 0; i < ResultCount; i++ ) { *msg++ = LO_UINT16( NetworkList->panId ); *msg++ = HI_UINT16( NetworkList->panId ); *msg++ = NetworkList->logicalChannel; *msg++ = BEACON_ORDER_NO_BEACONS; *msg++ = BEACON_ORDER_NO_BEACONS; *msg++ = NetworkList->routerCapacity; *msg++ = NetworkList->deviceCapacity; *msg++ = NetworkList->version; *msg++ = NetworkList->stackProfile; //*msg++ = NetworkList->securityLevel; NetworkList = (networkDesc_t*)NetworkList->nextDesc; } MT_BuildAndSendZToolResponse (((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_NETWORK_DISCOVERY_CONF, len, msgPtr); osal_mem_free( msgPtr ); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubJoinIndication * * @brief Process the callback subscription for NLME-INIT-COORD.indication * * @param ShortAddress - 16-bit address * @param ExtendedAddress - IEEE (64-bit) address * @param CapabilityFlags - Association Capability Information * * @return ZStatus_t ***************************************************************************************************/ void nwk_MTCallbackSubJoinIndication( uint16 ShortAddress, uint8 *ExtendedAddress, uint8 CapabilityFlags ) { uint8 *msgPtr; uint8 *msg; uint8 len; len = sizeof( uint16 ) + Z_EXTADDR_LEN + sizeof( uint8 ); msgPtr = osal_mem_alloc( len ); if ( msgPtr ) { /* Fill up the data bytes */ msg = msgPtr; /* First fill in details */ *msg++ = LO_UINT16( ShortAddress ); *msg++ = HI_UINT16( ShortAddress ); osal_cpyExtAddr( msg, ExtendedAddress ); msg += Z_EXTADDR_LEN; *msg = CapabilityFlags; MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_JOIN_IND, len, msgPtr ); osal_mem_free( msgPtr ); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubLeaveConfirm * * @brief Process the callback subscription for NLME-LEAVE.confirm * * @param DeviceAddress - IEEE (64-bit) address * @param Status - Result of NLME_LeaveRequest() * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubLeaveConfirm( uint8 *DeviceAddress, ZStatus_t Status ) { uint8 *msgPtr; uint8 *msg; msgPtr = osal_mem_alloc( Z_EXTADDR_LEN + sizeof( uint8 ) ); if ( msgPtr ) { /* Fill up the data bytes */ msg = msgPtr; /* First fill in details */ osal_cpyExtAddr( msg, DeviceAddress ); msg += Z_EXTADDR_LEN; *msg = (uint8)Status; MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_LEAVE_CONF, Z_EXTADDR_LEN + sizeof( uint8 ), msgPtr ); osal_mem_free( msgPtr ); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubLeaveIndication * * @brief Process the callback subscription for NLME-LEAVE.indication * * @param DeviceAddress - IEEE (64-bit) address * * @return NULL ***************************************************************************************************/ void nwk_MTCallbackSubLeaveIndication( uint8 *DeviceAddress ) { uint8 msg[Z_EXTADDR_LEN+1]; /* First fill in details */ if ( DeviceAddress ) { osal_cpyExtAddr( msg, DeviceAddress ); } else { osal_memset( msg, 0, Z_EXTADDR_LEN ); } /* Status, assume good if we get this far */ msg[Z_EXTADDR_LEN] = 0; MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_LEAVE_IND, Z_EXTADDR_LEN+1, msg ); } /*************************************************************************************************** * @fn nwk_MTCallbackSubSyncIndication * * @brief Process the callback subscription for NLME-SYNC.indication * * @param none * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubSyncIndication( void ) { MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_SYNC_IND, 0, NULL ); } /*************************************************************************************************** * @fn nwk_MTCallbackSubPollConfirm * * @brief Process the callback subscription for NLME-POLL.confirm * * @param status - status of the poll operation * * @return none ***************************************************************************************************/ void nwk_MTCallbackSubPollConfirm( uint8 status ) { uint8 msg = status; MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_NWK), MT_NLME_POLL_CONF, 1, &msg ); } #endif /* NWK Callback commands */ /*************************************************************************************************** ***************************************************************************************************/