Home | History | Annotate | Download | only in Connection_Managment
      1 /*
      2  * mainKeysSm.c
      3  *
      4  * Copyright(c) 1998 - 2009 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 /** \file mainKeySM.c
     35  * \brief Main key state machine implementation.
     36  *
     37  * \see mainKeySM.h
     38 */
     39 
     40 /****************************************************************************
     41  *                                                                          *
     42  *   MODULE:  Main key SM													*
     43  *   PURPOSE: Main key SM implmentation				  						*
     44  *                                                                          *
     45  ****************************************************************************/
     46 
     47 #define __FILE_ID__  FILE_ID_36
     48 #include "osApi.h"
     49 #include "paramOut.h"
     50 #include "timer.h"
     51 #include "report.h"
     52 #include "rsn.h"
     53 #include "rsnApi.h"
     54 #include "smeApi.h"
     55 #include "mainSecSm.h"
     56 #include "keyParser.h"
     57 #include "broadcastKeySM.h"
     58 #include "unicastKeySM.h"
     59 #include "mainKeysSm.h"
     60 #include "mainKeysSmInternal.h"
     61 #include "DataCtrl_Api.h"
     62 #include "admCtrl.h"
     63 #include "EvHandler.h"
     64 #include "TI_IPC_Api.h"
     65 #include "connApi.h"
     66 
     67 static TI_STATUS mainKeys_smEvent(struct _mainKeys_t *pMainKeys, TI_UINT8 event, void* pData);
     68 
     69 /**
     70 *
     71 * mainKeys_create
     72 *
     73 * \b Description:
     74 *
     75 * Allocate memory for the main security context, and create all the rest of the needed contexts.
     76 *
     77 * \b ARGS:
     78 *
     79 *  I - hOs - OS handle for OS operations.
     80 *
     81 * \b RETURNS:
     82 *
     83 *  pointer to main security context. If failed, returns NULL.
     84 *
     85 * \sa
     86 */
     87 mainKeys_t* mainKeys_create(TI_HANDLE hOs)
     88 {
     89 	mainKeys_t 	*pHandle;
     90 	TI_STATUS		status;
     91 
     92 	/* allocate association context memory */
     93 	pHandle = (mainKeys_t*)os_memoryAlloc(hOs, sizeof(mainKeys_t));
     94 	if (pHandle == NULL)
     95 	{
     96 		return NULL;
     97 	}
     98 
     99 	os_memoryZero(hOs, pHandle, sizeof(mainKeys_t));
    100 
    101 	/* allocate memory for association state machine */
    102 	status = fsm_Create(hOs, &pHandle->pMainKeysSm, MAIN_KEYS_NUM_STATES, MAIN_KEYS_NUM_EVENTS);
    103 	if (status != TI_OK)
    104 	{
    105 		os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
    106 		return NULL;
    107 	}
    108 
    109 	pHandle->pKeyParser = keyParser_create(hOs);
    110 	if (pHandle->pKeyParser == NULL)
    111 	{
    112 		fsm_Unload(hOs, pHandle->pMainKeysSm);
    113 		os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
    114 		return NULL;
    115 	}
    116 
    117 	pHandle->pBcastSm = broadcastKey_create(hOs);
    118 	if (pHandle->pBcastSm == NULL)
    119 	{
    120 		keyParser_unload(pHandle->pKeyParser);
    121 		fsm_Unload(hOs, pHandle->pMainKeysSm);
    122 		os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
    123 		return NULL;
    124 	}
    125 
    126 	pHandle->pUcastSm = unicastKey_create(hOs);
    127 	if (pHandle->pBcastSm == NULL)
    128 	{
    129 		broadcastKey_unload(pHandle->pBcastSm);
    130 		keyParser_unload(pHandle->pKeyParser);
    131 		fsm_Unload(hOs, pHandle->pMainKeysSm);
    132 		os_memoryFree(hOs, pHandle, sizeof(mainKeys_t));
    133 		return NULL;
    134 	}
    135 
    136 	pHandle->hOs = hOs;
    137 
    138 	/* At first Timeout we will send MediaSpecific Event   */
    139 	/* At any other Timeout we will send the Timeout Event */
    140 
    141 	pHandle->mainKeysTimeoutCounter = TI_FALSE;
    142 
    143 	return pHandle;
    144 }
    145 
    146 /**
    147 *
    148 * mainKeys_config
    149 *
    150 * \b Description:
    151 *
    152 * Init main security state machine state machine
    153 *
    154 * \b ARGS:
    155 *
    156 *  none
    157 *
    158 * \b RETURNS:
    159 *
    160 *  TI_OK on success, TI_NOK otherwise.
    161 *
    162 * \sa
    163 */
    164 TI_STATUS mainKeys_config (mainKeys_t    *pMainKeys,
    165                            TRsnPaeConfig *pPaeConfig,
    166                            void          *pParent,
    167                            TI_HANDLE      hReport,
    168                            TI_HANDLE      hOs,
    169                            TI_HANDLE      hCtrlData,
    170                            TI_HANDLE      hEvHandler,
    171                            TI_HANDLE      hConn,
    172                            TI_HANDLE      hRsn,
    173                            TI_HANDLE      hTimer)
    174 
    175 {
    176     TI_STATUS      status;
    177 
    178 	/** Main key State Machine matrix */
    179 	fsm_actionCell_t    mainKeysSM_matrix[MAIN_KEYS_NUM_STATES][MAIN_KEYS_NUM_EVENTS] =
    180 	{
    181 		/* next state and actions for IDLE state */
    182 		{	{MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeys_startIdle},
    183 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmNop},
    184 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected},
    185 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected},
    186 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeySmUnexpected}
    187 		},
    188 
    189 		/* next state and actions for START state */
    190 		{	{MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeySmUnexpected},
    191 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopStart},
    192 			{MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
    193 			{MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
    194 			{MAIN_KEYS_STATE_START, (fsm_Action_t)mainKeys_smTimeOut}
    195 		},
    196 
    197 		/* next state and actions for UNICAST COMPLETE state */
    198 		{	{MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmUnexpected},
    199 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopUcastComplete},
    200 			{MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
    201 			{MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeys_bcastCompleteUcastComplete},
    202 			{MAIN_KEYS_STATE_UNICAST_COMPLETE, (fsm_Action_t)mainKeys_smTimeOut}
    203 		},
    204 
    205 		/* next state and actions for BROADCAST COMPLETE state */
    206 		{	{MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmUnexpected},
    207 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopBcastComplete},
    208 			{MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeys_ucastCompleteBcastComplete},
    209 			{MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeySmNop},
    210 			{MAIN_KEYS_STATE_BROADCAST_COMPLETE, (fsm_Action_t)mainKeys_smTimeOut}
    211 		},
    212 
    213 		/* next state and actions for COMPLETE state */
    214 		{	{MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmUnexpected},
    215 			{MAIN_KEYS_STATE_IDLE, (fsm_Action_t)mainKeys_stopComplete},
    216 			{MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmNop},
    217 			{MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmNop},
    218 			{MAIN_KEYS_STATE_COMPLETE, (fsm_Action_t)mainKeySmUnexpected}
    219 		}
    220 	};
    221 
    222 	pMainKeys->hCtrlData = hCtrlData;
    223 	pMainKeys->hOs = hOs;
    224 	pMainKeys->hReport = hReport;
    225     pMainKeys->hEvHandler = hEvHandler;
    226     pMainKeys->hConn = hConn;
    227     pMainKeys->hRsn = hRsn;
    228     pMainKeys->hTimer = hTimer;
    229 
    230     pMainKeys->pParent = pParent;
    231 	pMainKeys->keysTimeout = MAIN_KEYS_TIMEOUT;
    232 
    233 	pMainKeys->start = mainKeys_start;
    234 	pMainKeys->stop = mainKeys_stop;
    235 	pMainKeys->reportUcastStatus = mainKeys_reportUcastStatus;
    236 	pMainKeys->reportBcastStatus = mainKeys_reportBcastStatus;
    237 	pMainKeys->setKey = mainKeys_setKey;
    238 	pMainKeys->removeKey = mainKeys_removeKey;
    239 	pMainKeys->setDefaultKeyId = mainKeys_setDefaultKeyId;
    240 	pMainKeys->getSessionKey = mainKeys_getSessionKey;
    241 
    242 	pMainKeys->currentState = MAIN_KEYS_STATE_IDLE;
    243 
    244 	/* allocate OS timer memory */
    245     if (pMainKeys->hSessionTimer == NULL)
    246     {
    247         pMainKeys->hSessionTimer = tmr_CreateTimer (pMainKeys->hTimer);
    248         if (pMainKeys->hSessionTimer == NULL)
    249         {
    250             TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "mainKeys_config(): Failed to create hSessionTimer!\n");
    251             return TI_NOK;
    252         }
    253 	}
    254 
    255     status = fsm_Config(pMainKeys->pMainKeysSm, &mainKeysSM_matrix[0][0],
    256 						MAIN_KEYS_NUM_STATES, MAIN_KEYS_NUM_EVENTS, NULL, pMainKeys->hOs);
    257 	if (status != TI_OK)
    258 	{
    259 TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring SM\n");
    260 		return status;
    261 	}
    262 
    263 	status = keyParser_config(pMainKeys->pKeyParser,
    264                               pPaeConfig,
    265                               pMainKeys->pUcastSm,
    266                               pMainKeys->pBcastSm,
    267                               pMainKeys,
    268                               hReport,
    269                               hOs,
    270                               hCtrlData);
    271 	if (status != TI_OK)
    272 	{
    273 TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring key parser\n");
    274 		return status;
    275 	}
    276 
    277 	status = broadcastKey_config(pMainKeys->pBcastSm, pPaeConfig, pMainKeys, hReport, hOs);
    278 	if (status != TI_OK)
    279 	{
    280 TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring broadcast key SM\n");
    281 		return status;
    282 	}
    283 
    284 	status = unicastKey_config(pMainKeys->pUcastSm, pPaeConfig, pMainKeys, hReport, hOs);
    285 	if (status != TI_OK)
    286 	{
    287 TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error in configuring unicast key SM\n");
    288 		return status;
    289 	}
    290 
    291 	return TI_OK;
    292 }
    293 
    294 /**
    295 *
    296 * mainKeys_config
    297 *
    298 * \b Description:
    299 *
    300 * Init main security state machine state machine
    301 *
    302 * \b ARGS:
    303 *
    304 *  none
    305 *
    306 * \b RETURNS:
    307 *
    308 *  TI_OK on success, TI_NOK otherwise.
    309 *
    310 * \sa
    311 */
    312 TI_STATUS mainKeys_unload(mainKeys_t *pMainKeys)
    313 {
    314 	TI_STATUS	status;
    315 
    316 	if (pMainKeys == NULL)
    317 	{
    318 		return TI_NOK;
    319 	}
    320 
    321 	status = fsm_Unload(pMainKeys->hOs, pMainKeys->pMainKeysSm);
    322     if (status != TI_OK)
    323 	{
    324 		/* report failure but don't stop... */
    325         TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error releasing FSM memory \n");
    326 	}
    327 
    328 	if (pMainKeys->hSessionTimer)
    329 	{
    330 		tmr_DestroyTimer (pMainKeys->hSessionTimer);
    331 	}
    332     pMainKeys->hSessionTimer = NULL;
    333 
    334     status = keyParser_unload(pMainKeys->pKeyParser);
    335     if (status != TI_OK)
    336 	{
    337 		/* report failure but don't stop... */
    338         TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error unloading key parser\n");
    339 	}
    340 
    341 	status = broadcastKey_unload(pMainKeys->pBcastSm);
    342     if (status != TI_OK)
    343 	{
    344 		/* report failure but don't stop... */
    345         TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error unloading broadcast key SM\n");
    346 	}
    347 
    348 	status = unicastKey_unload(pMainKeys->pUcastSm);
    349     if (status != TI_OK)
    350 	{
    351 		/* report failure but don't stop... */
    352         TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: Error unloading unicast key SM\n");
    353 	}
    354 
    355 	os_memoryFree(pMainKeys->hOs, pMainKeys, sizeof(mainKeys_t));
    356 
    357     return TI_OK;
    358 }
    359 
    360 
    361 /**
    362 *
    363 * rsn_mainKeySmStart
    364 *
    365 * \b Description:
    366 *
    367 * START event handler
    368 *
    369 * \b ARGS:
    370 *
    371 *  I   - pCtrlB - station control block  \n
    372 *
    373 * \b RETURNS:
    374 *
    375 *  TI_OK on success, TI_NOK otherwise.
    376 *
    377 * \sa rsn_mainKeySmStop()
    378 */
    379 
    380 TI_STATUS mainKeys_start(struct _mainKeys_t *pMainKeys)
    381 {
    382 	TI_STATUS  status;
    383 
    384 	status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_START, pMainKeys);
    385 
    386 	return status;
    387 }
    388 
    389 /**
    390 *
    391 * rsn_mainKeySmStop
    392 *
    393 * \b Description:
    394 *
    395 * STOP event handler
    396 *
    397 * \b ARGS:
    398 *
    399 *  I   - pCtrlB - station control block  \n
    400 *
    401 * \b RETURNS:
    402 *
    403 *  TI_OK on success, TI_NOK otherwise.
    404 *
    405 * \sa rsn_mainKeySmStart()
    406 */
    407 
    408 TI_STATUS mainKeys_stop(struct _mainKeys_t *pMainKeys)
    409 {
    410 	TI_STATUS  status;
    411 
    412 	status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_STOP, pMainKeys);
    413 
    414 	return status;
    415 }
    416 
    417 /**
    418 *
    419 * rsn_mainKeySmReportUnicastComplete
    420 *
    421 * \b Description:
    422 *
    423 * UNICAST_COMPLETE event handler
    424 *
    425 * \b ARGS:
    426 *
    427 *  I   - pCtrlB - station control block  \n
    428 *
    429 * \b RETURNS:
    430 *
    431 *  TI_OK on success, TI_NOK otherwise.
    432 *
    433 * \sa rsn_mainKeySmReportBroadcastComplete()
    434 */
    435 
    436 TI_STATUS mainKeys_reportUcastStatus(struct _mainKeys_t *pMainKeys, TI_STATUS ucastStatus)
    437 {
    438 	TI_STATUS    status=TI_NOK;
    439     EExternalAuthMode extAuthMode;
    440 	struct _rsn_t *pRsn = pMainKeys->pParent->pParent;
    441 
    442 	if (ucastStatus == TI_OK)
    443 	{
    444 
    445 		txCtrlParams_setCurrentPrivacyInvokedMode(pRsn->hTxCtrl, TI_TRUE);
    446 
    447 		status = pRsn->pAdmCtrl->getExtAuthMode(pRsn->pAdmCtrl, &extAuthMode);
    448         if (status != TI_OK)
    449         {
    450             return status;
    451         }
    452         if (extAuthMode >= RSN_EXT_AUTH_MODE_WPA)
    453         {
    454 			txCtrlParams_setEapolEncryptionStatus(pRsn->hTxCtrl, TI_TRUE);
    455         }
    456         else
    457         {
    458 			txCtrlParams_setEapolEncryptionStatus(pRsn->hTxCtrl, TI_FALSE);
    459         }
    460 
    461         status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_UCAST_COMPLETE, pMainKeys);
    462 	}
    463 
    464 	return status;
    465 }
    466 
    467 
    468 /**
    469 *
    470 * rsn_mainKeySmReportBroadcastComplete
    471 *
    472 * \b Description:
    473 *
    474 * BROADCAST_COMPLETE event handler
    475 *
    476 * \b ARGS:
    477 *
    478 *  I   - pCtrlB - station control block  \n
    479 *
    480 * \b RETURNS:
    481 *
    482 *  TI_OK on success, TI_NOK otherwise.
    483 *
    484 * \sa rsn_mainKeySmReportUnicastComplete()
    485 */
    486 
    487 TI_STATUS mainKeys_reportBcastStatus(struct _mainKeys_t *pMainKeys, TI_STATUS bcastStatus)
    488 {
    489 	TI_STATUS  status=TI_NOK;
    490 
    491 	if (bcastStatus == TI_OK)
    492 	{
    493 		status = mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_BCAST_COMPLETE, pMainKeys);
    494 	}
    495 
    496 	return status;
    497 }
    498 
    499 /**
    500 *
    501 * mainKeySmSessionTimeout
    502 *
    503 * \b Description:
    504 *
    505 * SESSION_TIMEOUOT event handler
    506 *
    507 * \b ARGS:
    508 *
    509 *  I   - pData - station control block  \n
    510 *
    511 * \b RETURNS:
    512 *
    513 *  TI_OK on success, TI_NOK otherwise.
    514 */
    515 TI_STATUS mainKeys_setKey(struct _mainKeys_t *pMainKeys, TSecurityKeys *pKey)
    516 {
    517 	return (pMainKeys->pParent->setKey(pMainKeys->pParent, pKey));
    518 }
    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 *  TI_OK on success, TI_NOK otherwise.
    535 */
    536 TI_STATUS mainKeys_removeKey(struct _mainKeys_t *pMainKeys, TSecurityKeys *pKey)
    537 {
    538 	return (pMainKeys->pParent->removeKey(pMainKeys->pParent, pKey));
    539 }
    540 
    541 /**
    542 *
    543 * mainKeySmSessionTimeout
    544 *
    545 * \b Description:
    546 *
    547 * SESSION_TIMEOUOT event handler
    548 *
    549 * \b ARGS:
    550 *
    551 *  I   - pData - station control block  \n
    552 *
    553 * \b RETURNS:
    554 *
    555 *  TI_OK on success, TI_NOK otherwise.
    556 */
    557 TI_STATUS mainKeys_setDefaultKeyId(struct _mainKeys_t *pMainKeys, TI_UINT8 keyId)
    558 {
    559 	return (pMainKeys->pParent->setDefaultKeyId(pMainKeys->pParent, keyId));
    560 }
    561 
    562 /**
    563 *
    564 * mainKeySmSessionTimeout
    565 *
    566 * \b Description:
    567 *
    568 * SESSION_TIMEOUOT event handler
    569 *
    570 * \b ARGS:
    571 *
    572 *  I   - pData - station control block  \n
    573 *
    574 * \b RETURNS:
    575 *
    576 *  TI_OK on success, TI_NOK otherwise.
    577 */
    578 TI_STATUS mainKeys_getSessionKey(struct _mainKeys_t *pMainKeys, TI_UINT8 *pKey, TI_UINT32 *pKeyLen)
    579 {
    580 	TI_STATUS		status;
    581 
    582 	status = pMainKeys->pParent->getSessionKey(pMainKeys->pParent, pKey, pKeyLen);
    583 
    584 	return status;
    585 }
    586 
    587 /**
    588 *
    589 * mainKeySmSessionTimeout
    590 *
    591 * \b Description:
    592 *
    593 * SESSION_TIMEOUOT event handler
    594 *
    595 * \b ARGS:
    596 *
    597 *  I   - pMainKeys - module handle  \n
    598 *  I   - bTwdInitOccured - Indicates if TWDriver recovery occured since timer started   \n
    599 *
    600 * \b RETURNS:
    601 *
    602 *  TI_OK on success, TI_NOK otherwise.
    603 */
    604 
    605 void mainKeys_sessionTimeout(void *pMainKeys, TI_BOOL bTwdInitOccured)
    606 {
    607 
    608 	mainKeys_smEvent(pMainKeys, MAIN_KEYS_EVENT_SESSION_TIMEOUOT, pMainKeys);
    609 
    610 }
    611 
    612 
    613 static TI_STATUS mainKeys_smEvent(struct _mainKeys_t *pMainKeys, TI_UINT8 event, void* pData)
    614 {
    615 	TI_STATUS		status;
    616 	TI_UINT8		nextState;
    617 
    618 
    619 	status = fsm_GetNextState(pMainKeys->pMainKeysSm, pMainKeys->currentState, event, &nextState);
    620 	if (status != TI_OK)
    621 	{
    622 TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEYS_SM: ERROR - failed getting next state \n");
    623 
    624 		return(TI_NOK);
    625 	}
    626 
    627 	TRACE3( pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "mainKeys_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", pMainKeys->currentState, event, nextState);
    628 
    629 	status = fsm_Event(pMainKeys->pMainKeysSm, &pMainKeys->currentState, event, pData);
    630 
    631 	return status;
    632 }
    633 /**
    634 *
    635 * mainKeySmStartSubKeySmsAndTimer
    636 *
    637 * \b Description:
    638 *
    639 * Starts unicast & broadcast key SMs and session timer.
    640 *
    641 * \b ARGS:
    642 *
    643 *  I   - pData - station control block  \n
    644 *
    645 * \b RETURNS:
    646 *
    647 *  TI_OK on success, TI_NOK otherwise.
    648 */
    649 
    650 TI_STATUS mainKeys_startIdle(struct _mainKeys_t *pMainKeys)
    651 {
    652 	TI_STATUS  status;
    653 
    654 	status = pMainKeys->pUcastSm->start(pMainKeys->pUcastSm);
    655 	if (status != TI_OK)
    656 	{
    657 		return TI_NOK;
    658 	}
    659 
    660 	status = pMainKeys->pBcastSm->start(pMainKeys->pBcastSm);
    661 	if (status != TI_OK)
    662 	{
    663 		return TI_NOK;
    664 	}
    665 
    666     tmr_StartTimer (pMainKeys->hSessionTimer,
    667                     mainKeys_sessionTimeout,
    668                     (TI_HANDLE)pMainKeys,
    669                     pMainKeys->keysTimeout,
    670                     TI_FALSE);
    671 
    672 	status = pMainKeys->pKeyParser->replayReset(pMainKeys->pKeyParser);
    673 
    674 	return status;
    675 }
    676 
    677 
    678 /**
    679 *
    680 * mainKeySmStopSubKeySmsAndTimer
    681 *
    682 * \b Description:
    683 *
    684 * Stops unicast & broadcast key SMs and session timer.
    685 *
    686 * \b ARGS:
    687 *
    688 *  I   - pData - station control block  \n
    689 *
    690 * \b RETURNS:
    691 *
    692 *  TI_OK on success, TI_NOK otherwise.
    693 */
    694 TI_STATUS mainKeys_stopStart(struct _mainKeys_t *pMainKeys)
    695 {
    696 	TI_STATUS  status = TI_OK;
    697 
    698 	status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
    699 	if (status != TI_OK)
    700 	{
    701 		return TI_NOK;
    702 	}
    703 
    704 	status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
    705 	if (status != TI_OK)
    706 	{
    707 		return TI_NOK;
    708 	}
    709 
    710 	tmr_StopTimer (pMainKeys->hSessionTimer);
    711 
    712 	return status;
    713 }
    714 
    715 
    716 /**
    717 *
    718 * mainKeySmStopSubKeySmsAndTimer
    719 *
    720 * \b Description:
    721 *
    722 * Stops unicast & broadcast key SMs and session timer.
    723 *
    724 * \b ARGS:
    725 *
    726 *  I   - pData - station control block  \n
    727 *
    728 * \b RETURNS:
    729 *
    730 *  TI_OK on success, TI_NOK otherwise.
    731 */
    732 TI_STATUS mainKeys_stopUcastComplete(struct _mainKeys_t *pMainKeys)
    733 {
    734 	TI_STATUS  status = TI_OK;
    735 
    736 	status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
    737 	if (status != TI_OK)
    738 	{
    739 		return TI_NOK;
    740 	}
    741 
    742 	status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
    743 	if (status != TI_OK)
    744 	{
    745 		return TI_NOK;
    746 	}
    747 
    748 	tmr_StopTimer (pMainKeys->hSessionTimer);
    749 
    750 	return status;
    751 }
    752 
    753 /**
    754 *
    755 * mainKeySmReportComplete
    756 *
    757 * \b Description:
    758 *
    759 * Report key complete to the main security SM.
    760 *
    761 * \b ARGS:
    762 *
    763 *  I   - pData - station control block  \n
    764 *
    765 * \b RETURNS:
    766 *
    767 *  TI_OK on success, TI_NOK otherwise.
    768 */
    769 TI_STATUS mainKeys_bcastCompleteUcastComplete(struct _mainKeys_t *pMainKeys)
    770 {
    771 	TI_STATUS  status;
    772 
    773     TRACE0(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "mainKeys_bcastCompleteUcastComplete - sending Interrogate \n");
    774 
    775     tmr_StopTimer (pMainKeys->hSessionTimer);
    776 
    777 	status = pMainKeys->pParent->reportKeysStatus(pMainKeys->pParent, TI_OK);
    778 
    779 	return status;
    780 }
    781 
    782 
    783 /**
    784 *
    785 * mainKeySmStopSubKeySmsAndTimer
    786 *
    787 * \b Description:
    788 *
    789 * Stops unicast & broadcast key SMs and session timer.
    790 *
    791 * \b ARGS:
    792 *
    793 *  I   - pData - station control block  \n
    794 *
    795 * \b RETURNS:
    796 *
    797 *  TI_OK on success, TI_NOK otherwise.
    798 */
    799 TI_STATUS mainKeys_stopBcastComplete(struct _mainKeys_t *pMainKeys)
    800 {
    801 	TI_STATUS  status = TI_OK;
    802 
    803 	status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
    804 	if (status != TI_OK)
    805 	{
    806 		return TI_NOK;
    807 	}
    808 
    809 	status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
    810 	if (status != TI_OK)
    811 	{
    812 		return TI_NOK;
    813 	}
    814 
    815 	tmr_StopTimer (pMainKeys->hSessionTimer);
    816 
    817 	return status;
    818 }
    819 
    820 /**
    821 *
    822 * mainKeySmReportComplete
    823 *
    824 * \b Description:
    825 *
    826 * Report key complete to the main security SM.
    827 *
    828 * \b ARGS:
    829 *
    830 *  I   - pData - station control block  \n
    831 *
    832 * \b RETURNS:
    833 *
    834 *  TI_OK on success, TI_NOK otherwise.
    835 */
    836 TI_STATUS mainKeys_ucastCompleteBcastComplete(struct _mainKeys_t *pMainKeys)
    837 {
    838 	TI_STATUS  status;
    839 
    840     TRACE0(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "mainKeys_ucastCompleteBcastComplete \n");
    841 
    842 	tmr_StopTimer (pMainKeys->hSessionTimer);
    843 	pMainKeys->mainKeysTimeoutCounter = TI_FALSE;
    844 	status = pMainKeys->pParent->reportKeysStatus(pMainKeys->pParent, TI_OK);
    845 
    846 	return status;
    847 }
    848 
    849 /**
    850 *
    851 * mainKeySmStopSubKeySmsAndTimer
    852 *
    853 * \b Description:
    854 *
    855 * Stops unicast & broadcast key SMs and session timer.
    856 *
    857 * \b ARGS:
    858 *
    859 *  I   - pData - station control block  \n
    860 *
    861 * \b RETURNS:
    862 *
    863 *  TI_OK on success, TI_NOK otherwise.
    864 */
    865 TI_STATUS mainKeys_stopComplete(struct _mainKeys_t *pMainKeys)
    866 {
    867 	TI_STATUS  status = TI_OK;
    868 
    869 	status = pMainKeys->pUcastSm->stop(pMainKeys->pUcastSm);
    870 	if (status != TI_OK)
    871 	{
    872 		return TI_NOK;
    873 	}
    874 
    875 	status = pMainKeys->pBcastSm->stop(pMainKeys->pBcastSm);
    876 	if (status != TI_OK)
    877 	{
    878 		return TI_NOK;
    879 	}
    880 
    881 	return status;
    882 }
    883 
    884 /**
    885 *
    886 * mainKeySmLogMessage
    887 *
    888 * \b Description:
    889 *
    890 * Prints Log messge.\n
    891 * Start session timer.
    892 *
    893 * \b ARGS:
    894 *
    895 *  I   - pData - station control block  \n
    896 *
    897 * \b RETURNS:
    898 *
    899 *  TI_OK on success, TI_NOK otherwise.
    900 */
    901 TI_STATUS mainKeys_smTimeOut(void* data)
    902 {
    903 	OS_802_11_AUTHENTICATION_REQUEST   *request;
    904 	TI_UINT8                   AuthBuf[sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST)];
    905 	paramInfo_t				param;
    906 	TI_STATUS				status;
    907 	struct _mainKeys_t 		*pMainKeys = (struct _mainKeys_t *)data;
    908 
    909 
    910 TRACE1(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "MAIN_KEY_SM: TRAP: Session Timeout for station , mainKeysTimeoutCounter=%d\n", pMainKeys->mainKeysTimeoutCounter);
    911 
    912 	request = (OS_802_11_AUTHENTICATION_REQUEST *)(AuthBuf + sizeof(TI_UINT32));
    913 	request->Length = sizeof(OS_802_11_AUTHENTICATION_REQUEST);
    914 
    915 	param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
    916 	status = ctrlData_getParam(pMainKeys->hCtrlData, &param);
    917 	if (status != TI_OK)
    918 	{
    919 		return TI_NOK;
    920 	}
    921 
    922     TRACE1(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, "current station is banned from the roaming candidates list for %d Ms\n", RSN_MAIN_KEYS_SESSION_TIMEOUT);
    923 
    924     rsn_banSite(pMainKeys->hRsn, param.content.ctrlDataCurrentBSSID, RSN_SITE_BAN_LEVEL_FULL, RSN_MAIN_KEYS_SESSION_TIMEOUT);
    925 
    926 
    927 	/* mainKeysTimeoutCounter is a boolean variable, With states:	*/
    928 	/* TI_TRUE - It is a Timeout Association Event						*/
    929 	/* TI_FALSE - It is a Media specific Event							*/
    930 
    931 	if (!pMainKeys->mainKeysTimeoutCounter)
    932 	{
    933 		/* Fill Media specific indication fields and send to OS/User    */
    934 		MAC_COPY (request->BSSID, param.content.ctrlDataCurrentBSSID);
    935 
    936 		request->Flags = OS_802_11_REQUEST_REAUTH;
    937 
    938 		*(TI_UINT32*)AuthBuf = os802_11StatusType_Authentication;
    939 
    940 TRACE1(pMainKeys->hReport, REPORT_SEVERITY_INFORMATION, " %d Ms\n",RSN_MAIN_KEYS_SESSION_TIMEOUT);
    941 
    942 		EvHandlerSendEvent(pMainKeys->hEvHandler, IPC_EVENT_MEDIA_SPECIFIC, (TI_UINT8*)AuthBuf,
    943 							sizeof(TI_UINT32) + sizeof(OS_802_11_AUTHENTICATION_REQUEST));
    944 
    945         tmr_StartTimer (pMainKeys->hSessionTimer,
    946                         mainKeys_sessionTimeout,
    947                         (TI_HANDLE)pMainKeys,
    948                         pMainKeys->keysTimeout,
    949                         TI_FALSE);
    950 
    951 		pMainKeys->mainKeysTimeoutCounter = TI_TRUE;
    952 	}
    953 	else
    954 	{
    955         pMainKeys->mainKeysTimeoutCounter = TI_FALSE;
    956         rsn_reportAuthFailure(pMainKeys->hRsn, RSN_AUTH_STATUS_TIMEOUT);
    957         conn_reportRsnStatus(pMainKeys->hConn, (mgmtStatus_e)STATUS_SECURITY_FAILURE);
    958 	}
    959 	return TI_OK;
    960 }
    961 
    962 
    963 TI_STATUS mainKeySmUnexpected(struct _mainKeys_t *pMainKeys)
    964 {
    965 TRACE0(pMainKeys->hReport, REPORT_SEVERITY_ERROR, "MAIN_KEY_SM: ERROR UnExpected Event\n");
    966 
    967 	return(TI_OK);
    968 }
    969 
    970 TI_STATUS mainKeySmNop(struct _mainKeys_t *pMainKeys)
    971 {
    972 	return(TI_OK);
    973 }
    974 
    975 void mainKeys_reAuth(TI_HANDLE pHandle)
    976 {
    977 	mainKeys_t 	*pMainKeys = (mainKeys_t *)pHandle;
    978 
    979 	rsn_reAuth(pMainKeys->hRsn);
    980 }
    981