| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546 |
- /**************************************************************************************************
- Filename: MT_ZDO.c
- Revised: $Date: 2009-01-05 16:58:00 -0800 (Mon, 05 Jan 2009) $
- Revision: $Revision: 18682 $
- Description: MonitorTest functions for the ZDO layer.
- Copyright 2004-2007 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.
- **************************************************************************************************/
- #ifdef MT_ZDO_FUNC
- /**************************************************************************************************
- * INCLUDES
- **************************************************************************************************/
- #include "ZComDef.h"
- #include "OSAL.h"
- #include "MT.h"
- #include "MT_ZDO.h"
- #include "APSMEDE.h"
- #include "ZDConfig.h"
- #include "ZDProfile.h"
- #include "ZDObject.h"
- #include "ZDApp.h"
- #if !defined( WIN32 )
- #include "OnBoard.h"
- #endif
- #include "nwk_util.h"
- /**************************************************************************************************
- * CONSTANTS
- **************************************************************************************************/
- #define MT_ZDO_END_DEVICE_ANNCE_IND_LEN 0x0D
- #define MT_ZDO_ADDR_RSP_LEN 0x0D
- #define MT_ZDO_BIND_UNBIND_RSP_LEN 0x03
- #define MTZDO_RESPONSE_BUFFER_LEN 100
- #define MTZDO_MAX_MATCH_CLUSTERS 16
- #define MTZDO_MAX_ED_BIND_CLUSTERS 15
- /**************************************************************************************************
- * GLOBAL VARIABLES
- **************************************************************************************************/
- uint32 _zdoCallbackSub;
- /**************************************************************************************************
- * LOCAL VARIABLES
- **************************************************************************************************/
- uint8 mtzdoResponseBuffer[MTZDO_RESPONSE_BUFFER_LEN];
- /**************************************************************************************************
- * LOCAL FUNCTIONS
- **************************************************************************************************/
- #if defined (MT_ZDO_FUNC)
- void MT_ZdoNWKAddressRequest(uint8 *pBuf);
- void MT_ZdoIEEEAddrRequest(uint8 *pBuf);
- void MT_ZdoNodeDescRequest(uint8 *pBuf);
- void MT_ZdoPowerDescRequest(uint8 *pBuf);
- void MT_ZdoSimpleDescRequest(uint8 *pBuf);
- void MT_ZdoActiveEpRequest(uint8 *pBuf);
- void MT_ZdoMatchDescRequest(uint8 *pBuf);
- void MT_ZdoComplexDescRequest(uint8 *pBuf);
- void MT_ZdoUserDescRequest(uint8 *pBuf);
- void MT_ZdoEndDevAnnce(uint8 *pBuf);
- void MT_ZdoUserDescSet(uint8 *pBuf);
- void MT_ZdoServiceDiscRequest(uint8 *pBuf);
- void MT_ZdoEndDevBindRequest(uint8 *pBuf);
- void MT_ZdoBindRequest(uint8 *pBuf);
- void MT_ZdoUnbindRequest(uint8 *pBuf);
- void MT_ZdoMgmtNwkDiscRequest(uint8 *pBuf);
- void MT_ZdoStartupFromApp(uint8 *pBuf);
- #if defined (MT_ZDO_MGMT)
- void MT_ZdoMgmtLqiRequest(uint8 *pBuf);
- void MT_ZdoMgmtRtgRequest(uint8 *pBuf);
- void MT_ZdoMgmtBindRequest(uint8 *pBuf);
- void MT_ZdoMgmtLeaveRequest(uint8 *pBuf);
- void MT_ZdoMgmtDirectJoinRequest(uint8 *pBuf);
- void MT_ZdoMgmtPermitJoinRequest(uint8 *pBuf);
- void MT_ZdoMgmtNwkUpdateRequest(uint8 *pBuf);
- #endif /* MT_ZDO_MGMT */
- #endif /* MT_ZDO_FUNC */
- #if defined (MT_ZDO_CB_FUNC)
- uint8 MT_ZdoHandleExceptions( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg );
- void MT_ZdoAddrRspCB( ZDO_NwkIEEEAddrResp_t *pMsg, uint16 clusterID );
- void MT_ZdoEndDevAnnceCB( ZDO_DeviceAnnce_t *pMsg, uint16 srcAddr );
- void MT_ZdoBindUnbindRspCB( uint16 clusterID, uint16 srcAddr, uint8 status );
- /* ZDO cluster ID to MT response command ID lookup */
- static const uint8 CODE mtZdoCluster2Rsp[4][7] =
- {
- {
- MT_ZDO_NWK_ADDR_RSP, /* NWK_addr_req */
- MT_ZDO_IEEE_ADDR_RSP, /* IEEE_addr_req */
- MT_ZDO_NODE_DESC_RSP, /* Node_Desc_req */
- MT_ZDO_POWER_DESC_RSP, /* Power_Desc_req */
- MT_ZDO_SIMPLE_DESC_RSP, /* Simple_Desc_req */
- MT_ZDO_ACTIVE_EP_RSP, /* Active_EP_req */
- MT_ZDO_MATCH_DESC_RSP /* Match_Desc_req */
- },
- {
- MT_ZDO_COMPLEX_DESC_RSP, /* Complex_Desc_req */
- MT_ZDO_USER_DESC_RSP, /* User_Desc_req */
- 0, /* Discovery_Cache_req */
- 0, /* End_Device_annce */
- MT_ZDO_USER_DESC_CONF, /* User_Desc_set */
- MT_ZDO_SERVER_DISC_RSP, /* Server_Discovery_req */
- 0
- },
- {
- MT_ZDO_END_DEVICE_BIND_RSP, /* End_Device_Bind_req */
- MT_ZDO_BIND_RSP, /* Bind_req */
- MT_ZDO_UNBIND_RSP, /* Unbind_req */
- 0,
- 0,
- 0,
- MT_ZDO_STATUS_ERROR_RSP /* default error status msg */
- },
- {
- MT_ZDO_MGMT_NWK_DISC_RSP, /* Mgmt_NWK_Disc_req */
- MT_ZDO_MGMT_LQI_RSP, /* Mgmt_Lqi_req */
- MT_ZDO_MGMT_RTG_RSP, /* Mgmt_Rtg_req */
- MT_ZDO_MGMT_BIND_RSP, /* Mgmt_Bind_req */
- MT_ZDO_MGMT_LEAVE_RSP, /* Mgmt_Leave_req */
- MT_ZDO_MGMT_DIRECT_JOIN_RSP, /* Mgmt_Direct_Join_req */
- MT_ZDO_MGMT_PERMIT_JOIN_RSP /* Mgmt_Permit_Join_req */
- }
- };
- #endif /* MT_ZDO_CB_FUNC */
- #if defined (MT_ZDO_FUNC)
- /***************************************************************************************************
- * @fn MT_ZdoCommandProcessing
- *
- * @brief
- *
- * Process all the ZDO commands that are issued by test tool
- *
- * @param pBuf - pointer to the msg buffer
- *
- * | LEN | CMD0 | CMD1 | DATA |
- * | 1 | 1 | 1 | 0-255 |
- *
- * @return status
- ***************************************************************************************************/
- uint8 MT_ZdoCommandProcessing(uint8* pBuf)
- {
- uint8 status = MT_RPC_SUCCESS;
- switch (pBuf[MT_RPC_POS_CMD1])
- {
- #if defined ( ZDO_NWKADDR_REQUEST )
- case MT_ZDO_NWK_ADDR_REQ:
- MT_ZdoNWKAddressRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_IEEEADDR_REQUEST )
- case MT_ZDO_IEEE_ADDR_REQ:
- MT_ZdoIEEEAddrRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_NODEDESC_REQUEST )
- case MT_ZDO_NODE_DESC_REQ:
- MT_ZdoNodeDescRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_POWERDESC_REQUEST )
- case MT_ZDO_POWER_DESC_REQ:
- MT_ZdoPowerDescRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_SIMPLEDESC_REQUEST )
- case MT_ZDO_SIMPLE_DESC_REQ:
- MT_ZdoSimpleDescRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_ACTIVEEP_REQUEST )
- case MT_ZDO_ACTIVE_EP_REQ:
- MT_ZdoActiveEpRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MATCH_REQUEST )
- case MT_ZDO_MATCH_DESC_REQ:
- MT_ZdoMatchDescRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_COMPLEXDESC_REQUEST )
- case MT_ZDO_COMPLEX_DESC_REQ:
- MT_ZdoComplexDescRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_USERDESC_REQUEST )
- case MT_ZDO_USER_DESC_REQ:
- MT_ZdoUserDescRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_ENDDEVICE_ANNCE )
- case MT_ZDO_END_DEV_ANNCE:
- MT_ZdoEndDevAnnce(pBuf);
- break;
- #endif
- #if defined ( ZDO_USERDESCSET_REQUEST )
- case MT_ZDO_USER_DESC_SET:
- MT_ZdoUserDescSet(pBuf);
- break;
- #endif
- #if defined ( ZDO_SERVERDISC_REQUEST )
- case MT_ZDO_SERVICE_DISC_REQ:
- MT_ZdoServiceDiscRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_ENDDEVICEBIND_REQUEST )
- case MT_ZDO_END_DEV_BIND_REQ:
- MT_ZdoEndDevBindRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_BIND_UNBIND_REQUEST )
- case MT_ZDO_BIND_REQ:
- MT_ZdoBindRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_BIND_UNBIND_REQUEST )
- case MT_ZDO_UNBIND_REQ:
- MT_ZdoUnbindRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_NETWORKSTART_REQUEST )
- case MT_ZDO_STARTUP_FROM_APP:
- MT_ZdoStartupFromApp(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_NWKDISC_REQUEST )
- case MT_ZDO_MGMT_NWKDISC_REQ:
- MT_ZdoMgmtNwkDiscRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_LQI_REQUEST )
- case MT_ZDO_MGMT_LQI_REQ:
- MT_ZdoMgmtLqiRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_RTG_REQUEST )
- case MT_ZDO_MGMT_RTG_REQ:
- MT_ZdoMgmtRtgRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_BIND_REQUEST )
- case MT_ZDO_MGMT_BIND_REQ:
- MT_ZdoMgmtBindRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_LEAVE_REQUEST )
- case MT_ZDO_MGMT_LEAVE_REQ:
- MT_ZdoMgmtLeaveRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_JOINDIRECT_REQUEST )
- case MT_ZDO_MGMT_DIRECT_JOIN_REQ:
- MT_ZdoMgmtDirectJoinRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_PERMIT_JOIN_REQUEST )
- case MT_ZDO_MGMT_PERMIT_JOIN_REQ:
- MT_ZdoMgmtPermitJoinRequest(pBuf);
- break;
- #endif
- #if defined ( ZDO_MGMT_NWKUPDATE_REQUEST )
- case MT_ZDO_MGMT_NWK_UPDATE_REQ:
- MT_ZdoMgmtNwkUpdateRequest(pBuf);
- break;
- #endif
- default:
- status = MT_RPC_ERR_COMMAND_ID;
- break;
- }
- return status;
- }
- /***************************************************************************************************
- * @fn MT_ZdoNwkAddrReq
- *
- * @brief Handle a nwk address request.
- *
- * @param pData - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoNWKAddressRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- uint8 reqType;
- uint8 startIndex;
- uint8 *pExtAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* parse parameters */
- pExtAddr = pBuf;
- pBuf += Z_EXTADDR_LEN;
- /* Request type */
- reqType = *pBuf++;
- /* Start index */
- startIndex = *pBuf;
- retValue = (uint8)ZDP_NwkAddrReq(pExtAddr, reqType, startIndex, 0);
- /* Build and send back the response */
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoIEEEAddrRequest
- *
- * @brief Handle a IEEE address request.
- *
- * @param pData - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoIEEEAddrRequest (uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- uint16 shortAddr;
- uint8 reqType;
- uint8 startIndex;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- shortAddr = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
- /* request type */
- reqType = *pBuf++;
- /* start index */
- startIndex = *pBuf;
- retValue = (uint8)ZDP_IEEEAddrReq(shortAddr, reqType, startIndex, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoNodeDescRequest
- *
- * @brief Handle a Node Descriptor request.
- *
- * @param pData - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoNodeDescRequest (uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint16 shortAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Destination address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- retValue = (uint8)ZDP_NodeDescReq( &destAddr, shortAddr, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoPowerDescRequest
- *
- * @brief Handle a Power Descriptor request.
- *
- * @param pData - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoPowerDescRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint16 shortAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- retValue = (uint8)ZDP_PowerDescReq( &destAddr, shortAddr, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoSimpleDescRequest
- *
- * @brief Handle a Simple Descriptor request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoSimpleDescRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- uint8 epInt;
- zAddrType_t destAddr;
- uint16 shortAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* endpoint/interface */
- epInt = *pBuf++;
- retValue = (uint8)ZDP_SimpleDescReq( &destAddr, shortAddr, epInt, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoSimpleDescRequest
- *
- * @brief Handle a Active EP request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoActiveEpRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint16 shortAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- retValue = (uint8)ZDP_ActiveEPReq( &destAddr, shortAddr, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMatchDescRequest
- *
- * @brief Handle a Match Descriptor request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMatchDescRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue = 0;
- uint8 i, numInClusters, numOutClusters;
- uint16 profileId;
- zAddrType_t destAddr;
- uint16 shortAddr;
- uint16 inClusters[MTZDO_MAX_MATCH_CLUSTERS], outClusters[MTZDO_MAX_MATCH_CLUSTERS];
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Profile ID */
- profileId = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* NumInClusters */
- numInClusters = *pBuf++;
- if ( numInClusters <= MTZDO_MAX_MATCH_CLUSTERS )
- {
- /* IN clusters */
- for ( i = 0; i < numInClusters; i++ )
- {
- inClusters[i] = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- }
- }
- else
- {
- retValue = ZDP_INVALID_REQTYPE;
- }
- /* NumOutClusters */
- numOutClusters = *pBuf++;
- if ( numOutClusters <= MTZDO_MAX_MATCH_CLUSTERS )
- {
- /* OUT Clusters */
- for ( i = 0; i < numOutClusters; i++ )
- {
- outClusters[i] = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- }
- }
- else
- {
- retValue = ZDP_INVALID_REQTYPE;
- }
- if ( retValue == 0 )
- {
- retValue = (uint8)ZDP_MatchDescReq( &destAddr, shortAddr, profileId, numInClusters,
- inClusters, numOutClusters, outClusters, 0);
- }
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoComplexDescRequest
- *
- * @brief Handle a Complex Descriptor request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoComplexDescRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint16 shortAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- retValue = (uint8)ZDP_ComplexDescReq( &destAddr, shortAddr, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoUserDescRequest
- *
- * @brief Handle a User Descriptor request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoUserDescRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint16 shortAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- retValue = (uint8)ZDP_UserDescReq( &destAddr, shortAddr, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoEndDevAnnce
- *
- * @brief Handle a End Device Announce Descriptor request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoEndDevAnnce(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- uint16 shortAddr;
- uint8 *pIEEEAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* network address */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* extended address */
- pIEEEAddr = pBuf;
- pBuf += Z_EXTADDR_LEN;
- retValue = (uint8)ZDP_DeviceAnnce( shortAddr, pIEEEAddr, *pBuf, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoUserDescSet
- *
- * @brief Handle a User Descriptor Set.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoUserDescSet(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint16 shortAddr;
- UserDescriptorFormat_t userDesc;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Network address of interest */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* User descriptor */
- userDesc.len = *pBuf++;
- osal_memcpy( userDesc.desc, pBuf, userDesc.len );
- pBuf += 16;
- retValue = (uint8)ZDP_UserDescSet( &destAddr, shortAddr, &userDesc, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoServiceDiscRequest
- *
- * @brief Handle a Server Discovery request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoServiceDiscRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- uint16 serviceMask;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Service Mask */
- serviceMask = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- retValue = (uint8)ZDP_ServerDiscReq( serviceMask, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoEndDevBindRequest
- *
- * @brief Handle a End Device Bind request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoEndDevBindRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue = 0;
- uint8 i, epInt, numInClusters, numOutClusters;
- zAddrType_t destAddr;
- uint16 shortAddr;
- uint16 profileID, inClusters[MTZDO_MAX_ED_BIND_CLUSTERS], outClusters[MTZDO_MAX_ED_BIND_CLUSTERS];
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Local coordinator of the binding */
- shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
-
- /* For now, skip past the extended address */
- pBuf += Z_EXTADDR_LEN;
- /* Endpoint */
- epInt = *pBuf++;
- /* Profile ID */
- profileID = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* NumInClusters */
- numInClusters = *pBuf++;
- if ( numInClusters <= MTZDO_MAX_ED_BIND_CLUSTERS )
- {
- for ( i = 0; i < numInClusters; i++ )
- {
- inClusters[i] = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
- }
- }
- else
- retValue = ZDP_INVALID_REQTYPE;
- /* NumOutClusters */
- numOutClusters = *pBuf++;
- if ( numOutClusters <= MTZDO_MAX_ED_BIND_CLUSTERS )
- {
- for ( i = 0; i < numOutClusters; i++ )
- {
- outClusters[i] = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
- }
- }
- else
- retValue = ZDP_INVALID_REQTYPE;
-
- if ( retValue == 0 )
- {
- retValue = (uint8)ZDP_EndDeviceBindReq( &destAddr, shortAddr, epInt, profileID,
- numInClusters, inClusters, numOutClusters, outClusters, 0);
- }
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoBindRequest
- *
- * @brief Handle a Bind request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoBindRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr, devAddr;
- uint8 *pSrcAddr, *ptr;
- uint8 srcEPInt, dstEPInt;
- uint16 clusterID;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* SrcAddress */
- pSrcAddr = pBuf;
- pBuf += Z_EXTADDR_LEN;
- /* SrcEPInt */
- srcEPInt = *pBuf++;
- /* ClusterID */
- clusterID = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- /* Destination Address mode */
- devAddr.addrMode = *pBuf++;
- /* Destination Address */
- if ( devAddr.addrMode == Addr64Bit )
- {
- ptr = pBuf;
- osal_cpyExtAddr( devAddr.addr.extAddr, ptr );
- }
- else
- {
- devAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- }
- /* The short address occupies LSB two bytes */
- pBuf += Z_EXTADDR_LEN;
- /* DstEPInt */
- dstEPInt = *pBuf;
- retValue = (uint8)ZDP_BindReq( &destAddr, pSrcAddr, srcEPInt, clusterID, &devAddr, dstEPInt, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoUnbindRequest
- *
- * @brief Handle a Unbind request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoUnbindRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr, devAddr;
- uint8 *pSrcAddr, *ptr;
- uint8 srcEPInt, dstEPInt;
- uint16 clusterID;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* SrcAddress */
- pSrcAddr = pBuf;
- pBuf += Z_EXTADDR_LEN;
- /* SrcEPInt */
- srcEPInt = *pBuf++;
- /* ClusterID */
- clusterID = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- /* Destination Address mode */
- devAddr.addrMode = *pBuf++;
- /* Destination Address */
- if ( devAddr.addrMode == Addr64Bit )
- {
- ptr = pBuf;
- osal_cpyExtAddr( devAddr.addr.extAddr, ptr );
- }
- else
- {
- devAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- }
- /* The short address occupies LSB two bytes */
- pBuf += Z_EXTADDR_LEN;
- /* dstEPInt */
- dstEPInt = *pBuf;
- retValue = (uint8)ZDP_UnbindReq( &destAddr, pSrcAddr, srcEPInt, clusterID, &devAddr, dstEPInt, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoStartupFromApp
- *
- * @brief Handle a Startup from App request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoStartupFromApp(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- retValue = ZDOInitDevice(100);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- #if defined (MT_ZDO_MGMT)
- /***************************************************************************************************
- * @fn MT_ZdoMgmtNwkDiscRequest
- *
- * @brief Handle a Mgmt Nwk Discovery request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtNwkDiscRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint32 scanChannels;
- uint8 scanDuration, startIndex;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Scan Channels */
- scanChannels = BUILD_UINT32( pBuf[0], pBuf[1], pBuf[2], pBuf[3] );
- pBuf += 4;
- /* Scan Duration */
- scanDuration = *pBuf++;
- /* Start Index */
- startIndex = *pBuf;
- retValue = (uint8)ZDP_MgmtNwkDiscReq( &destAddr, scanChannels, scanDuration, startIndex, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtLqiRequest
- *
- * @brief Handle a Mgmt Lqi request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtLqiRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint8 startIndex;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Start Index */
- startIndex = *pBuf;
- retValue = (uint8)ZDP_MgmtLqiReq( &destAddr, startIndex, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtRtgRequest
- *
- * @brief Handle a Mgmt Rtg request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtRtgRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint8 startIndex;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev Address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
- pBuf += 2;
- /* Start Index */
- startIndex = *pBuf;
- retValue = (byte)ZDP_MgmtRtgReq( &destAddr, startIndex, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtBindRequest
- *
- * @brief Handle a Mgmt Bind request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtBindRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint8 startIndex;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Dev Address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Start Index */
- startIndex = *pBuf;
- retValue = (uint8)ZDP_MgmtBindReq( &destAddr, startIndex, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtLeaveRequest
- *
- * @brief Handle a Mgmt Leave request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtLeaveRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint8 *pIEEEAddr;
- uint8 removeChildren, rejoin;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Destination Address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* IEEE address */
- pIEEEAddr = pBuf;
- pBuf += Z_EXTADDR_LEN;
- /* Remove Children */
- removeChildren = *pBuf++;
- /* Rejoin */
- rejoin = *pBuf;
- retValue = (byte)ZDP_MgmtLeaveReq( &destAddr, pIEEEAddr, removeChildren, rejoin, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtDirectJoinRequest
- *
- * @brief Handle a Mgmt Direct Join request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtDirectJoinRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint8 *deviceAddr;
- uint8 capInfo;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Destination Address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Device Address */
- deviceAddr = pBuf;
- pBuf += Z_EXTADDR_LEN;
- /* Capability information */
- capInfo = *pBuf;
- retValue = (uint8)ZDP_MgmtDirectJoinReq( &destAddr, deviceAddr, capInfo, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtPermitJoinRequest
- *
- * @brief Handle a Mgmt Permit Join request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtPermitJoinRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint8 duration, tcSignificance;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Destination Address */
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Duration */
- duration = *pBuf++;
- /* Trust center significance */
- tcSignificance = *pBuf;
- retValue = (byte)ZDP_MgmtPermitJoinReq( &destAddr, duration, tcSignificance, 0);
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- /***************************************************************************************************
- * @fn MT_ZdoMgmtNwkUpdateRequest
- *
- * @brief Handle a Mgmt Nwk Update request.
- *
- * @param pBuf - MT message data
- *
- * @return void
- ***************************************************************************************************/
- void MT_ZdoMgmtNwkUpdateRequest(uint8 *pBuf)
- {
- uint8 cmdId;
- uint8 retValue;
- zAddrType_t destAddr;
- uint32 channelMask;
- uint8 scanDuration, scanCount;
- uint16 nwkManagerAddr;
- /* parse header */
- cmdId = pBuf[MT_RPC_POS_CMD1];
- pBuf += MT_RPC_FRAME_HDR_SZ;
- /* Destination address */
- destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- pBuf += 2;
- /* Destination address mode */
- destAddr.addrMode = *pBuf++;
- channelMask = BUILD_UINT32( pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
- pBuf += 4;
- /* Scan duration */
- scanDuration = *pBuf++;
- /* Scan count */
- scanCount = *pBuf++;
- /* NWK manager address */
- nwkManagerAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
- /* Send the Management Network Update request */
- retValue = (uint8)ZDP_MgmtNwkUpdateReq( &destAddr, channelMask, scanDuration,
- scanCount, _NIB.nwkUpdateId+1, nwkManagerAddr );
- /*
- Since we don't recevied our own broadcast messages, we should
- send a unicast copy of the message to ourself.
- */
- if ( destAddr.addrMode == AddrBroadcast )
- {
- destAddr.addrMode = Addr16Bit;
- destAddr.addr.shortAddr = _NIB.nwkDevAddress;
- retValue = (uint8) ZDP_MgmtNwkUpdateReq( &destAddr, channelMask, scanDuration,
- scanCount, _NIB.nwkUpdateId+1, nwkManagerAddr );
- }
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
- }
- #endif /* MT_ZDO_MGMT */
- #endif /* MT_ZDO_FUNC */
- /***************************************************************************************************
- * Callback handling function
- ***************************************************************************************************/
- #if defined (MT_ZDO_CB_FUNC)
- /***************************************************************************************************
- * @fn MT_ZdoDirectCB()
- *
- * @brief ZDO direct callback. Build an MT message directly from the
- * over-the-air ZDO message.
- *
- * @param pData - Incoming AF frame.
- *
- * @return none
- ***************************************************************************************************/
- void MT_ZdoDirectCB( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg )
- {
- uint8 dataLen;
- uint8 msgLen;
- uint8 *pBuf;
- uint8 *p;
- uint8 id;
-
- // Is the message an exception or not a response?
- if ( ((pData->clusterId & ZDO_RESPONSE_BIT) == 0)
- || MT_ZdoHandleExceptions( pData, inMsg ) )
- {
- // Handled somewhere else or not needed
- return;
- }
- /* map cluster ID to MT message */
- id = (uint8) pData->clusterId;
- id = mtZdoCluster2Rsp[id >> 4][id & 0x0F];
- /* ZDO data starts after one-byte sequence number */
- dataLen = pData->cmd.DataLength - 1;
- /* msg buffer length includes two bytes for srcAddr */
- msgLen = dataLen + sizeof(uint16);
- /* get buffer */
- if ((p = pBuf = MT_TransportAlloc(((uint8)MT_RPC_CMD_AREQ |(uint8)MT_RPC_SYS_ZDO), msgLen)) != NULL)
- {
- /* build header */
- *p++ = msgLen;
- *p++ = (uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO;
- *p++ = id;
- /* build srcAddr */
- *p++ = LO_UINT16(pData->srcAddr.addr.shortAddr);
- *p++ = HI_UINT16(pData->srcAddr.addr.shortAddr);
- /* copy ZDO data, skipping one-byte sequence number */
- osal_memcpy(p, (pData->cmd.Data + 1), dataLen);
- /* send it */
- MT_TransportSend(pBuf);
- }
- }
- /***************************************************************************************************
- * @fn MT_ZdoHandleExceptions()
- *
- * @brief Handles all messages that are an expection to the generic MT ZDO Response.
- *
- * @param pData - Incoming AF frame.
- *
- * @return TRUE if handled by this function, FALSE if not
- ***************************************************************************************************/
- uint8 MT_ZdoHandleExceptions( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg )
- {
- uint8 ret = TRUE;
- ZDO_NwkIEEEAddrResp_t *nwkRsp = NULL;
- ZDO_DeviceAnnce_t devAnnce;
- uint8 doDefault = FALSE;
-
- switch ( inMsg->clusterID )
- {
- case NWK_addr_rsp:
- case IEEE_addr_rsp:
- nwkRsp = ZDO_ParseAddrRsp( inMsg );
- MT_ZdoAddrRspCB( nwkRsp, inMsg->clusterID );
- if ( nwkRsp )
- osal_mem_free( nwkRsp );
- break;
-
- case Device_annce:
- ZDO_ParseDeviceAnnce( inMsg, &devAnnce );
- MT_ZdoEndDevAnnceCB( &devAnnce, inMsg->srcAddr.addr.shortAddr );
- break;
-
- case Simple_Desc_rsp:
- if ( pData->cmd.DataLength > 5 )
- ret = FALSE;
- else
- doDefault = TRUE;
- break;
-
- default:
- ret = FALSE;
- break;
- }
-
- if ( doDefault )
- {
- ret = FALSE;
- pData->clusterId = 0x26;
- pData->cmd.DataLength = 2;
- }
-
- return ( ret );
- }
- /***************************************************************************************************
- * @fn MT_ZdoAddrRspCB
- *
- * @brief Handle IEEE or nwk address response OSAL message from ZDO.
- *
- * @param pMsg - Message data
- *
- * @return void
- */
- void MT_ZdoAddrRspCB( ZDO_NwkIEEEAddrResp_t *pMsg, uint16 clusterID )
- {
- uint8 listLen;
- uint8 msgLen;
- uint8 *pBuf;
- uint8 *p;
- /* both ZDO_NwkAddrResp_t and ZDO_IEEEAddrResp_t must be the same */
- /* get length, sanity check length */
- listLen = pMsg->numAssocDevs;
-
- /* calculate msg length */
- msgLen = MT_ZDO_ADDR_RSP_LEN + (listLen * sizeof(uint16));
- /* get buffer */
- if ((p = pBuf = MT_TransportAlloc(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO), msgLen)) != NULL)
- {
- /* build header */
- *p++ = msgLen;
- *p++ = (uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO;
- *p++ = (clusterID == IEEE_addr_rsp) ?
- MT_ZDO_IEEE_ADDR_RSP : MT_ZDO_NWK_ADDR_RSP;
- /* build msg parameters */
- *p++ = pMsg->status;
- osal_cpyExtAddr(p, pMsg->extAddr);
- p += Z_EXTADDR_LEN;
- *p++ = LO_UINT16(pMsg->nwkAddr);
- *p++ = HI_UINT16(pMsg->nwkAddr);
- *p++ = pMsg->startIndex;
- *p++ = listLen;
- MT_Word2Buf(p, pMsg->devList, listLen);
- /* send it */
- MT_TransportSend(pBuf);
- }
- }
- /***************************************************************************************************
- * @fn MT_ZdoEndDevAnnceCB
- *
- * @brief Handle end device announce OSAL message from ZDO.
- *
- * @param pMsg - Message data
- *
- * @return void
- */
- void MT_ZdoEndDevAnnceCB( ZDO_DeviceAnnce_t *pMsg, uint16 srcAddr )
- {
- uint8 *pBuf;
- uint8 *p;
- if ((p = pBuf = MT_TransportAlloc(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
- MT_ZDO_END_DEVICE_ANNCE_IND_LEN)) != NULL)
- {
- *p++ = MT_ZDO_END_DEVICE_ANNCE_IND_LEN;
- *p++ = (uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO;
- *p++ = MT_ZDO_END_DEVICE_ANNCE_IND;
- *p++ = LO_UINT16(srcAddr);
- *p++ = HI_UINT16(srcAddr);
- *p++ = LO_UINT16(pMsg->nwkAddr);
- *p++ = HI_UINT16(pMsg->nwkAddr);
- osal_cpyExtAddr(p, pMsg->extAddr);
- p += Z_EXTADDR_LEN;
- *p = pMsg->capabilities;
- MT_TransportSend(pBuf);
- }
- }
- #endif // MT_ZDO_CB_FUNC
- /***************************************************************************************************
- ***************************************************************************************************/
- #endif /*ZDO Command Processing in MT*/
|