1486 lines
44 KiB
C
1486 lines
44 KiB
C
|
/***************************************************************************************************
|
|||
|
Filename: MT_UTIL.c
|
|||
|
Revised: $Date: 2012-02-25 17:43:09 -0800 (Sat, 25 Feb 2012) $
|
|||
|
Revision: $Revision: 29520 $
|
|||
|
|
|||
|
Description: MonitorTest Utility Functions
|
|||
|
|
|||
|
Copyright 2007-2012 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 <EFBFBD>AS IS<EFBFBD> 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 "AddrMgr.h"
|
|||
|
|
|||
|
#include "OnBoard.h" /* This is here because of the key reading */
|
|||
|
#include "hal_key.h"
|
|||
|
#include "hal_led.h"
|
|||
|
#include "OSAL_Nv.h"
|
|||
|
#include "osal.h"
|
|||
|
#include "NLMEDE.h"
|
|||
|
#include "MT.h"
|
|||
|
#include "MT_UTIL.h"
|
|||
|
#include "MT_MAC.h"
|
|||
|
#include "ssp.h"
|
|||
|
#if defined ZCL_KEY_ESTABLISH
|
|||
|
#include "zcl_key_establish.h"
|
|||
|
#endif
|
|||
|
#if defined TC_LINKKEY_JOIN
|
|||
|
#include "zcl_se.h"
|
|||
|
#endif
|
|||
|
|
|||
|
#if !defined NONWK
|
|||
|
#include "MT_ZDO.h"
|
|||
|
#include "MT_SAPI.h"
|
|||
|
#include "MT_NWK.h"
|
|||
|
#include "MT_AF.h"
|
|||
|
#include "AssocList.h"
|
|||
|
#include "ZDApp.h"
|
|||
|
#include "ZDSecMgr.h"
|
|||
|
#endif
|
|||
|
/***************************************************************************************************
|
|||
|
* CONSTANTS
|
|||
|
***************************************************************************************************/
|
|||
|
#define MT_UTIL_DEVICE_INFO_RESPONSE_LEN 14
|
|||
|
#define MT_UTIL_STATUS_LEN 1
|
|||
|
#define MT_UTIL_FRM_CTR_LEN 4
|
|||
|
// Status + LinkKeyDataLen + Tx+Rx Frame counter.
|
|||
|
#define MT_APSME_LINKKEY_GET_RSP_LEN (MT_UTIL_STATUS_LEN + SEC_KEY_LEN + (MT_UTIL_FRM_CTR_LEN * 2))
|
|||
|
// Status + NV id
|
|||
|
#define MT_APSME_LINKKEY_NV_ID_GET_RSP_LEN (MT_UTIL_STATUS_LEN + 2)
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* LOCAL VARIABLES
|
|||
|
***************************************************************************************************/
|
|||
|
#if defined ZCL_KEY_ESTABLISH
|
|||
|
uint8 zcl_key_establish_task_id;
|
|||
|
#endif
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* LOCAL FUNCTIONS
|
|||
|
***************************************************************************************************/
|
|||
|
#ifdef AUTO_PEND
|
|||
|
static void MT_UtilRevExtCpy( uint8 *pDst, uint8 *pSrc );
|
|||
|
static void MT_UtilSpi2Addr( zAddrType_t *pDst, uint8 *pSrc );
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined (MT_UTIL_FUNC)
|
|||
|
void MT_UtilGetDeviceInfo(void);
|
|||
|
void MT_UtilGetNvInfo(void);
|
|||
|
void MT_UtilSetPanID(uint8 *pBuf);
|
|||
|
void MT_UtilSetChannels(uint8 *pBuf);
|
|||
|
void MT_UtilSetSecLevel(uint8 *pBuf);
|
|||
|
void MT_UtilSetPreCfgKey(uint8 *pBuf);
|
|||
|
void MT_UtilCallbackSub(uint8 *pData);
|
|||
|
void MT_UtilKeyEvent(uint8 *pBuf);
|
|||
|
void MT_UtilTimeAlive(void);
|
|||
|
void MT_UtilLedControl(uint8 *pBuf);
|
|||
|
void MT_UtilSrcMatchEnable (uint8 *pBuf);
|
|||
|
void MT_UtilSrcMatchAddEntry (uint8 *pBuf);
|
|||
|
void MT_UtilSrcMatchDeleteEntry (uint8 *pBuf);
|
|||
|
void MT_UtilSrcMatchCheckSrcAddr (uint8 *pBuf);
|
|||
|
void MT_UtilSrcMatchAckAllPending (uint8 *pBuf);
|
|||
|
void MT_UtilSrcMatchCheckAllPending (uint8 *pBuf);
|
|||
|
|
|||
|
#if !defined NONWK
|
|||
|
void MT_UtilDataReq(uint8 *pBuf);
|
|||
|
static void MT_UtilAddrMgrEntryLookupExt(uint8 *pBuf);
|
|||
|
static void MT_UtilAddrMgrEntryLookupNwk(uint8 *pBuf);
|
|||
|
#if defined MT_SYS_KEY_MANAGEMENT
|
|||
|
static void MT_UtilAPSME_LinkKeyDataGet(uint8 *pBuf);
|
|||
|
static void MT_UtilAPSME_LinkKeyNvIdGet(uint8 *pBuf);
|
|||
|
#endif //MT_SYS_KEY_MANAGEMENT
|
|||
|
static void MT_UtilAPSME_RequestKeyCmd(uint8 *pBuf);
|
|||
|
static void MT_UtilAssocCount(uint8 *pBuf);
|
|||
|
static void MT_UtilAssocFindDevice(uint8 *pBuf);
|
|||
|
static void MT_UtilAssocGetWithAddress(uint8 *pBuf);
|
|||
|
static void packDev_t(uint8 *pBuf, associated_devices_t *pDev);
|
|||
|
#if defined ZCL_KEY_ESTABLISH
|
|||
|
static void MT_UtilzclGeneral_KeyEstablish_InitiateKeyEstablishment(uint8 *pBuf);
|
|||
|
static void MT_UtilzclGeneral_KeyEstablishment_ECDSASign(uint8 *pBuf);
|
|||
|
#endif // ZCL_KEY_ESTABLISH
|
|||
|
static void MT_UtilSync(void);
|
|||
|
#endif // !defined NONWK
|
|||
|
#endif // MT_UTIL_FUNC
|
|||
|
|
|||
|
#if defined (MT_UTIL_FUNC)
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilProcessing
|
|||
|
*
|
|||
|
* @brief Process all the DEBUG commands that are issued by test tool
|
|||
|
*
|
|||
|
* @param pBuf - pointer to received SPI data message
|
|||
|
*
|
|||
|
* @return status
|
|||
|
***************************************************************************************************/
|
|||
|
uint8 MT_UtilCommandProcessing(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 status = MT_RPC_SUCCESS;
|
|||
|
|
|||
|
switch (pBuf[MT_RPC_POS_CMD1])
|
|||
|
{
|
|||
|
// CC253X MAC Network Processor does not have NV support
|
|||
|
#if !defined(CC253X_MACNP)
|
|||
|
case MT_UTIL_GET_DEVICE_INFO:
|
|||
|
MT_UtilGetDeviceInfo();
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_GET_NV_INFO:
|
|||
|
MT_UtilGetNvInfo();
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SET_PANID:
|
|||
|
MT_UtilSetPanID(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SET_CHANNELS:
|
|||
|
MT_UtilSetChannels(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SET_SECLEVEL:
|
|||
|
MT_UtilSetSecLevel(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SET_PRECFGKEY:
|
|||
|
MT_UtilSetPreCfgKey(pBuf);
|
|||
|
break;
|
|||
|
#endif
|
|||
|
case MT_UTIL_CALLBACK_SUB_CMD:
|
|||
|
MT_UtilCallbackSub(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_KEY_EVENT:
|
|||
|
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
|
|||
|
MT_UtilKeyEvent(pBuf);
|
|||
|
#endif
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_TIME_ALIVE:
|
|||
|
MT_UtilTimeAlive();
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_LED_CONTROL:
|
|||
|
#if (defined HAL_LED) && (HAL_LED == TRUE)
|
|||
|
MT_UtilLedControl(pBuf);
|
|||
|
#endif
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SRC_MATCH_ENABLE:
|
|||
|
MT_UtilSrcMatchEnable(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SRC_MATCH_ADD_ENTRY:
|
|||
|
MT_UtilSrcMatchAddEntry(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SRC_MATCH_DEL_ENTRY:
|
|||
|
MT_UtilSrcMatchDeleteEntry(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SRC_MATCH_CHECK_SRC_ADDR:
|
|||
|
MT_UtilSrcMatchCheckSrcAddr(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SRC_MATCH_ACK_ALL_PENDING:
|
|||
|
MT_UtilSrcMatchAckAllPending(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_SRC_MATCH_CHECK_ALL_PENDING:
|
|||
|
MT_UtilSrcMatchCheckAllPending(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_TEST_LOOPBACK:
|
|||
|
MT_BuildAndSendZToolResponse((MT_RPC_CMD_SRSP|(uint8)MT_RPC_SYS_UTIL), MT_UTIL_TEST_LOOPBACK,
|
|||
|
pBuf[MT_RPC_POS_LEN], (pBuf+MT_RPC_FRAME_HDR_SZ));
|
|||
|
break;
|
|||
|
|
|||
|
#if !defined NONWK
|
|||
|
case MT_UTIL_DATA_REQ:
|
|||
|
MT_UtilDataReq(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_ADDRMGR_EXT_ADDR_LOOKUP:
|
|||
|
MT_UtilAddrMgrEntryLookupExt(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_ADDRMGR_NWK_ADDR_LOOKUP:
|
|||
|
MT_UtilAddrMgrEntryLookupNwk(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
#if defined MT_SYS_KEY_MANAGEMENT
|
|||
|
case MT_UTIL_APSME_LINK_KEY_DATA_GET:
|
|||
|
MT_UtilAPSME_LinkKeyDataGet(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_APSME_LINK_KEY_NV_ID_GET:
|
|||
|
MT_UtilAPSME_LinkKeyNvIdGet(pBuf);
|
|||
|
break;
|
|||
|
#endif // MT_SYS_KEY_MANAGEMENT
|
|||
|
|
|||
|
case MT_UTIL_APSME_REQUEST_KEY_CMD:
|
|||
|
MT_UtilAPSME_RequestKeyCmd(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_ASSOC_COUNT:
|
|||
|
MT_UtilAssocCount(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_ASSOC_FIND_DEVICE:
|
|||
|
MT_UtilAssocFindDevice(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_ASSOC_GET_WITH_ADDRESS:
|
|||
|
MT_UtilAssocGetWithAddress(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
#if defined ZCL_KEY_ESTABLISH
|
|||
|
case MT_UTIL_ZCL_KEY_EST_INIT_EST:
|
|||
|
MT_UtilzclGeneral_KeyEstablish_InitiateKeyEstablishment(pBuf);
|
|||
|
break;
|
|||
|
|
|||
|
case MT_UTIL_ZCL_KEY_EST_SIGN:
|
|||
|
MT_UtilzclGeneral_KeyEstablishment_ECDSASign(pBuf);
|
|||
|
break;
|
|||
|
#endif
|
|||
|
|
|||
|
case MT_UTIL_SYNC_REQ:
|
|||
|
MT_UtilSync();
|
|||
|
break;
|
|||
|
#endif /* !defined NONWK */
|
|||
|
|
|||
|
default:
|
|||
|
status = MT_RPC_ERR_COMMAND_ID;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilGetDeviceInfo
|
|||
|
*
|
|||
|
* @brief The Get Device Info serial message.
|
|||
|
*
|
|||
|
* @param None.
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilGetDeviceInfo(void)
|
|||
|
{
|
|||
|
uint8 *buf;
|
|||
|
uint8 *pBuf;
|
|||
|
uint8 bufLen = MT_UTIL_DEVICE_INFO_RESPONSE_LEN;
|
|||
|
uint16 *assocList = NULL;
|
|||
|
|
|||
|
#if !defined NONWK
|
|||
|
uint8 assocCnt = 0;
|
|||
|
|
|||
|
if (ZG_DEVICE_RTR_TYPE)
|
|||
|
{
|
|||
|
assocList = AssocMakeList( &assocCnt );
|
|||
|
bufLen += (assocCnt * sizeof(uint16));
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
buf = osal_mem_alloc( bufLen );
|
|||
|
if ( buf )
|
|||
|
{
|
|||
|
pBuf = buf;
|
|||
|
|
|||
|
*pBuf++ = ZSUCCESS; // Status
|
|||
|
|
|||
|
osal_nv_read( ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, pBuf );
|
|||
|
pBuf += Z_EXTADDR_LEN;
|
|||
|
|
|||
|
#if defined NONWK
|
|||
|
// Skip past ZStack only parameters for NONWK
|
|||
|
*pBuf++ = 0;
|
|||
|
*pBuf++ = 0;
|
|||
|
*pBuf++ = 0;
|
|||
|
*pBuf++ = 0;
|
|||
|
*pBuf = 0;
|
|||
|
#else
|
|||
|
{
|
|||
|
uint16 shortAddr = NLME_GetShortAddr();
|
|||
|
*pBuf++ = LO_UINT16( shortAddr );
|
|||
|
*pBuf++ = HI_UINT16( shortAddr );
|
|||
|
}
|
|||
|
|
|||
|
/* Return device type */
|
|||
|
*pBuf++ = ZSTACK_DEVICE_BUILD;
|
|||
|
|
|||
|
/*Return device state */
|
|||
|
*pBuf++ = (uint8)devState;
|
|||
|
|
|||
|
if (ZG_DEVICE_RTR_TYPE)
|
|||
|
{
|
|||
|
*pBuf++ = assocCnt;
|
|||
|
|
|||
|
if ( assocCnt )
|
|||
|
{
|
|||
|
uint8 x;
|
|||
|
uint16 *puint16 = assocList;
|
|||
|
|
|||
|
for ( x = 0; x < assocCnt; x++, puint16++ )
|
|||
|
{
|
|||
|
*pBuf++ = LO_UINT16( *puint16 );
|
|||
|
*pBuf++ = HI_UINT16( *puint16 );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
*pBuf++ = 0;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse( ((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL),
|
|||
|
MT_UTIL_GET_DEVICE_INFO,
|
|||
|
bufLen, buf );
|
|||
|
|
|||
|
osal_mem_free( buf );
|
|||
|
}
|
|||
|
|
|||
|
if ( assocList )
|
|||
|
{
|
|||
|
osal_mem_free( assocList );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilGetNvInfo
|
|||
|
*
|
|||
|
* @brief The Get NV Info serial message.
|
|||
|
*
|
|||
|
* @param None.
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilGetNvInfo(void)
|
|||
|
{
|
|||
|
uint8 len;
|
|||
|
uint8 stat;
|
|||
|
uint8 *buf;
|
|||
|
uint8 *pBuf;
|
|||
|
uint16 tmp16;
|
|||
|
uint32 tmp32;
|
|||
|
|
|||
|
/*
|
|||
|
Get required length of buffer
|
|||
|
Status + ExtAddr + ChanList + PanID + SecLevel + PreCfgKey
|
|||
|
*/
|
|||
|
len = 1 + Z_EXTADDR_LEN + 4 + 2 + 1 + SEC_KEY_LEN;
|
|||
|
|
|||
|
buf = osal_mem_alloc( len );
|
|||
|
if ( buf )
|
|||
|
{
|
|||
|
/* Assume NV not available */
|
|||
|
osal_memset( buf, 0xFF, len );
|
|||
|
|
|||
|
/* Skip over status */
|
|||
|
pBuf = buf + 1;
|
|||
|
|
|||
|
/* Start with 64-bit extended address */
|
|||
|
stat = osal_nv_read( ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, pBuf );
|
|||
|
if ( stat ) stat = 0x01;
|
|||
|
pBuf += Z_EXTADDR_LEN;
|
|||
|
|
|||
|
/* Scan channel list (bit mask) */
|
|||
|
if ( osal_nv_read( ZCD_NV_CHANLIST, 0, sizeof( tmp32 ), &tmp32 ) )
|
|||
|
stat |= 0x02;
|
|||
|
else
|
|||
|
{
|
|||
|
pBuf[0] = BREAK_UINT32( tmp32, 3 );
|
|||
|
pBuf[1] = BREAK_UINT32( tmp32, 2 );
|
|||
|
pBuf[2] = BREAK_UINT32( tmp32, 1 );
|
|||
|
pBuf[3] = BREAK_UINT32( tmp32, 0 );
|
|||
|
}
|
|||
|
pBuf += sizeof( tmp32 );
|
|||
|
|
|||
|
/* ZigBee PanID */
|
|||
|
if ( osal_nv_read( ZCD_NV_PANID, 0, sizeof( tmp16 ), &tmp16 ) )
|
|||
|
stat |= 0x04;
|
|||
|
else
|
|||
|
{
|
|||
|
pBuf[0] = LO_UINT16( tmp16 );
|
|||
|
pBuf[1] = HI_UINT16( tmp16 );
|
|||
|
}
|
|||
|
pBuf += sizeof( tmp16 );
|
|||
|
|
|||
|
/* Security level */
|
|||
|
if ( osal_nv_read( ZCD_NV_SECURITY_LEVEL, 0, sizeof( uint8 ), pBuf++ ) )
|
|||
|
stat |= 0x08;
|
|||
|
|
|||
|
/* Pre-configured security key */
|
|||
|
if ( osal_nv_read( ZCD_NV_PRECFGKEY, 0, SEC_KEY_LEN, pBuf ) )
|
|||
|
stat |= 0x10;
|
|||
|
|
|||
|
/* Status bit mask - bit=1 indicates failure */
|
|||
|
*buf = stat;
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), MT_UTIL_GET_NV_INFO,
|
|||
|
len, buf );
|
|||
|
|
|||
|
osal_mem_free( buf );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSetPanID
|
|||
|
*
|
|||
|
* @brief Set PanID message
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSetPanID(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint16 temp16;
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
uint8 cmdId;
|
|||
|
|
|||
|
/* parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
temp16 = BUILD_UINT16(pBuf[0], pBuf[1]);
|
|||
|
pBuf += sizeof(uint16);
|
|||
|
|
|||
|
retValue = osal_nv_write(ZCD_NV_PANID, 0, osal_nv_item_len( ZCD_NV_PANID ), &temp16);
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSetChannels
|
|||
|
*
|
|||
|
* @brief Set Channels
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSetChannels(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint32 tmp32;
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
uint8 cmdId;
|
|||
|
|
|||
|
/* parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
tmp32 = BUILD_UINT32(pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
|
|||
|
|
|||
|
retValue = osal_nv_write(ZCD_NV_CHANLIST, 0, osal_nv_item_len( ZCD_NV_CHANLIST ), &tmp32);
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSetSecLevel
|
|||
|
*
|
|||
|
* @brief Set Sec Level
|
|||
|
*
|
|||
|
* @param byte *msg - pointer to the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSetSecLevel(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
uint8 cmdId;
|
|||
|
|
|||
|
/* parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
retValue = osal_nv_write( ZCD_NV_SECURITY_LEVEL, 0, osal_nv_item_len( ZCD_NV_SECURITY_LEVEL ), pBuf);
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSetPreCfgKey
|
|||
|
*
|
|||
|
* @brief Set Pre Cfg Key
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSetPreCfgKey(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
uint8 cmdId;
|
|||
|
|
|||
|
/* parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
retValue = osal_nv_write( ZCD_NV_PRECFGKEY, 0, osal_nv_item_len( ZCD_NV_PRECFGKEY ), pBuf);
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilCallbackSub
|
|||
|
*
|
|||
|
* @brief The Callback subscribe.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilCallbackSub(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
|
|||
|
#if defined(MT_MAC_CB_FUNC) || defined(MT_NWK_CB_FUNC) || defined(MT_ZDO_CB_FUNC) || defined(MT_AF_CB_FUNC) || defined(MT_SAPI_CB_FUNC)
|
|||
|
uint8 subSystem;
|
|||
|
uint16 subscribed_command;
|
|||
|
|
|||
|
// Move past header
|
|||
|
retValue = ZSuccess;
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
/* Command */
|
|||
|
subscribed_command = BUILD_UINT16(pBuf[0], pBuf[1]);
|
|||
|
pBuf += 2;
|
|||
|
|
|||
|
/* Subsystem - 5 bits on the MSB of the command */
|
|||
|
subSystem = HI_UINT16(subscribed_command) & 0x1F ;
|
|||
|
|
|||
|
/* What is the action - SUBSCRIBE or !SUBSCRIBE */
|
|||
|
if (*pBuf)
|
|||
|
{
|
|||
|
/* Turn ON */
|
|||
|
#if defined( MT_MAC_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_MAC) || (subscribed_command == 0xFFFF))
|
|||
|
_macCallbackSub = 0xFFFF;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_NWK_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_NWK) || (subscribed_command == 0xFFFF))
|
|||
|
_nwkCallbackSub = 0xFFFF;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_ZDO_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_ZDO) || (subscribed_command == 0xFFFF))
|
|||
|
_zdoCallbackSub = 0xFFFFFFFF;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_AF_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_AF) || (subscribed_command == 0xFFFF))
|
|||
|
_afCallbackSub = 0xFFFF;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_SAPI_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_SAPI) || (subscribed_command == 0xFFFF))
|
|||
|
_sapiCallbackSub = 0xFFFF;
|
|||
|
#endif
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
/* Turn OFF */
|
|||
|
#if defined( MT_MAC_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_MAC) || (subscribed_command == 0xFFFF))
|
|||
|
_macCallbackSub = 0x0000;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_NWK_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_NWK) || (subscribed_command == 0xFFFF))
|
|||
|
_nwkCallbackSub = 0x0000;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_ZDO_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_ZDO) || (subscribed_command == 0xFFFF))
|
|||
|
_zdoCallbackSub = 0x00000000;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_AF_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_AF) || (subscribed_command == 0xFFFF))
|
|||
|
_afCallbackSub = 0x0000;
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( MT_SAPI_CB_FUNC )
|
|||
|
if ((subSystem == MT_RPC_SYS_SAPI) || (subscribed_command == 0xFFFF))
|
|||
|
_sapiCallbackSub = 0x0000;
|
|||
|
#endif
|
|||
|
}
|
|||
|
#endif // MT_MAC_CB_FUNC || MT_NWK_CB_FUNC || MT_ZDO_CB_FUNC || MT_AF_CB_FUNC || MT_SAPI_CB_FUNC || MT_SAPI_CB_FUNC
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
}
|
|||
|
|
|||
|
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilKeyEvent
|
|||
|
*
|
|||
|
* @brief Process Key Event
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilKeyEvent(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 x = 0;
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
uint8 cmdId;
|
|||
|
|
|||
|
/* parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
/* Translate between SPI values to device values */
|
|||
|
if ( *pBuf & 0x01 )
|
|||
|
x |= HAL_KEY_SW_1;
|
|||
|
if ( *pBuf & 0x02 )
|
|||
|
x |= HAL_KEY_SW_2;
|
|||
|
if ( *pBuf & 0x04 )
|
|||
|
x |= HAL_KEY_SW_3;
|
|||
|
if ( *pBuf & 0x08 )
|
|||
|
x |= HAL_KEY_SW_4;
|
|||
|
#if defined ( HAL_KEY_SW_5 )
|
|||
|
if ( *pBuf & 0x10 )
|
|||
|
x |= HAL_KEY_SW_5;
|
|||
|
#endif
|
|||
|
#if defined ( HAL_KEY_SW_6 )
|
|||
|
if ( *pBuf & 0x20 )
|
|||
|
x |= HAL_KEY_SW_6;
|
|||
|
#endif
|
|||
|
#if defined ( HAL_KEY_SW_7 )
|
|||
|
if ( *pBuf & 0x40 )
|
|||
|
x |= HAL_KEY_SW_7;
|
|||
|
#endif
|
|||
|
#if defined ( HAL_KEY_SW_8 )
|
|||
|
if ( *pBuf & 0x80 )
|
|||
|
x |= HAL_KEY_SW_8;
|
|||
|
#endif
|
|||
|
pBuf++;
|
|||
|
|
|||
|
retValue = OnBoard_SendKeys(x, *pBuf);
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilTimeAlive
|
|||
|
*
|
|||
|
* @brief Process Time Alive
|
|||
|
*
|
|||
|
* @param None.
|
|||
|
*
|
|||
|
* @return None
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilTimeAlive(void)
|
|||
|
{
|
|||
|
uint8 timeAlive[4];
|
|||
|
uint32 tmp32;
|
|||
|
|
|||
|
/* Time since last reset (seconds) */
|
|||
|
tmp32 = osal_GetSystemClock() / 1000;
|
|||
|
|
|||
|
/* Convert to high byte first into temp buffer */
|
|||
|
timeAlive[0] = BREAK_UINT32(tmp32, 0);
|
|||
|
timeAlive[1] = BREAK_UINT32(tmp32, 1);
|
|||
|
timeAlive[2] = BREAK_UINT32(tmp32, 2);
|
|||
|
timeAlive[3] = BREAK_UINT32(tmp32, 3);
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL),
|
|||
|
MT_UTIL_TIME_ALIVE, sizeof(timeAlive), timeAlive);
|
|||
|
}
|
|||
|
|
|||
|
#if (defined HAL_LED) && (HAL_LED == TRUE)
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilLedControl
|
|||
|
*
|
|||
|
* @brief Process the LED Control Message
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received data
|
|||
|
*
|
|||
|
* @return None
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilLedControl(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 iLed, Led, iMode, Mode, cmdId;
|
|||
|
uint8 retValue = ZFailure;
|
|||
|
|
|||
|
/* parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
/* LED and Mode */
|
|||
|
iLed = *pBuf++;
|
|||
|
iMode = *pBuf;
|
|||
|
|
|||
|
if ( iLed == 1 )
|
|||
|
Led = HAL_LED_1;
|
|||
|
else if ( iLed == 2 )
|
|||
|
Led = HAL_LED_2;
|
|||
|
else if ( iLed == 3 )
|
|||
|
Led = HAL_LED_3;
|
|||
|
else if ( iLed == 4 )
|
|||
|
Led = HAL_LED_4;
|
|||
|
else if ( iLed == 0xFF )
|
|||
|
Led = HAL_LED_ALL;
|
|||
|
else
|
|||
|
Led = 0;
|
|||
|
|
|||
|
if ( iMode == 0 )
|
|||
|
Mode = HAL_LED_MODE_OFF;
|
|||
|
else if ( iMode == 1 )
|
|||
|
Mode = HAL_LED_MODE_ON;
|
|||
|
else if ( iMode == 2 )
|
|||
|
Mode = HAL_LED_MODE_BLINK;
|
|||
|
else if ( iMode == 3 )
|
|||
|
Mode = HAL_LED_MODE_FLASH;
|
|||
|
else if ( iMode == 4 )
|
|||
|
Mode = HAL_LED_MODE_TOGGLE;
|
|||
|
else
|
|||
|
Led = 0;
|
|||
|
|
|||
|
if ( Led != 0 )
|
|||
|
{
|
|||
|
HalLedSet (Led, Mode);
|
|||
|
retValue = ZSuccess;
|
|||
|
}
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
}
|
|||
|
#endif /* HAL_LED */
|
|||
|
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSrcMatchEnable
|
|||
|
*
|
|||
|
* @brief Enabled AUTOPEND and source address matching.
|
|||
|
*
|
|||
|
* @param pBuf - Buffer contains the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSrcMatchEnable (uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retValue, cmdId;
|
|||
|
|
|||
|
/* Parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
#ifdef AUTO_PEND
|
|||
|
/* Call the routine */
|
|||
|
retValue = ZMacSrcMatchEnable (pBuf[0], pBuf[1]);
|
|||
|
#else
|
|||
|
retValue = ZMacUnsupported;
|
|||
|
#endif
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSrcMatchAddEntry
|
|||
|
*
|
|||
|
* @brief Add a short or extended address to source address table.
|
|||
|
*
|
|||
|
* @param pBuf - Buffer contains the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSrcMatchAddEntry (uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retValue, cmdId;
|
|||
|
|
|||
|
/* Parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
#ifdef AUTO_PEND
|
|||
|
uint16 panID;
|
|||
|
zAddrType_t devAddr;
|
|||
|
|
|||
|
/* Address mode */
|
|||
|
devAddr.addrMode = *pBuf++;
|
|||
|
|
|||
|
/* Address based on the address mode */
|
|||
|
MT_UtilSpi2Addr( &devAddr, pBuf);
|
|||
|
pBuf += Z_EXTADDR_LEN;
|
|||
|
|
|||
|
/* PanID */
|
|||
|
panID = BUILD_UINT16( pBuf[0] , pBuf[1] );
|
|||
|
|
|||
|
/* Call the routine */
|
|||
|
retValue = ZMacSrcMatchAddEntry (&devAddr, panID);
|
|||
|
#else
|
|||
|
retValue = ZMacUnsupported;
|
|||
|
#endif
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSrcMatchDeleteEntry
|
|||
|
*
|
|||
|
* @brief Delete a short or extended address from source address table.
|
|||
|
*
|
|||
|
* @param pBuf - Buffer contains the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSrcMatchDeleteEntry (uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retValue, cmdId;
|
|||
|
|
|||
|
/* Parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
#ifdef AUTO_PEND
|
|||
|
uint16 panID;
|
|||
|
zAddrType_t devAddr;
|
|||
|
|
|||
|
/* Address mode */
|
|||
|
devAddr.addrMode = *pBuf++;
|
|||
|
|
|||
|
/* Address based on the address mode */
|
|||
|
MT_UtilSpi2Addr( &devAddr, pBuf);
|
|||
|
pBuf += Z_EXTADDR_LEN;
|
|||
|
|
|||
|
/* PanID */
|
|||
|
panID = BUILD_UINT16( pBuf[0] , pBuf[1] );
|
|||
|
|
|||
|
/* Call the routine */
|
|||
|
retValue = ZMacSrcMatchDeleteEntry (&devAddr, panID);
|
|||
|
#else
|
|||
|
retValue = ZMacUnsupported;
|
|||
|
#endif
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSrcMatchCheckSrcAddr
|
|||
|
*
|
|||
|
* @brief Check if a short or extended address is in the source address table.
|
|||
|
*
|
|||
|
* @param pBuf - Buffer contains the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSrcMatchCheckSrcAddr (uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 cmdId;
|
|||
|
uint8 retArray[2];
|
|||
|
|
|||
|
/* Parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
#if 0 /* Unsupported */
|
|||
|
uint16 panID;
|
|||
|
zAddrType_t devAddr;
|
|||
|
|
|||
|
/* Address mode */
|
|||
|
devAddr.addrMode = *pBuf++;
|
|||
|
|
|||
|
/* Address based on the address mode */
|
|||
|
MT_UtilSpi2Addr( &devAddr, pBuf);
|
|||
|
pBuf += Z_EXTADDR_LEN;
|
|||
|
|
|||
|
/* PanID */
|
|||
|
panID = BUILD_UINT16( pBuf[0] , pBuf[1] );
|
|||
|
|
|||
|
/* Call the routine */
|
|||
|
retArray[1] = ZMacSrcMatchCheckSrcAddr (&devAddr, panID);
|
|||
|
|
|||
|
/* Return failure if the index is invalid */
|
|||
|
if (retArray[1] == ZMacSrcMatchInvalidIndex )
|
|||
|
{
|
|||
|
retArray[0] = ZFailure;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
retArray[0] = ZSuccess;
|
|||
|
}
|
|||
|
#else
|
|||
|
retArray[0] = ZMacUnsupported;
|
|||
|
retArray[1] = ZMacSrcMatchInvalidIndex;
|
|||
|
#endif
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 2, retArray );
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSrcMatchAckAllPending
|
|||
|
*
|
|||
|
* @brief Enabled/disable acknowledging all packets with pending bit set
|
|||
|
* It is normally enabled when adding new entries to
|
|||
|
* the source address table fails due to the table is full, or
|
|||
|
* disabled when more entries are deleted and the table has
|
|||
|
* empty slots.
|
|||
|
*
|
|||
|
* @param pBuf - Buffer contains the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSrcMatchAckAllPending (uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retValue, cmdId;
|
|||
|
|
|||
|
/* Parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
#ifdef AUTO_PEND
|
|||
|
/* Call the routine */
|
|||
|
retValue = ZMacSrcMatchAckAllPending(*pBuf);
|
|||
|
#else
|
|||
|
retValue = ZMacUnsupported;
|
|||
|
#endif
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue );
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSrcMatchCheckAllPending
|
|||
|
*
|
|||
|
* @brief Check if acknowledging all packets with pending bit set
|
|||
|
* is enabled.
|
|||
|
*
|
|||
|
* @param pBuf - Buffer contains the data
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilSrcMatchCheckAllPending (uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 retArray[2], cmdId;
|
|||
|
|
|||
|
/* Parse header */
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
#ifdef AUTO_PEND
|
|||
|
/* Call the routine */
|
|||
|
retArray[0] = ZMacSuccess;
|
|||
|
retArray[1] = ZMacSrcMatchCheckAllPending();
|
|||
|
#else
|
|||
|
retArray[0] = ZMacUnsupported;
|
|||
|
retArray[1] = FALSE;
|
|||
|
#endif
|
|||
|
|
|||
|
/* Build and send back the response */
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 2, retArray );
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* SUPPORT
|
|||
|
***************************************************************************************************/
|
|||
|
|
|||
|
#ifdef AUTO_PEND
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilRevExtCpy
|
|||
|
*
|
|||
|
* @brief
|
|||
|
*
|
|||
|
* Reverse-copy an extended address.
|
|||
|
*
|
|||
|
* @param pDst - Pointer to data destination
|
|||
|
* @param pSrc - Pointer to data source
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilRevExtCpy( uint8 *pDst, uint8 *pSrc )
|
|||
|
{
|
|||
|
int8 i;
|
|||
|
|
|||
|
for ( i = Z_EXTADDR_LEN - 1; i >= 0; i-- )
|
|||
|
{
|
|||
|
*pDst++ = pSrc[i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSpi2Addr
|
|||
|
*
|
|||
|
* @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_UtilSpi2Addr( zAddrType_t *pDst, uint8 *pSrc )
|
|||
|
{
|
|||
|
if ( pDst->addrMode == Addr16Bit )
|
|||
|
{
|
|||
|
pDst->addr.shortAddr = BUILD_UINT16( pSrc[0] , pSrc[1] );
|
|||
|
}
|
|||
|
else if ( pDst->addrMode == Addr64Bit )
|
|||
|
{
|
|||
|
MT_UtilRevExtCpy( pDst->addr.extAddr, pSrc );
|
|||
|
}
|
|||
|
}
|
|||
|
#endif // AUTO_PEND
|
|||
|
|
|||
|
#if !defined NONWK
|
|||
|
/**************************************************************************************************
|
|||
|
* @fn MT_UtilDataReq
|
|||
|
*
|
|||
|
* @brief Process the MAC Data Request command.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received data
|
|||
|
*
|
|||
|
* @return None
|
|||
|
**************************************************************************************************/
|
|||
|
void MT_UtilDataReq(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 rtrn = NwkPollReq(pBuf[MT_RPC_POS_DAT0]);
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), MT_UTIL_DATA_REQ,
|
|||
|
1, &rtrn);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAddrMgrEntryLookupExt
|
|||
|
*
|
|||
|
* @brief Proxy the AddrMgrEntryLookupExt() function.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAddrMgrEntryLookupExt(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 nwkAddr[2];
|
|||
|
AddrMgrEntry_t entry;
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
osal_memcpy(entry.extAddr, pBuf, Z_EXTADDR_LEN);
|
|||
|
(void)AddrMgrEntryLookupExt(&entry);
|
|||
|
|
|||
|
nwkAddr[0] = LO_UINT16(entry.nwkAddr);
|
|||
|
nwkAddr[1] = HI_UINT16(entry.nwkAddr);
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL),
|
|||
|
cmdId, sizeof(uint16), nwkAddr);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAddrMgrEntryLookupNwk
|
|||
|
*
|
|||
|
* @brief Proxy the AddrMgrEntryLookupNwk() function.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAddrMgrEntryLookupNwk(uint8 *pBuf)
|
|||
|
{
|
|||
|
AddrMgrEntry_t entry;
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
entry.nwkAddr = BUILD_UINT16(pBuf[0], pBuf[1]);
|
|||
|
(void)AddrMgrEntryLookupNwk(&entry);
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL),
|
|||
|
cmdId, Z_EXTADDR_LEN, entry.extAddr);
|
|||
|
}
|
|||
|
|
|||
|
#if defined MT_SYS_KEY_MANAGEMENT
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAPSME_LinkKeyDataGet
|
|||
|
*
|
|||
|
* @brief Retrieves APS Link Key data from NV.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAPSME_LinkKeyDataGet(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 rsp[MT_APSME_LINKKEY_GET_RSP_LEN];
|
|||
|
APSME_LinkKeyData_t *pData = NULL;
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
uint16 apsLinkKeyNvId;
|
|||
|
uint32 *apsRxFrmCntr;
|
|||
|
uint32 *apsTxFrmCntr;
|
|||
|
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
*rsp = APSME_LinkKeyNVIdGet(pBuf, &apsLinkKeyNvId);
|
|||
|
|
|||
|
if (SUCCESS == *rsp)
|
|||
|
{
|
|||
|
pData = (APSME_LinkKeyData_t *)osal_mem_alloc(sizeof(APSME_LinkKeyData_t));
|
|||
|
|
|||
|
if (pData != NULL)
|
|||
|
{
|
|||
|
// retrieve key from NV
|
|||
|
if ( osal_nv_read( apsLinkKeyNvId, 0,
|
|||
|
sizeof(APSME_LinkKeyData_t), pData) == SUCCESS)
|
|||
|
|
|||
|
{
|
|||
|
apsRxFrmCntr = &ApsLinkKeyFrmCntr[apsLinkKeyNvId - ZCD_NV_APS_LINK_KEY_DATA_START].rxFrmCntr;
|
|||
|
apsTxFrmCntr = &ApsLinkKeyFrmCntr[apsLinkKeyNvId - ZCD_NV_APS_LINK_KEY_DATA_START].txFrmCntr;
|
|||
|
|
|||
|
uint8 *ptr = rsp+1;
|
|||
|
(void)osal_memcpy(ptr, pData->key, SEC_KEY_LEN);
|
|||
|
ptr += SEC_KEY_LEN;
|
|||
|
*ptr++ = BREAK_UINT32(*apsTxFrmCntr, 0);
|
|||
|
*ptr++ = BREAK_UINT32(*apsTxFrmCntr, 1);
|
|||
|
*ptr++ = BREAK_UINT32(*apsTxFrmCntr, 2);
|
|||
|
*ptr++ = BREAK_UINT32(*apsTxFrmCntr, 3);
|
|||
|
*ptr++ = BREAK_UINT32(*apsRxFrmCntr, 0);
|
|||
|
*ptr++ = BREAK_UINT32(*apsRxFrmCntr, 1);
|
|||
|
*ptr++ = BREAK_UINT32(*apsRxFrmCntr, 2);
|
|||
|
*ptr++ = BREAK_UINT32(*apsRxFrmCntr, 3);
|
|||
|
}
|
|||
|
|
|||
|
// clear copy of key in RAM
|
|||
|
osal_memset( pData, 0x00, sizeof(APSME_LinkKeyData_t) );
|
|||
|
|
|||
|
osal_mem_free(pData);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// set data key and counters 0xFF
|
|||
|
osal_memset(&rsp[1], 0xFF, SEC_KEY_LEN + (MT_UTIL_FRM_CTR_LEN * 2));
|
|||
|
}
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId,
|
|||
|
MT_APSME_LINKKEY_GET_RSP_LEN, rsp);
|
|||
|
|
|||
|
// clear key data
|
|||
|
osal_memset(rsp, 0x00, MT_APSME_LINKKEY_GET_RSP_LEN);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAPSME_LinkKeyNvIdGet
|
|||
|
*
|
|||
|
* @brief Retrieves APS Link Key NV ID from the entry table.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAPSME_LinkKeyNvIdGet(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 rsp[MT_APSME_LINKKEY_NV_ID_GET_RSP_LEN];
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
uint16 apsLinkKeyNvId;
|
|||
|
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
*rsp = APSME_LinkKeyNVIdGet(pBuf, &apsLinkKeyNvId);
|
|||
|
|
|||
|
if (SUCCESS == *rsp)
|
|||
|
{
|
|||
|
rsp[1] = LO_UINT16(apsLinkKeyNvId);
|
|||
|
rsp[2] = HI_UINT16(apsLinkKeyNvId);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// send failure response with invalid NV ID
|
|||
|
osal_memset(&rsp[1], 0xFF, 2);
|
|||
|
}
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId,
|
|||
|
MT_APSME_LINKKEY_NV_ID_GET_RSP_LEN, rsp);
|
|||
|
}
|
|||
|
#endif // MT_SYS_KEY_MANAGEMENT
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAPSME_RequestKeyCmd
|
|||
|
*
|
|||
|
* @brief Send RequestKey command message to TC for a specific partner Address.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilAPSME_RequestKeyCmd(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 cmdId;
|
|||
|
uint8 partnerAddr[Z_EXTADDR_LEN];
|
|||
|
uint8 retValue;
|
|||
|
|
|||
|
// parse header
|
|||
|
cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
/* PartnerAddress */
|
|||
|
osal_memcpy(partnerAddr, pBuf, Z_EXTADDR_LEN);
|
|||
|
|
|||
|
retValue = (uint8)ZDSecMgrRequestAppKey(partnerAddr);
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAssocCount
|
|||
|
*
|
|||
|
* @brief Proxy the AssocCount() function.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAssocCount(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint16 cnt;
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
cnt = AssocCount(pBuf[0], pBuf[1]);
|
|||
|
pBuf[0] = LO_UINT16(cnt);
|
|||
|
pBuf[1] = HI_UINT16(cnt);
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 2, pBuf);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAssocFindDevice
|
|||
|
*
|
|||
|
* @brief Get an associated device by index.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAssocFindDevice(uint8 *pBuf)
|
|||
|
{
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
uint8 buf[sizeof(associated_devices_t)];
|
|||
|
|
|||
|
packDev_t(buf, AssocFindDevice(pBuf[MT_RPC_FRAME_HDR_SZ]));
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId,
|
|||
|
sizeof(associated_devices_t), buf);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilAssocGetWithAddress
|
|||
|
*
|
|||
|
* @brief Get an associated device by address.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilAssocGetWithAddress(uint8 *pBuf)
|
|||
|
{
|
|||
|
extern associated_devices_t *AssocGetWithAddress(uint8 *extAddr, uint16 shortAddr);
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
uint8 buf[sizeof(associated_devices_t)];
|
|||
|
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
packDev_t(buf, AssocGetWithAddress(((AddrMgrExtAddrValid(pBuf)) ? pBuf : NULL),
|
|||
|
BUILD_UINT16(pBuf[Z_EXTADDR_LEN], pBuf[Z_EXTADDR_LEN+1])));
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId,
|
|||
|
sizeof(associated_devices_t), buf);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn packDev_t
|
|||
|
*
|
|||
|
* @brief Pack an associated_devices_t structure into a byte buffer (pack INVALID_NODE_ADDR if
|
|||
|
* the pDev parameter is NULL).
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the buffer into which to pack the structure.
|
|||
|
* @param pDev - pointer to the structure.
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void packDev_t(uint8 *pBuf, associated_devices_t *pDev)
|
|||
|
{
|
|||
|
if (NULL == pDev)
|
|||
|
{
|
|||
|
uint16 rtrn = INVALID_NODE_ADDR;
|
|||
|
*pBuf++ = LO_UINT16(rtrn);
|
|||
|
*pBuf++ = HI_UINT16(rtrn);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
*pBuf++ = LO_UINT16(pDev->shortAddr);
|
|||
|
*pBuf++ = HI_UINT16(pDev->shortAddr);
|
|||
|
*pBuf++ = LO_UINT16(pDev->addrIdx);
|
|||
|
*pBuf++ = HI_UINT16(pDev->addrIdx);
|
|||
|
*pBuf++ = pDev->nodeRelation;
|
|||
|
*pBuf++ = pDev->devStatus;
|
|||
|
*pBuf++ = pDev->assocCnt;
|
|||
|
*pBuf++ = pDev->age;
|
|||
|
*pBuf++ = pDev->linkInfo.txCounter;
|
|||
|
*pBuf++ = pDev->linkInfo.txCost;
|
|||
|
*pBuf++ = pDev->linkInfo.rxLqi;
|
|||
|
*pBuf++ = pDev->linkInfo.inKeySeqNum;
|
|||
|
*pBuf++ = BREAK_UINT32(pDev->linkInfo.inFrmCntr, 0);
|
|||
|
*pBuf++ = BREAK_UINT32(pDev->linkInfo.inFrmCntr, 1);
|
|||
|
*pBuf++ = BREAK_UINT32(pDev->linkInfo.inFrmCntr, 2);
|
|||
|
*pBuf++ = BREAK_UINT32(pDev->linkInfo.inFrmCntr, 3);
|
|||
|
*pBuf++ = LO_UINT16(pDev->linkInfo.txFailure);
|
|||
|
*pBuf++ = HI_UINT16(pDev->linkInfo.txFailure);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if defined ZCL_KEY_ESTABLISH
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilzclGeneral_KeyEstablish_InitiateKeyEstablishment
|
|||
|
*
|
|||
|
* @brief Proxy the zclGeneral_KeyEstablish_InitiateKeyEstablishment() function.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilzclGeneral_KeyEstablish_InitiateKeyEstablishment(uint8 *pBuf)
|
|||
|
{
|
|||
|
afAddrType_t partnerAddr;
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
partnerAddr.panId = 0; // Not an inter-pan message.
|
|||
|
partnerAddr.endPoint = pBuf[2];
|
|||
|
partnerAddr.addrMode = (afAddrMode_t)pBuf[3];
|
|||
|
if (afAddr64Bit == partnerAddr.addrMode)
|
|||
|
{
|
|||
|
(void)osal_memcpy(partnerAddr.addr.extAddr, pBuf+4, Z_EXTADDR_LEN);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
partnerAddr.addr.shortAddr = BUILD_UINT16(pBuf[4], pBuf[5]);
|
|||
|
}
|
|||
|
|
|||
|
zcl_key_establish_task_id = pBuf[0];
|
|||
|
*pBuf = zclGeneral_KeyEstablish_InitiateKeyEstablishment(MT_TaskID, &partnerAddr, pBuf[1]);
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, pBuf);
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilzclGeneral_KeyEstablishment_ECDSASign
|
|||
|
*
|
|||
|
* @brief Proxy the zclGeneral_KeyEstablishment_ECDSASign() function.
|
|||
|
*
|
|||
|
* @param pBuf - pointer to the received buffer
|
|||
|
*
|
|||
|
* @return void
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilzclGeneral_KeyEstablishment_ECDSASign(uint8 *pBuf)
|
|||
|
{
|
|||
|
#if defined TC_LINKKEY_JOIN
|
|||
|
uint8 *output = osal_mem_alloc(SE_PROFILE_SIGNATURE_LENGTH+1);
|
|||
|
uint8 cmdId = pBuf[MT_RPC_POS_CMD1];
|
|||
|
pBuf += MT_RPC_FRAME_HDR_SZ;
|
|||
|
|
|||
|
if (NULL == output)
|
|||
|
{
|
|||
|
*pBuf = FAILURE;
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, pBuf);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
*output = zclGeneral_KeyEstablishment_ECDSASign(pBuf+1, *pBuf, output+1);
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId,
|
|||
|
SE_PROFILE_SIGNATURE_LENGTH+1, output);
|
|||
|
osal_mem_free(output);
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilKeyEstablishInd
|
|||
|
*
|
|||
|
* @brief Proxy the ZCL_KEY_ESTABLISH_IND command.
|
|||
|
*
|
|||
|
* @param pInd - Pointer to a keyEstablishmentInd_t structure.
|
|||
|
*
|
|||
|
* @return None
|
|||
|
***************************************************************************************************/
|
|||
|
void MT_UtilKeyEstablishInd(keyEstablishmentInd_t *pInd)
|
|||
|
{
|
|||
|
uint8 msg[6];
|
|||
|
|
|||
|
msg[0] = zcl_key_establish_task_id;
|
|||
|
msg[1] = pInd->hdr.event;
|
|||
|
msg[2] = pInd->hdr.status;
|
|||
|
msg[3] = pInd->waitTime;
|
|||
|
msg[4] = LO_UINT16(pInd->keyEstablishmentSuite);
|
|||
|
msg[5] = HI_UINT16(pInd->keyEstablishmentSuite);
|
|||
|
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_UTIL),
|
|||
|
MT_UTIL_ZCL_KEY_ESTABLISH_IND, 6, msg);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
/***************************************************************************************************
|
|||
|
* @fn MT_UtilSync
|
|||
|
*
|
|||
|
* @brief Process the MT_UTIL_SYNC command
|
|||
|
*
|
|||
|
* @param None
|
|||
|
*
|
|||
|
* @return None
|
|||
|
***************************************************************************************************/
|
|||
|
static void MT_UtilSync(void)
|
|||
|
{
|
|||
|
MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ|(uint8)MT_RPC_SYS_UTIL),MT_UTIL_SYNC_REQ,0,0);
|
|||
|
}
|
|||
|
#endif /* !defined NONWK */
|
|||
|
#endif /* MT_UTIL_FUNC */
|
|||
|
/**************************************************************************************************
|
|||
|
**************************************************************************************************/
|