/************************************************************************************************** Filename: MT_MAC.c Revised: $Date: 2011-03-25 18:16:38 -0700 (Fri, 25 Mar 2011) $ Revision: $Revision: 25528 $ Description: MonitorTest functions for the MAC layer. 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. **************************************************************************************************/ #if defined (MT_MAC_FUNC) || defined (MT_MAC_CB_FUNC) //MAC commands /*************************************************************************************************** * INCLUDES ***************************************************************************************************/ #include "ZComDef.h" #include "OSAL.h" #include "MT.h" #include "MT_UART.h" #include "ZMAC.h" #include "MT_MAC.h" #if !defined( WIN32 ) #include "OnBoard.h" #endif /* MAC radio */ #include "mac_radio_defs.h" /* Hal */ #include "hal_uart.h" #ifdef MAC_SECURITY #include "mac_security_pib.h" #endif /*************************************************************************************************** * MACROS ***************************************************************************************************/ /* The length in bytes of the pending address fields in the beacon */ #define MT_MAC_PEND_LEN(pendAddrSpec) ((((pendAddrSpec) & 0x07) * 2) + \ ((((pendAddrSpec) & 0x70) >> 4) * 8)) /* This matches the value used by nwk */ #define MT_MAC_ED_SCAN_MAXCHANNELS 27 /* Maximum size of pending address spec in beacon notify ind */ #define MT_MAC_PEND_LEN_MAX 32 /* Maximum size of the payload SDU in beacon notify ind */ #define MT_MAC_SDU_LEN_MAX 32 /* Maximum length of scan result in bytes */ #define MT_MAC_SCAN_RESULT_LEN_MAX 32 /* Maximum size of beacon payload */ #define MT_MAC_BEACON_PAYLOAD_MAX 16 /*************************************************************************************************** * CONSTANTS ***************************************************************************************************/ #define DEFAULT_NSDU_HANDLE 0x00 #define MT_MAC_LEN_ASSOCIATE_IND 0x14 /* Associate Indication */ #define MT_MAC_LEN_ASSOCIATE_CNF 0x0E /* Associate Confirmation */ #define MT_MAC_LEN_DISASSOCIATE_IND 0x14 /* Disassociate Indication */ #define MT_MAC_LEN_DISASSOCIATE_CNF 0x0c /* Disassociate Confirmation */ #define MT_MAC_LEN_BEACON_NOTIFY_IND 0x63 /* Beacon Notification */ #define MT_MAC_LEN_ORPHAN_IND 0x13 /* Orphan Indication */ #define MT_MAC_LEN_SCAN_CNF 0x09 /* Scan Confirmation */ #define MT_MAC_LEN_SYNC_LOSS_IND 0x10 /* Sync Loss Indication */ #define MT_MAC_LEN_COMM_STATUS_IND 0x21 /* Comm Status Indication */ #define MT_MAC_LEN_DATA_CNF 0x08 /* Data Confirmation */ #define MT_MAC_LEN_DATA_IND 0x2C /* Data Indication */ #define MT_MAC_LEN_PURGE_CNF 0x02 /* Purge Confirmation */ /*************************************************************************************************** * GLOBAL VARIABLES ***************************************************************************************************/ uint16 _macCallbackSub; /* storage for MAC beacon payload */ static uint8 mtMacBeaconPayload[MT_MAC_BEACON_PAYLOAD_MAX]; /*************************************************************************************************** * LOCAL FUNCTIONS ***************************************************************************************************/ static void MT_MacSpi2Sec( ZMacSec_t *pSec, uint8 *pSrc ); static void MT_MacSpi2Addr( zAddrType_t *pDst, uint8 *pSrc ); static void MT_MacAddr2Spi( uint8 *pDst, zAddrType_t *pSrc ); static void MT_MacExtCpy( uint8 *pDst, uint8 *pSrc ); static void MT_MacRevExtCpy( uint8 *pDst, uint8 *pSrc ); void MT_MacResetReq(uint8 *pBuf); void MT_MacInit(uint8 *pBuf); void MT_MacStartReq(uint8 *pBuf); void MT_MacSyncReq(uint8 *pBuf); void MT_MacDataReq(uint8 *pBuf); void MT_MacAssociateReq(uint8 *pBuf); void MT_MacDisassociateReq(uint8 *pBuf); void MT_MacGetReq(uint8 *pBuf); void MT_MacSetReq(uint8 *pBuf); #ifdef MAC_SECURITY void MT_MacSecurityGetReq(uint8 *pBuf); void MT_MacSecuritySetReq(uint8 *pBuf); #endif void MT_MacScanReq(uint8 * pBuf); void MT_MacPollReq(uint8 *pBuf); void MT_MacPurgeReq(uint8 *pBuf); void MT_MacSetRxGainReq(uint8 *pBuf); void MT_MacAssociateRsp(uint8 *pBuf); void MT_MacOrphanRsp(uint8 *pBuf); /*************************************************************************************************** * @fn MT_MacCommandProcessing * * @brief Process all the MAC commands that are issued by test tool * * @param pBuf - pointer to the msg buffer * * | LEN | CMD0 | CMD1 | DATA | * | 1 | 1 | 1 | 0-255 | * * @return void ***************************************************************************************************/ uint8 MT_MacCommandProcessing (uint8 *pBuf) { uint8 status = MT_RPC_SUCCESS; switch (pBuf[MT_RPC_POS_CMD1]) { case MT_MAC_RESET_REQ: MT_MacResetReq(pBuf); break; case MT_MAC_INIT: MT_MacInit(pBuf); break; case MT_MAC_START_REQ: MT_MacStartReq(pBuf); break; case MT_MAC_SYNC_REQ: MT_MacSyncReq(pBuf); break; case MT_MAC_DATA_REQ: MT_MacDataReq(pBuf); break; case MT_MAC_ASSOCIATE_REQ: MT_MacAssociateReq(pBuf); break; case MT_MAC_DISASSOCIATE_REQ: MT_MacDisassociateReq(pBuf); break; case MT_MAC_GET_REQ: MT_MacGetReq(pBuf); break; case MT_MAC_SET_REQ: MT_MacSetReq(pBuf); break; #ifdef MAC_SECURITY case MT_MAC_SECURITY_GET_REQ: MT_MacSecurityGetReq(pBuf); break; case MT_MAC_SECURITY_SET_REQ: MT_MacSecuritySetReq(pBuf); break; #endif /* MAC_SECURITY */ case MT_MAC_GTS_REQ: /* Not supported */ break; case MT_MAC_SCAN_REQ: MT_MacScanReq(pBuf); break; case MT_MAC_POLL_REQ: MT_MacPollReq(pBuf); break; case MT_MAC_PURGE_REQ: MT_MacPurgeReq(pBuf); break; case MT_MAC_SET_RX_GAIN_REQ: MT_MacSetRxGainReq(pBuf); break; case MT_MAC_ASSOCIATE_RSP: MT_MacAssociateRsp(pBuf); break; case MT_MAC_ORPHAN_RSP: MT_MacOrphanRsp(pBuf); break; default: status = MT_RPC_ERR_COMMAND_ID; break; } return status; } /*************************************************************************************************** * @fn MT_MacReset * * @brief Process MAC Reset command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacResetReq(uint8 *pBuf) { uint8 retValue, cmdId; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; retValue = ZMacReset(*pBuf); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacInit * * @brief Process Mac Init command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacInit(uint8 *pBuf) { uint8 retValue, cmdId; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; retValue = ZMacInit(); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacStart * * @brief Process MAC Start command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacStartReq(uint8 *pBuf) { uint8 retValue, cmdId; #ifdef RTR_NWK ZMacStartReq_t startReq; #endif /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; #ifdef RTR_NWK /* StartTime */ startReq.StartTime = BUILD_UINT32 (pBuf[0], pBuf[1], pBuf[2], pBuf[3]); pBuf += 4; /* PanID */ startReq.PANID = BUILD_UINT16( pBuf[0] , pBuf[1] ); pBuf += 2; /* Fill in other fields sequentially incrementing the pointer*/ startReq.LogicalChannel = *pBuf++; startReq.ChannelPage = *pBuf++; startReq.BeaconOrder = *pBuf++; startReq.SuperframeOrder = *pBuf++; startReq.PANCoordinator = *pBuf++; startReq.BatteryLifeExt = *pBuf++; startReq.CoordRealignment = *pBuf++; /* Realign Security Information */ MT_MacSpi2Sec( &startReq.RealignSec, pBuf ); pBuf += ZTEST_DEFAULT_SEC_LEN; /* Beacon Security Information */ MT_MacSpi2Sec( &startReq.BeaconSec, pBuf ); /* Call corresponding ZMAC function */ retValue = ZMacStartReq( &startReq ); #else retValue = ZMacDenied; #endif /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacSync * * @brief Process MAC Sync command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacSyncReq(uint8 *pBuf) { uint8 retValue, cmdId; ZMacSyncReq_t syncReq; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* LogicalChannel */ syncReq.LogicalChannel = *pBuf++; /* ChannelPage */ syncReq.ChannelPage = *pBuf++; /* TrackBeacon */ syncReq.TrackBeacon = *pBuf; /* Call corresponding ZMAC function */ retValue = ZMacSyncReq( &syncReq ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacDataReq * * @brief Process MAC Data Request command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacDataReq(uint8 *pBuf) { uint8 retValue, cmdId; ZMacDataReq_t dataReq; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Destination address mode */ dataReq.DstAddr.addrMode = *pBuf++; /* Destination address */ MT_MacSpi2Addr( &dataReq.DstAddr, pBuf); pBuf += Z_EXTADDR_LEN; /* Destination Pan ID */ dataReq.DstPANId = BUILD_UINT16( pBuf[0] , pBuf[1] ); pBuf += 2; /* Source address mode */ dataReq.SrcAddrMode = *pBuf++; /* Handle */ dataReq.Handle = *pBuf++; /* TxOptions */ dataReq.TxOptions = *pBuf++; /* Channel */ dataReq.Channel = *pBuf++; /* Power */ dataReq.Power = *pBuf++; /* Data Security */ MT_MacSpi2Sec( &dataReq.Sec, pBuf ); pBuf += ZTEST_DEFAULT_SEC_LEN; /* Data length */ dataReq.msduLength = *pBuf++; /* Data - Just pass the pointer to the structure */ dataReq.msdu = pBuf; /* Call corresponding ZMAC function */ retValue = ZMacDataReq( &dataReq ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacAssociateReq * * @brief Process MAC Get Request command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacAssociateReq(uint8 *pBuf) { uint8 retValue, cmdId; ZMacAssociateReq_t assocReq; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Logical Channel */ assocReq.LogicalChannel = *pBuf++; /* Channel Page */ assocReq.ChannelPage = *pBuf++; /* Address Mode */ assocReq.CoordAddress.addrMode = *pBuf++; /* Coordinator Address, address mode must be set at this point */ MT_MacSpi2Addr( &assocReq.CoordAddress, pBuf ); pBuf += Z_EXTADDR_LEN; /* Coordinator PanID */ assocReq.CoordPANId = BUILD_UINT16( pBuf[0] , pBuf[1] ); pBuf += 2; /* Capability information */ assocReq.CapabilityFlags = *pBuf++; /* Security Information */ MT_MacSpi2Sec( &assocReq.Sec, pBuf ); /* Call corresponding ZMAC function */ retValue = ZMacAssociateReq( &assocReq ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacDisassociateReq * * @brief Process MAC Get Request command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacDisassociateReq(uint8 *pBuf) { uint8 retValue, cmdId; ZMacDisassociateReq_t disassocReq; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Device address mode */ disassocReq.DeviceAddress.addrMode = *pBuf++; /* Device address - Device address mode have to be set to use this function*/ MT_MacSpi2Addr( &disassocReq.DeviceAddress, pBuf); pBuf += Z_EXTADDR_LEN; /* Pan ID */ disassocReq.DevicePanId = BUILD_UINT16( pBuf[0] , pBuf[1] ); pBuf += 2; /* Disassociate reason */ disassocReq.DisassociateReason = *pBuf++; /* TxIndirect */ disassocReq.TxIndirect = *pBuf++; /* Security Information */ MT_MacSpi2Sec( &disassocReq.Sec, pBuf ); /* Call corresponding ZMAC function */ retValue = ZMacDisassociateReq( &disassocReq ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacGetReq * * @brief Process MAC Get Request command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacGetReq(uint8 *pBuf) { uint8 respLen, cmdId, attr; uint8 *pRetBuf; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Response length is 16 bytes + 1 byte status */ respLen = ZTEST_DEFAULT_PARAM_LEN; /* Allocate */ pRetBuf = osal_mem_alloc(respLen); /* Attribute to be read */ attr = *pBuf; if (pRetBuf) { /* Zero everything */ osal_memset(pRetBuf, 0, respLen); /* Default to ZFailure */ pRetBuf[0] = ZFailure; /* Read the pib value */ pRetBuf[0] = ZMacGetReq(attr, &pRetBuf[1]); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, respLen, pRetBuf ); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn MT_MacSetReq * * @brief Process MAC Set Req command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacSetReq(uint8 *pBuf) { uint8 retValue, cmdId, attr; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* In the data field of 'msg', the first byte is the attribute and remainder is the attribute value. So the pointer 'pBuf' points directly to the attribute. The value of the attribute is from the next byte position */ attr = *pBuf; /* special case for beacon payload */ if ( attr == ZMacBeaconMSDU ) { osal_memcpy( mtMacBeaconPayload, pBuf + 1, MT_MAC_BEACON_PAYLOAD_MAX ); retValue = ZMacSetReq( (ZMacAttributes_t)attr , (byte *) &mtMacBeaconPayload ); } else { retValue = ZMacSetReq( (ZMacAttributes_t)attr , pBuf + 1 ); } /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } #ifdef MAC_SECURITY /*************************************************************************************************** * @fn MT_MacSecurityGetReq * * @brief Process MAC Security Get Request command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacSecurityGetReq(uint8 *pBuf) { uint8 respLen, cmdId, attr; uint8 *pRetBuf; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Response length is 25 bytes + 2 bytes index + 1 byte status */ respLen = ZTEST_DEFAULT_SEC_PARAM_LEN; /* Allocate */ pRetBuf = osal_mem_alloc(respLen); /* Attribute to be read */ attr = *pBuf++; if (pRetBuf) { /* Zero everything */ osal_memset(pRetBuf, 0, respLen); switch (attr) { case MAC_KEY_ID_LOOKUP_ENTRY: case MAC_KEY_DEVICE_ENTRY: case MAC_KEY_USAGE_ENTRY: /* These security PIBs have two parameters */ pRetBuf[1] = *pBuf++; pRetBuf[2] = *pBuf; break; case MAC_KEY_ENTRY: case MAC_DEVICE_ENTRY: case MAC_SECURITY_LEVEL_ENTRY: /* These security PIBs have one parameter */ pRetBuf[1] = *pBuf; break; } /* Other MAC Security PIB items. Read the pib value */ pRetBuf[0] = ZMacSecurityGetReq(attr, &pRetBuf[1]); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, respLen, pRetBuf ); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn MT_MacSecuritySetReq * * @brief Process MAC Set Req command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacSecuritySetReq(uint8 *pBuf) { uint8 cmdId, attr; uint8 retValue = ZMAC_SUCCESS; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* In the data field of 'msg', the first byte is the attribute and remainder is the attribute value. So the pointer 'pBuf' points directly to the attribute. The value of the attribute is from the next byte position */ attr = *pBuf++; if (attr == MAC_KEY_TABLE || attr == MAC_DEVICE_TABLE || attr == MAC_SECURITY_LEVEL_TABLE) { pBuf = NULL; } retValue = ZMacSecuritySetReq( (ZMacAttributes_t)attr , pBuf ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } #endif /* MAC_SECURITY */ /*************************************************************************************************** * @fn MT_MacScanReq * * @brief Process MAC Scan Req command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacScanReq(uint8 * pBuf) { uint8 retValue, cmdId; ZMacScanReq_t scanReq; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* ScanChannels is the 32-bit channel list */ scanReq.ScanChannels = BUILD_UINT32 (pBuf[0], pBuf[1], pBuf[2], pBuf[3]); pBuf += 4; /* Fill in fields sequentially incrementing the pointer */ scanReq.ScanType = *pBuf++; /* ScanDuration */ scanReq.ScanDuration = *pBuf++; /* Channel Page */ scanReq.ChannelPage = *pBuf++; /* MaxResults */ scanReq.MaxResults = *pBuf++; /* Security Information */ MT_MacSpi2Sec( &scanReq.Sec, pBuf ); /* Call corresponding ZMAC function */ retValue = ZMacScanReq( &scanReq ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacPollReq * * @brief Process MAC Poll Req command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacPollReq(uint8 *pBuf) { uint8 retValue, cmdId; ZMacPollReq_t pollReq; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Coordinator address mode */ pollReq.CoordAddress.addrMode = *pBuf++; /* Coordinator address - Device address mode have to be set to use this function */ MT_MacSpi2Addr( &pollReq.CoordAddress, pBuf); pBuf += Z_EXTADDR_LEN; /* Coordinator Pan ID */ pollReq.CoordPanId = BUILD_UINT16(pBuf[0] , pBuf[1]); pBuf += 2; /* Security Information */ MT_MacSpi2Sec(&pollReq.Sec, pBuf); /* Call corresponding ZMAC function */ retValue = ZMacPollReq( &pollReq ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacPurgeReq * * @brief Process MAC Purge Req command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacPurgeReq(uint8 *pBuf) { uint8 retValue, cmdId; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* First and only byte - MsduHandle */ retValue = ZMacPurgeReq (*pBuf); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacSetRxGainReq * * @brief Process MAC Rx Gain Req command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacSetRxGainReq(uint8 *pBuf) { uint8 retValue, cmdId; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; #ifdef HAL_PA_LNA /* Toggle PA/LNA mode */ if (*pBuf) { HAL_PA_LNA_RX_HGM(); } else { HAL_PA_LNA_RX_LGM(); } retValue = ZSuccess; #else retValue = ZFailure; #endif /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue ); } /*************************************************************************************************** * @fn MT_MacAssociateRsp * * @brief Process MAC Associate Rsp command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacAssociateRsp(uint8 *pBuf) { uint8 retValue, cmdId; ZMacAssociateRsp_t assocRsp; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; #ifdef RTR_NWK /* The address of the device requesting association */ MT_MacExtCpy(assocRsp.DeviceAddress, pBuf); pBuf += Z_EXTADDR_LEN; /* The short address allocated to the (associated) device */ assocRsp.AssocShortAddress = BUILD_UINT16(pBuf[0],pBuf[1]); pBuf += 2; /* Status of the association */ assocRsp.Status = *pBuf++; /* Security Information */ MT_MacSpi2Sec( &assocRsp.Sec, pBuf ); /* Call corresponding ZMAC function */ retValue = ZMacAssociateRsp( &assocRsp ); #else retValue = ZMacDenied; #endif /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue); } /*************************************************************************************************** * @fn MT_MacOrphanRsp * * @brief Process MAC Orphan Response command that are issued by test tool * * @param pBuf - Buffer contains the data * * @return void ***************************************************************************************************/ void MT_MacOrphanRsp(uint8 *pBuf) { uint8 retValue, cmdId; ZMacOrphanRsp_t orphanRsp; /* Parse header */ cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; /* Extended address of the device sending the notification */ MT_MacRevExtCpy( orphanRsp.OrphanAddress, pBuf ); pBuf += Z_EXTADDR_LEN; /* Short address of the orphan device */ orphanRsp.ShortAddress = BUILD_UINT16( pBuf[0] , pBuf[1] ); pBuf += 2; /* Associated member */ orphanRsp.AssociatedMember = *pBuf++; /* Security Information */ MT_MacSpi2Sec( &orphanRsp.Sec, pBuf ); /* Call corresponding ZMAC function */ retValue = ZMacOrphanRsp( &orphanRsp ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_MAC), cmdId, 1, &retValue); } #if defined ( MT_MAC_CB_FUNC ) /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkSyncLossInd * * @brief Process the callback subscription for nwk_sync_loss_ind * * @param byte LossReason * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkSyncLossInd( ZMacSyncLossInd_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_SYNC_LOSS_IND; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Status - loss reason */ *tp++ = param->hdr.Status; /* Pan Id */ *tp++ = LO_UINT16( param->PANId ); *tp++ = HI_UINT16( param->PANId ); /* Logical Channel */ *tp++ = param->LogicalChannel; /* Channel Page */ *tp++ = param->ChannelPage; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_SYNC_LOSS_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkAssociateInd * * @brief Process the callback subscription for nwk_associate_ind * * @param pointer of type macnwk_associate_ind_t * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkAssociateInd( ZMacAssociateInd_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_ASSOCIATE_IND; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Extended address */ MT_MacAddr2Spi(pRetBuf, (zAddrType_t*)param->DeviceAddress); tp += Z_EXTADDR_LEN; /* Capability Information */ *tp++ = param->CapabilityFlags; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_ASSOCIATE_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkAssociateCnf * * @brief Process the callback subscription for nwk_associate_cnf * * @param pointer of type macnwk_associate_cnf_t * * @return SUCCESS if message sent succesfully , else N_FAIL ***************************************************************************************************/ void nwk_MTCallbackSubNwkAssociateCnf( ZMacAssociateCnf_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_ASSOCIATE_CNF; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Status */ *tp++ = param->hdr.Status; /* Short address */ *tp++ = LO_UINT16( param->AssocShortAddress ); *tp++ = HI_UINT16( param->AssocShortAddress ); /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_ASSOCIATE_CNF, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkBeaconNotifyInd * * @brief Process the callback subscription for * beacon_notify_ind. * * @param pointer to ZMacBeaconNotifyInd_t * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkBeaconNotifyInd ( ZMacBeaconNotifyInd_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_BEACON_NOTIFY_IND; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* BSN */ *tp++ = param->BSN; /* Timestamp */ *tp++ = BREAK_UINT32( param->pPanDesc->TimeStamp, 0 ); *tp++ = BREAK_UINT32( param->pPanDesc->TimeStamp, 1 ); *tp++ = BREAK_UINT32( param->pPanDesc->TimeStamp, 2 ); *tp++ = BREAK_UINT32( param->pPanDesc->TimeStamp, 3 ); /* Coordinator address mode */ *tp++ = param->pPanDesc->CoordAddress.addrMode; /* Coordinator address */ MT_MacAddr2Spi( tp, ¶m->pPanDesc->CoordAddress ); tp += Z_EXTADDR_LEN; /* PAN ID */ *tp++ = LO_UINT16( param->pPanDesc->CoordPANId ); *tp++ = HI_UINT16( param->pPanDesc->CoordPANId ); /* Superframe spec */ *tp++ = LO_UINT16( param->pPanDesc->SuperframeSpec ); *tp++ = HI_UINT16( param->pPanDesc->SuperframeSpec ); /* LogicalChannel */ *tp++ = param->pPanDesc->LogicalChannel; /* GTSPermit */ *tp++ = param->pPanDesc->GTSPermit; /* LinkQuality */ *tp++ = param->pPanDesc->LinkQuality; /* SecurityFailure */ *tp++ = param->pPanDesc->SecurityFailure; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->pPanDesc->Sec); tp += ZTEST_DEFAULT_SEC_LEN; /* PendingAddrSpec */ *tp++ = param->PendAddrSpec; /* AddrList */ osal_memset( tp, 0, MT_MAC_PEND_LEN_MAX ); osal_memcpy( tp, param->AddrList, MIN(MT_MAC_PEND_LEN_MAX, MT_MAC_PEND_LEN(param->PendAddrSpec)) ); tp += MT_MAC_PEND_LEN_MAX; /* SDULength */ *tp++ = param->sduLength; /* SDU */ osal_memset( tp, 0, MT_MAC_SDU_LEN_MAX ); osal_memcpy( tp, param->sdu, MIN(MT_MAC_SDU_LEN_MAX, param->sduLength) ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_BEACON_NOTIFY_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkDataCnf * * @brief Process the callback subscription for nwk_data_cnf * * @param pointer of type macnwk_data_cnf_t * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkDataCnf( ZMacDataCnf_t *param ) { uint8 *pRetBuf, *tp; /* Allocate */ pRetBuf = osal_mem_alloc(MT_MAC_LEN_DATA_CNF); if (pRetBuf) { tp = pRetBuf; /* Status */ *tp++ = param->hdr.Status; /* Handle */ *tp++ = param->msduHandle; /* Timestamp */ *tp++ = BREAK_UINT32( param->Timestamp, 0 ); *tp++ = BREAK_UINT32( param->Timestamp, 1 ); *tp++ = BREAK_UINT32( param->Timestamp, 2 ); *tp++ = BREAK_UINT32( param->Timestamp, 3 ); /* Timestamp2 */ *tp++ = LO_UINT16( param->Timestamp2); *tp = HI_UINT16( param->Timestamp2); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_DATA_CNF, MT_MAC_LEN_DATA_CNF, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkDataInd * * @brief Process the callback subscription for nwk_data_ind * * @param pointer of type macnwk_data_ind_t * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkDataInd( ZMacDataInd_t *param ) { uint8 respLen, tempLen; uint8 *pRetBuf, *tp; /* Packet length is 44 + 102 data */ respLen = MT_MAC_LEN_DATA_IND + ZTEST_DEFAULT_DATA_LEN; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Src address mode */ *tp++ = param->SrcAddr.addrMode; if (param->SrcAddr.addrMode != SADDR_MODE_NONE) { /* Src Address */ MT_MacAddr2Spi( tp, ¶m->SrcAddr ); } else { /* No address */ for ( uint8 i = 0; i< Z_EXTADDR_LEN; i++ ) { tp[i] = 0x00; } } tp += Z_EXTADDR_LEN; /* Dst address mode */ *tp++ = param->DstAddr.addrMode; /* Dst address */ MT_MacAddr2Spi( tp, ¶m->DstAddr ); tp += Z_EXTADDR_LEN; /* Timestamp */ *tp++ = BREAK_UINT32( param->Timestamp, 0 ); *tp++ = BREAK_UINT32( param->Timestamp, 1 ); *tp++ = BREAK_UINT32( param->Timestamp, 2 ); *tp++ = BREAK_UINT32( param->Timestamp, 3 ); /* Timestamp2 */ *tp++ = LO_UINT16( param->Timestamp2); *tp++ = HI_UINT16( param->Timestamp2); /* Src Pan Id */ *tp++ = LO_UINT16( param->SrcPANId ); *tp++ = HI_UINT16( param->SrcPANId ); /* Dst Pan Id */ *tp++ = LO_UINT16( param->DstPANId ); *tp++ = HI_UINT16( param->DstPANId ); /* mpdu Link Quality */ *tp++ = param->mpduLinkQuality; /* LQI */ *tp++ = param->Correlation; /* RSSI */ *tp++ = param->Rssi; /* DSN */ *tp++ = param->Dsn; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); tp += ZTEST_DEFAULT_SEC_LEN; /* Determine the length of the actual data */ if ( param->msduLength < ZTEST_DEFAULT_DATA_LEN ) tempLen = param->msduLength; else tempLen = ZTEST_DEFAULT_DATA_LEN; /* Length */ *tp++ = tempLen; /* Copy the data according to Len, the rest are zeroed out */ osal_memset( tp, 0, ZTEST_DEFAULT_DATA_LEN ); osal_memcpy( tp, param->msdu, tempLen ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_DATA_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkDisassociateInd * * @brief Process the callback subscription for nwk_disassociate_ind * * @param pointer of type macnwk_disassociate_ind_t * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkDisassociateInd( ZMacDisassociateInd_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_DISASSOCIATE_IND; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Extended address */ MT_MacRevExtCpy( pRetBuf, param->DeviceAddress ); tp += Z_EXTADDR_LEN; /* Disassociate Reason */ *tp++ = param->DisassociateReason; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_DISASSOCIATE_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkDisassociateCnf * * @brief Process the callback subscription for nwk_disassociate_cnf * * @param param * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkDisassociateCnf( ZMacDisassociateCnf_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_DISASSOCIATE_CNF; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Status */ *tp++ = param->hdr.Status; /* DeviceAddress */ *tp++ = param->DeviceAddress.addrMode; /* Copy Address */ MT_MacAddr2Spi( tp, ¶m->DeviceAddress ); tp += Z_EXTADDR_LEN; /* Pan ID */ *tp++ = LO_UINT16( param->panID ); *tp = HI_UINT16( param->panID ); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_DISASSOCIATE_CNF, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkOrphanInd * * @brief Process the callback subscription for nwk_orphan_ind * * @param pointer of type macnwk_orphan_ind_t * * @return SUCCESS if message sent succesfully , else N_FAIL ***************************************************************************************************/ void nwk_MTCallbackSubNwkOrphanInd( ZMacOrphanInd_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_ORPHAN_IND; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Extended address */ MT_MacRevExtCpy( tp, param->OrphanAddress ); tp += Z_EXTADDR_LEN; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_ORPHAN_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkPollCnf * * @brief Process the callback subscription for nwk_poll_cnf * * @param byte Status * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkPollCnf( byte Status ) { uint8 retValue; /*The only data byte is Status */ retValue = Status; /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_POLL_CNF, 1, &retValue); } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkScanCnf * * @brief Process the callback subscription for nwk_scan_cnf * * @param pointer of type macnwk_scan_cnf_t * * @return SUCCESS if message sent succesfully , else N_FAIL ***************************************************************************************************/ void nwk_MTCallbackSubNwkScanCnf( ZMacScanCnf_t *param ) { uint8 respLen, resultLen; uint8 *pRetBuf, *tp; /* Depends on the type of scan, calculate the required length */ if ( param->ScanType == ZMAC_ED_SCAN ) resultLen = MT_MAC_ED_SCAN_MAXCHANNELS; else if ( param->ScanType == ZMAC_ACTIVE_SCAN ) resultLen = (param->ResultListSize * sizeof( ZMacPanDesc_t )); else if ( param->ScanType == ZMAC_PASSIVE_SCAN ) resultLen = (param->ResultListSize * sizeof( ZMacPanDesc_t )); else if ( param->ScanType == ZMAC_ORPHAN_SCAN ) resultLen = 0; else return; /* Make sure the result wont be more than the size */ resultLen = MIN(resultLen, MT_MAC_SCAN_RESULT_LEN_MAX); respLen = MT_MAC_LEN_SCAN_CNF + MT_MAC_SCAN_RESULT_LEN_MAX + 1; /* Extra byte for the length of the list */ /* Allocate */ pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Status */ *tp++ = param->hdr.Status; /* ED max energy parameter no longer used */ *tp++ = 0; /* Scan type */ *tp++ = param->ScanType; /* Channel page */ *tp++ = param->ChannelPage; /* Unscanned channel list */ *tp++ = BREAK_UINT32( param->UnscannedChannels, 0 ); *tp++ = BREAK_UINT32( param->UnscannedChannels, 1 ); *tp++ = BREAK_UINT32( param->UnscannedChannels, 2 ); *tp++ = BREAK_UINT32( param->UnscannedChannels, 3 ); /* Result count */ *tp++ = param->ResultListSize; /* MAX length of the result List */ *tp++ = MT_MAC_SCAN_RESULT_LEN_MAX; /* PAN descriptor information */ osal_memcpy( tp, param->Result.pPanDescriptor, resultLen ); /* clear extra buffer space at end, if any */ osal_memset( tp, 0, (MT_MAC_SCAN_RESULT_LEN_MAX - resultLen)); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_SCAN_CNF, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubCommStatusInd * * @brief Process the callback subscription for comm_status_ind. * * @param None * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubCommStatusInd ( ZMacCommStatusInd_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_COMM_STATUS_IND; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Status */ *tp++ = param->hdr.Status; /* Source address */ *tp++ = param->SrcAddress.addrMode; MT_MacAddr2Spi( tp, ¶m->SrcAddress ); tp += Z_EXTADDR_LEN; /* Destination address */ *tp++ = param->DstAddress.addrMode; MT_MacAddr2Spi( tp, ¶m->DstAddress ); tp += Z_EXTADDR_LEN; /* PAN ID */ *tp++ = LO_UINT16( param->PANId ); *tp++ = HI_UINT16( param->PANId ); /* Reason */ *tp++ = param->Reason; /* Security */ MT_MacSpi2Sec ((ZMacSec_t *)tp, (uint8 *)¶m->Sec); /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_COMM_STATUS_IND, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkStartCnf * * @brief Process the callback subscription for nwk_start_cnf * * @param byte Status * * @return None ***************************************************************************************************/ void nwk_MTCallbackSubNwkStartCnf( uint8 Status ) { uint8 retValue; retValue = Status; /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_START_CNF, 1, &retValue); } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkRxEnableCnf * * @brief Process the callback subscription for nwk_Rx_Enable_cnf * * @param * * @return SUCCESS if message sent succesfully , else N_FAIL ***************************************************************************************************/ void nwk_MTCallbackSubNwkRxEnableCnf ( byte Status ) { uint8 retValue; /* The only data byte is Status */ retValue = Status; /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_RX_ENABLE_CNF, 1, &retValue); } /*************************************************************************************************** * @fn nwk_MTCallbackSubNwkPurgeCnf * * @brief Process the callback subscription for nwk_purge_cnf * * @param pointer of type ZMacPurgeCnf_t * * @return SUCCESS if message sent succesfully , else N_FAIL ***************************************************************************************************/ void nwk_MTCallbackSubNwkPurgeCnf( ZMacPurgeCnf_t *param ) { uint8 respLen; uint8 *pRetBuf, *tp; respLen = MT_MAC_LEN_PURGE_CNF; pRetBuf = osal_mem_alloc (respLen); if ( pRetBuf ) { tp = pRetBuf; /* Status */ *tp++ = param->hdr.Status; /* Handle */ *tp = param->msduHandle; /* Build and send back the response */ MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_MAC), MT_MAC_PURGE_CNF, respLen, pRetBuf); /* Deallocate */ osal_mem_free(pRetBuf); } } #endif // MT_MAC_CB_FUNC /*************************************************************************************************** * SUPPORT ***************************************************************************************************/ /*************************************************************************************************** * @fn MT_MacExtCpy * * @brief * * Copy an extended address. * * @param pDst - Pointer to data destination * @param pSrc - Pointer to data source * * @return void ***************************************************************************************************/ static void MT_MacExtCpy( uint8 *pDst, uint8 *pSrc ) { int8 i; for ( i = 0; i < Z_EXTADDR_LEN; i++ ) { *pDst++ = pSrc[i]; } } /*************************************************************************************************** * @fn MT_MacRevExtCpy * * @brief * * Reverse-copy an extended address. * * @param pDst - Pointer to data destination * @param pSrc - Pointer to data source * * @return void ***************************************************************************************************/ static void MT_MacRevExtCpy( uint8 *pDst, uint8 *pSrc ) { int8 i; for ( i = Z_EXTADDR_LEN - 1; i >= 0; i-- ) { *pDst++ = pSrc[i]; } } /*************************************************************************************************** * @fn MT_MacSpi2Addr * * @brief Copy an address from an SPI message to an address struct. The * addrMode in pAddr must already be set. * * @param pDst - Pointer to address struct * @param pSrc - Pointer SPI message byte array * * @return void ***************************************************************************************************/ static void MT_MacSpi2Addr( zAddrType_t *pDst, uint8 *pSrc ) { if ( pDst->addrMode == Addr16Bit ) { pDst->addr.shortAddr = BUILD_UINT16( pSrc[0] , pSrc[1] ); } else if ( pDst->addrMode == Addr64Bit ) { MT_MacRevExtCpy( pDst->addr.extAddr, pSrc ); } } /*************************************************************************************************** * @fn MT_MacSpi2Sec * * @brief Copy Security information from SPI message to a Sec structure * * @param pSec - Pointer to security struct * @param pSrc - Pointer SPI message byte array * * @return void ***************************************************************************************************/ static void MT_MacSpi2Sec( ZMacSec_t *pSec, uint8 *pSrc ) { /* Copy the security structure directly from the byte array */ osal_memcpy (pSec, pSrc, sizeof (ZMacSec_t)); } /*************************************************************************************************** * @fn MT_MacAddr2Spi * * @brief Copy an address from an address struct to an SPI message. * * @param pDst - Pointer SPI message byte array * @param pSrc - Pointer to address struct * * @return void ***************************************************************************************************/ static void MT_MacAddr2Spi( uint8 *pDst, zAddrType_t *pSrc ) { if ( pSrc->addrMode == Addr16Bit ) { *pDst++ = LO_UINT16( pSrc->addr.shortAddr ); *pDst++ = HI_UINT16( pSrc->addr.shortAddr ); *pDst++ = 0; *pDst++ = 0; *pDst++ = 0; *pDst++ = 0; *pDst++ = 0; *pDst = 0; } else if ( pSrc->addrMode == Addr64Bit ) { for ( uint8 i = 0; i< Z_EXTADDR_LEN; i++ ) { *pDst++ = pSrc->addr.extAddr[i]; } } else { for ( uint8 i = 0; i< Z_EXTADDR_LEN; i++ ) { *pDst++ = pSrc->addr.extAddr[i]; } } } /*************************************************************************************************** ***************************************************************************************************/ #endif // MT_MAC_FUNC