/********************************************************************* * @fn loadcontrol_KeyEstablish_ReturnLinkKey * * @brief This function get the requested link key * * @param shortAddr - short address of the partner. * * @return none */ static uint8 loadcontrol_KeyEstablish_ReturnLinkKey( uint16 shortAddr ) { APSME_LinkKeyData_t* keyData; uint8 status = ZFailure; AddrMgrEntry_t entry; // Look up the long address of the device entry.user = ADDRMGR_USER_DEFAULT; entry.nwkAddr = shortAddr; if ( AddrMgrEntryLookupNwk( &entry ) ) { // check for APS link key data APSME_LinkKeyDataGet( entry.extAddr, &keyData ); if ( (keyData != NULL) && (keyData->key != NULL) ) { status = ZSuccess; } } else { // It's an unknown device status = ZInvalidParameter; } return status; }
/*************************************************************************************************** * @fn MT_UtilAPSME_LinkKeyDataGet * * @brief Proxy the APSME_LinkKeyDataGet() function. * * @param pBuf - pointer to the received buffer * * @return void ***************************************************************************************************/ static void MT_UtilAPSME_LinkKeyDataGet(uint8 *pBuf) { // Status + LinkKeyDataLen + Tx+Rx Frame counter. #define MT_APSME_LINKKEY_GET_RSP_LEN (1 + SEC_KEY_LEN + 4 + 4) uint8 rsp[MT_APSME_LINKKEY_GET_RSP_LEN]; APSME_LinkKeyData_t *pData; uint8 cmdId = pBuf[MT_RPC_POS_CMD1]; pBuf += MT_RPC_FRAME_HDR_SZ; *rsp = APSME_LinkKeyDataGet(pBuf, &pData); if (SUCCESS == *rsp) { uint8 *ptr = rsp+1; (void)osal_memcpy(ptr, pData->key, SEC_KEY_LEN); ptr += SEC_KEY_LEN; *ptr++ = BREAK_UINT32(pData->txFrmCntr, 0); *ptr++ = BREAK_UINT32(pData->txFrmCntr, 1); *ptr++ = BREAK_UINT32(pData->txFrmCntr, 2); *ptr++ = BREAK_UINT32(pData->txFrmCntr, 3); *ptr++ = BREAK_UINT32(pData->rxFrmCntr, 0); *ptr++ = BREAK_UINT32(pData->rxFrmCntr, 1); *ptr++ = BREAK_UINT32(pData->rxFrmCntr, 2); *ptr++ = BREAK_UINT32(pData->rxFrmCntr, 3); } MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_NWK), cmdId, MT_APSME_LINKKEY_GET_RSP_LEN, rsp); }