PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/net/wireless/tiwlan1251/common/src/core/rsn/mainKeysSm.c

http://github.com/CyanogenMod/cm-kernel
C | 1003 lines | 464 code | 146 blank | 393 comment | 62 complexity | dde2646f3479ec8e2687248d18e36b06 MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
  1. /****************************************************************************
  2. **+-----------------------------------------------------------------------+**
  3. **| |**
  4. **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
  5. **| All rights reserved. |**
  6. **| |**
  7. **| Redistribution and use in source and binary forms, with or without |**
  8. **| modification, are permitted provided that the following conditions |**
  9. **| are met: |**
  10. **| |**
  11. **| * Redistributions of source code must retain the above copyright |**
  12. **| notice, this list of conditions and the following disclaimer. |**
  13. **| * Redistributions in binary form must reproduce the above copyright |**
  14. **| notice, this list of conditions and the following disclaimer in |**
  15. **| the documentation and/or other materials provided with the |**
  16. **| distribution. |**
  17. **| * Neither the name Texas Instruments nor the names of its |**
  18. **| contributors may be used to endorse or promote products derived |**
  19. **| from this software without specific prior written permission. |**
  20. **| |**
  21. **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
  22. **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
  23. **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
  24. **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
  25. **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
  26. **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
  27. **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
  28. **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
  29. **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
  30. **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
  31. **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
  32. **| |**
  33. **+-----------------------------------------------------------------------+**
  34. ****************************************************************************/
  35. /** \file mainKeySM.c
  36. * \brief Main key state machine implementation.
  37. *
  38. * \see mainKeySM.h
  39. */
  40. #include "osApi.h"
  41. #include "paramOut.h"
  42. /*#include "paramIn.h"*/
  43. #include "utils.h"
  44. #include "report.h"
  45. #include "rsn.h"
  46. #include "rsnApi.h"
  47. #include "smeApi.h"
  48. #include "mainSecSm.h"
  49. #include "keyParser.h"
  50. #include "broadcastKeySM.h"
  51. #include "unicastKeySM.h"
  52. #include "mainKeysSm.h"
  53. #include "mainKeysSmInternal.h"
  54. #include "DataCtrl_Api.h"
  55. #include "admCtrl.h"
  56. #include "EvHandler.h"
  57. #include "TI_IPC_Api.h"
  58. static TI_STATUS mainKeys_smEvent(struct _mainKeys_t *pMainKeys, UINT8 event, void* pData);
  59. /**
  60. *
  61. * mainKeys_create
  62. *
  63. * \b Description:
  64. *
  65. * Allocate memory for the main security context, and create all the rest of the needed contexts.
  66. *
  67. * \b ARGS:
  68. *
  69. * I - hOs - OS handle for OS operations.
  70. *
  71. * \b RETURNS:
  72. *
  73. * pointer to main security context. If failed, returns NULL.
  74. *
  75. * \sa
  76. */
  77. mainKeys_t* mainKeys_create(TI_HANDLE hOs)
  78. {
  79. mainKeys_t *pHandle;
  80. TI_STATUS status;
  81. /* allocate association context memory */
  82. pHandle = (mainKeys_t*)os_memoryAlloc(hOs, sizeof(mainKeys_t));
  83. if (pHandle == NULL)
  84. {
  85. return NULL;
  86. }
  87. os_memoryZero(hOs, pHandle, sizeof(mainKeys_t));
  88. /* allocate memory for association state machine */
  89. status = fsm_Create(hOs, &pHandle->pMainKeysSm, MAIN_KEYS_NUM_STATES, MAIN_KEYS_NUM_EVENTS);
  90. if (status != OK)
  91. {
  92. os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
  93. return NULL;
  94. }
  95. pHandle->timer = os_timerCreate(hOs, mainKeys_sessionTimeout, pHandle);
  96. if (pHandle->timer == NULL)
  97. {
  98. fsm_Unload(hOs, pHandle->pMainKeysSm);
  99. os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
  100. return NULL;
  101. }
  102. pHandle->pKeyParser = keyParser_create(hOs);
  103. if (pHandle->pKeyParser == NULL)
  104. {
  105. os_timerDestroy(hOs, pHandle->timer);
  106. fsm_Unload(hOs, pHandle->pMainKeysSm);
  107. os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
  108. return NULL;
  109. }
  110. pHandle->pBcastSm = broadcastKey_create(hOs);
  111. if (pHandle->pBcastSm == NULL)
  112. {
  113. keyParser_unload(pHandle->pKeyParser);
  114. os_timerDestroy(hOs, pHandle->timer);
  115. fsm_Unload(hOs, pHandle->pMainKeysSm);
  116. os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
  117. return NULL;
  118. }
  119. pHandle->pUcastSm = unicastKey_create(hOs);
  120. if (pHandle->pBcastSm == NULL)
  121. {
  122. broadcastKey_unload(pHandle->pBcastSm);
  123. keyParser_unload(pHandle->pKeyParser);
  124. os_timerDestroy(hOs, pHandle->timer);
  125. fsm_Unload(hOs, pHandle->pMainKeysSm);
  126. os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
  127. return NULL;
  128. }
  129. pHandle->hOs = hOs;
  130. /* At first Timeout we will send MediaSpecific Event */
  131. /* At any other Timeout we will send the Timeout Event */
  132. pHandle->mainKeysTimeoutCounter = FALSE;
  133. return pHandle;
  134. }
  135. /**
  136. *
  137. * mainKeys_config
  138. *
  139. * \b Description:
  140. *
  141. * Init main security state machine state machine
  142. *
  143. * \b ARGS:
  144. *
  145. * none
  146. *
  147. * \b RETURNS:
  148. *
  149. * OK on success, NOK otherwise.
  150. *
  151. * \sa
  152. */
  153. TI_STATUS mainKeys_config(mainKeys_t *pMainKeys,
  154. rsn_paeConfig_t *pPaeConfig,
  155. void *pParent,
  156. TI_HANDLE hReport,
  157. TI_HANDLE hOs,
  158. TI_HANDLE hCtrlData,
  159. TI_HANDLE hEvHandler,
  160. TI_HANDLE hConn,
  161. TI_HANDLE hRsn )
  162. {
  163. TI_STATUS status;
  164. /** Main key State Machine matrix */
  165. fsm_actionCell_t mainKeysSM_matrix[MAIN_KEYS_NUM_STATES][MAIN_KEYS_NUM_EVENTS] =
  166. {
  167. /* next state and actions for IDLE state */
  168. { {MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeys_startIdle},
  169. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmNop},
  170. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected},
  171. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected},
  172. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected}
  173. },
  174. /* next state and actions for START state */
  175. { {MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeySmUnexpected},
  176. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopStart},
  177. {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
  178. {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
  179. {MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeys_smTimeOut}
  180. },
  181. /* next state and actions for UNICAST COMPLETE state */
  182. { {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmUnexpected},
  183. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopUcastComplete},
  184. {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
  185. {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeys_bcastCompleteUcastComplete},
  186. {MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeys_smTimeOut}
  187. },
  188. /* next state and actions for BROADCAST COMPLETE state */
  189. { {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmUnexpected},
  190. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopBcastComplete},
  191. {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeys_ucastCompleteBcastComplete},
  192. {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
  193. {MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeys_smTimeOut}
  194. },
  195. /* next state and actions for COMPLETE state */
  196. { {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmUnexpected},
  197. {MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopComplete},
  198. {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmNop},
  199. {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmNop},
  200. {MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmUnexpected}
  201. }
  202. };
  203. pMainKeys->hCtrlData = hCtrlData;
  204. pMainKeys->hOs = hOs;
  205. pMainKeys->hReport = hReport;
  206. pMainKeys->hEvHandler = hEvHandler;
  207. pMainKeys->hConn = hConn;
  208. pMainKeys->hRsn = hRsn;
  209. pMainKeys->pParent = pParent;
  210. pMainKeys->keysTimeout = MAIN_KEYS_TIMEOUT;
  211. pMainKeys->start = mainKeys_start;
  212. pMainKeys->stop = mainKeys_stop;
  213. pMainKeys->reportUcastStatus = mainKeys_reportUcastStatus;
  214. pMainKeys->reportBcastStatus = mainKeys_reportBcastStatus;
  215. pMainKeys->setKey = mainKeys_setKey;
  216. pMainKeys->removeKey = mainKeys_removeKey;
  217. pMainKeys->setDefaultKeyId = mainKeys_setDefaultKeyId;
  218. pMainKeys->getSessionKey = mainKeys_getSessionKey;
  219. pMainKeys->currentState = MAIN_KEYS_STATE_IDLE;
  220. status = fsm_Config(pMainKeys->pMainKeysSm, &mainKeysSM_matrix[0][0],
  221. MAIN_KEYS_NUM_STATES, MAIN_KEYS_NUM_EVENTS, NULL, pMainKeys->hOs);
  222. if (status != OK)
  223. {
  224. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  225. ("MAIN_KEYS_SM: Error in configuring SM\n"));
  226. return status;
  227. }
  228. status = keyParser_config(pMainKeys->pKeyParser,
  229. pPaeConfig,
  230. pMainKeys->pUcastSm,
  231. pMainKeys->pBcastSm,
  232. pMainKeys,
  233. hReport,
  234. hOs,
  235. hCtrlData);
  236. if (status != OK)
  237. {
  238. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  239. ("MAIN_KEYS_SM: Error in configuring key parser\n"));
  240. return status;
  241. }
  242. status = broadcastKey_config(pMainKeys->pBcastSm, pPaeConfig, pMainKeys, hReport, hOs);
  243. if (status != OK)
  244. {
  245. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  246. ("MAIN_KEYS_SM: Error in configuring broadcast key SM\n"));
  247. return status;
  248. }
  249. status = unicastKey_config(pMainKeys->pUcastSm, pPaeConfig, pMainKeys, hReport, hOs);
  250. if (status != OK)
  251. {
  252. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  253. ("MAIN_KEYS_SM: Error in configuring unicast key SM\n"));
  254. return status;
  255. }
  256. return OK;
  257. }
  258. /**
  259. *
  260. * mainKeys_config
  261. *
  262. * \b Description:
  263. *
  264. * Init main security state machine state machine
  265. *
  266. * \b ARGS:
  267. *
  268. * none
  269. *
  270. * \b RETURNS:
  271. *
  272. * OK on success, NOK otherwise.
  273. *
  274. * \sa
  275. */
  276. TI_STATUS mainKeys_unload(mainKeys_t *pMainKeys)
  277. {
  278. TI_STATUS status;
  279. if (pMainKeys == NULL)
  280. {
  281. return NOK;
  282. }
  283. status = fsm_Unload(pMainKeys->hOs, pMainKeys->pMainKeysSm);
  284. if (status != OK)
  285. {
  286. /* report failure but don't stop... */
  287. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  288. ("MAIN_KEYS_SM: Error releasing FSM memory \n"));
  289. }
  290. os_timerStop(pMainKeys->hOs, pMainKeys->timer);
  291. os_timerDestroy(pMainKeys->hOs, pMainKeys->timer);
  292. status = keyParser_unload(pMainKeys->pKeyParser);
  293. if (status != OK)
  294. {
  295. /* report failure but don't stop... */
  296. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  297. ("MAIN_KEYS_SM: Error unloading key parser\n"));
  298. }
  299. status = broadcastKey_unload(pMainKeys->pBcastSm);
  300. if (status != OK)
  301. {
  302. /* report failure but don't stop... */
  303. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  304. ("MAIN_KEYS_SM: Error unloading broadcast key SM\n"));
  305. }
  306. status = unicastKey_unload(pMainKeys->pUcastSm);
  307. if (status != OK)
  308. {
  309. /* report failure but don't stop... */
  310. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  311. ("MAIN_KEYS_SM: Error unloading unicast key SM\n"));
  312. }
  313. os_memoryFree(pMainKeys->hOs, pMainKeys, sizeof(mainKeys_t));
  314. return OK;
  315. }
  316. /**
  317. *
  318. * rsn_mainKeySmStart
  319. *
  320. * \b Description:
  321. *
  322. * START event handler
  323. *
  324. * \b ARGS:
  325. *
  326. * I - pCtrlB - station control block \n
  327. *
  328. * \b RETURNS:
  329. *
  330. * OK on success, NOK otherwise.
  331. *
  332. * \sa rsn_mainKeySmStop()
  333. */
  334. TI_STATUS mainKeys_start(struct _mainKeys_t *pMainKeys)
  335. {
  336. TI_STATUS status;
  337. status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_START, pMainKeys);
  338. return status;
  339. }
  340. /**
  341. *
  342. * rsn_mainKeySmStop
  343. *
  344. * \b Description:
  345. *
  346. * STOP event handler
  347. *
  348. * \b ARGS:
  349. *
  350. * I - pCtrlB - station control block \n
  351. *
  352. * \b RETURNS:
  353. *
  354. * OK on success, NOK otherwise.
  355. *
  356. * \sa rsn_mainKeySmStart()
  357. */
  358. TI_STATUS mainKeys_stop(struct _mainKeys_t *pMainKeys)
  359. {
  360. TI_STATUS status;
  361. status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_STOP, pMainKeys);
  362. return status;
  363. }
  364. /**
  365. *
  366. * rsn_mainKeySmReportUnicastComplete
  367. *
  368. * \b Description:
  369. *
  370. * UNICAST_COMPLETE event handler
  371. *
  372. * \b ARGS:
  373. *
  374. * I - pCtrlB - station control block \n
  375. *
  376. * \b RETURNS:
  377. *
  378. * OK on success, NOK otherwise.
  379. *
  380. * \sa rsn_mainKeySmReportBroadcastComplete()
  381. */
  382. TI_STATUS mainKeys_reportUcastStatus(struct _mainKeys_t *pMainKeys, TI_STATUS ucastStatus)
  383. {
  384. TI_STATUS status=NOK;
  385. paramInfo_t param;
  386. externalAuthMode_e extAuthMode;
  387. if (ucastStatus == OK)
  388. {
  389. param.content.txDataCurrentPrivacyInvokedMode = TRUE;
  390. param.paramType = TX_DATA_CURRENT_PRIVACY_INVOKE_MODE_PARAM;
  391. txData_setParam(pMainKeys->pParent->pParent->hTx, &param);
  392. status = pMainKeys->pParent->pParent->pAdmCtrl->getExtAuthMode(pMainKeys->pParent->pParent->pAdmCtrl, &extAuthMode);
  393. if (status != OK)
  394. {
  395. return status;
  396. }
  397. if (extAuthMode >= RSN_EXT_AUTH_MODE_WPA)
  398. {
  399. param.content.txDataEapolEncryptionStatus = TRUE;
  400. }
  401. else
  402. {
  403. param.content.txDataEapolEncryptionStatus = FALSE;
  404. }
  405. param.paramType = TX_DATA_EAPOL_ENCRYPTION_STATUS_PARAM;
  406. txData_setParam(pMainKeys->pParent->pParent->hTx, &param);
  407. status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_UCAST_COMPLETE, pMainKeys);
  408. }
  409. return status;
  410. }
  411. /**
  412. *
  413. * rsn_mainKeySmReportBroadcastComplete
  414. *
  415. * \b Description:
  416. *
  417. * BROADCAST_COMPLETE event handler
  418. *
  419. * \b ARGS:
  420. *
  421. * I - pCtrlB - station control block \n
  422. *
  423. * \b RETURNS:
  424. *
  425. * OK on success, NOK otherwise.
  426. *
  427. * \sa rsn_mainKeySmReportUnicastComplete()
  428. */
  429. TI_STATUS mainKeys_reportBcastStatus(struct _mainKeys_t *pMainKeys, TI_STATUS bcastStatus)
  430. {
  431. TI_STATUS status=NOK;
  432. if (bcastStatus == OK)
  433. {
  434. status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_BCAST_COMPLETE, pMainKeys);
  435. }
  436. return status;
  437. }
  438. /**
  439. *
  440. * mainKeySmSessionTimeout
  441. *
  442. * \b Description:
  443. *
  444. * SESSION_TIMEOUOT event handler
  445. *
  446. * \b ARGS:
  447. *
  448. * I - pData - station control block \n
  449. *
  450. * \b RETURNS:
  451. *
  452. * OK on success, NOK otherwise.
  453. */
  454. TI_STATUS mainKeys_setKey(struct _mainKeys_t *pMainKeys, securityKeys_t *pKey)
  455. {
  456. return (pMainKeys->pParent->setKey(pMainKeys->pParent, pKey));
  457. }
  458. /**
  459. *
  460. * mainKeySmSessionTimeout
  461. *
  462. * \b Description:
  463. *
  464. * SESSION_TIMEOUOT event handler
  465. *
  466. * \b ARGS:
  467. *
  468. * I - pData - station control block \n
  469. *
  470. * \b RETURNS:
  471. *
  472. * OK on success, NOK otherwise.
  473. */
  474. TI_STATUS mainKeys_removeKey(struct _mainKeys_t *pMainKeys, securityKeys_t *pKey)
  475. {
  476. return (pMainKeys->pParent->removeKey(pMainKeys->pParent, pKey));
  477. }
  478. /**
  479. *
  480. * mainKeySmSessionTimeout
  481. *
  482. * \b Description:
  483. *
  484. * SESSION_TIMEOUOT event handler
  485. *
  486. * \b ARGS:
  487. *
  488. * I - pData - station control block \n
  489. *
  490. * \b RETURNS:
  491. *
  492. * OK on success, NOK otherwise.
  493. */
  494. TI_STATUS mainKeys_setDefaultKeyId(struct _mainKeys_t *pMainKeys, UINT8 keyId)
  495. {
  496. return (pMainKeys->pParent->setDefaultKeyId(pMainKeys->pParent, keyId));
  497. }
  498. /**
  499. *
  500. * mainKeySmSessionTimeout
  501. *
  502. * \b Description:
  503. *
  504. * SESSION_TIMEOUOT event handler
  505. *
  506. * \b ARGS:
  507. *
  508. * I - pData - station control block \n
  509. *
  510. * \b RETURNS:
  511. *
  512. * OK on success, NOK otherwise.
  513. */
  514. TI_STATUS mainKeys_getSessionKey(struct _mainKeys_t *pMainKeys, UINT8 *pKey, UINT32 *pKeyLen)
  515. {
  516. TI_STATUS status;
  517. status = pMainKeys->pParent->getSessionKey(pMainKeys->pParent, pKey, pKeyLen);
  518. return status;
  519. }
  520. /**
  521. *
  522. * mainKeySmSessionTimeout
  523. *
  524. * \b Description:
  525. *
  526. * SESSION_TIMEOUOT event handler
  527. *
  528. * \b ARGS:
  529. *
  530. * I - pData - station control block \n
  531. *
  532. * \b RETURNS:
  533. *
  534. * OK on success, NOK otherwise.
  535. */
  536. void mainKeys_sessionTimeout(void *pMainKeys)
  537. {
  538. mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_SESSION_TIMEOUOT, pMainKeys);
  539. }
  540. #ifdef REPORT_LOG
  541. static char *mainKeys_smStateDesc[MAIN_KEYS_NUM_STATES] = {
  542. "STATE_IDLE",
  543. "STATE_START",
  544. "STATE_UNICAST_COMPLETE",
  545. "STATE_BROADCAST_COMPLETE",
  546. "STATE_COMPLETE",
  547. };
  548. static char *mainKeys_smEventDesc[MAIN_KEYS_NUM_EVENTS] = {
  549. "EVENT_START",
  550. "EVENT_STOP",
  551. "EVENT_UNICAST_COMPLETE",
  552. "EVENT_BROADCAST_COMPLETE",
  553. "EVENT_SESSION_TIMEOUOT"
  554. };
  555. #endif
  556. static TI_STATUS mainKeys_smEvent(struct _mainKeys_t *pMainKeys, UINT8 event, void* pData)
  557. {
  558. TI_STATUS status;
  559. UINT8 nextState;
  560. status = fsm_GetNextState(pMainKeys->pMainKeysSm, pMainKeys->currentState, event, &nextState);
  561. if (status != OK)
  562. {
  563. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  564. ("MAIN_KEYS_SM: ERROR - failed getting next state \n"));
  565. return(NOK);
  566. }
  567. WLAN_REPORT_SM(pMainKeys->hReport, RSN_MODULE_LOG,
  568. ("MAIN_KEYS_SM: <%s, %s> --> %s\n",
  569. mainKeys_smStateDesc[pMainKeys->currentState],
  570. mainKeys_smEventDesc[event],
  571. mainKeys_smStateDesc[nextState]));
  572. status = fsm_Event(pMainKeys->pMainKeysSm, &pMainKeys->currentState, event, pData);
  573. return status;
  574. }
  575. /**
  576. *
  577. * mainKeySmStartSubKeySmsAndTimer
  578. *
  579. * \b Description:
  580. *
  581. * Starts unicast & broadcast key SMs and session timer.
  582. *
  583. * \b ARGS:
  584. *
  585. * I - pData - station control block \n
  586. *
  587. * \b RETURNS:
  588. *
  589. * OK on success, NOK otherwise.
  590. */
  591. TI_STATUS mainKeys_startIdle(struct _mainKeys_t *pMainKeys)
  592. {
  593. TI_STATUS status;
  594. status = pMainKeys->pUcastSm->start(pMainKeys->pUcastSm);
  595. if (status != OK)
  596. {
  597. return NOK;
  598. }
  599. status = pMainKeys->pBcastSm->start(pMainKeys->pBcastSm);
  600. if (status != OK)
  601. {
  602. return NOK;
  603. }
  604. os_timerStart(pMainKeys->hOs, pMainKeys->timer, pMainKeys->keysTimeout, FALSE);
  605. status = pMainKeys->pKeyParser->replayReset(pMainKeys->pKeyParser);
  606. return status;
  607. }
  608. /**
  609. *
  610. * mainKeySmStopSubKeySmsAndTimer
  611. *
  612. * \b Description:
  613. *
  614. * Stops unicast & broadcast key SMs and session timer.
  615. *
  616. * \b ARGS:
  617. *
  618. * I - pData - station control block \n
  619. *
  620. * \b RETURNS:
  621. *
  622. * OK on success, NOK otherwise.
  623. */
  624. TI_STATUS mainKeys_stopStart(struct _mainKeys_t *pMainKeys)
  625. {
  626. TI_STATUS status = OK;
  627. status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
  628. if (status != OK)
  629. {
  630. return NOK;
  631. }
  632. status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
  633. if (status != OK)
  634. {
  635. return NOK;
  636. }
  637. os_timerStop(pMainKeys->hOs, pMainKeys->timer);
  638. return status;
  639. }
  640. /**
  641. *
  642. * mainKeySmStopSubKeySmsAndTimer
  643. *
  644. * \b Description:
  645. *
  646. * Stops unicast & broadcast key SMs and session timer.
  647. *
  648. * \b ARGS:
  649. *
  650. * I - pData - station control block \n
  651. *
  652. * \b RETURNS:
  653. *
  654. * OK on success, NOK otherwise.
  655. */
  656. TI_STATUS mainKeys_stopUcastComplete(struct _mainKeys_t *pMainKeys)
  657. {
  658. TI_STATUS status = OK;
  659. status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
  660. if (status != OK)
  661. {
  662. return NOK;
  663. }
  664. status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
  665. if (status != OK)
  666. {
  667. return NOK;
  668. }
  669. os_timerStop(pMainKeys->hOs, pMainKeys->timer);
  670. return status;
  671. }
  672. /**
  673. *
  674. * mainKeySmReportComplete
  675. *
  676. * \b Description:
  677. *
  678. * Report key complete to the main security SM.
  679. *
  680. * \b ARGS:
  681. *
  682. * I - pData - station control block \n
  683. *
  684. * \b RETURNS:
  685. *
  686. * OK on success, NOK otherwise.
  687. */
  688. TI_STATUS mainKeys_bcastCompleteUcastComplete(struct _mainKeys_t *pMainKeys)
  689. {
  690. TI_STATUS status;
  691. WLAN_REPORT_INFORMATION(pMainKeys->hReport, RSN_MODULE_LOG,
  692. ("mainKeys_bcastCompleteUcastComplete - sending Interrogate \n"));
  693. os_timerStop(pMainKeys->hOs, pMainKeys->timer);
  694. status = pMainKeys->pParent->reportKeysStatus(pMainKeys->pParent, OK);
  695. return status;
  696. }
  697. /**
  698. *
  699. * mainKeySmStopSubKeySmsAndTimer
  700. *
  701. * \b Description:
  702. *
  703. * Stops unicast & broadcast key SMs and session timer.
  704. *
  705. * \b ARGS:
  706. *
  707. * I - pData - station control block \n
  708. *
  709. * \b RETURNS:
  710. *
  711. * OK on success, NOK otherwise.
  712. */
  713. TI_STATUS mainKeys_stopBcastComplete(struct _mainKeys_t *pMainKeys)
  714. {
  715. TI_STATUS status = OK;
  716. status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
  717. if (status != OK)
  718. {
  719. return NOK;
  720. }
  721. status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
  722. if (status != OK)
  723. {
  724. return NOK;
  725. }
  726. os_timerStop(pMainKeys->hOs, pMainKeys->timer);
  727. return status;
  728. }
  729. /**
  730. *
  731. * mainKeySmReportComplete
  732. *
  733. * \b Description:
  734. *
  735. * Report key complete to the main security SM.
  736. *
  737. * \b ARGS:
  738. *
  739. * I - pData - station control block \n
  740. *
  741. * \b RETURNS:
  742. *
  743. * OK on success, NOK otherwise.
  744. */
  745. TI_STATUS mainKeys_ucastCompleteBcastComplete(struct _mainKeys_t *pMainKeys)
  746. {
  747. TI_STATUS status;
  748. WLAN_REPORT_INFORMATION(pMainKeys->hReport, RSN_MODULE_LOG,
  749. ("mainKeys_ucastCompleteBcastComplete \n"));
  750. os_timerStop(pMainKeys->hOs, pMainKeys->timer);
  751. status = pMainKeys->pParent->reportKeysStatus(pMainKeys->pParent, OK);
  752. return status;
  753. }
  754. /**
  755. *
  756. * mainKeySmStopSubKeySmsAndTimer
  757. *
  758. * \b Description:
  759. *
  760. * Stops unicast & broadcast key SMs and session timer.
  761. *
  762. * \b ARGS:
  763. *
  764. * I - pData - station control block \n
  765. *
  766. * \b RETURNS:
  767. *
  768. * OK on success, NOK otherwise.
  769. */
  770. TI_STATUS mainKeys_stopComplete(struct _mainKeys_t *pMainKeys)
  771. {
  772. TI_STATUS status = OK;
  773. status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
  774. if (status != OK)
  775. {
  776. return NOK;
  777. }
  778. status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
  779. if (status != OK)
  780. {
  781. return NOK;
  782. }
  783. return status;
  784. }
  785. /**
  786. *
  787. * mainKeySmLogMessage
  788. *
  789. * \b Description:
  790. *
  791. * Prints Log messge.\n
  792. * Start session timer.
  793. *
  794. * \b ARGS:
  795. *
  796. * I - pData - station control block \n
  797. *
  798. * \b RETURNS:
  799. *
  800. * OK on success, NOK otherwise.
  801. */
  802. TI_STATUS mainKeys_smTimeOut(void* data)
  803. {
  804. OS_802_11_AUTHENTICATION_REQUEST *request;
  805. UINT8 AuthBuf[sizeof(UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)];
  806. paramInfo_t param;
  807. TI_STATUS status;
  808. struct _mainKeys_t *pMainKeys = (struct _mainKeys_t *)data;
  809. WLAN_REPORT_INFORMATION(pMainKeys->hReport, RSN_MODULE_LOG,
  810. ("MAIN_KEY_SM: TRAP: Session Timeout for station , mainKeysTimeoutCounter=%d\n",
  811. pMainKeys->mainKeysTimeoutCounter));
  812. request = (OS_802_11_AUTHENTICATION_REQUEST *)(AuthBuf + sizeof(UINT32));
  813. request->Length = sizeof(OS_802_11_AUTHENTICATION_REQUEST);
  814. param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
  815. status = ctrlData_getParam(pMainKeys->hCtrlData, &param);
  816. if (status != OK)
  817. {
  818. return NOK;
  819. }
  820. WLAN_REPORT_INFORMATION(pMainKeys->hReport, RSN_MODULE_LOG,
  821. ("current station is banned from the roaming candidates list for %d Ms\n",
  822. RSN_MAIN_KEYS_SESSION_TIMEOUT));
  823. rsn_banSite(pMainKeys->hRsn, param.content.ctrlDataCurrentBSSID, RSN_SITE_BAN_LEVEL_FULL, RSN_MAIN_KEYS_SESSION_TIMEOUT);
  824. /* mainKeysTimeoutCounter is a boolean variable, With states: */
  825. /* TRUE - It is a Timeout Association Event */
  826. /* FALSE - It is a Media specific Event */
  827. if (!pMainKeys->mainKeysTimeoutCounter)
  828. {
  829. /* Fill Media specific indication fields and send to OS/User */
  830. os_memoryCopy(pMainKeys->hOs, request->BSSID, (void *)param.content.ctrlDataCurrentBSSID.addr, MAC_ADDR_LEN);
  831. request->Flags = OS_802_11_REQUEST_REAUTH;
  832. *(UINT32*)AuthBuf = os802_11StatusType_Authentication;
  833. WLAN_REPORT_INFORMATION(pMainKeys->hReport, RSN_MODULE_LOG,
  834. (" %d Ms\n",RSN_MAIN_KEYS_SESSION_TIMEOUT));
  835. EvHandlerSendEvent(pMainKeys->hEvHandler, IPC_EVENT_MEDIA_SPECIFIC, (UINT8*)AuthBuf,
  836. sizeof(UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST));
  837. os_timerStart(pMainKeys->hOs, pMainKeys->timer, pMainKeys->keysTimeout, FALSE);
  838. pMainKeys->mainKeysTimeoutCounter = TRUE;
  839. }
  840. else
  841. {
  842. pMainKeys->mainKeysTimeoutCounter = FALSE;
  843. rsn_reportAuthFailure(pMainKeys->hRsn, RSN_AUTH_STATUS_TIMEOUT);
  844. conn_reportRsnStatus(pMainKeys->hConn, (mgmtStatus_e)STATUS_SECURITY_FAILURE);
  845. }
  846. return OK;
  847. }
  848. TI_STATUS mainKeySmUnexpected(struct _mainKeys_t *pMainKeys)
  849. {
  850. WLAN_REPORT_ERROR(pMainKeys->hReport, RSN_MODULE_LOG,
  851. ("MAIN_KEY_SM: ERROR UnExpected Event\n"));
  852. return(OK);
  853. }
  854. TI_STATUS mainKeySmNop(struct _mainKeys_t *pMainKeys)
  855. {
  856. return(OK);
  857. }