1 /* 2 * openAuthSm.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_70 49 #include "osApi.h" 50 51 #include "paramOut.h" 52 #include "timer.h" 53 #include "fsm.h" 54 #include "report.h" 55 #include "mlmeApi.h" 56 #include "authSm.h" 57 #include "openAuthSm.h" 58 #include "rsnApi.h" 59 60 /* Constants */ 61 62 /** number of states in the state machine */ 63 #define OPEN_AUTH_SM_NUM_STATES 3 64 65 /** number of events in the state machine */ 66 #define OPEN_AUTH_SM_NUM_EVENTS 6 67 68 /* Enumerations */ 69 70 /* Typedefs */ 71 72 /* Structures */ 73 74 /* External data definitions */ 75 76 /* External functions definitions */ 77 78 /* Global variables */ 79 80 /* Local function prototypes */ 81 82 /* functions */ 83 84 /** 85 * 86 * openAuth_smConfig - configure a new authentication SM 87 * 88 * \b Description: 89 * 90 * Configure a new authentication SM. 91 * 92 * \b ARGS: 93 * 94 * I - hAuth - Association SM context \n 95 * I - hMlme - MLME SM context \n 96 * I - hSiteMgr - Site manager context \n 97 * I - hCtrlData - Control data context \n 98 * I - hTxData - TX data context \n 99 * I - hHalCtrl - Hal control context \n 100 * I - hReport - Report context \n 101 * I - hOs - OS context \n 102 * I - authTimeout - Association SM timeout \n 103 * I - authMaxCount - Max number of authentication requests to send \n 104 * 105 * \b RETURNS: 106 * 107 * TI_OK if successful, TI_NOK otherwise. 108 * 109 * \sa openAuth_Create, openAuth_Unload 110 */ 111 TI_STATUS openAuth_Config(TI_HANDLE hAuth, TI_HANDLE hOs) 112 { 113 auth_t *pHandle; 114 TI_STATUS status; 115 /** Main 802.1X State Machine matrix */ 116 fsm_actionCell_t openAuth_smMatrix[OPEN_AUTH_SM_NUM_STATES][OPEN_AUTH_SM_NUM_EVENTS] = 117 { 118 /* next state and actions for IDLE state */ 119 {{OPEN_AUTH_SM_STATE_WAIT, (fsm_Action_t)openAuth_smStartIdle}, 120 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smActionUnexpected}, 121 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smActionUnexpected}, 122 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smActionUnexpected}, 123 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smActionUnexpected}, 124 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smActionUnexpected} 125 }, 126 /* next state and actions for WAIT state */ 127 {{OPEN_AUTH_SM_STATE_WAIT, (fsm_Action_t)openAuth_smActionUnexpected}, 128 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smStopWait}, 129 {OPEN_AUTH_SM_STATE_AUTH, (fsm_Action_t)openAuth_smSuccessWait}, 130 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smFailureWait}, 131 {OPEN_AUTH_SM_STATE_WAIT, (fsm_Action_t)openAuth_smTimeoutWait}, 132 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smMaxRetryWait} 133 }, 134 /* next state and actions for AUTH state */ 135 {{OPEN_AUTH_SM_STATE_AUTH, (fsm_Action_t)openAuth_smActionUnexpected}, 136 {OPEN_AUTH_SM_STATE_IDLE, (fsm_Action_t)openAuth_smStopAuth}, 137 {OPEN_AUTH_SM_STATE_AUTH, (fsm_Action_t)openAuth_smActionUnexpected}, 138 {OPEN_AUTH_SM_STATE_AUTH, (fsm_Action_t)openAuth_smActionUnexpected}, 139 {OPEN_AUTH_SM_STATE_AUTH, (fsm_Action_t)openAuth_smActionUnexpected}, 140 {OPEN_AUTH_SM_STATE_AUTH, (fsm_Action_t)openAuth_smActionUnexpected} 141 }}; 142 143 144 if (hAuth == NULL) 145 { 146 return TI_NOK; 147 } 148 149 pHandle = (auth_t*)hAuth; 150 151 status = fsm_Config(pHandle->pAuthSm, &openAuth_smMatrix[0][0], 152 OPEN_AUTH_SM_NUM_STATES, OPEN_AUTH_SM_NUM_EVENTS, auth_osSMEvent, hOs); 153 if (status != TI_OK) 154 { 155 return TI_NOK; 156 } 157 158 pHandle->currentState = OPEN_AUTH_SM_STATE_IDLE; 159 160 return TI_OK; 161 } 162 163 164 TI_STATUS auth_osSMEvent(TI_UINT8 *currentState, TI_UINT8 event, TI_HANDLE hAuth) 165 { 166 auth_t *pAuth = (auth_t *)hAuth; 167 TI_STATUS status; 168 TI_UINT8 nextState; 169 170 status = fsm_GetNextState(pAuth->pAuthSm, *currentState, event, &nextState); 171 if (status != TI_OK) 172 { 173 TRACE0(pAuth->hReport, REPORT_SEVERITY_SM, "State machine error, failed getting next state\n"); 174 return(TI_NOK); 175 } 176 177 TRACE3( pAuth->hReport, REPORT_SEVERITY_INFORMATION, "auth_osSMEvent: <currentState = %d, event = %d> --> nextState = %d\n", *currentState, event, nextState); 178 179 status = fsm_Event(pAuth->pAuthSm, currentState, event, (void *)pAuth); 180 181 return status; 182 } 183 184 /** 185 * 186 * openAuth_Recv - Recive a message from the AP 187 * 188 * \b Description: 189 * 190 * Parse a message form the AP and perform the appropriate event. 191 * 192 * \b ARGS: 193 * 194 * I - hAuth - Association SM context \n 195 * 196 * \b RETURNS: 197 * 198 * TI_OK if successful, TI_NOK otherwise. 199 * 200 * \sa openAuth_Start, openAuth_Stop 201 */ 202 TI_STATUS openAuth_Recv(TI_HANDLE hAuth, mlmeFrameInfo_t *pFrame) 203 { 204 TI_STATUS status; 205 auth_t *pHandle; 206 TI_UINT16 authAlgo; 207 208 pHandle = (auth_t*)hAuth; 209 210 if (pHandle == NULL) 211 { 212 return TI_NOK; 213 } 214 215 /* check response status */ 216 authAlgo = ENDIAN_HANDLE_WORD(pFrame->content.auth.authAlgo); 217 if ((authAlgo != AUTH_LEGACY_OPEN_SYSTEM) && 218 (authAlgo != AUTH_LEGACY_RESERVED1)) 219 { 220 TRACE0(pHandle->hReport, REPORT_SEVERITY_SM, "OPEN_AUTH_SM: DEBUG recieved authentication message with wrong algorithm \n"); 221 rsn_reportAuthFailure(pHandle->hRsn, RSN_AUTH_STATUS_INVALID_TYPE); 222 return TI_NOK; 223 } 224 225 if ((pHandle->authType==AUTH_LEGACY_RESERVED1) && (authAlgo !=AUTH_LEGACY_RESERVED1)) 226 { 227 rsn_reportAuthFailure(pHandle->hRsn, RSN_AUTH_STATUS_INVALID_TYPE); 228 } 229 TRACE1(pHandle->hReport, REPORT_SEVERITY_SM, "OPEN_AUTH_SM: DEBUG Authentication status is %d \n", pFrame->content.auth.status); 230 231 pHandle->authData.status = pFrame->content.auth.status; 232 233 if (pHandle->authData.status == STATUS_SUCCESSFUL) 234 { 235 status = auth_osSMEvent(&pHandle->currentState, OPEN_AUTH_SM_EVENT_SUCCESS, pHandle); 236 } else { 237 rsn_reportAuthFailure(pHandle->hRsn, RSN_AUTH_STATUS_INVALID_TYPE); 238 status = auth_osSMEvent(&pHandle->currentState, OPEN_AUTH_SM_EVENT_FAIL, pHandle); 239 } 240 241 return status; 242 } 243 244 /* state machine functions */ 245 246 TI_STATUS openAuth_smStartIdle(auth_t *pAuth) 247 { 248 TI_STATUS status; 249 250 status = openAuth_smResetRetry(pAuth); 251 if (TI_OK != status) 252 { 253 TRACE0(pAuth->hReport, REPORT_SEVERITY_ERROR, "openAuth_smStartIdle: openAuth_smResetRetry return\n"); 254 return status; 255 } 256 257 status = openAuth_smSendAuthReq(pAuth); 258 if (TI_OK != status) 259 { 260 TRACE0(pAuth->hReport, REPORT_SEVERITY_ERROR, "openAuth_smStartIdle: openAuth_smSendAuthReq return\n"); 261 return status; 262 } 263 264 status = openAuth_smStartTimer(pAuth); 265 if (TI_OK != status) 266 { 267 TRACE0(pAuth->hReport, REPORT_SEVERITY_ERROR, "openAuth_smStartIdle: openAuth_smStartTimer return\n"); 268 return status; 269 } 270 271 status = openAuth_smIncRetry(pAuth); 272 if (TI_OK != status) 273 { 274 TRACE0(pAuth->hReport, REPORT_SEVERITY_ERROR, "openAuth_smStartIdle: openAuth_smIncRetry return\n"); 275 return status; 276 } 277 278 return status; 279 } 280 281 TI_STATUS openAuth_smStopWait(auth_t *hAuth) 282 { 283 TI_STATUS status; 284 285 status = openAuth_smStopTimer(hAuth); 286 287 return status; 288 } 289 290 TI_STATUS openAuth_smSuccessWait(auth_t *hAuth) 291 { 292 TI_STATUS status; 293 294 status = openAuth_smStopTimer(hAuth); 295 status = openAuth_smReportSuccess(hAuth); 296 297 return status; 298 } 299 300 TI_STATUS openAuth_smFailureWait(auth_t *hAuth) 301 { 302 TI_STATUS status; 303 304 status = openAuth_smStopTimer(hAuth); 305 status = openAuth_smReportFailure(hAuth); 306 307 return status; 308 } 309 310 TI_STATUS openAuth_smTimeoutWait(auth_t *hAuth) 311 { 312 TI_STATUS status; 313 314 status = openAuth_smSendAuthReq(hAuth); 315 status = openAuth_smStartTimer(hAuth); 316 status = openAuth_smIncRetry(hAuth); 317 318 return status; 319 } 320 321 TI_STATUS openAuth_smMaxRetryWait(auth_t *hAuth) 322 { 323 TI_STATUS status; 324 325 rsn_reportAuthFailure(hAuth->hRsn, RSN_AUTH_STATUS_TIMEOUT); 326 status = openAuth_smReportFailure(hAuth); 327 328 return status; 329 } 330 331 TI_STATUS openAuth_smSendAuthReq(auth_t *hAuth) 332 { 333 TI_STATUS status; 334 335 status = auth_smMsgBuild(hAuth, 1, 0, NULL, 0); 336 337 return status; 338 } 339 340 TI_STATUS openAuth_smStopAuth(auth_t *hAuth) 341 { 342 return TI_OK; 343 } 344 345 TI_STATUS openAuth_smActionUnexpected(auth_t *hAuth) 346 { 347 return TI_OK; 348 } 349 350 /* local functions */ 351 352 353 TI_STATUS openAuth_smResetRetry(auth_t *hAuth) 354 { 355 if (hAuth == NULL) 356 { 357 return TI_NOK; 358 } 359 360 hAuth->retryCount = 0; 361 362 return TI_OK; 363 } 364 365 TI_STATUS openAuth_smIncRetry(auth_t *hAuth) 366 { 367 if (hAuth == NULL) 368 { 369 return TI_NOK; 370 } 371 372 hAuth->retryCount++; 373 374 return TI_OK; 375 } 376 377 TI_STATUS openAuth_smReportSuccess(auth_t *hAuth) 378 { 379 TI_STATUS status; 380 381 if (hAuth == NULL) 382 { 383 return TI_NOK; 384 } 385 status = mlme_reportAuthStatus(hAuth->hMlme, hAuth->authData.status); 386 387 return status; 388 } 389 390 TI_STATUS openAuth_smReportFailure(auth_t *hAuth) 391 { 392 TI_STATUS status; 393 394 if (hAuth == NULL) 395 { 396 return TI_NOK; 397 } 398 399 status = mlme_reportAuthStatus(hAuth->hMlme, hAuth->authData.status); 400 401 return status; 402 } 403 404 TI_STATUS openAuth_smStartTimer(auth_t *hAuth) 405 { 406 if (hAuth == NULL) 407 { 408 return TI_NOK; 409 } 410 411 tmr_StartTimer (hAuth->hAuthSmTimer, 412 auth_smTimeout, 413 (TI_HANDLE)hAuth, 414 hAuth->timeout, 415 TI_FALSE); 416 417 return TI_OK; 418 } 419 420 TI_STATUS openAuth_smStopTimer(auth_t *hAuth) 421 { 422 if (hAuth == NULL) 423 { 424 return TI_NOK; 425 } 426 427 tmr_StopTimer (hAuth->hAuthSmTimer); 428 429 return TI_OK; 430 } 431 432 TI_STATUS openAuth_Timeout(auth_t *pAuth) 433 { 434 if (pAuth->retryCount >= pAuth->maxCount) 435 { 436 pAuth->authData.status = STATUS_PACKET_REJ_TIMEOUT; 437 return auth_osSMEvent(&pAuth->currentState, OPEN_AUTH_SM_EVENT_MAX_RETRY, pAuth); 438 } 439 440 return auth_osSMEvent(&pAuth->currentState, OPEN_AUTH_SM_EVENT_TIMEOUT, pAuth); 441 } 442 443 444