/*********************************************************************
 * @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;
}
Exemple #2
0
/***************************************************************************************************
 * @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);
}