MT_ZDO.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546
  1. /**************************************************************************************************
  2. Filename: MT_ZDO.c
  3. Revised: $Date: 2009-01-05 16:58:00 -0800 (Mon, 05 Jan 2009) $
  4. Revision: $Revision: 18682 $
  5. Description: MonitorTest functions for the ZDO layer.
  6. Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.
  7. IMPORTANT: Your use of this Software is limited to those specific rights
  8. granted under the terms of a software license agreement between the user
  9. who downloaded the software, his/her employer (which must be your employer)
  10. and Texas Instruments Incorporated (the "License"). You may not use this
  11. Software unless you agree to abide by the terms of the License. The License
  12. limits your use, and you acknowledge, that the Software may not be modified,
  13. copied or distributed unless embedded on a Texas Instruments microcontroller
  14. or used solely and exclusively in conjunction with a Texas Instruments radio
  15. frequency transceiver, which is integrated into your product. Other than for
  16. the foregoing purpose, you may not use, reproduce, copy, prepare derivative
  17. works of, modify, distribute, perform, display or sell this Software and/or
  18. its documentation for any purpose.
  19. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
  20. PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
  21. INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
  22. NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
  23. TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
  24. NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
  25. LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
  26. INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
  27. OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
  28. OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
  29. (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
  30. Should you have any questions regarding your right to use this Software,
  31. contact Texas Instruments Incorporated at www.TI.com.
  32. **************************************************************************************************/
  33. #ifdef MT_ZDO_FUNC
  34. /**************************************************************************************************
  35. * INCLUDES
  36. **************************************************************************************************/
  37. #include "ZComDef.h"
  38. #include "OSAL.h"
  39. #include "MT.h"
  40. #include "MT_ZDO.h"
  41. #include "APSMEDE.h"
  42. #include "ZDConfig.h"
  43. #include "ZDProfile.h"
  44. #include "ZDObject.h"
  45. #include "ZDApp.h"
  46. #if !defined( WIN32 )
  47. #include "OnBoard.h"
  48. #endif
  49. #include "nwk_util.h"
  50. /**************************************************************************************************
  51. * CONSTANTS
  52. **************************************************************************************************/
  53. #define MT_ZDO_END_DEVICE_ANNCE_IND_LEN 0x0D
  54. #define MT_ZDO_ADDR_RSP_LEN 0x0D
  55. #define MT_ZDO_BIND_UNBIND_RSP_LEN 0x03
  56. #define MTZDO_RESPONSE_BUFFER_LEN 100
  57. #define MTZDO_MAX_MATCH_CLUSTERS 16
  58. #define MTZDO_MAX_ED_BIND_CLUSTERS 15
  59. /**************************************************************************************************
  60. * GLOBAL VARIABLES
  61. **************************************************************************************************/
  62. uint32 _zdoCallbackSub;
  63. /**************************************************************************************************
  64. * LOCAL VARIABLES
  65. **************************************************************************************************/
  66. uint8 mtzdoResponseBuffer[MTZDO_RESPONSE_BUFFER_LEN];
  67. /**************************************************************************************************
  68. * LOCAL FUNCTIONS
  69. **************************************************************************************************/
  70. #if defined (MT_ZDO_FUNC)
  71. void MT_ZdoNWKAddressRequest(uint8 *pBuf);
  72. void MT_ZdoIEEEAddrRequest(uint8 *pBuf);
  73. void MT_ZdoNodeDescRequest(uint8 *pBuf);
  74. void MT_ZdoPowerDescRequest(uint8 *pBuf);
  75. void MT_ZdoSimpleDescRequest(uint8 *pBuf);
  76. void MT_ZdoActiveEpRequest(uint8 *pBuf);
  77. void MT_ZdoMatchDescRequest(uint8 *pBuf);
  78. void MT_ZdoComplexDescRequest(uint8 *pBuf);
  79. void MT_ZdoUserDescRequest(uint8 *pBuf);
  80. void MT_ZdoEndDevAnnce(uint8 *pBuf);
  81. void MT_ZdoUserDescSet(uint8 *pBuf);
  82. void MT_ZdoServiceDiscRequest(uint8 *pBuf);
  83. void MT_ZdoEndDevBindRequest(uint8 *pBuf);
  84. void MT_ZdoBindRequest(uint8 *pBuf);
  85. void MT_ZdoUnbindRequest(uint8 *pBuf);
  86. void MT_ZdoMgmtNwkDiscRequest(uint8 *pBuf);
  87. void MT_ZdoStartupFromApp(uint8 *pBuf);
  88. #if defined (MT_ZDO_MGMT)
  89. void MT_ZdoMgmtLqiRequest(uint8 *pBuf);
  90. void MT_ZdoMgmtRtgRequest(uint8 *pBuf);
  91. void MT_ZdoMgmtBindRequest(uint8 *pBuf);
  92. void MT_ZdoMgmtLeaveRequest(uint8 *pBuf);
  93. void MT_ZdoMgmtDirectJoinRequest(uint8 *pBuf);
  94. void MT_ZdoMgmtPermitJoinRequest(uint8 *pBuf);
  95. void MT_ZdoMgmtNwkUpdateRequest(uint8 *pBuf);
  96. #endif /* MT_ZDO_MGMT */
  97. #endif /* MT_ZDO_FUNC */
  98. #if defined (MT_ZDO_CB_FUNC)
  99. uint8 MT_ZdoHandleExceptions( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg );
  100. void MT_ZdoAddrRspCB( ZDO_NwkIEEEAddrResp_t *pMsg, uint16 clusterID );
  101. void MT_ZdoEndDevAnnceCB( ZDO_DeviceAnnce_t *pMsg, uint16 srcAddr );
  102. void MT_ZdoBindUnbindRspCB( uint16 clusterID, uint16 srcAddr, uint8 status );
  103. /* ZDO cluster ID to MT response command ID lookup */
  104. static const uint8 CODE mtZdoCluster2Rsp[4][7] =
  105. {
  106. {
  107. MT_ZDO_NWK_ADDR_RSP, /* NWK_addr_req */
  108. MT_ZDO_IEEE_ADDR_RSP, /* IEEE_addr_req */
  109. MT_ZDO_NODE_DESC_RSP, /* Node_Desc_req */
  110. MT_ZDO_POWER_DESC_RSP, /* Power_Desc_req */
  111. MT_ZDO_SIMPLE_DESC_RSP, /* Simple_Desc_req */
  112. MT_ZDO_ACTIVE_EP_RSP, /* Active_EP_req */
  113. MT_ZDO_MATCH_DESC_RSP /* Match_Desc_req */
  114. },
  115. {
  116. MT_ZDO_COMPLEX_DESC_RSP, /* Complex_Desc_req */
  117. MT_ZDO_USER_DESC_RSP, /* User_Desc_req */
  118. 0, /* Discovery_Cache_req */
  119. 0, /* End_Device_annce */
  120. MT_ZDO_USER_DESC_CONF, /* User_Desc_set */
  121. MT_ZDO_SERVER_DISC_RSP, /* Server_Discovery_req */
  122. 0
  123. },
  124. {
  125. MT_ZDO_END_DEVICE_BIND_RSP, /* End_Device_Bind_req */
  126. MT_ZDO_BIND_RSP, /* Bind_req */
  127. MT_ZDO_UNBIND_RSP, /* Unbind_req */
  128. 0,
  129. 0,
  130. 0,
  131. MT_ZDO_STATUS_ERROR_RSP /* default error status msg */
  132. },
  133. {
  134. MT_ZDO_MGMT_NWK_DISC_RSP, /* Mgmt_NWK_Disc_req */
  135. MT_ZDO_MGMT_LQI_RSP, /* Mgmt_Lqi_req */
  136. MT_ZDO_MGMT_RTG_RSP, /* Mgmt_Rtg_req */
  137. MT_ZDO_MGMT_BIND_RSP, /* Mgmt_Bind_req */
  138. MT_ZDO_MGMT_LEAVE_RSP, /* Mgmt_Leave_req */
  139. MT_ZDO_MGMT_DIRECT_JOIN_RSP, /* Mgmt_Direct_Join_req */
  140. MT_ZDO_MGMT_PERMIT_JOIN_RSP /* Mgmt_Permit_Join_req */
  141. }
  142. };
  143. #endif /* MT_ZDO_CB_FUNC */
  144. #if defined (MT_ZDO_FUNC)
  145. /***************************************************************************************************
  146. * @fn MT_ZdoCommandProcessing
  147. *
  148. * @brief
  149. *
  150. * Process all the ZDO commands that are issued by test tool
  151. *
  152. * @param pBuf - pointer to the msg buffer
  153. *
  154. * | LEN | CMD0 | CMD1 | DATA |
  155. * | 1 | 1 | 1 | 0-255 |
  156. *
  157. * @return status
  158. ***************************************************************************************************/
  159. uint8 MT_ZdoCommandProcessing(uint8* pBuf)
  160. {
  161. uint8 status = MT_RPC_SUCCESS;
  162. switch (pBuf[MT_RPC_POS_CMD1])
  163. {
  164. #if defined ( ZDO_NWKADDR_REQUEST )
  165. case MT_ZDO_NWK_ADDR_REQ:
  166. MT_ZdoNWKAddressRequest(pBuf);
  167. break;
  168. #endif
  169. #if defined ( ZDO_IEEEADDR_REQUEST )
  170. case MT_ZDO_IEEE_ADDR_REQ:
  171. MT_ZdoIEEEAddrRequest(pBuf);
  172. break;
  173. #endif
  174. #if defined ( ZDO_NODEDESC_REQUEST )
  175. case MT_ZDO_NODE_DESC_REQ:
  176. MT_ZdoNodeDescRequest(pBuf);
  177. break;
  178. #endif
  179. #if defined ( ZDO_POWERDESC_REQUEST )
  180. case MT_ZDO_POWER_DESC_REQ:
  181. MT_ZdoPowerDescRequest(pBuf);
  182. break;
  183. #endif
  184. #if defined ( ZDO_SIMPLEDESC_REQUEST )
  185. case MT_ZDO_SIMPLE_DESC_REQ:
  186. MT_ZdoSimpleDescRequest(pBuf);
  187. break;
  188. #endif
  189. #if defined ( ZDO_ACTIVEEP_REQUEST )
  190. case MT_ZDO_ACTIVE_EP_REQ:
  191. MT_ZdoActiveEpRequest(pBuf);
  192. break;
  193. #endif
  194. #if defined ( ZDO_MATCH_REQUEST )
  195. case MT_ZDO_MATCH_DESC_REQ:
  196. MT_ZdoMatchDescRequest(pBuf);
  197. break;
  198. #endif
  199. #if defined ( ZDO_COMPLEXDESC_REQUEST )
  200. case MT_ZDO_COMPLEX_DESC_REQ:
  201. MT_ZdoComplexDescRequest(pBuf);
  202. break;
  203. #endif
  204. #if defined ( ZDO_USERDESC_REQUEST )
  205. case MT_ZDO_USER_DESC_REQ:
  206. MT_ZdoUserDescRequest(pBuf);
  207. break;
  208. #endif
  209. #if defined ( ZDO_ENDDEVICE_ANNCE )
  210. case MT_ZDO_END_DEV_ANNCE:
  211. MT_ZdoEndDevAnnce(pBuf);
  212. break;
  213. #endif
  214. #if defined ( ZDO_USERDESCSET_REQUEST )
  215. case MT_ZDO_USER_DESC_SET:
  216. MT_ZdoUserDescSet(pBuf);
  217. break;
  218. #endif
  219. #if defined ( ZDO_SERVERDISC_REQUEST )
  220. case MT_ZDO_SERVICE_DISC_REQ:
  221. MT_ZdoServiceDiscRequest(pBuf);
  222. break;
  223. #endif
  224. #if defined ( ZDO_ENDDEVICEBIND_REQUEST )
  225. case MT_ZDO_END_DEV_BIND_REQ:
  226. MT_ZdoEndDevBindRequest(pBuf);
  227. break;
  228. #endif
  229. #if defined ( ZDO_BIND_UNBIND_REQUEST )
  230. case MT_ZDO_BIND_REQ:
  231. MT_ZdoBindRequest(pBuf);
  232. break;
  233. #endif
  234. #if defined ( ZDO_BIND_UNBIND_REQUEST )
  235. case MT_ZDO_UNBIND_REQ:
  236. MT_ZdoUnbindRequest(pBuf);
  237. break;
  238. #endif
  239. #if defined ( ZDO_NETWORKSTART_REQUEST )
  240. case MT_ZDO_STARTUP_FROM_APP:
  241. MT_ZdoStartupFromApp(pBuf);
  242. break;
  243. #endif
  244. #if defined ( ZDO_MGMT_NWKDISC_REQUEST )
  245. case MT_ZDO_MGMT_NWKDISC_REQ:
  246. MT_ZdoMgmtNwkDiscRequest(pBuf);
  247. break;
  248. #endif
  249. #if defined ( ZDO_MGMT_LQI_REQUEST )
  250. case MT_ZDO_MGMT_LQI_REQ:
  251. MT_ZdoMgmtLqiRequest(pBuf);
  252. break;
  253. #endif
  254. #if defined ( ZDO_MGMT_RTG_REQUEST )
  255. case MT_ZDO_MGMT_RTG_REQ:
  256. MT_ZdoMgmtRtgRequest(pBuf);
  257. break;
  258. #endif
  259. #if defined ( ZDO_MGMT_BIND_REQUEST )
  260. case MT_ZDO_MGMT_BIND_REQ:
  261. MT_ZdoMgmtBindRequest(pBuf);
  262. break;
  263. #endif
  264. #if defined ( ZDO_MGMT_LEAVE_REQUEST )
  265. case MT_ZDO_MGMT_LEAVE_REQ:
  266. MT_ZdoMgmtLeaveRequest(pBuf);
  267. break;
  268. #endif
  269. #if defined ( ZDO_MGMT_JOINDIRECT_REQUEST )
  270. case MT_ZDO_MGMT_DIRECT_JOIN_REQ:
  271. MT_ZdoMgmtDirectJoinRequest(pBuf);
  272. break;
  273. #endif
  274. #if defined ( ZDO_MGMT_PERMIT_JOIN_REQUEST )
  275. case MT_ZDO_MGMT_PERMIT_JOIN_REQ:
  276. MT_ZdoMgmtPermitJoinRequest(pBuf);
  277. break;
  278. #endif
  279. #if defined ( ZDO_MGMT_NWKUPDATE_REQUEST )
  280. case MT_ZDO_MGMT_NWK_UPDATE_REQ:
  281. MT_ZdoMgmtNwkUpdateRequest(pBuf);
  282. break;
  283. #endif
  284. default:
  285. status = MT_RPC_ERR_COMMAND_ID;
  286. break;
  287. }
  288. return status;
  289. }
  290. /***************************************************************************************************
  291. * @fn MT_ZdoNwkAddrReq
  292. *
  293. * @brief Handle a nwk address request.
  294. *
  295. * @param pData - MT message data
  296. *
  297. * @return void
  298. ***************************************************************************************************/
  299. void MT_ZdoNWKAddressRequest(uint8 *pBuf)
  300. {
  301. uint8 cmdId;
  302. uint8 retValue;
  303. uint8 reqType;
  304. uint8 startIndex;
  305. uint8 *pExtAddr;
  306. /* parse header */
  307. cmdId = pBuf[MT_RPC_POS_CMD1];
  308. pBuf += MT_RPC_FRAME_HDR_SZ;
  309. /* parse parameters */
  310. pExtAddr = pBuf;
  311. pBuf += Z_EXTADDR_LEN;
  312. /* Request type */
  313. reqType = *pBuf++;
  314. /* Start index */
  315. startIndex = *pBuf;
  316. retValue = (uint8)ZDP_NwkAddrReq(pExtAddr, reqType, startIndex, 0);
  317. /* Build and send back the response */
  318. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  319. }
  320. /***************************************************************************************************
  321. * @fn MT_ZdoIEEEAddrRequest
  322. *
  323. * @brief Handle a IEEE address request.
  324. *
  325. * @param pData - MT message data
  326. *
  327. * @return void
  328. ***************************************************************************************************/
  329. void MT_ZdoIEEEAddrRequest (uint8 *pBuf)
  330. {
  331. uint8 cmdId;
  332. uint8 retValue;
  333. uint16 shortAddr;
  334. uint8 reqType;
  335. uint8 startIndex;
  336. /* parse header */
  337. cmdId = pBuf[MT_RPC_POS_CMD1];
  338. pBuf += MT_RPC_FRAME_HDR_SZ;
  339. /* Dev address */
  340. shortAddr = BUILD_UINT16(pBuf[0], pBuf[1]);
  341. pBuf += 2;
  342. /* request type */
  343. reqType = *pBuf++;
  344. /* start index */
  345. startIndex = *pBuf;
  346. retValue = (uint8)ZDP_IEEEAddrReq(shortAddr, reqType, startIndex, 0);
  347. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  348. }
  349. /***************************************************************************************************
  350. * @fn MT_ZdoNodeDescRequest
  351. *
  352. * @brief Handle a Node Descriptor request.
  353. *
  354. * @param pData - MT message data
  355. *
  356. * @return void
  357. ***************************************************************************************************/
  358. void MT_ZdoNodeDescRequest (uint8 *pBuf)
  359. {
  360. uint8 cmdId;
  361. uint8 retValue;
  362. zAddrType_t destAddr;
  363. uint16 shortAddr;
  364. /* parse header */
  365. cmdId = pBuf[MT_RPC_POS_CMD1];
  366. pBuf += MT_RPC_FRAME_HDR_SZ;
  367. /* Destination address */
  368. destAddr.addrMode = Addr16Bit;
  369. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  370. pBuf += 2;
  371. /* Network address of interest */
  372. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  373. pBuf += 2;
  374. retValue = (uint8)ZDP_NodeDescReq( &destAddr, shortAddr, 0);
  375. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  376. }
  377. /***************************************************************************************************
  378. * @fn MT_ZdoPowerDescRequest
  379. *
  380. * @brief Handle a Power Descriptor request.
  381. *
  382. * @param pData - MT message data
  383. *
  384. * @return void
  385. ***************************************************************************************************/
  386. void MT_ZdoPowerDescRequest(uint8 *pBuf)
  387. {
  388. uint8 cmdId;
  389. uint8 retValue;
  390. zAddrType_t destAddr;
  391. uint16 shortAddr;
  392. /* parse header */
  393. cmdId = pBuf[MT_RPC_POS_CMD1];
  394. pBuf += MT_RPC_FRAME_HDR_SZ;
  395. /* Dev address */
  396. destAddr.addrMode = Addr16Bit;
  397. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  398. pBuf += 2;
  399. /* Network address of interest */
  400. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  401. pBuf += 2;
  402. retValue = (uint8)ZDP_PowerDescReq( &destAddr, shortAddr, 0);
  403. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  404. }
  405. /***************************************************************************************************
  406. * @fn MT_ZdoSimpleDescRequest
  407. *
  408. * @brief Handle a Simple Descriptor request.
  409. *
  410. * @param pBuf - MT message data
  411. *
  412. * @return void
  413. ***************************************************************************************************/
  414. void MT_ZdoSimpleDescRequest(uint8 *pBuf)
  415. {
  416. uint8 cmdId;
  417. uint8 retValue;
  418. uint8 epInt;
  419. zAddrType_t destAddr;
  420. uint16 shortAddr;
  421. /* parse header */
  422. cmdId = pBuf[MT_RPC_POS_CMD1];
  423. pBuf += MT_RPC_FRAME_HDR_SZ;
  424. /* Dev address */
  425. destAddr.addrMode = Addr16Bit;
  426. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  427. pBuf += 2;
  428. /* Network address of interest */
  429. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  430. pBuf += 2;
  431. /* endpoint/interface */
  432. epInt = *pBuf++;
  433. retValue = (uint8)ZDP_SimpleDescReq( &destAddr, shortAddr, epInt, 0);
  434. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  435. }
  436. /***************************************************************************************************
  437. * @fn MT_ZdoSimpleDescRequest
  438. *
  439. * @brief Handle a Active EP request.
  440. *
  441. * @param pBuf - MT message data
  442. *
  443. * @return void
  444. ***************************************************************************************************/
  445. void MT_ZdoActiveEpRequest(uint8 *pBuf)
  446. {
  447. uint8 cmdId;
  448. uint8 retValue;
  449. zAddrType_t destAddr;
  450. uint16 shortAddr;
  451. /* parse header */
  452. cmdId = pBuf[MT_RPC_POS_CMD1];
  453. pBuf += MT_RPC_FRAME_HDR_SZ;
  454. /* Dev address */
  455. destAddr.addrMode = Addr16Bit;
  456. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  457. pBuf += 2;
  458. /* Network address of interest */
  459. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  460. pBuf += 2;
  461. retValue = (uint8)ZDP_ActiveEPReq( &destAddr, shortAddr, 0);
  462. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  463. }
  464. /***************************************************************************************************
  465. * @fn MT_ZdoMatchDescRequest
  466. *
  467. * @brief Handle a Match Descriptor request.
  468. *
  469. * @param pBuf - MT message data
  470. *
  471. * @return void
  472. ***************************************************************************************************/
  473. void MT_ZdoMatchDescRequest(uint8 *pBuf)
  474. {
  475. uint8 cmdId;
  476. uint8 retValue = 0;
  477. uint8 i, numInClusters, numOutClusters;
  478. uint16 profileId;
  479. zAddrType_t destAddr;
  480. uint16 shortAddr;
  481. uint16 inClusters[MTZDO_MAX_MATCH_CLUSTERS], outClusters[MTZDO_MAX_MATCH_CLUSTERS];
  482. /* parse header */
  483. cmdId = pBuf[MT_RPC_POS_CMD1];
  484. pBuf += MT_RPC_FRAME_HDR_SZ;
  485. /* Dev address */
  486. destAddr.addrMode = Addr16Bit;
  487. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  488. pBuf += 2;
  489. /* Network address of interest */
  490. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  491. pBuf += 2;
  492. /* Profile ID */
  493. profileId = BUILD_UINT16( pBuf[0], pBuf[1] );
  494. pBuf += 2;
  495. /* NumInClusters */
  496. numInClusters = *pBuf++;
  497. if ( numInClusters <= MTZDO_MAX_MATCH_CLUSTERS )
  498. {
  499. /* IN clusters */
  500. for ( i = 0; i < numInClusters; i++ )
  501. {
  502. inClusters[i] = BUILD_UINT16( pBuf[0], pBuf[1]);
  503. pBuf += 2;
  504. }
  505. }
  506. else
  507. {
  508. retValue = ZDP_INVALID_REQTYPE;
  509. }
  510. /* NumOutClusters */
  511. numOutClusters = *pBuf++;
  512. if ( numOutClusters <= MTZDO_MAX_MATCH_CLUSTERS )
  513. {
  514. /* OUT Clusters */
  515. for ( i = 0; i < numOutClusters; i++ )
  516. {
  517. outClusters[i] = BUILD_UINT16( pBuf[0], pBuf[1]);
  518. pBuf += 2;
  519. }
  520. }
  521. else
  522. {
  523. retValue = ZDP_INVALID_REQTYPE;
  524. }
  525. if ( retValue == 0 )
  526. {
  527. retValue = (uint8)ZDP_MatchDescReq( &destAddr, shortAddr, profileId, numInClusters,
  528. inClusters, numOutClusters, outClusters, 0);
  529. }
  530. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  531. }
  532. /***************************************************************************************************
  533. * @fn MT_ZdoComplexDescRequest
  534. *
  535. * @brief Handle a Complex Descriptor request.
  536. *
  537. * @param pBuf - MT message data
  538. *
  539. * @return void
  540. ***************************************************************************************************/
  541. void MT_ZdoComplexDescRequest(uint8 *pBuf)
  542. {
  543. uint8 cmdId;
  544. uint8 retValue;
  545. zAddrType_t destAddr;
  546. uint16 shortAddr;
  547. /* parse header */
  548. cmdId = pBuf[MT_RPC_POS_CMD1];
  549. pBuf += MT_RPC_FRAME_HDR_SZ;
  550. /* Dev address */
  551. destAddr.addrMode = Addr16Bit;
  552. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  553. pBuf += 2;
  554. /* Network address of interest */
  555. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  556. pBuf += 2;
  557. retValue = (uint8)ZDP_ComplexDescReq( &destAddr, shortAddr, 0);
  558. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  559. }
  560. /***************************************************************************************************
  561. * @fn MT_ZdoUserDescRequest
  562. *
  563. * @brief Handle a User Descriptor request.
  564. *
  565. * @param pBuf - MT message data
  566. *
  567. * @return void
  568. ***************************************************************************************************/
  569. void MT_ZdoUserDescRequest(uint8 *pBuf)
  570. {
  571. uint8 cmdId;
  572. uint8 retValue;
  573. zAddrType_t destAddr;
  574. uint16 shortAddr;
  575. /* parse header */
  576. cmdId = pBuf[MT_RPC_POS_CMD1];
  577. pBuf += MT_RPC_FRAME_HDR_SZ;
  578. /* Dev address */
  579. destAddr.addrMode = Addr16Bit;
  580. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
  581. pBuf += 2;
  582. /* Network address of interest */
  583. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
  584. pBuf += 2;
  585. retValue = (uint8)ZDP_UserDescReq( &destAddr, shortAddr, 0);
  586. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  587. }
  588. /***************************************************************************************************
  589. * @fn MT_ZdoEndDevAnnce
  590. *
  591. * @brief Handle a End Device Announce Descriptor request.
  592. *
  593. * @param pBuf - MT message data
  594. *
  595. * @return void
  596. ***************************************************************************************************/
  597. void MT_ZdoEndDevAnnce(uint8 *pBuf)
  598. {
  599. uint8 cmdId;
  600. uint8 retValue;
  601. uint16 shortAddr;
  602. uint8 *pIEEEAddr;
  603. /* parse header */
  604. cmdId = pBuf[MT_RPC_POS_CMD1];
  605. pBuf += MT_RPC_FRAME_HDR_SZ;
  606. /* network address */
  607. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  608. pBuf += 2;
  609. /* extended address */
  610. pIEEEAddr = pBuf;
  611. pBuf += Z_EXTADDR_LEN;
  612. retValue = (uint8)ZDP_DeviceAnnce( shortAddr, pIEEEAddr, *pBuf, 0);
  613. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  614. }
  615. /***************************************************************************************************
  616. * @fn MT_ZdoUserDescSet
  617. *
  618. * @brief Handle a User Descriptor Set.
  619. *
  620. * @param pBuf - MT message data
  621. *
  622. * @return void
  623. ***************************************************************************************************/
  624. void MT_ZdoUserDescSet(uint8 *pBuf)
  625. {
  626. uint8 cmdId;
  627. uint8 retValue;
  628. zAddrType_t destAddr;
  629. uint16 shortAddr;
  630. UserDescriptorFormat_t userDesc;
  631. /* parse header */
  632. cmdId = pBuf[MT_RPC_POS_CMD1];
  633. pBuf += MT_RPC_FRAME_HDR_SZ;
  634. /* Dev address */
  635. destAddr.addrMode = Addr16Bit;
  636. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  637. pBuf += 2;
  638. /* Network address of interest */
  639. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  640. pBuf += 2;
  641. /* User descriptor */
  642. userDesc.len = *pBuf++;
  643. osal_memcpy( userDesc.desc, pBuf, userDesc.len );
  644. pBuf += 16;
  645. retValue = (uint8)ZDP_UserDescSet( &destAddr, shortAddr, &userDesc, 0);
  646. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  647. }
  648. /***************************************************************************************************
  649. * @fn MT_ZdoServiceDiscRequest
  650. *
  651. * @brief Handle a Server Discovery request.
  652. *
  653. * @param pBuf - MT message data
  654. *
  655. * @return void
  656. ***************************************************************************************************/
  657. void MT_ZdoServiceDiscRequest(uint8 *pBuf)
  658. {
  659. uint8 cmdId;
  660. uint8 retValue;
  661. uint16 serviceMask;
  662. /* parse header */
  663. cmdId = pBuf[MT_RPC_POS_CMD1];
  664. pBuf += MT_RPC_FRAME_HDR_SZ;
  665. /* Service Mask */
  666. serviceMask = BUILD_UINT16( pBuf[0], pBuf[1]);
  667. pBuf += 2;
  668. retValue = (uint8)ZDP_ServerDiscReq( serviceMask, 0);
  669. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  670. }
  671. /***************************************************************************************************
  672. * @fn MT_ZdoEndDevBindRequest
  673. *
  674. * @brief Handle a End Device Bind request.
  675. *
  676. * @param pBuf - MT message data
  677. *
  678. * @return void
  679. ***************************************************************************************************/
  680. void MT_ZdoEndDevBindRequest(uint8 *pBuf)
  681. {
  682. uint8 cmdId;
  683. uint8 retValue = 0;
  684. uint8 i, epInt, numInClusters, numOutClusters;
  685. zAddrType_t destAddr;
  686. uint16 shortAddr;
  687. uint16 profileID, inClusters[MTZDO_MAX_ED_BIND_CLUSTERS], outClusters[MTZDO_MAX_ED_BIND_CLUSTERS];
  688. /* parse header */
  689. cmdId = pBuf[MT_RPC_POS_CMD1];
  690. pBuf += MT_RPC_FRAME_HDR_SZ;
  691. /* Dev address */
  692. destAddr.addrMode = Addr16Bit;
  693. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  694. pBuf += 2;
  695. /* Local coordinator of the binding */
  696. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  697. pBuf += 2;
  698. /* For now, skip past the extended address */
  699. pBuf += Z_EXTADDR_LEN;
  700. /* Endpoint */
  701. epInt = *pBuf++;
  702. /* Profile ID */
  703. profileID = BUILD_UINT16( pBuf[0], pBuf[1] );
  704. pBuf += 2;
  705. /* NumInClusters */
  706. numInClusters = *pBuf++;
  707. if ( numInClusters <= MTZDO_MAX_ED_BIND_CLUSTERS )
  708. {
  709. for ( i = 0; i < numInClusters; i++ )
  710. {
  711. inClusters[i] = BUILD_UINT16(pBuf[0], pBuf[1]);
  712. pBuf += 2;
  713. }
  714. }
  715. else
  716. retValue = ZDP_INVALID_REQTYPE;
  717. /* NumOutClusters */
  718. numOutClusters = *pBuf++;
  719. if ( numOutClusters <= MTZDO_MAX_ED_BIND_CLUSTERS )
  720. {
  721. for ( i = 0; i < numOutClusters; i++ )
  722. {
  723. outClusters[i] = BUILD_UINT16(pBuf[0], pBuf[1]);
  724. pBuf += 2;
  725. }
  726. }
  727. else
  728. retValue = ZDP_INVALID_REQTYPE;
  729. if ( retValue == 0 )
  730. {
  731. retValue = (uint8)ZDP_EndDeviceBindReq( &destAddr, shortAddr, epInt, profileID,
  732. numInClusters, inClusters, numOutClusters, outClusters, 0);
  733. }
  734. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  735. }
  736. /***************************************************************************************************
  737. * @fn MT_ZdoBindRequest
  738. *
  739. * @brief Handle a Bind request.
  740. *
  741. * @param pBuf - MT message data
  742. *
  743. * @return void
  744. ***************************************************************************************************/
  745. void MT_ZdoBindRequest(uint8 *pBuf)
  746. {
  747. uint8 cmdId;
  748. uint8 retValue;
  749. zAddrType_t destAddr, devAddr;
  750. uint8 *pSrcAddr, *ptr;
  751. uint8 srcEPInt, dstEPInt;
  752. uint16 clusterID;
  753. /* parse header */
  754. cmdId = pBuf[MT_RPC_POS_CMD1];
  755. pBuf += MT_RPC_FRAME_HDR_SZ;
  756. /* Dev address */
  757. destAddr.addrMode = Addr16Bit;
  758. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  759. pBuf += 2;
  760. /* SrcAddress */
  761. pSrcAddr = pBuf;
  762. pBuf += Z_EXTADDR_LEN;
  763. /* SrcEPInt */
  764. srcEPInt = *pBuf++;
  765. /* ClusterID */
  766. clusterID = BUILD_UINT16( pBuf[0], pBuf[1]);
  767. pBuf += 2;
  768. /* Destination Address mode */
  769. devAddr.addrMode = *pBuf++;
  770. /* Destination Address */
  771. if ( devAddr.addrMode == Addr64Bit )
  772. {
  773. ptr = pBuf;
  774. osal_cpyExtAddr( devAddr.addr.extAddr, ptr );
  775. }
  776. else
  777. {
  778. devAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  779. }
  780. /* The short address occupies LSB two bytes */
  781. pBuf += Z_EXTADDR_LEN;
  782. /* DstEPInt */
  783. dstEPInt = *pBuf;
  784. retValue = (uint8)ZDP_BindReq( &destAddr, pSrcAddr, srcEPInt, clusterID, &devAddr, dstEPInt, 0);
  785. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  786. }
  787. /***************************************************************************************************
  788. * @fn MT_ZdoUnbindRequest
  789. *
  790. * @brief Handle a Unbind request.
  791. *
  792. * @param pBuf - MT message data
  793. *
  794. * @return void
  795. ***************************************************************************************************/
  796. void MT_ZdoUnbindRequest(uint8 *pBuf)
  797. {
  798. uint8 cmdId;
  799. uint8 retValue;
  800. zAddrType_t destAddr, devAddr;
  801. uint8 *pSrcAddr, *ptr;
  802. uint8 srcEPInt, dstEPInt;
  803. uint16 clusterID;
  804. /* parse header */
  805. cmdId = pBuf[MT_RPC_POS_CMD1];
  806. pBuf += MT_RPC_FRAME_HDR_SZ;
  807. /* dev address */
  808. destAddr.addrMode = Addr16Bit;
  809. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  810. pBuf += 2;
  811. /* SrcAddress */
  812. pSrcAddr = pBuf;
  813. pBuf += Z_EXTADDR_LEN;
  814. /* SrcEPInt */
  815. srcEPInt = *pBuf++;
  816. /* ClusterID */
  817. clusterID = BUILD_UINT16( pBuf[0], pBuf[1]);
  818. pBuf += 2;
  819. /* Destination Address mode */
  820. devAddr.addrMode = *pBuf++;
  821. /* Destination Address */
  822. if ( devAddr.addrMode == Addr64Bit )
  823. {
  824. ptr = pBuf;
  825. osal_cpyExtAddr( devAddr.addr.extAddr, ptr );
  826. }
  827. else
  828. {
  829. devAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  830. }
  831. /* The short address occupies LSB two bytes */
  832. pBuf += Z_EXTADDR_LEN;
  833. /* dstEPInt */
  834. dstEPInt = *pBuf;
  835. retValue = (uint8)ZDP_UnbindReq( &destAddr, pSrcAddr, srcEPInt, clusterID, &devAddr, dstEPInt, 0);
  836. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  837. }
  838. /***************************************************************************************************
  839. * @fn MT_ZdoStartupFromApp
  840. *
  841. * @brief Handle a Startup from App request.
  842. *
  843. * @param pBuf - MT message data
  844. *
  845. * @return void
  846. ***************************************************************************************************/
  847. void MT_ZdoStartupFromApp(uint8 *pBuf)
  848. {
  849. uint8 cmdId;
  850. uint8 retValue;
  851. /* parse header */
  852. cmdId = pBuf[MT_RPC_POS_CMD1];
  853. pBuf += MT_RPC_FRAME_HDR_SZ;
  854. retValue = ZDOInitDevice(100);
  855. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  856. }
  857. #if defined (MT_ZDO_MGMT)
  858. /***************************************************************************************************
  859. * @fn MT_ZdoMgmtNwkDiscRequest
  860. *
  861. * @brief Handle a Mgmt Nwk Discovery request.
  862. *
  863. * @param pBuf - MT message data
  864. *
  865. * @return void
  866. ***************************************************************************************************/
  867. void MT_ZdoMgmtNwkDiscRequest(uint8 *pBuf)
  868. {
  869. uint8 cmdId;
  870. uint8 retValue;
  871. zAddrType_t destAddr;
  872. uint32 scanChannels;
  873. uint8 scanDuration, startIndex;
  874. /* parse header */
  875. cmdId = pBuf[MT_RPC_POS_CMD1];
  876. pBuf += MT_RPC_FRAME_HDR_SZ;
  877. /* Dev address */
  878. destAddr.addrMode = Addr16Bit;
  879. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  880. pBuf += 2;
  881. /* Scan Channels */
  882. scanChannels = BUILD_UINT32( pBuf[0], pBuf[1], pBuf[2], pBuf[3] );
  883. pBuf += 4;
  884. /* Scan Duration */
  885. scanDuration = *pBuf++;
  886. /* Start Index */
  887. startIndex = *pBuf;
  888. retValue = (uint8)ZDP_MgmtNwkDiscReq( &destAddr, scanChannels, scanDuration, startIndex, 0);
  889. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  890. }
  891. /***************************************************************************************************
  892. * @fn MT_ZdoMgmtLqiRequest
  893. *
  894. * @brief Handle a Mgmt Lqi request.
  895. *
  896. * @param pBuf - MT message data
  897. *
  898. * @return void
  899. ***************************************************************************************************/
  900. void MT_ZdoMgmtLqiRequest(uint8 *pBuf)
  901. {
  902. uint8 cmdId;
  903. uint8 retValue;
  904. zAddrType_t destAddr;
  905. uint8 startIndex;
  906. /* parse header */
  907. cmdId = pBuf[MT_RPC_POS_CMD1];
  908. pBuf += MT_RPC_FRAME_HDR_SZ;
  909. /* Dev address */
  910. destAddr.addrMode = Addr16Bit;
  911. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  912. pBuf += 2;
  913. /* Start Index */
  914. startIndex = *pBuf;
  915. retValue = (uint8)ZDP_MgmtLqiReq( &destAddr, startIndex, 0);
  916. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  917. }
  918. /***************************************************************************************************
  919. * @fn MT_ZdoMgmtRtgRequest
  920. *
  921. * @brief Handle a Mgmt Rtg request.
  922. *
  923. * @param pBuf - MT message data
  924. *
  925. * @return void
  926. ***************************************************************************************************/
  927. void MT_ZdoMgmtRtgRequest(uint8 *pBuf)
  928. {
  929. uint8 cmdId;
  930. uint8 retValue;
  931. zAddrType_t destAddr;
  932. uint8 startIndex;
  933. /* parse header */
  934. cmdId = pBuf[MT_RPC_POS_CMD1];
  935. pBuf += MT_RPC_FRAME_HDR_SZ;
  936. /* Dev Address */
  937. destAddr.addrMode = Addr16Bit;
  938. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
  939. pBuf += 2;
  940. /* Start Index */
  941. startIndex = *pBuf;
  942. retValue = (byte)ZDP_MgmtRtgReq( &destAddr, startIndex, 0);
  943. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  944. }
  945. /***************************************************************************************************
  946. * @fn MT_ZdoMgmtBindRequest
  947. *
  948. * @brief Handle a Mgmt Bind request.
  949. *
  950. * @param pBuf - MT message data
  951. *
  952. * @return void
  953. ***************************************************************************************************/
  954. void MT_ZdoMgmtBindRequest(uint8 *pBuf)
  955. {
  956. uint8 cmdId;
  957. uint8 retValue;
  958. zAddrType_t destAddr;
  959. uint8 startIndex;
  960. /* parse header */
  961. cmdId = pBuf[MT_RPC_POS_CMD1];
  962. pBuf += MT_RPC_FRAME_HDR_SZ;
  963. /* Dev Address */
  964. destAddr.addrMode = Addr16Bit;
  965. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  966. pBuf += 2;
  967. /* Start Index */
  968. startIndex = *pBuf;
  969. retValue = (uint8)ZDP_MgmtBindReq( &destAddr, startIndex, 0);
  970. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  971. }
  972. /***************************************************************************************************
  973. * @fn MT_ZdoMgmtLeaveRequest
  974. *
  975. * @brief Handle a Mgmt Leave request.
  976. *
  977. * @param pBuf - MT message data
  978. *
  979. * @return void
  980. ***************************************************************************************************/
  981. void MT_ZdoMgmtLeaveRequest(uint8 *pBuf)
  982. {
  983. uint8 cmdId;
  984. uint8 retValue;
  985. zAddrType_t destAddr;
  986. uint8 *pIEEEAddr;
  987. uint8 removeChildren, rejoin;
  988. /* parse header */
  989. cmdId = pBuf[MT_RPC_POS_CMD1];
  990. pBuf += MT_RPC_FRAME_HDR_SZ;
  991. /* Destination Address */
  992. destAddr.addrMode = Addr16Bit;
  993. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  994. pBuf += 2;
  995. /* IEEE address */
  996. pIEEEAddr = pBuf;
  997. pBuf += Z_EXTADDR_LEN;
  998. /* Remove Children */
  999. removeChildren = *pBuf++;
  1000. /* Rejoin */
  1001. rejoin = *pBuf;
  1002. retValue = (byte)ZDP_MgmtLeaveReq( &destAddr, pIEEEAddr, removeChildren, rejoin, 0);
  1003. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1004. }
  1005. /***************************************************************************************************
  1006. * @fn MT_ZdoMgmtDirectJoinRequest
  1007. *
  1008. * @brief Handle a Mgmt Direct Join request.
  1009. *
  1010. * @param pBuf - MT message data
  1011. *
  1012. * @return void
  1013. ***************************************************************************************************/
  1014. void MT_ZdoMgmtDirectJoinRequest(uint8 *pBuf)
  1015. {
  1016. uint8 cmdId;
  1017. uint8 retValue;
  1018. zAddrType_t destAddr;
  1019. uint8 *deviceAddr;
  1020. uint8 capInfo;
  1021. /* parse header */
  1022. cmdId = pBuf[MT_RPC_POS_CMD1];
  1023. pBuf += MT_RPC_FRAME_HDR_SZ;
  1024. /* Destination Address */
  1025. destAddr.addrMode = Addr16Bit;
  1026. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1027. pBuf += 2;
  1028. /* Device Address */
  1029. deviceAddr = pBuf;
  1030. pBuf += Z_EXTADDR_LEN;
  1031. /* Capability information */
  1032. capInfo = *pBuf;
  1033. retValue = (uint8)ZDP_MgmtDirectJoinReq( &destAddr, deviceAddr, capInfo, 0);
  1034. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1035. }
  1036. /***************************************************************************************************
  1037. * @fn MT_ZdoMgmtPermitJoinRequest
  1038. *
  1039. * @brief Handle a Mgmt Permit Join request.
  1040. *
  1041. * @param pBuf - MT message data
  1042. *
  1043. * @return void
  1044. ***************************************************************************************************/
  1045. void MT_ZdoMgmtPermitJoinRequest(uint8 *pBuf)
  1046. {
  1047. uint8 cmdId;
  1048. uint8 retValue;
  1049. zAddrType_t destAddr;
  1050. uint8 duration, tcSignificance;
  1051. /* parse header */
  1052. cmdId = pBuf[MT_RPC_POS_CMD1];
  1053. pBuf += MT_RPC_FRAME_HDR_SZ;
  1054. /* Destination Address */
  1055. destAddr.addrMode = Addr16Bit;
  1056. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1057. pBuf += 2;
  1058. /* Duration */
  1059. duration = *pBuf++;
  1060. /* Trust center significance */
  1061. tcSignificance = *pBuf;
  1062. retValue = (byte)ZDP_MgmtPermitJoinReq( &destAddr, duration, tcSignificance, 0);
  1063. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1064. }
  1065. /***************************************************************************************************
  1066. * @fn MT_ZdoMgmtNwkUpdateRequest
  1067. *
  1068. * @brief Handle a Mgmt Nwk Update request.
  1069. *
  1070. * @param pBuf - MT message data
  1071. *
  1072. * @return void
  1073. ***************************************************************************************************/
  1074. void MT_ZdoMgmtNwkUpdateRequest(uint8 *pBuf)
  1075. {
  1076. uint8 cmdId;
  1077. uint8 retValue;
  1078. zAddrType_t destAddr;
  1079. uint32 channelMask;
  1080. uint8 scanDuration, scanCount;
  1081. uint16 nwkManagerAddr;
  1082. /* parse header */
  1083. cmdId = pBuf[MT_RPC_POS_CMD1];
  1084. pBuf += MT_RPC_FRAME_HDR_SZ;
  1085. /* Destination address */
  1086. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1087. pBuf += 2;
  1088. /* Destination address mode */
  1089. destAddr.addrMode = *pBuf++;
  1090. channelMask = BUILD_UINT32( pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
  1091. pBuf += 4;
  1092. /* Scan duration */
  1093. scanDuration = *pBuf++;
  1094. /* Scan count */
  1095. scanCount = *pBuf++;
  1096. /* NWK manager address */
  1097. nwkManagerAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1098. /* Send the Management Network Update request */
  1099. retValue = (uint8)ZDP_MgmtNwkUpdateReq( &destAddr, channelMask, scanDuration,
  1100. scanCount, _NIB.nwkUpdateId+1, nwkManagerAddr );
  1101. /*
  1102. Since we don't recevied our own broadcast messages, we should
  1103. send a unicast copy of the message to ourself.
  1104. */
  1105. if ( destAddr.addrMode == AddrBroadcast )
  1106. {
  1107. destAddr.addrMode = Addr16Bit;
  1108. destAddr.addr.shortAddr = _NIB.nwkDevAddress;
  1109. retValue = (uint8) ZDP_MgmtNwkUpdateReq( &destAddr, channelMask, scanDuration,
  1110. scanCount, _NIB.nwkUpdateId+1, nwkManagerAddr );
  1111. }
  1112. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1113. }
  1114. #endif /* MT_ZDO_MGMT */
  1115. #endif /* MT_ZDO_FUNC */
  1116. /***************************************************************************************************
  1117. * Callback handling function
  1118. ***************************************************************************************************/
  1119. #if defined (MT_ZDO_CB_FUNC)
  1120. /***************************************************************************************************
  1121. * @fn MT_ZdoDirectCB()
  1122. *
  1123. * @brief ZDO direct callback. Build an MT message directly from the
  1124. * over-the-air ZDO message.
  1125. *
  1126. * @param pData - Incoming AF frame.
  1127. *
  1128. * @return none
  1129. ***************************************************************************************************/
  1130. void MT_ZdoDirectCB( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg )
  1131. {
  1132. uint8 dataLen;
  1133. uint8 msgLen;
  1134. uint8 *pBuf;
  1135. uint8 *p;
  1136. uint8 id;
  1137. // Is the message an exception or not a response?
  1138. if ( ((pData->clusterId & ZDO_RESPONSE_BIT) == 0)
  1139. || MT_ZdoHandleExceptions( pData, inMsg ) )
  1140. {
  1141. // Handled somewhere else or not needed
  1142. return;
  1143. }
  1144. /* map cluster ID to MT message */
  1145. id = (uint8) pData->clusterId;
  1146. id = mtZdoCluster2Rsp[id >> 4][id & 0x0F];
  1147. /* ZDO data starts after one-byte sequence number */
  1148. dataLen = pData->cmd.DataLength - 1;
  1149. /* msg buffer length includes two bytes for srcAddr */
  1150. msgLen = dataLen + sizeof(uint16);
  1151. /* get buffer */
  1152. if ((p = pBuf = MT_TransportAlloc(((uint8)MT_RPC_CMD_AREQ |(uint8)MT_RPC_SYS_ZDO), msgLen)) != NULL)
  1153. {
  1154. /* build header */
  1155. *p++ = msgLen;
  1156. *p++ = (uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO;
  1157. *p++ = id;
  1158. /* build srcAddr */
  1159. *p++ = LO_UINT16(pData->srcAddr.addr.shortAddr);
  1160. *p++ = HI_UINT16(pData->srcAddr.addr.shortAddr);
  1161. /* copy ZDO data, skipping one-byte sequence number */
  1162. osal_memcpy(p, (pData->cmd.Data + 1), dataLen);
  1163. /* send it */
  1164. MT_TransportSend(pBuf);
  1165. }
  1166. }
  1167. /***************************************************************************************************
  1168. * @fn MT_ZdoHandleExceptions()
  1169. *
  1170. * @brief Handles all messages that are an expection to the generic MT ZDO Response.
  1171. *
  1172. * @param pData - Incoming AF frame.
  1173. *
  1174. * @return TRUE if handled by this function, FALSE if not
  1175. ***************************************************************************************************/
  1176. uint8 MT_ZdoHandleExceptions( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg )
  1177. {
  1178. uint8 ret = TRUE;
  1179. ZDO_NwkIEEEAddrResp_t *nwkRsp = NULL;
  1180. ZDO_DeviceAnnce_t devAnnce;
  1181. uint8 doDefault = FALSE;
  1182. switch ( inMsg->clusterID )
  1183. {
  1184. case NWK_addr_rsp:
  1185. case IEEE_addr_rsp:
  1186. nwkRsp = ZDO_ParseAddrRsp( inMsg );
  1187. MT_ZdoAddrRspCB( nwkRsp, inMsg->clusterID );
  1188. if ( nwkRsp )
  1189. osal_mem_free( nwkRsp );
  1190. break;
  1191. case Device_annce:
  1192. ZDO_ParseDeviceAnnce( inMsg, &devAnnce );
  1193. MT_ZdoEndDevAnnceCB( &devAnnce, inMsg->srcAddr.addr.shortAddr );
  1194. break;
  1195. case Simple_Desc_rsp:
  1196. if ( pData->cmd.DataLength > 5 )
  1197. ret = FALSE;
  1198. else
  1199. doDefault = TRUE;
  1200. break;
  1201. default:
  1202. ret = FALSE;
  1203. break;
  1204. }
  1205. if ( doDefault )
  1206. {
  1207. ret = FALSE;
  1208. pData->clusterId = 0x26;
  1209. pData->cmd.DataLength = 2;
  1210. }
  1211. return ( ret );
  1212. }
  1213. /***************************************************************************************************
  1214. * @fn MT_ZdoAddrRspCB
  1215. *
  1216. * @brief Handle IEEE or nwk address response OSAL message from ZDO.
  1217. *
  1218. * @param pMsg - Message data
  1219. *
  1220. * @return void
  1221. */
  1222. void MT_ZdoAddrRspCB( ZDO_NwkIEEEAddrResp_t *pMsg, uint16 clusterID )
  1223. {
  1224. uint8 listLen;
  1225. uint8 msgLen;
  1226. uint8 *pBuf;
  1227. uint8 *p;
  1228. /* both ZDO_NwkAddrResp_t and ZDO_IEEEAddrResp_t must be the same */
  1229. /* get length, sanity check length */
  1230. listLen = pMsg->numAssocDevs;
  1231. /* calculate msg length */
  1232. msgLen = MT_ZDO_ADDR_RSP_LEN + (listLen * sizeof(uint16));
  1233. /* get buffer */
  1234. if ((p = pBuf = MT_TransportAlloc(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO), msgLen)) != NULL)
  1235. {
  1236. /* build header */
  1237. *p++ = msgLen;
  1238. *p++ = (uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO;
  1239. *p++ = (clusterID == IEEE_addr_rsp) ?
  1240. MT_ZDO_IEEE_ADDR_RSP : MT_ZDO_NWK_ADDR_RSP;
  1241. /* build msg parameters */
  1242. *p++ = pMsg->status;
  1243. osal_cpyExtAddr(p, pMsg->extAddr);
  1244. p += Z_EXTADDR_LEN;
  1245. *p++ = LO_UINT16(pMsg->nwkAddr);
  1246. *p++ = HI_UINT16(pMsg->nwkAddr);
  1247. *p++ = pMsg->startIndex;
  1248. *p++ = listLen;
  1249. MT_Word2Buf(p, pMsg->devList, listLen);
  1250. /* send it */
  1251. MT_TransportSend(pBuf);
  1252. }
  1253. }
  1254. /***************************************************************************************************
  1255. * @fn MT_ZdoEndDevAnnceCB
  1256. *
  1257. * @brief Handle end device announce OSAL message from ZDO.
  1258. *
  1259. * @param pMsg - Message data
  1260. *
  1261. * @return void
  1262. */
  1263. void MT_ZdoEndDevAnnceCB( ZDO_DeviceAnnce_t *pMsg, uint16 srcAddr )
  1264. {
  1265. uint8 *pBuf;
  1266. uint8 *p;
  1267. if ((p = pBuf = MT_TransportAlloc(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1268. MT_ZDO_END_DEVICE_ANNCE_IND_LEN)) != NULL)
  1269. {
  1270. *p++ = MT_ZDO_END_DEVICE_ANNCE_IND_LEN;
  1271. *p++ = (uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO;
  1272. *p++ = MT_ZDO_END_DEVICE_ANNCE_IND;
  1273. *p++ = LO_UINT16(srcAddr);
  1274. *p++ = HI_UINT16(srcAddr);
  1275. *p++ = LO_UINT16(pMsg->nwkAddr);
  1276. *p++ = HI_UINT16(pMsg->nwkAddr);
  1277. osal_cpyExtAddr(p, pMsg->extAddr);
  1278. p += Z_EXTADDR_LEN;
  1279. *p = pMsg->capabilities;
  1280. MT_TransportSend(pBuf);
  1281. }
  1282. }
  1283. #endif // MT_ZDO_CB_FUNC
  1284. /***************************************************************************************************
  1285. ***************************************************************************************************/
  1286. #endif /*ZDO Command Processing in MT*/