MT_ZDO.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160
  1. /**************************************************************************************************
  2. Filename: MT_ZDO.c
  3. Revised: $Date: 2012-02-16 16:04:32 -0800 (Thu, 16 Feb 2012) $
  4. Revision: $Revision: 29348 $
  5. Description: MonitorTest functions for the ZDO layer.
  6. Copyright 2004-2012 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 "OSAL_Nv.h"
  40. #include "MT.h"
  41. #include "MT_ZDO.h"
  42. #include "APSMEDE.h"
  43. #include "ZDConfig.h"
  44. #include "ZDProfile.h"
  45. #include "ZDObject.h"
  46. #include "ZDApp.h"
  47. #if !defined( WIN32 )
  48. #include "OnBoard.h"
  49. #endif
  50. #if defined ( MT_SYS_KEY_MANAGEMENT )
  51. #include "ZDSecMgr.h"
  52. #endif
  53. #include "nwk_util.h"
  54. /**************************************************************************************************
  55. * CONSTANTS
  56. **************************************************************************************************/
  57. #define MT_ZDO_END_DEVICE_ANNCE_IND_LEN 0x0D
  58. #define MT_ZDO_ADDR_RSP_LEN 0x0D
  59. #define MT_ZDO_BIND_UNBIND_RSP_LEN 0x03
  60. #define MT_ZDO_BEACON_IND_LEN 21
  61. #define MT_ZDO_BEACON_IND_PACK_LEN (MT_UART_TX_BUFF_MAX - SPI_0DATA_MSG_LEN)
  62. #define MT_ZDO_JOIN_CNF_LEN 5
  63. // Message must pack nwk addr, entire (not just pointer to) ieee addr, and packet cost, so the
  64. // sizeof(zdoConcentratorInd_t) is not usable.
  65. #define MT_ZDO_CONCENTRATOR_IND_LEN (2 + Z_EXTADDR_LEN + 1)
  66. #define MTZDO_RESPONSE_BUFFER_LEN 100
  67. #define MTZDO_MAX_MATCH_CLUSTERS 16
  68. #define MTZDO_MAX_ED_BIND_CLUSTERS 15
  69. // Conversion from ZDO Cluster Id to the RPC AREQ Id is direct as follows:
  70. #define MT_ZDO_CID_TO_AREQ_ID(CId) ((uint8)(CId) | 0x80)
  71. #define MT_ZDO_STATUS_LEN 1
  72. /**************************************************************************************************
  73. * GLOBAL VARIABLES
  74. **************************************************************************************************/
  75. uint32 _zdoCallbackSub;
  76. uint8 *pBeaconIndBuf = NULL;
  77. /**************************************************************************************************
  78. * LOCAL VARIABLES
  79. **************************************************************************************************/
  80. /**************************************************************************************************
  81. * LOCAL FUNCTIONS
  82. **************************************************************************************************/
  83. #if defined (MT_ZDO_FUNC)
  84. void MT_ZdoNWKAddressRequest(uint8 *pBuf);
  85. void MT_ZdoIEEEAddrRequest(uint8 *pBuf);
  86. void MT_ZdoNodeDescRequest(uint8 *pBuf);
  87. void MT_ZdoPowerDescRequest(uint8 *pBuf);
  88. void MT_ZdoSimpleDescRequest(uint8 *pBuf);
  89. void MT_ZdoActiveEpRequest(uint8 *pBuf);
  90. void MT_ZdoMatchDescRequest(uint8 *pBuf);
  91. void MT_ZdoComplexDescRequest(uint8 *pBuf);
  92. void MT_ZdoUserDescRequest(uint8 *pBuf);
  93. void MT_ZdoEndDevAnnce(uint8 *pBuf);
  94. void MT_ZdoUserDescSet(uint8 *pBuf);
  95. void MT_ZdoServiceDiscRequest(uint8 *pBuf);
  96. void MT_ZdoEndDevBindRequest(uint8 *pBuf);
  97. void MT_ZdoBindRequest(uint8 *pBuf);
  98. void MT_ZdoUnbindRequest(uint8 *pBuf);
  99. void MT_ZdoMgmtNwkDiscRequest(uint8 *pBuf);
  100. #if defined ( MT_SYS_KEY_MANAGEMENT )
  101. void MT_ZdoSetLinkKey(uint8 *pBuf);
  102. void MT_ZdoRemoveLinkKey(uint8 *pBuf);
  103. void MT_ZdoGetLinkKey(uint8 *pBuf);
  104. #endif /* MT_SYS_KEY_MANAGEMENT */
  105. void MT_ZdoNetworkDiscoveryReq(uint8 *pBuf);
  106. void MT_ZdoJoinReq(uint8 *pBuf);
  107. /* Call back function */
  108. void *MT_ZdoNwkDiscoveryCnfCB ( void *pStr );
  109. void *MT_ZdoBeaconIndCB ( void *pStr );
  110. void *MT_ZdoJoinCnfCB ( void *pStr );
  111. #if defined (MT_ZDO_MGMT)
  112. void MT_ZdoMgmtLqiRequest(uint8 *pBuf);
  113. void MT_ZdoMgmtRtgRequest(uint8 *pBuf);
  114. void MT_ZdoMgmtBindRequest(uint8 *pBuf);
  115. void MT_ZdoMgmtLeaveRequest(uint8 *pBuf);
  116. void MT_ZdoMgmtDirectJoinRequest(uint8 *pBuf);
  117. void MT_ZdoMgmtPermitJoinRequest(uint8 *pBuf);
  118. void MT_ZdoMgmtNwkUpdateRequest(uint8 *pBuf);
  119. #endif /* MT_ZDO_MGMT */
  120. void MT_ZdoStartupFromApp(uint8 *pBuf);
  121. void MT_ZdoRegisterForZDOMsg(uint8 *pBuf);
  122. void MT_ZdoRemoveRegisteredCB(uint8 *pBuf);
  123. #endif /* MT_ZDO_FUNC */
  124. #if defined (MT_ZDO_CB_FUNC)
  125. uint8 MT_ZdoHandleExceptions( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg );
  126. void MT_ZdoAddrRspCB( ZDO_NwkIEEEAddrResp_t *pMsg, uint16 clusterID );
  127. void MT_ZdoEndDevAnnceCB( ZDO_DeviceAnnce_t *pMsg, uint16 srcAddr );
  128. void MT_ZdoBindUnbindRspCB( uint16 clusterID, uint16 srcAddr, uint8 status );
  129. void* MT_ZdoSrcRtgCB( void *pStr );
  130. static void *MT_ZdoConcentratorIndCB(void *pStr);
  131. static void *MT_ZdoLeaveInd(void *vPtr);
  132. #endif /* MT_ZDO_CB_FUNC */
  133. #if defined (MT_ZDO_FUNC)
  134. /***************************************************************************************************
  135. * @fn MT_ZdoInit
  136. *
  137. * @brief MT ZDO initialization
  138. *
  139. * @param none
  140. *
  141. * @return none
  142. ***************************************************************************************************/
  143. void MT_ZdoInit(void)
  144. {
  145. #ifdef MT_ZDO_CB_FUNC
  146. /* Register with ZDO for indication callbacks */
  147. ZDO_RegisterForZdoCB(ZDO_SRC_RTG_IND_CBID, &MT_ZdoSrcRtgCB);
  148. ZDO_RegisterForZdoCB(ZDO_CONCENTRATOR_IND_CBID, &MT_ZdoConcentratorIndCB);
  149. ZDO_RegisterForZdoCB(ZDO_LEAVE_IND_CBID, &MT_ZdoLeaveInd);
  150. #endif
  151. }
  152. /***************************************************************************************************
  153. * @fn MT_ZdoCommandProcessing
  154. *
  155. * @brief
  156. *
  157. * Process all the ZDO commands that are issued by test tool
  158. *
  159. * @param pBuf - pointer to the msg buffer
  160. *
  161. * | LEN | CMD0 | CMD1 | DATA |
  162. * | 1 | 1 | 1 | 0-255 |
  163. *
  164. * @return status
  165. ***************************************************************************************************/
  166. uint8 MT_ZdoCommandProcessing(uint8* pBuf)
  167. {
  168. uint8 status = MT_RPC_SUCCESS;
  169. switch (pBuf[MT_RPC_POS_CMD1])
  170. {
  171. #if defined ( ZDO_NWKADDR_REQUEST )
  172. case MT_ZDO_NWK_ADDR_REQ:
  173. MT_ZdoNWKAddressRequest(pBuf);
  174. break;
  175. #endif
  176. #if defined ( ZDO_IEEEADDR_REQUEST )
  177. case MT_ZDO_IEEE_ADDR_REQ:
  178. MT_ZdoIEEEAddrRequest(pBuf);
  179. break;
  180. #endif
  181. #if defined ( ZDO_NODEDESC_REQUEST )
  182. case MT_ZDO_NODE_DESC_REQ:
  183. MT_ZdoNodeDescRequest(pBuf);
  184. break;
  185. #endif
  186. #if defined ( ZDO_POWERDESC_REQUEST )
  187. case MT_ZDO_POWER_DESC_REQ:
  188. MT_ZdoPowerDescRequest(pBuf);
  189. break;
  190. #endif
  191. #if defined ( ZDO_SIMPLEDESC_REQUEST )
  192. case MT_ZDO_SIMPLE_DESC_REQ:
  193. MT_ZdoSimpleDescRequest(pBuf);
  194. break;
  195. #endif
  196. #if defined ( ZDO_ACTIVEEP_REQUEST )
  197. case MT_ZDO_ACTIVE_EP_REQ:
  198. MT_ZdoActiveEpRequest(pBuf);
  199. break;
  200. #endif
  201. #if defined ( ZDO_MATCH_REQUEST )
  202. case MT_ZDO_MATCH_DESC_REQ:
  203. MT_ZdoMatchDescRequest(pBuf);
  204. break;
  205. #endif
  206. #if defined ( ZDO_COMPLEXDESC_REQUEST )
  207. case MT_ZDO_COMPLEX_DESC_REQ:
  208. MT_ZdoComplexDescRequest(pBuf);
  209. break;
  210. #endif
  211. #if defined ( ZDO_USERDESC_REQUEST )
  212. case MT_ZDO_USER_DESC_REQ:
  213. MT_ZdoUserDescRequest(pBuf);
  214. break;
  215. #endif
  216. #if defined ( ZDO_ENDDEVICE_ANNCE )
  217. case MT_ZDO_END_DEV_ANNCE:
  218. MT_ZdoEndDevAnnce(pBuf);
  219. break;
  220. #endif
  221. #if defined ( ZDO_USERDESCSET_REQUEST )
  222. case MT_ZDO_USER_DESC_SET:
  223. MT_ZdoUserDescSet(pBuf);
  224. break;
  225. #endif
  226. #if defined ( ZDO_SERVERDISC_REQUEST )
  227. case MT_ZDO_SERVICE_DISC_REQ:
  228. MT_ZdoServiceDiscRequest(pBuf);
  229. break;
  230. #endif
  231. #if defined ( ZDO_ENDDEVICEBIND_REQUEST )
  232. case MT_ZDO_END_DEV_BIND_REQ:
  233. MT_ZdoEndDevBindRequest(pBuf);
  234. break;
  235. #endif
  236. #if defined ( ZDO_BIND_UNBIND_REQUEST )
  237. case MT_ZDO_BIND_REQ:
  238. MT_ZdoBindRequest(pBuf);
  239. break;
  240. #endif
  241. #if defined ( ZDO_BIND_UNBIND_REQUEST )
  242. case MT_ZDO_UNBIND_REQ:
  243. MT_ZdoUnbindRequest(pBuf);
  244. break;
  245. #endif
  246. #if defined ( MT_SYS_KEY_MANAGEMENT )
  247. case MT_ZDO_SET_LINK_KEY:
  248. MT_ZdoSetLinkKey(pBuf);
  249. break;
  250. case MT_ZDO_REMOVE_LINK_KEY:
  251. MT_ZdoRemoveLinkKey(pBuf);
  252. break;
  253. case MT_ZDO_GET_LINK_KEY:
  254. MT_ZdoGetLinkKey(pBuf);
  255. break;
  256. #endif // MT_SYS_KEY_MANAGEMENT
  257. #if defined ( ZDO_MANUAL_JOIN )
  258. case MT_ZDO_NWK_DISCOVERY_REQ:
  259. MT_ZdoNetworkDiscoveryReq(pBuf);
  260. break;
  261. case MT_ZDO_JOIN_REQ:
  262. MT_ZdoJoinReq(pBuf);
  263. break;
  264. #endif
  265. #if defined ( ZDO_MGMT_NWKDISC_REQUEST )
  266. case MT_ZDO_MGMT_NWKDISC_REQ:
  267. MT_ZdoMgmtNwkDiscRequest(pBuf);
  268. break;
  269. #endif
  270. #if defined ( ZDO_MGMT_LQI_REQUEST )
  271. case MT_ZDO_MGMT_LQI_REQ:
  272. MT_ZdoMgmtLqiRequest(pBuf);
  273. break;
  274. #endif
  275. #if defined ( ZDO_MGMT_RTG_REQUEST )
  276. case MT_ZDO_MGMT_RTG_REQ:
  277. MT_ZdoMgmtRtgRequest(pBuf);
  278. break;
  279. #endif
  280. #if defined ( ZDO_MGMT_BIND_REQUEST )
  281. case MT_ZDO_MGMT_BIND_REQ:
  282. MT_ZdoMgmtBindRequest(pBuf);
  283. break;
  284. #endif
  285. #if defined ( ZDO_MGMT_LEAVE_REQUEST )
  286. case MT_ZDO_MGMT_LEAVE_REQ:
  287. MT_ZdoMgmtLeaveRequest(pBuf);
  288. break;
  289. #endif
  290. #if defined ( ZDO_MGMT_JOINDIRECT_REQUEST )
  291. case MT_ZDO_MGMT_DIRECT_JOIN_REQ:
  292. MT_ZdoMgmtDirectJoinRequest(pBuf);
  293. break;
  294. #endif
  295. #if defined ( ZDO_MGMT_PERMIT_JOIN_REQUEST )
  296. case MT_ZDO_MGMT_PERMIT_JOIN_REQ:
  297. MT_ZdoMgmtPermitJoinRequest(pBuf);
  298. break;
  299. #endif
  300. #if defined ( ZDO_MGMT_NWKUPDATE_REQUEST )
  301. case MT_ZDO_MGMT_NWK_UPDATE_REQ:
  302. MT_ZdoMgmtNwkUpdateRequest(pBuf);
  303. break;
  304. #endif
  305. #if defined ( ZDO_NETWORKSTART_REQUEST )
  306. case MT_ZDO_STARTUP_FROM_APP:
  307. MT_ZdoStartupFromApp(pBuf);
  308. break;
  309. #endif
  310. case MT_ZDO_MSG_CB_REGISTER:
  311. MT_ZdoRegisterForZDOMsg(pBuf);
  312. break;
  313. case MT_ZDO_MSG_CB_REMOVE:
  314. MT_ZdoRemoveRegisteredCB(pBuf);
  315. break;
  316. default:
  317. status = MT_RPC_ERR_COMMAND_ID;
  318. break;
  319. }
  320. return status;
  321. }
  322. /***************************************************************************************************
  323. * @fn MT_ZdoNwkAddrReq
  324. *
  325. * @brief Handle a nwk address request.
  326. *
  327. * @param pData - MT message data
  328. *
  329. * @return void
  330. ***************************************************************************************************/
  331. void MT_ZdoNWKAddressRequest(uint8 *pBuf)
  332. {
  333. uint8 cmdId;
  334. uint8 retValue;
  335. uint8 reqType;
  336. uint8 startIndex;
  337. uint8 *pExtAddr;
  338. /* parse header */
  339. cmdId = pBuf[MT_RPC_POS_CMD1];
  340. pBuf += MT_RPC_FRAME_HDR_SZ;
  341. /* parse parameters */
  342. pExtAddr = pBuf;
  343. pBuf += Z_EXTADDR_LEN;
  344. /* Request type */
  345. reqType = *pBuf++;
  346. /* Start index */
  347. startIndex = *pBuf;
  348. retValue = (uint8)ZDP_NwkAddrReq(pExtAddr, reqType, startIndex, 0);
  349. /* Build and send back the response */
  350. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  351. }
  352. /***************************************************************************************************
  353. * @fn MT_ZdoIEEEAddrRequest
  354. *
  355. * @brief Handle a IEEE address request.
  356. *
  357. * @param pData - MT message data
  358. *
  359. * @return void
  360. ***************************************************************************************************/
  361. void MT_ZdoIEEEAddrRequest (uint8 *pBuf)
  362. {
  363. uint8 cmdId;
  364. uint8 retValue;
  365. uint16 shortAddr;
  366. uint8 reqType;
  367. uint8 startIndex;
  368. /* parse header */
  369. cmdId = pBuf[MT_RPC_POS_CMD1];
  370. pBuf += MT_RPC_FRAME_HDR_SZ;
  371. /* Dev address */
  372. shortAddr = BUILD_UINT16(pBuf[0], pBuf[1]);
  373. pBuf += 2;
  374. /* request type */
  375. reqType = *pBuf++;
  376. /* start index */
  377. startIndex = *pBuf;
  378. retValue = (uint8)ZDP_IEEEAddrReq(shortAddr, reqType, startIndex, 0);
  379. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  380. }
  381. /***************************************************************************************************
  382. * @fn MT_ZdoNodeDescRequest
  383. *
  384. * @brief Handle a Node Descriptor request.
  385. *
  386. * @param pData - MT message data
  387. *
  388. * @return void
  389. ***************************************************************************************************/
  390. void MT_ZdoNodeDescRequest (uint8 *pBuf)
  391. {
  392. uint8 cmdId;
  393. uint8 retValue;
  394. zAddrType_t destAddr;
  395. uint16 shortAddr;
  396. /* parse header */
  397. cmdId = pBuf[MT_RPC_POS_CMD1];
  398. pBuf += MT_RPC_FRAME_HDR_SZ;
  399. /* Destination address */
  400. destAddr.addrMode = Addr16Bit;
  401. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  402. pBuf += 2;
  403. /* Network address of interest */
  404. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  405. pBuf += 2;
  406. retValue = (uint8)ZDP_NodeDescReq( &destAddr, shortAddr, 0);
  407. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  408. }
  409. /***************************************************************************************************
  410. * @fn MT_ZdoPowerDescRequest
  411. *
  412. * @brief Handle a Power Descriptor request.
  413. *
  414. * @param pData - MT message data
  415. *
  416. * @return void
  417. ***************************************************************************************************/
  418. void MT_ZdoPowerDescRequest(uint8 *pBuf)
  419. {
  420. uint8 cmdId;
  421. uint8 retValue;
  422. zAddrType_t destAddr;
  423. uint16 shortAddr;
  424. /* parse header */
  425. cmdId = pBuf[MT_RPC_POS_CMD1];
  426. pBuf += MT_RPC_FRAME_HDR_SZ;
  427. /* Dev address */
  428. destAddr.addrMode = Addr16Bit;
  429. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  430. pBuf += 2;
  431. /* Network address of interest */
  432. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  433. pBuf += 2;
  434. retValue = (uint8)ZDP_PowerDescReq( &destAddr, shortAddr, 0);
  435. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  436. }
  437. /***************************************************************************************************
  438. * @fn MT_ZdoSimpleDescRequest
  439. *
  440. * @brief Handle a Simple Descriptor request.
  441. *
  442. * @param pBuf - MT message data
  443. *
  444. * @return void
  445. ***************************************************************************************************/
  446. void MT_ZdoSimpleDescRequest(uint8 *pBuf)
  447. {
  448. uint8 cmdId;
  449. uint8 retValue;
  450. uint8 epInt;
  451. zAddrType_t destAddr;
  452. uint16 shortAddr;
  453. /* parse header */
  454. cmdId = pBuf[MT_RPC_POS_CMD1];
  455. pBuf += MT_RPC_FRAME_HDR_SZ;
  456. /* Dev address */
  457. destAddr.addrMode = Addr16Bit;
  458. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  459. pBuf += 2;
  460. /* Network address of interest */
  461. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  462. pBuf += 2;
  463. /* endpoint/interface */
  464. epInt = *pBuf++;
  465. retValue = (uint8)ZDP_SimpleDescReq( &destAddr, shortAddr, epInt, 0);
  466. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  467. }
  468. /***************************************************************************************************
  469. * @fn MT_ZdoActiveEpRequest
  470. *
  471. * @brief Handle a Active EP request.
  472. *
  473. * @param pBuf - MT message data
  474. *
  475. * @return void
  476. ***************************************************************************************************/
  477. void MT_ZdoActiveEpRequest(uint8 *pBuf)
  478. {
  479. uint8 cmdId;
  480. uint8 retValue;
  481. zAddrType_t destAddr;
  482. uint16 shortAddr;
  483. /* parse header */
  484. cmdId = pBuf[MT_RPC_POS_CMD1];
  485. pBuf += MT_RPC_FRAME_HDR_SZ;
  486. /* Dev address */
  487. destAddr.addrMode = Addr16Bit;
  488. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  489. pBuf += 2;
  490. /* Network address of interest */
  491. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  492. pBuf += 2;
  493. retValue = (uint8)ZDP_ActiveEPReq( &destAddr, shortAddr, 0);
  494. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  495. }
  496. /***************************************************************************************************
  497. * @fn MT_ZdoMatchDescRequest
  498. *
  499. * @brief Handle a Match Descriptor request.
  500. *
  501. * @param pBuf - MT message data
  502. *
  503. * @return void
  504. ***************************************************************************************************/
  505. void MT_ZdoMatchDescRequest(uint8 *pBuf)
  506. {
  507. uint8 cmdId;
  508. uint8 retValue = 0;
  509. uint8 i, numInClusters, numOutClusters;
  510. uint16 profileId;
  511. zAddrType_t destAddr;
  512. uint16 shortAddr;
  513. uint16 inClusters[MTZDO_MAX_MATCH_CLUSTERS], outClusters[MTZDO_MAX_MATCH_CLUSTERS];
  514. /* parse header */
  515. cmdId = pBuf[MT_RPC_POS_CMD1];
  516. pBuf += MT_RPC_FRAME_HDR_SZ;
  517. /* Dev address */
  518. destAddr.addrMode = Addr16Bit;
  519. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  520. pBuf += 2;
  521. /* Network address of interest */
  522. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  523. pBuf += 2;
  524. /* Profile ID */
  525. profileId = BUILD_UINT16( pBuf[0], pBuf[1] );
  526. pBuf += 2;
  527. /* NumInClusters */
  528. numInClusters = *pBuf++;
  529. if ( numInClusters <= MTZDO_MAX_MATCH_CLUSTERS )
  530. {
  531. /* IN clusters */
  532. for ( i = 0; i < numInClusters; i++ )
  533. {
  534. inClusters[i] = BUILD_UINT16( pBuf[0], pBuf[1]);
  535. pBuf += 2;
  536. }
  537. }
  538. else
  539. {
  540. retValue = ZDP_INVALID_REQTYPE;
  541. }
  542. /* NumOutClusters */
  543. numOutClusters = *pBuf++;
  544. if ( numOutClusters <= MTZDO_MAX_MATCH_CLUSTERS )
  545. {
  546. /* OUT Clusters */
  547. for ( i = 0; i < numOutClusters; i++ )
  548. {
  549. outClusters[i] = BUILD_UINT16( pBuf[0], pBuf[1]);
  550. pBuf += 2;
  551. }
  552. }
  553. else
  554. {
  555. retValue = ZDP_INVALID_REQTYPE;
  556. }
  557. if ( retValue == 0 )
  558. {
  559. retValue = (uint8)ZDP_MatchDescReq( &destAddr, shortAddr, profileId, numInClusters,
  560. inClusters, numOutClusters, outClusters, 0);
  561. }
  562. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  563. }
  564. /***************************************************************************************************
  565. * @fn MT_ZdoComplexDescRequest
  566. *
  567. * @brief Handle a Complex Descriptor request.
  568. *
  569. * @param pBuf - MT message data
  570. *
  571. * @return void
  572. ***************************************************************************************************/
  573. void MT_ZdoComplexDescRequest(uint8 *pBuf)
  574. {
  575. uint8 cmdId;
  576. uint8 retValue;
  577. zAddrType_t destAddr;
  578. uint16 shortAddr;
  579. /* parse header */
  580. cmdId = pBuf[MT_RPC_POS_CMD1];
  581. pBuf += MT_RPC_FRAME_HDR_SZ;
  582. /* Dev address */
  583. destAddr.addrMode = Addr16Bit;
  584. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  585. pBuf += 2;
  586. /* Network address of interest */
  587. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  588. pBuf += 2;
  589. retValue = (uint8)ZDP_ComplexDescReq( &destAddr, shortAddr, 0);
  590. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  591. }
  592. /***************************************************************************************************
  593. * @fn MT_ZdoUserDescRequest
  594. *
  595. * @brief Handle a User Descriptor request.
  596. *
  597. * @param pBuf - MT message data
  598. *
  599. * @return void
  600. ***************************************************************************************************/
  601. void MT_ZdoUserDescRequest(uint8 *pBuf)
  602. {
  603. uint8 cmdId;
  604. uint8 retValue;
  605. zAddrType_t destAddr;
  606. uint16 shortAddr;
  607. /* parse header */
  608. cmdId = pBuf[MT_RPC_POS_CMD1];
  609. pBuf += MT_RPC_FRAME_HDR_SZ;
  610. /* Dev address */
  611. destAddr.addrMode = Addr16Bit;
  612. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
  613. pBuf += 2;
  614. /* Network address of interest */
  615. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
  616. pBuf += 2;
  617. retValue = (uint8)ZDP_UserDescReq( &destAddr, shortAddr, 0);
  618. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  619. }
  620. /***************************************************************************************************
  621. * @fn MT_ZdoEndDevAnnce
  622. *
  623. * @brief Handle a End Device Announce Descriptor request.
  624. *
  625. * @param pBuf - MT message data
  626. *
  627. * @return void
  628. ***************************************************************************************************/
  629. void MT_ZdoEndDevAnnce(uint8 *pBuf)
  630. {
  631. uint8 cmdId;
  632. uint8 retValue;
  633. uint16 shortAddr;
  634. uint8 *pIEEEAddr;
  635. /* parse header */
  636. cmdId = pBuf[MT_RPC_POS_CMD1];
  637. pBuf += MT_RPC_FRAME_HDR_SZ;
  638. /* network address */
  639. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  640. pBuf += 2;
  641. /* extended address */
  642. pIEEEAddr = pBuf;
  643. pBuf += Z_EXTADDR_LEN;
  644. retValue = (uint8)ZDP_DeviceAnnce( shortAddr, pIEEEAddr, *pBuf, 0);
  645. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  646. }
  647. /***************************************************************************************************
  648. * @fn MT_ZdoUserDescSet
  649. *
  650. * @brief Handle a User Descriptor Set.
  651. *
  652. * @param pBuf - MT message data
  653. *
  654. * @return void
  655. ***************************************************************************************************/
  656. void MT_ZdoUserDescSet(uint8 *pBuf)
  657. {
  658. uint8 cmdId;
  659. uint8 retValue;
  660. zAddrType_t destAddr;
  661. uint16 shortAddr;
  662. UserDescriptorFormat_t userDesc;
  663. /* parse header */
  664. cmdId = pBuf[MT_RPC_POS_CMD1];
  665. pBuf += MT_RPC_FRAME_HDR_SZ;
  666. /* Dev address */
  667. destAddr.addrMode = Addr16Bit;
  668. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  669. pBuf += 2;
  670. /* Network address of interest */
  671. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  672. pBuf += 2;
  673. /* User descriptor */
  674. userDesc.len = *pBuf++;
  675. osal_memcpy( userDesc.desc, pBuf, userDesc.len );
  676. pBuf += 16;
  677. retValue = (uint8)ZDP_UserDescSet( &destAddr, shortAddr, &userDesc, 0);
  678. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  679. }
  680. /***************************************************************************************************
  681. * @fn MT_ZdoServiceDiscRequest
  682. *
  683. * @brief Handle a Server Discovery request.
  684. *
  685. * @param pBuf - MT message data
  686. *
  687. * @return void
  688. ***************************************************************************************************/
  689. void MT_ZdoServiceDiscRequest(uint8 *pBuf)
  690. {
  691. uint8 cmdId;
  692. uint8 retValue;
  693. uint16 serviceMask;
  694. /* parse header */
  695. cmdId = pBuf[MT_RPC_POS_CMD1];
  696. pBuf += MT_RPC_FRAME_HDR_SZ;
  697. /* Service Mask */
  698. serviceMask = BUILD_UINT16( pBuf[0], pBuf[1]);
  699. pBuf += 2;
  700. retValue = (uint8)ZDP_ServerDiscReq( serviceMask, 0);
  701. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  702. }
  703. /***************************************************************************************************
  704. * @fn MT_ZdoEndDevBindRequest
  705. *
  706. * @brief Handle a End Device Bind request.
  707. *
  708. * @param pBuf - MT message data
  709. *
  710. * @return void
  711. ***************************************************************************************************/
  712. void MT_ZdoEndDevBindRequest(uint8 *pBuf)
  713. {
  714. uint8 cmdId;
  715. uint8 retValue = 0;
  716. uint8 i, epInt, numInClusters, numOutClusters;
  717. zAddrType_t destAddr;
  718. uint16 shortAddr;
  719. uint16 profileID, inClusters[MTZDO_MAX_ED_BIND_CLUSTERS], outClusters[MTZDO_MAX_ED_BIND_CLUSTERS];
  720. /* parse header */
  721. cmdId = pBuf[MT_RPC_POS_CMD1];
  722. pBuf += MT_RPC_FRAME_HDR_SZ;
  723. /* Dev address */
  724. destAddr.addrMode = Addr16Bit;
  725. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  726. pBuf += 2;
  727. /* Local coordinator of the binding */
  728. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  729. pBuf += 2;
  730. /* For now, skip past the extended address */
  731. pBuf += Z_EXTADDR_LEN;
  732. /* Endpoint */
  733. epInt = *pBuf++;
  734. /* Profile ID */
  735. profileID = BUILD_UINT16( pBuf[0], pBuf[1] );
  736. pBuf += 2;
  737. /* NumInClusters */
  738. numInClusters = *pBuf++;
  739. if ( numInClusters <= MTZDO_MAX_ED_BIND_CLUSTERS )
  740. {
  741. for ( i = 0; i < numInClusters; i++ )
  742. {
  743. inClusters[i] = BUILD_UINT16(pBuf[0], pBuf[1]);
  744. pBuf += 2;
  745. }
  746. }
  747. else
  748. {
  749. retValue = ZDP_INVALID_REQTYPE;
  750. }
  751. /* NumOutClusters */
  752. numOutClusters = *pBuf++;
  753. if ( numOutClusters <= MTZDO_MAX_ED_BIND_CLUSTERS )
  754. {
  755. for ( i = 0; i < numOutClusters; i++ )
  756. {
  757. outClusters[i] = BUILD_UINT16(pBuf[0], pBuf[1]);
  758. pBuf += 2;
  759. }
  760. }
  761. else
  762. {
  763. retValue = ZDP_INVALID_REQTYPE;
  764. }
  765. if ( retValue == 0 )
  766. {
  767. retValue = (uint8)ZDP_EndDeviceBindReq( &destAddr, shortAddr, epInt, profileID,
  768. numInClusters, inClusters, numOutClusters, outClusters, 0);
  769. }
  770. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  771. }
  772. /***************************************************************************************************
  773. * @fn MT_ZdoBindRequest
  774. *
  775. * @brief Handle a Bind request.
  776. *
  777. * @param pBuf - MT message data
  778. *
  779. * @return void
  780. ***************************************************************************************************/
  781. void MT_ZdoBindRequest(uint8 *pBuf)
  782. {
  783. uint8 cmdId;
  784. uint8 retValue;
  785. zAddrType_t destAddr, devAddr;
  786. uint8 *pSrcAddr, *ptr;
  787. uint8 srcEPInt, dstEPInt;
  788. uint16 clusterID;
  789. /* parse header */
  790. cmdId = pBuf[MT_RPC_POS_CMD1];
  791. pBuf += MT_RPC_FRAME_HDR_SZ;
  792. /* Dev address */
  793. destAddr.addrMode = Addr16Bit;
  794. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  795. pBuf += 2;
  796. /* SrcAddress */
  797. pSrcAddr = pBuf;
  798. pBuf += Z_EXTADDR_LEN;
  799. /* SrcEPInt */
  800. srcEPInt = *pBuf++;
  801. /* ClusterID */
  802. clusterID = BUILD_UINT16( pBuf[0], pBuf[1]);
  803. pBuf += 2;
  804. /* Destination Address mode */
  805. devAddr.addrMode = *pBuf++;
  806. /* Destination Address */
  807. if ( devAddr.addrMode == Addr64Bit )
  808. {
  809. ptr = pBuf;
  810. osal_cpyExtAddr( devAddr.addr.extAddr, ptr );
  811. }
  812. else
  813. {
  814. devAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  815. }
  816. /* The short address occupies LSB two bytes */
  817. pBuf += Z_EXTADDR_LEN;
  818. /* DstEPInt */
  819. dstEPInt = *pBuf;
  820. retValue = (uint8)ZDP_BindReq( &destAddr, pSrcAddr, srcEPInt, clusterID, &devAddr, dstEPInt, 0);
  821. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  822. }
  823. /***************************************************************************************************
  824. * @fn MT_ZdoUnbindRequest
  825. *
  826. * @brief Handle a Unbind request.
  827. *
  828. * @param pBuf - MT message data
  829. *
  830. * @return void
  831. ***************************************************************************************************/
  832. void MT_ZdoUnbindRequest(uint8 *pBuf)
  833. {
  834. uint8 cmdId;
  835. uint8 retValue;
  836. zAddrType_t destAddr, devAddr;
  837. uint8 *pSrcAddr, *ptr;
  838. uint8 srcEPInt, dstEPInt;
  839. uint16 clusterID;
  840. /* parse header */
  841. cmdId = pBuf[MT_RPC_POS_CMD1];
  842. pBuf += MT_RPC_FRAME_HDR_SZ;
  843. /* dev address */
  844. destAddr.addrMode = Addr16Bit;
  845. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  846. pBuf += 2;
  847. /* SrcAddress */
  848. pSrcAddr = pBuf;
  849. pBuf += Z_EXTADDR_LEN;
  850. /* SrcEPInt */
  851. srcEPInt = *pBuf++;
  852. /* ClusterID */
  853. clusterID = BUILD_UINT16( pBuf[0], pBuf[1]);
  854. pBuf += 2;
  855. /* Destination Address mode */
  856. devAddr.addrMode = *pBuf++;
  857. /* Destination Address */
  858. if ( devAddr.addrMode == Addr64Bit )
  859. {
  860. ptr = pBuf;
  861. osal_cpyExtAddr( devAddr.addr.extAddr, ptr );
  862. }
  863. else
  864. {
  865. devAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  866. }
  867. /* The short address occupies LSB two bytes */
  868. pBuf += Z_EXTADDR_LEN;
  869. /* dstEPInt */
  870. dstEPInt = *pBuf;
  871. retValue = (uint8)ZDP_UnbindReq( &destAddr, pSrcAddr, srcEPInt, clusterID, &devAddr, dstEPInt, 0);
  872. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  873. }
  874. #if defined (MT_SYS_KEY_MANAGEMENT)
  875. /***************************************************************************************************
  876. * @fn MT_ZdoSetLinkKey
  877. *
  878. * @brief Set an application or trust center link key.
  879. *
  880. * @param pBuf - MT message data
  881. *
  882. * @return void
  883. ***************************************************************************************************/
  884. void MT_ZdoSetLinkKey(uint8 *pBuf)
  885. {
  886. uint8 cmdId;
  887. uint8 retValue;
  888. uint8 *pExtAddr;
  889. uint8 *pKey;
  890. uint16 shortAddr;
  891. /* parse header */
  892. cmdId = pBuf[MT_RPC_POS_CMD1];
  893. pBuf += MT_RPC_FRAME_HDR_SZ;
  894. /* ShortAddr */
  895. shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  896. pBuf += 2;
  897. /* Extended Addr */
  898. pExtAddr = pBuf;
  899. pBuf += Z_EXTADDR_LEN;
  900. /* Key data */
  901. pKey = pBuf;
  902. retValue = (uint8)ZDSecMgrAddLinkKey( shortAddr, pExtAddr, pKey);
  903. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  904. }
  905. /***************************************************************************************************
  906. * @fn MT_ZdoRemoveLinkKey
  907. *
  908. * @brief Remove an application or trust center link key.
  909. *
  910. * @param pBuf - MT message data
  911. *
  912. * @return void
  913. ***************************************************************************************************/
  914. void MT_ZdoRemoveLinkKey(uint8 *pBuf)
  915. {
  916. uint8 cmdId;
  917. uint8 retValue;
  918. uint8 *pExtAddr;
  919. /* parse header */
  920. cmdId = pBuf[MT_RPC_POS_CMD1];
  921. pBuf += MT_RPC_FRAME_HDR_SZ;
  922. /* ShortAddr */
  923. pExtAddr = pBuf;
  924. retValue = ZDSecMgrDeviceRemoveByExtAddr( pExtAddr );
  925. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  926. }
  927. /***************************************************************************************************
  928. * @fn MT_ZdoGetLinkKey
  929. *
  930. * @brief Get the application link key.
  931. *
  932. * @param pBuf - MT message data
  933. *
  934. * @return void
  935. ***************************************************************************************************/
  936. void MT_ZdoGetLinkKey(uint8 *pBuf)
  937. {
  938. uint8 cmdId;
  939. uint8 retValue;
  940. uint8 *pExtAddr;
  941. uint8 *retBuf = NULL;
  942. uint8 len;
  943. APSME_LinkKeyData_t *pApsLinkKey = NULL;
  944. uint16 apsLinkKeyNvId;
  945. // parse header
  946. cmdId = pBuf[MT_RPC_POS_CMD1];
  947. pBuf += MT_RPC_FRAME_HDR_SZ;
  948. // Extended Address
  949. pExtAddr = pBuf;
  950. // Fetch the key NV ID
  951. retValue = APSME_LinkKeyNVIdGet( pExtAddr, &apsLinkKeyNvId );
  952. if (retValue == ZSuccess)
  953. {
  954. if ((pApsLinkKey = (APSME_LinkKeyData_t *)osal_mem_alloc(sizeof(APSME_LinkKeyData_t))) != NULL)
  955. {
  956. // retrieve key from NV
  957. if (osal_nv_read( apsLinkKeyNvId, 0,
  958. sizeof(APSME_LinkKeyData_t), pApsLinkKey) != SUCCESS)
  959. {
  960. retValue = ZNwkUnknownDevice;
  961. }
  962. }
  963. else
  964. {
  965. retValue = ZNwkUnknownDevice;
  966. }
  967. }
  968. // Construct the response message
  969. len = MT_ZDO_STATUS_LEN + Z_EXTADDR_LEN + SEC_KEY_LEN; // status + extAddr + key
  970. if ((retBuf = (uint8 *)osal_mem_alloc(len)) != NULL)
  971. {
  972. if (retValue == ZSuccess)
  973. {
  974. // Extended Address
  975. osal_memcpy( &(retBuf[1]), pExtAddr, Z_EXTADDR_LEN );
  976. // Key data
  977. osal_memcpy( &(retBuf[1 + Z_EXTADDR_LEN]), pApsLinkKey->key, SEC_KEY_LEN );
  978. }
  979. else
  980. {
  981. // Failed case - set the rest fields to all FF
  982. osal_memset( &(retBuf[1]), 0xFF, Z_EXTADDR_LEN + SEC_KEY_LEN );
  983. }
  984. retBuf[0] = retValue; // Status
  985. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, len, retBuf);
  986. // clear retBuf because it contains key data and free allocated memory
  987. osal_memset(retBuf, 0x00, len);
  988. osal_mem_free(retBuf);
  989. }
  990. // clear copy of key in RAM
  991. if (pApsLinkKey != NULL)
  992. {
  993. osal_memset(pApsLinkKey, 0x00, sizeof(APSME_LinkKeyData_t));
  994. osal_mem_free(pApsLinkKey);
  995. }
  996. return;
  997. }
  998. #endif // MT_SYS_KEY_MANAGEMENT
  999. #if defined (MT_ZDO_MGMT)
  1000. /***************************************************************************************************
  1001. * @fn MT_ZdoMgmtNwkDiscRequest
  1002. *
  1003. * @brief Handle a Mgmt Nwk Discovery request.
  1004. *
  1005. * @param pBuf - MT message data
  1006. *
  1007. * @return void
  1008. ***************************************************************************************************/
  1009. void MT_ZdoMgmtNwkDiscRequest(uint8 *pBuf)
  1010. {
  1011. uint8 cmdId;
  1012. uint8 retValue;
  1013. zAddrType_t destAddr;
  1014. uint32 scanChannels;
  1015. uint8 scanDuration, startIndex;
  1016. /* parse header */
  1017. cmdId = pBuf[MT_RPC_POS_CMD1];
  1018. pBuf += MT_RPC_FRAME_HDR_SZ;
  1019. /* Dev address */
  1020. destAddr.addrMode = Addr16Bit;
  1021. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1022. pBuf += 2;
  1023. /* Scan Channels */
  1024. scanChannels = BUILD_UINT32( pBuf[0], pBuf[1], pBuf[2], pBuf[3] );
  1025. pBuf += 4;
  1026. /* Scan Duration */
  1027. scanDuration = *pBuf++;
  1028. /* Start Index */
  1029. startIndex = *pBuf;
  1030. retValue = (uint8)ZDP_MgmtNwkDiscReq( &destAddr, scanChannels, scanDuration, startIndex, 0);
  1031. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1032. }
  1033. /***************************************************************************************************
  1034. * @fn MT_ZdoMgmtLqiRequest
  1035. *
  1036. * @brief Handle a Mgmt Lqi request.
  1037. *
  1038. * @param pBuf - MT message data
  1039. *
  1040. * @return void
  1041. ***************************************************************************************************/
  1042. void MT_ZdoMgmtLqiRequest(uint8 *pBuf)
  1043. {
  1044. uint8 cmdId;
  1045. uint8 retValue;
  1046. zAddrType_t destAddr;
  1047. uint8 startIndex;
  1048. /* parse header */
  1049. cmdId = pBuf[MT_RPC_POS_CMD1];
  1050. pBuf += MT_RPC_FRAME_HDR_SZ;
  1051. /* Dev address */
  1052. destAddr.addrMode = Addr16Bit;
  1053. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1054. pBuf += 2;
  1055. /* Start Index */
  1056. startIndex = *pBuf;
  1057. retValue = (uint8)ZDP_MgmtLqiReq( &destAddr, startIndex, 0);
  1058. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1059. }
  1060. /***************************************************************************************************
  1061. * @fn MT_ZdoMgmtRtgRequest
  1062. *
  1063. * @brief Handle a Mgmt Rtg request.
  1064. *
  1065. * @param pBuf - MT message data
  1066. *
  1067. * @return void
  1068. ***************************************************************************************************/
  1069. void MT_ZdoMgmtRtgRequest(uint8 *pBuf)
  1070. {
  1071. uint8 cmdId;
  1072. uint8 retValue;
  1073. zAddrType_t destAddr;
  1074. uint8 startIndex;
  1075. /* parse header */
  1076. cmdId = pBuf[MT_RPC_POS_CMD1];
  1077. pBuf += MT_RPC_FRAME_HDR_SZ;
  1078. /* Dev Address */
  1079. destAddr.addrMode = Addr16Bit;
  1080. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1]);
  1081. pBuf += 2;
  1082. /* Start Index */
  1083. startIndex = *pBuf;
  1084. retValue = (byte)ZDP_MgmtRtgReq( &destAddr, startIndex, 0);
  1085. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1086. }
  1087. /***************************************************************************************************
  1088. * @fn MT_ZdoMgmtBindRequest
  1089. *
  1090. * @brief Handle a Mgmt Bind request.
  1091. *
  1092. * @param pBuf - MT message data
  1093. *
  1094. * @return void
  1095. ***************************************************************************************************/
  1096. void MT_ZdoMgmtBindRequest(uint8 *pBuf)
  1097. {
  1098. uint8 cmdId;
  1099. uint8 retValue;
  1100. zAddrType_t destAddr;
  1101. uint8 startIndex;
  1102. /* parse header */
  1103. cmdId = pBuf[MT_RPC_POS_CMD1];
  1104. pBuf += MT_RPC_FRAME_HDR_SZ;
  1105. /* Dev Address */
  1106. destAddr.addrMode = Addr16Bit;
  1107. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1108. pBuf += 2;
  1109. /* Start Index */
  1110. startIndex = *pBuf;
  1111. retValue = (uint8)ZDP_MgmtBindReq( &destAddr, startIndex, 0);
  1112. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1113. }
  1114. /***************************************************************************************************
  1115. * @fn MT_ZdoMgmtLeaveRequest
  1116. *
  1117. * @brief Handle a Mgmt Leave request.
  1118. *
  1119. * @param pBuf - MT message data
  1120. *
  1121. * @return void
  1122. ***************************************************************************************************/
  1123. void MT_ZdoMgmtLeaveRequest(uint8 *pBuf)
  1124. {
  1125. uint8 cmdId;
  1126. uint8 retValue;
  1127. zAddrType_t destAddr;
  1128. uint8 *pIEEEAddr;
  1129. uint8 removeChildren, rejoin;
  1130. /* parse header */
  1131. cmdId = pBuf[MT_RPC_POS_CMD1];
  1132. pBuf += MT_RPC_FRAME_HDR_SZ;
  1133. /* Destination Address */
  1134. destAddr.addrMode = Addr16Bit;
  1135. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1136. pBuf += 2;
  1137. /* IEEE address */
  1138. pIEEEAddr = pBuf;
  1139. pBuf += Z_EXTADDR_LEN;
  1140. /* Remove Children */
  1141. removeChildren = *pBuf++;
  1142. /* Rejoin */
  1143. rejoin = *pBuf;
  1144. retValue = (byte)ZDP_MgmtLeaveReq( &destAddr, pIEEEAddr, removeChildren, rejoin, 0);
  1145. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1146. }
  1147. /***************************************************************************************************
  1148. * @fn MT_ZdoMgmtDirectJoinRequest
  1149. *
  1150. * @brief Handle a Mgmt Direct Join request.
  1151. *
  1152. * @param pBuf - MT message data
  1153. *
  1154. * @return void
  1155. ***************************************************************************************************/
  1156. void MT_ZdoMgmtDirectJoinRequest(uint8 *pBuf)
  1157. {
  1158. uint8 cmdId;
  1159. uint8 retValue;
  1160. zAddrType_t destAddr;
  1161. uint8 *deviceAddr;
  1162. uint8 capInfo;
  1163. /* parse header */
  1164. cmdId = pBuf[MT_RPC_POS_CMD1];
  1165. pBuf += MT_RPC_FRAME_HDR_SZ;
  1166. /* Destination Address */
  1167. destAddr.addrMode = Addr16Bit;
  1168. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1169. pBuf += 2;
  1170. /* Device Address */
  1171. deviceAddr = pBuf;
  1172. pBuf += Z_EXTADDR_LEN;
  1173. /* Capability information */
  1174. capInfo = *pBuf;
  1175. retValue = (uint8)ZDP_MgmtDirectJoinReq( &destAddr, deviceAddr, capInfo, 0);
  1176. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1177. }
  1178. /***************************************************************************************************
  1179. * @fn MT_ZdoMgmtPermitJoinRequest
  1180. *
  1181. * @brief Handle a Mgmt Permit Join request.
  1182. *
  1183. * @param pBuf - MT message data
  1184. *
  1185. * @return void
  1186. ***************************************************************************************************/
  1187. void MT_ZdoMgmtPermitJoinRequest(uint8 *pBuf)
  1188. {
  1189. uint8 cmdId;
  1190. uint8 retValue;
  1191. zAddrType_t destAddr;
  1192. uint8 duration, tcSignificance;
  1193. /* parse header */
  1194. cmdId = pBuf[MT_RPC_POS_CMD1];
  1195. pBuf += MT_RPC_FRAME_HDR_SZ;
  1196. /* Destination Address */
  1197. destAddr.addrMode = Addr16Bit;
  1198. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1199. pBuf += 2;
  1200. /* Duration */
  1201. duration = *pBuf++;
  1202. /* Trust center significance */
  1203. tcSignificance = *pBuf;
  1204. retValue = (byte)ZDP_MgmtPermitJoinReq( &destAddr, duration, tcSignificance, 0);
  1205. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1206. }
  1207. /***************************************************************************************************
  1208. * @fn MT_ZdoMgmtNwkUpdateRequest
  1209. *
  1210. * @brief Handle a Mgmt Nwk Update request.
  1211. *
  1212. * @param pBuf - MT message data
  1213. *
  1214. * @return void
  1215. ***************************************************************************************************/
  1216. void MT_ZdoMgmtNwkUpdateRequest(uint8 *pBuf)
  1217. {
  1218. uint8 cmdId;
  1219. uint8 retValue;
  1220. zAddrType_t destAddr;
  1221. uint32 channelMask;
  1222. uint8 scanDuration, scanCount;
  1223. uint16 nwkManagerAddr;
  1224. /* parse header */
  1225. cmdId = pBuf[MT_RPC_POS_CMD1];
  1226. pBuf += MT_RPC_FRAME_HDR_SZ;
  1227. /* Destination address */
  1228. destAddr.addr.shortAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1229. pBuf += 2;
  1230. /* Destination address mode */
  1231. destAddr.addrMode = *pBuf++;
  1232. channelMask = BUILD_UINT32( pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
  1233. pBuf += 4;
  1234. /* Scan duration */
  1235. scanDuration = *pBuf++;
  1236. /* Scan count */
  1237. scanCount = *pBuf++;
  1238. /* NWK manager address */
  1239. nwkManagerAddr = BUILD_UINT16( pBuf[0], pBuf[1] );
  1240. /* Send the Management Network Update request */
  1241. retValue = (uint8)ZDP_MgmtNwkUpdateReq( &destAddr, channelMask, scanDuration,
  1242. scanCount, _NIB.nwkUpdateId+1, nwkManagerAddr );
  1243. /*
  1244. Since we don't recevied our own broadcast messages, we should
  1245. send a unicast copy of the message to ourself.
  1246. */
  1247. if ( destAddr.addrMode == AddrBroadcast )
  1248. {
  1249. destAddr.addrMode = Addr16Bit;
  1250. destAddr.addr.shortAddr = _NIB.nwkDevAddress;
  1251. retValue = (uint8) ZDP_MgmtNwkUpdateReq( &destAddr, channelMask, scanDuration,
  1252. scanCount, _NIB.nwkUpdateId+1, nwkManagerAddr );
  1253. }
  1254. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue);
  1255. }
  1256. #endif /* MT_ZDO_MGMT */
  1257. /***************************************************************************************************
  1258. * @fn MT_ZdoStartupFromApp
  1259. *
  1260. * @brief Handle a Startup from App request.
  1261. *
  1262. * @param pBuf - MT message data
  1263. *
  1264. * @return void
  1265. ***************************************************************************************************/
  1266. void MT_ZdoStartupFromApp(uint8 *pBuf)
  1267. {
  1268. uint8 cmd0, cmd1, retValue;
  1269. /* parse header */
  1270. cmd0 = pBuf[MT_RPC_POS_CMD0];
  1271. cmd1 = pBuf[MT_RPC_POS_CMD1];
  1272. pBuf += MT_RPC_FRAME_HDR_SZ;
  1273. retValue = ZDOInitDevice(100);
  1274. if (MT_RPC_CMD_SREQ == (cmd0 & MT_RPC_CMD_TYPE_MASK))
  1275. {
  1276. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP|(uint8)MT_RPC_SYS_ZDO), cmd1,1, &retValue);
  1277. }
  1278. }
  1279. /***************************************************************************************************
  1280. * @fn MT_ZdoNetworkDiscoveryReq
  1281. *
  1282. * @brief Handle a ZDO Network Discovery request.
  1283. *
  1284. * @param pBuf - MT message data
  1285. *
  1286. * @return void
  1287. ***************************************************************************************************/
  1288. void MT_ZdoNetworkDiscoveryReq(uint8 *pBuf)
  1289. {
  1290. uint8 retValue = ZFailure;
  1291. uint8 cmdId;
  1292. uint32 scanChannels;
  1293. /* parse header */
  1294. cmdId = pBuf[MT_RPC_POS_CMD1];
  1295. pBuf += MT_RPC_FRAME_HDR_SZ;
  1296. /* Packet format */
  1297. /* scan channels (4) | scan duration (1) */
  1298. /* Scan channels */
  1299. scanChannels = osal_build_uint32(pBuf, 4);
  1300. pBuf += 4;
  1301. retValue = ZDApp_NetworkDiscoveryReq(scanChannels, *pBuf);
  1302. // Register ZDO callback for MT to handle the network discovery confirm
  1303. // and beacon notification confirm
  1304. ZDO_RegisterForZdoCB( ZDO_NWK_DISCOVERY_CNF_CBID, &MT_ZdoNwkDiscoveryCnfCB );
  1305. ZDO_RegisterForZdoCB( ZDO_BEACON_NOTIFY_IND_CBID, &MT_ZdoBeaconIndCB );
  1306. /* Build and send back the response */
  1307. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue );
  1308. }
  1309. /***************************************************************************************************
  1310. * @fn MT_ZdoJoinReq
  1311. *
  1312. * @brief Handle a ZDO Join request.
  1313. *
  1314. * @param pBuf - MT message data
  1315. *
  1316. * @return void
  1317. ***************************************************************************************************/
  1318. void MT_ZdoJoinReq(uint8 *pBuf)
  1319. {
  1320. uint8 retValue = ZFailure;
  1321. uint8 cmdId;
  1322. uint16 panId;
  1323. uint16 chosenParent;
  1324. /* parse header */
  1325. cmdId = pBuf[MT_RPC_POS_CMD1];
  1326. pBuf += MT_RPC_FRAME_HDR_SZ;
  1327. /* Packet format */
  1328. /* channel (1) | panID (2) | extendedPanID (8) | chosenParent (2) |
  1329. * parentDepth (1) | stackProfile (1)
  1330. */
  1331. panId = BUILD_UINT16(pBuf[1], pBuf[2]);
  1332. chosenParent = BUILD_UINT16(pBuf[11], pBuf[12]);
  1333. retValue = ZDApp_JoinReq(pBuf[0], panId, &(pBuf[3]), chosenParent, pBuf[13], pBuf[14]);
  1334. /* Register for MT to receive Join Confirm */
  1335. ZDO_RegisterForZdoCB( ZDO_JOIN_CNF_CBID, &MT_ZdoJoinCnfCB );
  1336. /* Build and send back the response */
  1337. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_ZDO), cmdId, 1, &retValue );
  1338. }
  1339. /***************************************************************************************************
  1340. * @fn MT_ZdoNwkDiscoveryCnfCB
  1341. *
  1342. * @brief Send an indication to inform host device the completion of
  1343. * network discovery scan
  1344. *
  1345. * @param pStr - pointer to a parameter and a structure of parameters
  1346. *
  1347. * @return void
  1348. ***************************************************************************************************/
  1349. void *MT_ZdoNwkDiscoveryCnfCB ( void *pStr )
  1350. {
  1351. /* pStr: status (uint8) */
  1352. /* Packet Format */
  1353. /* Status (1) */
  1354. // Scan completed. De-register the callback with ZDO
  1355. ZDO_DeregisterForZdoCB( ZDO_NWK_DISCOVERY_CNF_CBID );
  1356. ZDO_DeregisterForZdoCB( ZDO_BEACON_NOTIFY_IND_CBID );
  1357. // Send the buffered beacon indication
  1358. MT_ZdoBeaconIndCB ( NULL );
  1359. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1360. MT_ZDO_NWK_DISCOVERY_CNF, 1, pStr);
  1361. return NULL;
  1362. }
  1363. /***************************************************************************************************
  1364. * @fn MT_ZdoBeaconIndCB
  1365. *
  1366. * @brief Send an indication to host device of a beacon notification
  1367. *
  1368. * @param pStr - pointer to a parameter and a structure of parameters
  1369. *
  1370. * @return void
  1371. ***************************************************************************************************/
  1372. void *MT_ZdoBeaconIndCB ( void *pStr )
  1373. {
  1374. zdoBeaconInd_t *pBeacon = pStr;
  1375. uint8 *pTmp;
  1376. /* Packet Format */
  1377. /* devCnt (1) | device #1 (21) | device #2 (21) |... | device #n (21) */
  1378. if( pStr != NULL)
  1379. {
  1380. if( pBeaconIndBuf == NULL )
  1381. {
  1382. // If pBeaconIndBuf has not been allocated yet
  1383. // allocate memory now with MAX_UART_TX_BUFF
  1384. if( NULL == (pBeaconIndBuf = (uint8 *)osal_mem_alloc(MT_ZDO_BEACON_IND_PACK_LEN)))
  1385. {
  1386. // Memory failure
  1387. return NULL;
  1388. }
  1389. pBeaconIndBuf[0] = 0; // First byte is devCnt. Initialize to 0.
  1390. }
  1391. // Fill in the buffer with the beacon indication
  1392. pTmp = pBeaconIndBuf + (1 + pBeaconIndBuf[0] * MT_ZDO_BEACON_IND_LEN);
  1393. *pTmp++ = LO_UINT16(pBeacon->sourceAddr);
  1394. *pTmp++ = HI_UINT16(pBeacon->sourceAddr);
  1395. *pTmp++ = LO_UINT16(pBeacon->panID);
  1396. *pTmp++ = HI_UINT16(pBeacon->panID);
  1397. *pTmp++ = pBeacon->logicalChannel;
  1398. *pTmp++ = pBeacon->permitJoining;
  1399. *pTmp++ = pBeacon->routerCapacity;
  1400. *pTmp++ = pBeacon->deviceCapacity;
  1401. *pTmp++ = pBeacon->protocolVersion;
  1402. *pTmp++ = pBeacon->stackProfile;
  1403. *pTmp++ = pBeacon->LQI;
  1404. *pTmp++ = pBeacon->depth;
  1405. *pTmp++ = pBeacon->updateID;
  1406. osal_memcpy( pTmp, pBeacon->extendedPanID, Z_EXTADDR_LEN);
  1407. pBeaconIndBuf[0] += 1; // Increment the devCnt
  1408. // Check if the buffer can fit in another beacon
  1409. if( ((pBeaconIndBuf[0] + 1) * MT_ZDO_BEACON_IND_LEN + 1) > MT_ZDO_BEACON_IND_PACK_LEN )
  1410. {
  1411. // Packet full, send the packet over MT
  1412. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1413. MT_ZDO_BEACON_NOTIFY_IND,
  1414. (pBeaconIndBuf[0] * MT_ZDO_BEACON_IND_LEN + 1), pBeaconIndBuf);
  1415. pBeaconIndBuf[0] = 0; // Reset the devCnt back to zero
  1416. }
  1417. }
  1418. else
  1419. {
  1420. if( (pBeaconIndBuf != NULL) && (pBeaconIndBuf[0] != 0) )
  1421. {
  1422. // End of beacon indication, send the packet over MT
  1423. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1424. MT_ZDO_BEACON_NOTIFY_IND,
  1425. (pBeaconIndBuf[0] * MT_ZDO_BEACON_IND_LEN + 1), pBeaconIndBuf);
  1426. }
  1427. // Free the allocated memory
  1428. if(pBeaconIndBuf != NULL)
  1429. {
  1430. osal_mem_free(pBeaconIndBuf);
  1431. pBeaconIndBuf = NULL;
  1432. }
  1433. }
  1434. return NULL;
  1435. }
  1436. /***************************************************************************************************
  1437. * @fn MT_ZdoJoinCnfCB
  1438. *
  1439. * @brief Handle the ZDO Join Confirm from ZDO
  1440. *
  1441. * @param pStr - pointer to a parameter and a structure of parameters
  1442. *
  1443. * @return void
  1444. ***************************************************************************************************/
  1445. void *MT_ZdoJoinCnfCB ( void *pStr )
  1446. {
  1447. /* pStr: zdoJoinCnf_t* */
  1448. /* Packet Format */
  1449. /* Status (1) | device addr (2) | parent addr (2) */
  1450. uint8 buf[MT_ZDO_JOIN_CNF_LEN];
  1451. zdoJoinCnf_t *joinCnf = pStr;
  1452. /* Join Complete. De-register the callback with ZDO */
  1453. ZDO_DeregisterForZdoCB( ZDO_JOIN_CNF_CBID );
  1454. buf[0] = joinCnf->status;
  1455. buf[1] = LO_UINT16( joinCnf->deviceAddr );
  1456. buf[2] = HI_UINT16( joinCnf->deviceAddr );
  1457. buf[3] = LO_UINT16( joinCnf->parentAddr );
  1458. buf[4] = HI_UINT16( joinCnf->parentAddr );
  1459. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1460. MT_ZDO_JOIN_CNF, MT_ZDO_JOIN_CNF_LEN, buf);
  1461. return NULL;
  1462. }
  1463. /*************************************************************************************************
  1464. * @fn MT_ZdoRegisterForZDOMsg(pBuf);
  1465. *
  1466. * @brief MT proxy for ZDO_RegisterForZDOMsg.
  1467. *
  1468. * @param pBuf - MT message data
  1469. *
  1470. * @return void
  1471. *************************************************************************************************/
  1472. void MT_ZdoRegisterForZDOMsg(uint8 *pBuf)
  1473. {
  1474. uint8 cmd0, cmd1, tmp;
  1475. uint16 cId;
  1476. /* parse header */
  1477. cmd0 = pBuf[MT_RPC_POS_CMD0];
  1478. cmd1 = pBuf[MT_RPC_POS_CMD1];
  1479. pBuf += MT_RPC_FRAME_HDR_SZ;
  1480. cId = BUILD_UINT16(pBuf[0], pBuf[1]);
  1481. tmp = ZDO_RegisterForZDOMsg(MT_TaskID, cId);
  1482. if (MT_RPC_CMD_SREQ == (cmd0 & MT_RPC_CMD_TYPE_MASK))
  1483. {
  1484. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP|(uint8)MT_RPC_SYS_ZDO), cmd1, 1, &tmp);
  1485. }
  1486. }
  1487. /*************************************************************************************************
  1488. * @fn MT_ZdoRemoveRegisteredCB(pBuf);
  1489. *
  1490. * @brief MT proxy for ZDO_RemoveRegisteredCB.
  1491. *
  1492. * @param pBuf - MT message data
  1493. *
  1494. * @return void
  1495. *************************************************************************************************/
  1496. void MT_ZdoRemoveRegisteredCB(uint8 *pBuf)
  1497. {
  1498. uint8 cmd0, cmd1, tmp;
  1499. uint16 cId;
  1500. /* parse header */
  1501. cmd0 = pBuf[MT_RPC_POS_CMD0];
  1502. cmd1 = pBuf[MT_RPC_POS_CMD1];
  1503. pBuf += MT_RPC_FRAME_HDR_SZ;
  1504. cId = BUILD_UINT16(pBuf[0], pBuf[1]);
  1505. tmp = ZDO_RemoveRegisteredCB(MT_TaskID, cId);
  1506. if (MT_RPC_CMD_SREQ == (cmd0 & MT_RPC_CMD_TYPE_MASK))
  1507. {
  1508. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP|(uint8)MT_RPC_SYS_ZDO), cmd1, 1, &tmp);
  1509. }
  1510. }
  1511. #endif /* MT_ZDO_FUNC */
  1512. /***************************************************************************************************
  1513. * Callback handling function
  1514. ***************************************************************************************************/
  1515. #if defined (MT_ZDO_CB_FUNC)
  1516. /***************************************************************************************************
  1517. * @fn MT_ZdoStateChangeCB
  1518. *
  1519. * @brief Handle state change OSAL message from ZDO.
  1520. *
  1521. * @param pMsg - Message data
  1522. *
  1523. * @return void
  1524. */
  1525. void MT_ZdoStateChangeCB(osal_event_hdr_t *pMsg)
  1526. {
  1527. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1528. MT_ZDO_STATE_CHANGE_IND, 1, &pMsg->status);
  1529. }
  1530. /***************************************************************************************************
  1531. * @fn MT_ZdoDirectCB()
  1532. *
  1533. * @brief ZDO direct callback. Build an MT message directly from the
  1534. * over-the-air ZDO message.
  1535. *
  1536. * @param pData - Incoming AF frame.
  1537. *
  1538. * @return none
  1539. ***************************************************************************************************/
  1540. void MT_ZdoDirectCB( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg )
  1541. {
  1542. uint8 len, *pBuf;
  1543. uint16 origClusterId;
  1544. // save original value because MT_ZdoHandleExceptions() function could modify pData->clusterId
  1545. origClusterId = pData->clusterId;
  1546. // Is the message an exception or not a response?
  1547. if ( MT_ZdoHandleExceptions( pData, inMsg ) || ( (origClusterId & ZDO_RESPONSE_BIT) == 0 ) )
  1548. {
  1549. return; // Handled somewhere else or not needed.
  1550. }
  1551. /* ZDO data starts after one-byte sequence number and the msg buffer length includes
  1552. * two bytes for srcAddr.
  1553. */
  1554. len = pData->cmd.DataLength - 1 + sizeof(uint16);
  1555. if (NULL != (pBuf = (uint8 *)osal_mem_alloc(len)))
  1556. {
  1557. uint8 id = MT_ZDO_CID_TO_AREQ_ID(pData->clusterId);
  1558. pBuf[0] = LO_UINT16(pData->srcAddr.addr.shortAddr);
  1559. pBuf[1] = HI_UINT16(pData->srcAddr.addr.shortAddr);
  1560. /* copy ZDO data, skipping one-byte sequence number */
  1561. osal_memcpy(pBuf+2, (pData->cmd.Data + 1), pData->cmd.DataLength-1);
  1562. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO), id, len, pBuf);
  1563. osal_mem_free(pBuf);
  1564. }
  1565. }
  1566. /***************************************************************************************************
  1567. * @fn MT_ZdoHandleExceptions()
  1568. *
  1569. * @brief Handles all messages that are an exception to the generic MT ZDO Response.
  1570. *
  1571. * @param pData - Incoming AF frame.
  1572. *
  1573. * @return TRUE if handled by this function, FALSE if not
  1574. ***************************************************************************************************/
  1575. uint8 MT_ZdoHandleExceptions( afIncomingMSGPacket_t *pData, zdoIncomingMsg_t *inMsg )
  1576. {
  1577. uint8 ret = TRUE;
  1578. ZDO_NwkIEEEAddrResp_t *nwkRsp;
  1579. ZDO_DeviceAnnce_t devAnnce;
  1580. uint8 doDefault = FALSE;
  1581. switch ( inMsg->clusterID )
  1582. {
  1583. case NWK_addr_rsp:
  1584. case IEEE_addr_rsp:
  1585. if ( NULL != (nwkRsp = ZDO_ParseAddrRsp(inMsg)) )
  1586. {
  1587. if ( nwkRsp->status == ZDO_SUCCESS )
  1588. {
  1589. MT_ZdoAddrRspCB( nwkRsp, inMsg->clusterID );
  1590. }
  1591. osal_mem_free( nwkRsp );
  1592. }
  1593. break;
  1594. case Device_annce:
  1595. ZDO_ParseDeviceAnnce( inMsg, &devAnnce );
  1596. MT_ZdoEndDevAnnceCB( &devAnnce, inMsg->srcAddr.addr.shortAddr );
  1597. break;
  1598. case Simple_Desc_rsp:
  1599. if ( pData->cmd.DataLength > 5 )
  1600. {
  1601. ret = FALSE;
  1602. }
  1603. else
  1604. {
  1605. doDefault = TRUE;
  1606. }
  1607. break;
  1608. default:
  1609. ret = FALSE;
  1610. break;
  1611. }
  1612. if ( doDefault )
  1613. {
  1614. ret = FALSE;
  1615. pData->clusterId = MtZdoDef_rsp;
  1616. pData->cmd.DataLength = 2;
  1617. }
  1618. return ( ret );
  1619. }
  1620. /***************************************************************************************************
  1621. * @fn MT_ZdoAddrRspCB
  1622. *
  1623. * @brief Handle IEEE or nwk address response OSAL message from ZDO.
  1624. *
  1625. * @param pMsg - Message data
  1626. *
  1627. * @return void
  1628. */
  1629. void MT_ZdoAddrRspCB( ZDO_NwkIEEEAddrResp_t *pMsg, uint16 clusterID )
  1630. {
  1631. uint8 listLen, len, *pBuf;
  1632. /* both ZDO_NwkAddrResp_t and ZDO_IEEEAddrResp_t must be the same */
  1633. /* get length, sanity check length */
  1634. listLen = pMsg->numAssocDevs;
  1635. /* calculate msg length */
  1636. len = MT_ZDO_ADDR_RSP_LEN + (listLen * sizeof(uint16));
  1637. /* get buffer */
  1638. if (NULL != (pBuf = (uint8 *)osal_mem_alloc(len)))
  1639. {
  1640. uint8 id = MT_ZDO_CID_TO_AREQ_ID(clusterID);
  1641. uint8 *pTmp = pBuf;
  1642. *pTmp++ = pMsg->status;
  1643. osal_cpyExtAddr(pTmp, pMsg->extAddr);
  1644. pTmp += Z_EXTADDR_LEN;
  1645. *pTmp++ = LO_UINT16(pMsg->nwkAddr);
  1646. *pTmp++ = HI_UINT16(pMsg->nwkAddr);
  1647. *pTmp++ = pMsg->startIndex;
  1648. *pTmp++ = listLen;
  1649. MT_Word2Buf(pTmp, pMsg->devList, listLen);
  1650. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO), id, len, pBuf);
  1651. osal_mem_free(pBuf);
  1652. }
  1653. }
  1654. /***************************************************************************************************
  1655. * @fn MT_ZdoEndDevAnnceCB
  1656. *
  1657. * @brief Handle end device announce OSAL message from ZDO.
  1658. *
  1659. * @param pMsg - Message data
  1660. *
  1661. * @return void
  1662. */
  1663. void MT_ZdoEndDevAnnceCB( ZDO_DeviceAnnce_t *pMsg, uint16 srcAddr )
  1664. {
  1665. uint8 *pBuf;
  1666. if (NULL != (pBuf = (uint8 *)osal_mem_alloc(MT_ZDO_END_DEVICE_ANNCE_IND_LEN)))
  1667. {
  1668. uint8 *pTmp = pBuf;
  1669. *pTmp++ = LO_UINT16(srcAddr);
  1670. *pTmp++ = HI_UINT16(srcAddr);
  1671. *pTmp++ = LO_UINT16(pMsg->nwkAddr);
  1672. *pTmp++ = HI_UINT16(pMsg->nwkAddr);
  1673. osal_cpyExtAddr(pTmp, pMsg->extAddr);
  1674. pTmp += Z_EXTADDR_LEN;
  1675. *pTmp = pMsg->capabilities;
  1676. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1677. MT_ZDO_END_DEVICE_ANNCE_IND,
  1678. MT_ZDO_END_DEVICE_ANNCE_IND_LEN, pBuf);
  1679. osal_mem_free(pBuf);
  1680. }
  1681. }
  1682. /***************************************************************************************************
  1683. * @fn MT_ZdoSrcRtgCB
  1684. *
  1685. * @brief Handle Src Route from ZDO.
  1686. *
  1687. * @param pStr - pointer to the data structure for the src route
  1688. *
  1689. * @return void*
  1690. */
  1691. void* MT_ZdoSrcRtgCB( void *pStr )
  1692. {
  1693. uint8 len, *pBuf;
  1694. zdoSrcRtg_t *pSrcRtg = pStr;
  1695. // srcAddr (2) + relayCnt (1) + relayList( relaycnt * 2 )
  1696. len = 2 + 1 + pSrcRtg->relayCnt * sizeof(uint16);
  1697. if (NULL != (pBuf = (uint8 *)osal_mem_alloc(len)))
  1698. {
  1699. uint8 idx, *pTmp = pBuf;
  1700. uint16 *pRelay;
  1701. // Packet payload
  1702. *pTmp++ = LO_UINT16(pSrcRtg->srcAddr);
  1703. *pTmp++ = HI_UINT16(pSrcRtg->srcAddr);
  1704. *pTmp++ = pSrcRtg->relayCnt;
  1705. // Relay List
  1706. if( ( pRelay = pSrcRtg->pRelayList ) != NULL )
  1707. {
  1708. for( idx = 0; idx < pSrcRtg->relayCnt; idx ++ )
  1709. {
  1710. *pTmp++ = LO_UINT16(*pRelay);
  1711. *pTmp++ = HI_UINT16(*pRelay);
  1712. pRelay++;
  1713. }
  1714. }
  1715. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1716. MT_ZDO_SRC_RTG_IND, len, pBuf);
  1717. osal_mem_free(pBuf);
  1718. }
  1719. return NULL;
  1720. }
  1721. /***************************************************************************************************
  1722. * @fn MT_ZdoConcentratorIndCB
  1723. *
  1724. * @brief Handle the ZDO Concentrator Indication callback from the ZDO.
  1725. *
  1726. * @param pStr - pointer to a parameter and a structure of parameters
  1727. *
  1728. * @return NULL
  1729. ***************************************************************************************************/
  1730. static void *MT_ZdoConcentratorIndCB(void *pStr)
  1731. {
  1732. uint8 buf[MT_ZDO_CONCENTRATOR_IND_LEN], *pTmp = buf;
  1733. zdoConcentratorInd_t *pInd = (zdoConcentratorInd_t *)pStr;
  1734. *pTmp++ = LO_UINT16(pInd->nwkAddr);
  1735. *pTmp++ = HI_UINT16(pInd->nwkAddr);
  1736. pTmp = osal_memcpy(pTmp, pInd->extAddr, Z_EXTADDR_LEN);
  1737. *pTmp = pInd->pktCost;
  1738. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1739. MT_ZDO_CONCENTRATOR_IND_CB, MT_ZDO_CONCENTRATOR_IND_LEN, buf);
  1740. return NULL;
  1741. }
  1742. /***************************************************************************************************
  1743. * @fn MT_ZdoLeaveInd
  1744. *
  1745. * @brief Handle the ZDO Leave Indication callback from the ZDO.
  1746. *
  1747. * @param vPtr - Pointer to the received Leave Indication message.
  1748. *
  1749. * @return NULL
  1750. ***************************************************************************************************/
  1751. static void *MT_ZdoLeaveInd(void *vPtr)
  1752. {
  1753. NLME_LeaveInd_t *pInd = (NLME_LeaveInd_t *)vPtr;
  1754. uint8 buf[sizeof(NLME_LeaveInd_t)];
  1755. buf[0] = LO_UINT16(pInd->srcAddr);
  1756. buf[1] = HI_UINT16(pInd->srcAddr);
  1757. (void)osal_memcpy(buf+2, pInd->extAddr, Z_EXTADDR_LEN);
  1758. buf[2+Z_EXTADDR_LEN] = pInd->request;
  1759. buf[3+Z_EXTADDR_LEN] = pInd->removeChildren;
  1760. buf[4+Z_EXTADDR_LEN] = pInd->rejoin;
  1761. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1762. MT_ZDO_LEAVE_IND, 5+Z_EXTADDR_LEN, buf);
  1763. return NULL;
  1764. }
  1765. #endif // MT_ZDO_CB_FUNC
  1766. /***************************************************************************************************
  1767. * @fn MT_ZdoSendMsgCB
  1768. *
  1769. * @brief Proxy the ZDO_SendMsgCBs one message at a time.
  1770. *
  1771. * @param pMsg - Message data
  1772. *
  1773. * @return void
  1774. */
  1775. void MT_ZdoSendMsgCB(zdoIncomingMsg_t *pMsg)
  1776. {
  1777. uint8 len = pMsg->asduLen + 9;
  1778. uint8 *pBuf = (uint8 *)osal_mem_alloc(len);
  1779. if (pBuf != NULL)
  1780. {
  1781. uint8 *pTmp = pBuf;
  1782. // Assuming exclusive use of network short addresses.
  1783. *pTmp++ = LO_UINT16(pMsg->srcAddr.addr.shortAddr);
  1784. *pTmp++ = HI_UINT16(pMsg->srcAddr.addr.shortAddr);
  1785. *pTmp++ = pMsg->wasBroadcast;
  1786. *pTmp++ = LO_UINT16(pMsg->clusterID);
  1787. *pTmp++ = HI_UINT16(pMsg->clusterID);
  1788. *pTmp++ = pMsg->SecurityUse;
  1789. *pTmp++ = pMsg->TransSeq;
  1790. // Skipping asduLen since it can be deduced from the RPC packet length.
  1791. *pTmp++ = LO_UINT16(pMsg->macDestAddr);
  1792. *pTmp++ = HI_UINT16(pMsg->macDestAddr);
  1793. (void)osal_memcpy(pTmp, pMsg->asdu, pMsg->asduLen);
  1794. MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_AREQ | (uint8)MT_RPC_SYS_ZDO),
  1795. MT_ZDO_MSG_CB_INCOMING, len, pBuf);
  1796. osal_mem_free(pBuf);
  1797. }
  1798. }
  1799. #endif /*ZDO Command Processing in MT*/
  1800. /***************************************************************************************************
  1801. ***************************************************************************************************/