Home | History | Annotate | Download | only in Sta_Management
      1 /*
      2  * authSm.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 authSM.c
     35  *  \brief 802.11 authentication SM source
     36  *
     37  *  \see authSM.h
     38  */
     39 
     40 
     41 /***************************************************************************/
     42 /*																		   */
     43 /*		MODULE:	authSM.c												   */
     44 /*    PURPOSE:	802.11 authentication SM source							   */
     45 /*																	 	   */
     46 /***************************************************************************/
     47 
     48 #define __FILE_ID__  FILE_ID_64
     49 #include "osApi.h"
     50 
     51 #include "paramOut.h"
     52 #include "fsm.h"
     53 #include "report.h"
     54 #include "timer.h"
     55 #include "mlmeApi.h"
     56 #include "mlmeBuilder.h"
     57 #include "authSm.h"
     58 #include "openAuthSm.h"
     59 #include "sharedKeyAuthSm.h"
     60 #include "DrvMainModules.h"
     61 
     62 /* Constants */
     63 
     64 /** number of states in the state machine */
     65 #define	AUTH_SM_MAX_NUM_STATES		4
     66 
     67 /** number of events in the state machine */
     68 #define	AUTH_SM_MAX_NUM_EVENTS		8
     69 
     70 /* Enumerations */
     71 
     72 /* Typedefs */
     73 
     74 /* Structures */
     75 
     76 /* External data definitions */
     77 
     78 /* External functions definitions */
     79 
     80 /* Global variables */
     81 
     82 /* Local function prototypes */
     83 
     84 /* functions */
     85 
     86 /**
     87 *
     88 * auth_create - allocate memory for authentication SM
     89 *
     90 * \b Description:
     91 *
     92 * Allocate memory for authentication SM. \n
     93 * 		Allocates memory for Association context. \n
     94 * 		Allocates memory for authentication timer. \n
     95 * 		Allocates memory for authentication SM matrix. \n
     96 *
     97 * \b ARGS:
     98 *
     99 *  I   - hOs - OS context  \n
    100 *
    101 * \b RETURNS:
    102 *
    103 *  TI_OK if successful, TI_NOK otherwise.
    104 *
    105 * \sa rsn_mainSecSmKeysOnlyStop()
    106 */
    107 TI_HANDLE auth_create(TI_HANDLE hOs)
    108 {
    109 	auth_t 	*pHandle;
    110 	TI_STATUS		status;
    111 
    112 	/* allocate authentication context memory */
    113 	pHandle = (auth_t*)os_memoryAlloc(hOs, sizeof(auth_t));
    114 	if (pHandle == NULL)
    115 	{
    116 		return NULL;
    117 	}
    118 
    119 	os_memoryZero(hOs, pHandle, sizeof(auth_t));
    120 
    121 	pHandle->hOs = hOs;
    122 
    123 	/* allocate memory for authentication state machine */
    124 	status = fsm_Create(hOs, &pHandle->pAuthSm, AUTH_SM_MAX_NUM_STATES, AUTH_SM_MAX_NUM_EVENTS);
    125 	if (status != TI_OK)
    126 	{
    127 		os_memoryFree(hOs, pHandle, sizeof(auth_t));
    128 		return NULL;
    129 	}
    130 
    131 	return pHandle;
    132 }
    133 
    134 
    135 /**
    136 *
    137 * auth_unload - unload authentication SM from memory
    138 *
    139 * \b Description:
    140 *
    141 * Unload authentication SM from memory
    142 *
    143 * \b ARGS:
    144 *
    145 *  I   - hAuth - Authentication SM context  \n
    146 *
    147 * \b RETURNS:
    148 *
    149 *  TI_OK if successful, TI_NOK otherwise.
    150 *
    151 * \sa rsn_mainSecSmKeysOnlyStop()
    152 */
    153 TI_STATUS auth_unload(TI_HANDLE hAuth)
    154 {
    155     TI_STATUS 		status;
    156 	auth_t		*pHandle;
    157 
    158 	pHandle = (auth_t*)hAuth;
    159 
    160 	status = fsm_Unload(pHandle->hOs, pHandle->pAuthSm);
    161     if (status != TI_OK)
    162 	{
    163 		/* report failure but don't stop... */
    164 TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "AUTH_SM: Error releasing FSM memory \n");
    165 	}
    166 
    167 	if (pHandle->hAuthSmTimer)
    168 	{
    169 		tmr_DestroyTimer (pHandle->hAuthSmTimer);
    170 	}
    171 
    172 	os_memoryFree(pHandle->hOs, pHandle, sizeof(auth_t));
    173 
    174 	return TI_OK;
    175 }
    176 
    177 /**
    178 *
    179 * auth_init - Init required handles and module variables,
    180 *
    181 * \b Description:
    182 *
    183 * Init required handles and module variables,
    184 *
    185 * \b ARGS:
    186 *
    187 *  I   - pStadHandles - The driver modules handles  \n
    188 *
    189 * \b RETURNS:
    190 *
    191 *  void
    192 *
    193 * \sa auth_Create, auth_Unload
    194 */
    195 void auth_init (TStadHandlesList *pStadHandles)
    196 {
    197 	auth_t *pHandle = (auth_t*)(pStadHandles->hAuth);
    198 
    199 	pHandle->hMlme   = pStadHandles->hMlmeSm;
    200 	pHandle->hRsn    = pStadHandles->hRsn;
    201 	pHandle->hReport = pStadHandles->hReport;
    202 	pHandle->hOs     = pStadHandles->hOs;
    203     pHandle->hTimer  = pStadHandles->hTimer;
    204 }
    205 
    206 
    207 TI_STATUS auth_SetDefaults (TI_HANDLE hAuth, authInitParams_t *pAuthInitParams)
    208 {
    209     auth_t		*pHandle = (TI_HANDLE) hAuth;
    210 
    211 	pHandle->timeout = pAuthInitParams->authResponseTimeout;
    212 	pHandle->maxCount = pAuthInitParams->authMaxRetryCount;
    213 
    214 	pHandle->retryCount = 0;
    215 	pHandle->authRejectCount = 0;
    216 	pHandle->authTimeoutCount = 0;
    217 
    218 	pHandle->authType = AUTH_LEGACY_NONE;
    219 
    220 	/* allocate OS timer memory */
    221     pHandle->hAuthSmTimer = tmr_CreateTimer (pHandle->hTimer);
    222 	if (pHandle->hAuthSmTimer == NULL)
    223 	{
    224         TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "auth_SetDefaults(): Failed to create hAuthSmTimer!\n");
    225 		return TI_NOK;
    226 	}
    227 
    228 	return TI_OK;
    229 }
    230 
    231 
    232 /**
    233 *
    234 * auth_start - Start event for the authentication SM
    235 *
    236 * \b Description:
    237 *
    238 * Start event for the authentication SM
    239 *
    240 * \b ARGS:
    241 *
    242 *  I   - hAuth - Authentication SM context  \n
    243 *
    244 * \b RETURNS:
    245 *
    246 *  TI_OK if successful, TI_NOK otherwise.
    247 *
    248 * \sa auth_Stop, auth_Recv
    249 */
    250 TI_STATUS auth_start(TI_HANDLE hAuth)
    251 {
    252 	auth_t		*pHandle = (auth_t*)hAuth;
    253 
    254 	if (pHandle == NULL)
    255     {
    256 		return TI_NOK;
    257     }
    258 
    259 	if (pHandle->authType == AUTH_LEGACY_NONE)
    260     {
    261         TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "auth_start: pHandle->authType == AUTH_LEGACY_NONE\n");
    262 		return TI_NOK;
    263     }
    264 
    265 	switch (pHandle->authType)
    266 	{
    267     case AUTH_LEGACY_RESERVED1:
    268 	case AUTH_LEGACY_OPEN_SYSTEM:
    269 		return auth_osSMEvent(&pHandle->currentState, OPEN_AUTH_SM_EVENT_START, pHandle);
    270 
    271 	case AUTH_LEGACY_SHARED_KEY:
    272 		return auth_skSMEvent(&pHandle->currentState, SHARED_KEY_AUTH_SM_EVENT_START, pHandle);
    273 
    274 	default:
    275         TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR, "auth_start: pHandle->authType unknown.\n");
    276 		return TI_NOK;
    277 	}
    278 }
    279 
    280 /**
    281 *
    282 * auth_stop - Stop event for the authentication SM
    283 *
    284 * \b Description:
    285 *
    286 * Stop event for the authentication SM
    287 *
    288 * \b ARGS:
    289 *
    290 *  I   - hAuth - Authentication SM context  \n
    291 *
    292 * \b RETURNS:
    293 *
    294 *  TI_OK if successful, TI_NOK otherwise.
    295 *
    296 * \sa auth_Start, auth_Recv
    297 */
    298 TI_STATUS auth_stop(TI_HANDLE hAuth, TI_BOOL sendDeAuth, mgmtStatus_e reason )
    299 {
    300 	auth_t		*pHandle;
    301 
    302 	pHandle = (auth_t*)hAuth;
    303 
    304 	if (pHandle == NULL)
    305 		return TI_NOK;
    306 
    307 	if (pHandle->authType == AUTH_LEGACY_NONE)
    308 		return TI_NOK;
    309 
    310 	if( sendDeAuth == TI_TRUE )
    311 	{
    312 		deAuth_t	deAuth;
    313 		deAuth.reason = ENDIAN_HANDLE_WORD(reason);
    314 		mlmeBuilder_sendFrame(pHandle->hMlme, DE_AUTH, (TI_UINT8*)&deAuth, sizeof(deAuth_t), 0);
    315 	}
    316 
    317 	switch (pHandle->authType)
    318 	{
    319     case AUTH_LEGACY_RESERVED1:
    320 	case AUTH_LEGACY_OPEN_SYSTEM:
    321 		return auth_osSMEvent(&pHandle->currentState, OPEN_AUTH_SM_EVENT_STOP, pHandle);
    322 
    323 	case AUTH_LEGACY_SHARED_KEY:
    324 		return auth_skSMEvent(&pHandle->currentState, SHARED_KEY_AUTH_SM_EVENT_STOP, pHandle);
    325 
    326 	default:
    327 		return TI_NOK;
    328 	}
    329 }
    330 
    331 /**
    332 *
    333 * auth_recv - Recive a message from the AP
    334 *
    335 * \b Description:
    336 *
    337 * Parse a message form the AP and perform the appropriate event.
    338 *
    339 * \b ARGS:
    340 *
    341 *  I   - hAuth - Authentication SM context  \n
    342 *
    343 * \b RETURNS:
    344 *
    345 *  TI_OK if successful, TI_NOK otherwise.
    346 *
    347 * \sa auth_Start, auth_Stop
    348 */
    349 TI_STATUS auth_recv(TI_HANDLE hAuth, mlmeFrameInfo_t *pFrame)
    350 {
    351 	auth_t			*pHandle;
    352 
    353 	pHandle = (auth_t*)hAuth;
    354 
    355 	if (pHandle == NULL)
    356 		return TI_NOK;
    357 
    358 	if (pFrame->subType != AUTH)
    359 		return TI_NOK;
    360 
    361 	if (pHandle->authType == AUTH_LEGACY_NONE)
    362 		return TI_NOK;
    363 
    364 	if (pFrame->content.auth.status != STATUS_SUCCESSFUL)
    365 		pHandle->authRejectCount++;
    366 
    367 	switch (pHandle->authType)
    368 	{
    369 	case AUTH_LEGACY_RESERVED1:
    370 	case AUTH_LEGACY_OPEN_SYSTEM:
    371 		return openAuth_Recv(hAuth, pFrame);
    372 
    373 	case AUTH_LEGACY_SHARED_KEY:
    374 		return sharedKeyAuth_Recv(hAuth, pFrame);
    375 
    376 	default:
    377 		return TI_OK;
    378 	}
    379 }
    380 
    381 /**
    382 *
    383 * auth_getParam - Get a specific parameter from the authentication SM
    384 *
    385 * \b Description:
    386 *
    387 * Get a specific parameter from the authentication SM.
    388 *
    389 * \b ARGS:
    390 *
    391 *  I   - hAuth - Authentication SM context  \n
    392 *  I/O - pParam - Parameter \n
    393 *
    394 * \b RETURNS:
    395 *
    396 *  TI_OK if successful, TI_NOK otherwise.
    397 *
    398 * \sa auth_Start, auth_Stop
    399 */
    400 TI_STATUS auth_getParam(TI_HANDLE hAuth, paramInfo_t *pParam)
    401 {
    402 	auth_t		*pHandle;
    403 
    404 	pHandle = (auth_t*)hAuth;
    405 
    406 	if ((pHandle == NULL) || (pParam == NULL))
    407 	{
    408 		return TI_NOK;
    409 	}
    410 
    411 	switch (pParam->paramType)
    412 	{
    413 	case AUTH_RESPONSE_TIMEOUT_PARAM:
    414 		pParam->content.authResponseTimeout = pHandle->timeout;
    415 		break;
    416 
    417 	case AUTH_COUNTERS_PARAM:
    418 		pParam->content.siteMgrTiWlanCounters.AuthRejects = pHandle->authRejectCount;
    419 		pParam->content.siteMgrTiWlanCounters.AuthTimeouts = pHandle->authTimeoutCount;
    420 		break;
    421 
    422 	case AUTH_LEGACY_TYPE_PARAM:
    423 		pParam->content.authLegacyAuthType = pHandle->authType;
    424 		break;
    425 
    426 	default:
    427 		return TI_NOK;
    428 	}
    429 
    430 	return TI_OK;
    431 }
    432 
    433 /**
    434 *
    435 * auth_setParam - Set a specific parameter to the authentication SM
    436 *
    437 * \b Description:
    438 *
    439 * Set a specific parameter to the authentication SM.
    440 *
    441 * \b ARGS:
    442 *
    443 *  I   - hAuth - Authentication SM context  \n
    444 *  I/O - pParam - Parameter \n
    445 *
    446 * \b RETURNS:
    447 *
    448 *  TI_OK if successful, TI_NOK otherwise.
    449 *
    450 * \sa auth_Start, auth_Stop
    451 */
    452 TI_STATUS auth_setParam(TI_HANDLE hAuth, paramInfo_t *pParam)
    453 {
    454 	auth_t		*pHandle;
    455 
    456 	pHandle = (auth_t*)hAuth;
    457 
    458 	if ((pHandle == NULL) || (pParam == NULL))
    459 	{
    460 		return TI_NOK;
    461 	}
    462 
    463 	switch (pParam->paramType)
    464 	{
    465 	case AUTH_LEGACY_TYPE_PARAM:
    466 		pHandle->authType = pParam->content.authLegacyAuthType;
    467 
    468 		switch (pHandle->authType)
    469 		{
    470         case AUTH_LEGACY_RESERVED1:
    471 		case AUTH_LEGACY_OPEN_SYSTEM:
    472 			openAuth_Config(hAuth, pHandle->hOs);
    473 			break;
    474 
    475 		case AUTH_LEGACY_SHARED_KEY:
    476 			sharedKeyAuth_Config(hAuth, pHandle->hOs);
    477 			break;
    478 
    479 		default:
    480 			return TI_NOK;
    481 		}
    482 		break;
    483 
    484 	case AUTH_RESPONSE_TIMEOUT_PARAM:
    485 		if ((pParam->content.authResponseTimeout >= AUTH_RESPONSE_TIMEOUT_MIN) &&
    486 			(pParam->content.authResponseTimeout <= AUTH_RESPONSE_TIMEOUT_MAX))
    487 		{
    488 			pHandle->timeout = pParam->content.authResponseTimeout;
    489 		}
    490 		else
    491 		{
    492 			return TI_NOK;
    493 		}
    494 		break;
    495 
    496 	default:
    497 		return TI_NOK;
    498 	}
    499 
    500 	return TI_OK;
    501 }
    502 
    503 /**
    504 *
    505 * auth_smTimeout - Set a specific parameter to the authentication SM
    506 *
    507 * \b Description:
    508 *
    509 * Set a specific parameter to the authentication SM.
    510 *
    511 * \b ARGS:
    512 *
    513 *  I   - hAuth - authentication SM context  \n
    514 *  I   - bTwdInitOccured - Indicates if TWDriver recovery occured since timer started  \n
    515 *
    516 * \b RETURNS:
    517 *
    518 *  TI_OK if successful, TI_NOK otherwise.
    519 *
    520 * \sa auth_Start, auth_Stop
    521 */
    522 void auth_smTimeout (TI_HANDLE hAuth, TI_BOOL bTwdInitOccured)
    523 {
    524 	auth_t		*pHandle;
    525 
    526 	pHandle = (auth_t*)hAuth;
    527 
    528 	if (pHandle == NULL)
    529 		return;
    530 
    531 	if (pHandle->authType == AUTH_LEGACY_NONE)
    532 		return;
    533 
    534 	pHandle->authTimeoutCount++;
    535 
    536 	switch (pHandle->authType)
    537 	{
    538     case AUTH_LEGACY_RESERVED1:
    539 	case AUTH_LEGACY_OPEN_SYSTEM:
    540 		openAuth_Timeout(pHandle);
    541 		break;
    542 
    543 	case AUTH_LEGACY_SHARED_KEY:
    544 		sharedKey_Timeout(pHandle);
    545 		break;
    546 
    547 	default:
    548 		break;
    549 	}
    550 }
    551 
    552 /*****************************************************************************
    553 **
    554 ** Authentication messages builder/Parser
    555 **
    556 *****************************************************************************/
    557 
    558 /**
    559 *
    560 * auth_smMsgBuild - Build an authentication message and send it to the mlme builder
    561 *
    562 * \b Description:
    563 *
    564 * Build an authentication message and send it to the mlme builder.
    565 *
    566 * \b ARGS:
    567 *
    568 *  I   - pAssoc - Association SM context  \n
    569 *  I/O - pParam - Parameter \n
    570 *
    571 * \b RETURNS:
    572 *
    573 *  TI_OK if successful, TI_NOK otherwise.
    574 *
    575 * \sa auth_Start, auth_Stop
    576 */
    577 TI_STATUS auth_smMsgBuild(auth_t *pCtx, TI_UINT16 seq, TI_UINT16 statusCode, TI_UINT8* pChallange, TI_UINT8 challangeLen)
    578 {
    579 	TI_STATUS				status;
    580 	TI_UINT8				len;
    581 	TI_UINT8				authMsg[MAX_AUTH_MSG_LEN];
    582 	authMsg_t			*pAuthMsg;
    583 	dot11_CHALLENGE_t	*pDot11Challenge;
    584 	TI_UINT8				wepOpt;
    585 
    586 	wepOpt = 0;
    587 
    588 	pAuthMsg = (authMsg_t*)authMsg;
    589 
    590 	/* insert algorithm */
    591 	pAuthMsg->authAlgo = (TI_UINT16)pCtx->authType;
    592 
    593 	/* insert sequense */
    594 	pAuthMsg->seqNum = ENDIAN_HANDLE_WORD(seq);
    595 
    596 	/* insert status code */
    597 	pAuthMsg->status = ENDIAN_HANDLE_WORD(statusCode);
    598 
    599 	len = sizeof(pAuthMsg->authAlgo) + sizeof(pAuthMsg->seqNum) + sizeof(pAuthMsg->status);
    600 
    601 	if (pChallange != NULL)
    602 	{
    603 		pDot11Challenge = (dot11_CHALLENGE_t*)&authMsg[len];
    604 
    605 		pDot11Challenge->hdr[0] = CHALLANGE_TEXT_IE_ID;
    606 		pDot11Challenge->hdr[1] = challangeLen;
    607 
    608 		os_memoryCopy(pCtx->hOs, (void *)pDot11Challenge->text, pChallange, challangeLen);
    609 		len += challangeLen + 2;
    610 
    611 		wepOpt = 1;
    612 	}
    613 
    614 	status =  mlmeBuilder_sendFrame(pCtx->hMlme, AUTH, authMsg, len, wepOpt);
    615 
    616 	return status;
    617 }
    618 
    619 
    620 
    621 
    622 
    623 
    624 
    625