1 /** \file ScanCncnRoamingContSM.c 2 * \brief This file include the scan concentrator continuous scan for roaming module implementation 3 * \author Ronen Kalish 4 * \date 03-Jan-2005 5 */ 6 /**************************************************************************** 7 **+-----------------------------------------------------------------------+** 8 **| |** 9 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 10 **| All rights reserved. |** 11 **| |** 12 **| Redistribution and use in source and binary forms, with or without |** 13 **| modification, are permitted provided that the following conditions |** 14 **| are met: |** 15 **| |** 16 **| * Redistributions of source code must retain the above copyright |** 17 **| notice, this list of conditions and the following disclaimer. |** 18 **| * Redistributions in binary form must reproduce the above copyright |** 19 **| notice, this list of conditions and the following disclaimer in |** 20 **| the documentation and/or other materials provided with the |** 21 **| distribution. |** 22 **| * Neither the name Texas Instruments nor the names of its |** 23 **| contributors may be used to endorse or promote products derived |** 24 **| from this software without specific prior written permission. |** 25 **| |** 26 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 27 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 28 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 29 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 30 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 31 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 32 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 33 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 34 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 35 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 36 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 37 **| |** 38 **+-----------------------------------------------------------------------+** 39 ****************************************************************************/ 40 41 #include "ScanCncnRoamingContSM.h" 42 #include "MacServices_api.h" 43 #include "report.h" 44 #include "siteMgrApi.h" 45 #include "healthMonitor.h" 46 47 static TI_STATUS actionUnexpected( TI_HANDLE hScanCncn ); 48 static TI_STATUS actionNop( TI_HANDLE hScanCncn ); 49 50 /** 51 * \author Ronen Kalish\n 52 * \date 02-Jan-2005\n 53 * \brief Initialize the scan concentrator continuous scan for roaming SM. 54 * 55 * Function Scope \e Public.\n 56 * \param hScanCncn - handle to the scan concentrator object.\n 57 * \return OK if successful, NOK otherwise.\n 58 */ 59 TI_STATUS scanConcentratorRoamingContSM_init( TI_HANDLE hScanCncn ) 60 { 61 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 62 63 fsm_actionCell_t smMatrix[ CONT_SCAN_NUM_OF_STATES ][ CONT_SCAN_NUM_OF_EVENTS ] = 64 { 65 /* next state and actions for IDLE state */ 66 { 67 {CONT_SCAN_STATE_SCR_REQUEST, scanConcentratorRoamingContSM_requestSCR}, /*"START_SCAN",*/ 68 {CONT_SCAN_STATE_IDLE, actionUnexpected}, /*"SCR_RUN",*/ 69 {CONT_SCAN_STATE_IDLE, actionUnexpected}, /*"SCR_PEND", */ 70 {CONT_SCAN_STATE_IDLE, actionUnexpected}, /*"SCR_REJECT",*/ 71 {CONT_SCAN_STATE_IDLE, actionUnexpected}, /*"ABORT_SCAN"*/ 72 {CONT_SCAN_STATE_IDLE, actionUnexpected}, /*"FW_RESET"*/ 73 {CONT_SCAN_STATE_IDLE, actionNop}, /*"STOP_SCAN"*/ 74 {CONT_SCAN_STATE_IDLE, actionUnexpected} /*"SCAN_COMPLETE"*/ 75 76 }, 77 78 /* next state and actions for SCR_REQUEST state */ 79 { 80 {CONT_SCAN_STATE_SCR_REQUEST, actionUnexpected}, /*"START_SCAN",*/ 81 {CONT_SCAN_STATE_SCANNING, scanConcentratorRoamingContSM_startScan}, /*"SCR_RUN",*/ 82 {CONT_SCAN_STATE_SCR_WAIT, actionNop}, /*"SCR_PEND", */ 83 {CONT_SCAN_STATE_IDLE, scanConcentratorRoamingContSM_scanRejected}, /*"SCR_REJECT",*/ 84 {CONT_SCAN_STATE_SCR_REQUEST, actionUnexpected}, /*"ABORT_SCAN"*/ 85 {CONT_SCAN_STATE_SCR_REQUEST, actionUnexpected}, /*"FW_RESET"*/ 86 {CONT_SCAN_STATE_SCR_REQUEST, actionUnexpected}, /*"STOP_SCAN"*/ 87 {CONT_SCAN_STATE_SCR_REQUEST, actionUnexpected} /*"SCAN_COMPLETE"*/ 88 }, 89 90 /* next state and actions for SCR_WAIT state */ 91 { 92 {CONT_SCAN_STATE_SCR_WAIT, actionUnexpected}, /*"START_SCAN",*/ 93 {CONT_SCAN_STATE_SCANNING, scanConcentratorRoamingContSM_startScan}, /*"SCR_RUN",*/ 94 {CONT_SCAN_STATE_SCR_WAIT, actionNop}, /*"SCR_PEND", */ 95 {CONT_SCAN_STATE_IDLE, scanConcentratorRoamingContSM_scanRejected}, /*"SCR_REJECT",*/ 96 {CONT_SCAN_STATE_SCR_WAIT, actionUnexpected}, /*"ABORT_SCAN"*/ 97 {CONT_SCAN_STATE_SCR_WAIT, actionUnexpected}, /*"FW_RESET"*/ 98 {CONT_SCAN_STATE_IDLE, scanConcentratorRoamingContSM_scanRejected}, /*"STOP_SCAN"*/ 99 {CONT_SCAN_STATE_SCR_WAIT, actionUnexpected} /*"SCAN_COMPLETE"*/ 100 }, 101 102 /* next state and actions for SCANNING state */ 103 { 104 {CONT_SCAN_STATE_SCANNING, actionUnexpected}, /*"START_SCAN",*/ 105 {CONT_SCAN_STATE_SCANNING, actionUnexpected}, /*"SCR_RUN",*/ 106 {CONT_SCAN_STATE_SCANNING, actionUnexpected}, /*"SCR_PEND", */ 107 {CONT_SCAN_STATE_SCANNING, actionUnexpected}, /*"SCR_REJECT",*/ 108 {CONT_SCAN_STATE_STOPPING, scanConcentratorRoamingContSM_abortScan}, /*"ABORT_SCAN"*/ 109 {CONT_SCAN_STATE_SCANNING, scanConcentratorRoamingContSM_recoveryDuringScan}, /*"FW_RESET"*/ 110 {CONT_SCAN_STATE_STOPPING, scanConcentratorRoamingContSM_abortScan}, /*"STOP_SCAN"*/ 111 {CONT_SCAN_STATE_IDLE, scanConcentratorRoamingContSM_scanComplete} /*"SCAN_COMPLETE"*/ 112 }, 113 114 /* next state and actions for STOPPING state */ 115 { 116 {CONT_SCAN_STATE_STOPPING, actionUnexpected}, /*"START_SCAN",*/ 117 {CONT_SCAN_STATE_STOPPING, actionUnexpected}, /*"SCR_RUN",*/ 118 {CONT_SCAN_STATE_STOPPING, actionUnexpected}, /*"SCR_PEND", */ 119 {CONT_SCAN_STATE_STOPPING, actionUnexpected}, /*"SCR_REJECT",*/ 120 {CONT_SCAN_STATE_STOPPING, actionNop}, /*"ABORT_SCAN"*/ 121 {CONT_SCAN_STATE_STOPPING, scanConcentratorRoamingContSM_recoveryDuringScan}, /*"FW_RESET"*/ 122 {CONT_SCAN_STATE_STOPPING, actionNop}, /*"STOP_SCAN"*/ 123 {CONT_SCAN_STATE_IDLE, scanConcentratorRoamingContSM_scanComplete} /*"SCAN_COMPLETE"*/ 124 } 125 }; 126 127 /* initialize current state */ 128 pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ] = CONT_SCAN_STATE_IDLE; 129 130 /* configure the state machine */ 131 return fsm_Config( pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_CONT ], (fsm_Matrix_t)smMatrix, 132 CONT_SCAN_NUM_OF_STATES, CONT_SCAN_NUM_OF_EVENTS, 133 (fsm_eventActivation_t)scanConcentratorRoamingContSM_SMEvent, pScanConcentrator->hOS ); 134 } 135 136 137 #ifdef REPORT_LOG 138 139 /* state descriptions, for state machine logging */ 140 static char stateDesc[ CONT_SCAN_NUM_OF_STATES ][ MAX_DESC_STRING_LEN ] = 141 { 142 "STATE_IDLE", 143 "STATE_SCR_REQUEST", 144 "STATE_SCR_WAIT", 145 "STATE_SCANNING", 146 "STATE_STOPPING" 147 }; 148 149 /* event descriptions, for state machine logging */ 150 static char eventDesc[ CONT_SCAN_NUM_OF_EVENTS ][ MAX_DESC_STRING_LEN ] = 151 { 152 "EVENT_START_SCAN", 153 "EVENT_SCR_RUN", 154 "EVENT_SCR_PEND", 155 "EVENT_SCR_REJECT", 156 "EVENT_ABORT_SCAN", 157 "EVENT_FW_RESET", 158 "EVENT_STOP_SCAN", 159 "EVENT_SCAN_COMPLETE" 160 }; 161 162 #endif 163 164 165 /** 166 * \author Ronen Kalish\n 167 * \date 02-Jan-2005\n 168 * \brief Processes an event. 169 * 170 * Function Scope \e Public.\n 171 * \param hScanCncn - handle to the scan concentrator object.\n 172 * \param currentState - the current continuous scan for roaming SM state.\n 173 * \param event - the event to handle.\n 174 * \return OK if successful, NOK otherwise.\n 175 */ 176 TI_STATUS scanConcentratorRoamingContSM_SMEvent( TI_HANDLE hScanCncn, scan_contSMStates_e* currentState, 177 scan_contSMEvents_e event ) 178 { 179 scanConcentrator_t *pScanConcentrator = (scanConcentrator_t *)hScanCncn; 180 TI_STATUS status = OK; 181 UINT8 nextState; 182 183 /* obtain the next state */ 184 status = fsm_GetNextState( pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_CONT ], *(UINT8*)currentState, (UINT8)event, &nextState ); 185 if ( status != OK ) 186 { 187 WLAN_REPORT_SM( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, ("Failed getting continuous scan for roaming next state.\n") ); 188 return NOK; 189 } 190 191 /* report the move */ 192 WLAN_REPORT_SM( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 193 ("CONT ROAMING SCAN: <%s, %s> --> %s\n\n", 194 stateDesc[(UINT8)*currentState], 195 eventDesc[(UINT8)event], 196 stateDesc[nextState]) ); 197 198 /* move */ 199 return fsm_Event( pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_CONT ], (UINT8*)currentState, 200 (UINT8)event, hScanCncn ); 201 } 202 203 /** 204 * \author Ronen Kalish\n 205 * \date 02-Jan-2005\n 206 * \brief SM action - handles a start scan event (by requesting the SCR) 207 * 208 * Function Scope \e Public.\n 209 * \param hScanCncn - handle to the scan concentrator object.\n 210 * \return OK if successful, NOK otherwise.\n 211 */ 212 TI_STATUS scanConcentratorRoamingContSM_requestSCR( TI_HANDLE hScanCncn ) 213 { 214 scr_clientRequestStatus_e scrReplyStatus; 215 scr_pendReason_e scrPendReason; 216 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 217 218 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 219 ("CONT SM: Requesting SCR.\n") ); 220 221 /* request the SCR as continuous roaming client, and act according to return status */ 222 switch ( scrReplyStatus = scr_clientRequest( pScanConcentrator->hSCR, SCR_CID_CONT_SCAN, &scrPendReason ) ) 223 { 224 case SCR_CRS_PEND: 225 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 226 ("CONT SM: SCR pending, pend Reason: %d.\n", scrPendReason) ); 227 228 if ( SCR_PR_DIFFERENT_GROUP_RUNNING == scrPendReason ) 229 { 230 /* send a reject event to the SM - will not scan if not in connected group */ 231 pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_FAILED; 232 return scanConcentratorRoamingContSM_SMEvent( hScanCncn, 233 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 234 CONT_SCAN_EVENT_SCR_REJECT ); 235 } 236 else 237 { 238 /* send a pend event to the SM */ 239 return scanConcentratorRoamingContSM_SMEvent( hScanCncn, 240 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 241 CONT_SCAN_EVENT_SCR_PEND ); 242 } 243 /* break; - unreachable */ 244 245 case SCR_CRS_RUN: 246 /* send a run event to the SM */ 247 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 248 ("CONT SM: SCR acquired.\n") ); 249 return scanConcentratorRoamingContSM_SMEvent( hScanCncn, 250 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 251 CONT_SCAN_EVENT_SCR_RUN ); 252 /* break; - unreachable */ 253 254 default: 255 WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 256 ("CONT SM: SCR returned unrecognized status: %d.\n", scrReplyStatus) ); 257 /* Notify scan complete to recover from this error */ 258 pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_FAILED; 259 scanConcentratorRoamingContSM_SMEvent( hScanCncn, 260 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 261 CONT_SCAN_EVENT_SCAN_COMPLETE ); 262 return NOK; 263 /* break; - unreachable */ 264 } 265 266 /* return OK; - unreachable */ 267 } 268 269 /** 270 * \author Ronen Kalish\n 271 * \date 02-Jan-2005\n 272 * \brief SM action - handles a SCR run event (by starting the actual scan) 273 * 274 * Function Scope \e Public.\n 275 * \param hScanCncn - handle to the scan concentrator object.\n 276 * \return OK if successful, NOK otherwise.\n 277 */ 278 TI_STATUS scanConcentratorRoamingContSM_startScan( TI_HANDLE hScanCncn ) 279 { 280 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 281 TI_STATUS status; 282 283 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 284 ("CONT SM: Sending scan command to scan SRV.\n") ); 285 286 /* mark that this scan is currently running */ 287 pScanConcentrator->currentRunningScanClient = SCAN_SCC_ROAMING_CONT; 288 289 /* register for scan results with the MLME parser */ 290 if ( OK != mlmeParser_registerForBeaconAndProbeResp( pScanConcentrator->hMlme, 291 scanConcentrator_mlmeResultCB, 292 hScanCncn ) ) 293 { 294 WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 295 ("CONT SM: MLME result registration failed.\n") ); 296 297 /* mark the return status */ 298 pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_FAILED; 299 300 /* could not start scan, send a scan complete event */ 301 scanConcentratorRoamingContSM_SMEvent( hScanCncn, 302 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 303 CONT_SCAN_EVENT_SCAN_COMPLETE ); 304 305 return NOK; 306 } 307 308 /* stop built-in test timer, to avoid TX stuck due to heavy traffic and unknown scan result time originally at scanSrv*/ 309 healthMonitor_suspendPeriodicTest( pScanConcentrator->hHealthMonitor ); 310 311 /* call the scan SRV start scan */ 312 if ( OK != (status = MacServices_scanSRV_scan( pScanConcentrator->hMacServices, 313 &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_CONT ]), 314 FALSE, 315 TRUE, 316 FALSE, 317 POWER_SAVE_ON, 318 TRUE , 319 NULL,NULL)) ) 320 { 321 WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 322 ("CONT SM: scan SRV returned status %d, quitting continuous scan.\n", status) ); 323 324 /* mark the return status */ 325 pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ] = SCAN_CRS_SCAN_FAILED; 326 327 /* unregister at the MLME for scan result frames */ 328 mlmeParser_unregisterForBeaconAndProbeResp( pScanConcentrator->hMlme ); 329 330 /* could not start scan, send a scan complete event */ 331 scanConcentratorRoamingContSM_SMEvent( hScanCncn, 332 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 333 CONT_SCAN_EVENT_SCAN_COMPLETE ); 334 335 return NOK; 336 } 337 338 return OK; 339 } 340 341 /** 342 * \author Ronen Kalish\n 343 * \date 02-Jan-2005\n 344 * \brief SM action - handles a stop scan or abort scan event (by stopping the actual scan) 345 * 346 * Function Scope \e Public.\n 347 * \param hScanCncn - handle to the scan concentrator object.\n 348 * \return OK if successful, NOK otherwise.\n 349 */ 350 TI_STATUS scanConcentratorRoamingContSM_abortScan( TI_HANDLE hScanCncn ) 351 { 352 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 353 BOOLEAN bSendNullData; 354 355 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 356 ("CONT SM: aborting scan.\n") ); 357 bSendNullData = (pScanConcentrator->bAbortOrStop == SCAN_CNCN_STOP) ? TRUE : FALSE; 358 359 /* call the scan SRV stop scan */ 360 MacServices_scanSRV_stopScan( pScanConcentrator->hMacServices, bSendNullData, NULL , NULL ); 361 362 return OK; 363 } 364 365 /** 366 * \author Ronen Kalish\n 367 * \date 10-July-2005\n 368 * \brief SM action - handles a recovery event (calls the scan SRV abort on FW reset and than finishes scan) 369 * 370 * Function Scope \e Public.\n 371 * \param hScanCncn - handle to the scan concentrator object.\n 372 * \return OK if successful, NOK otherwise.\n 373 */ 374 TI_STATUS scanConcentratorRoamingContSM_recoveryDuringScan( TI_HANDLE hScanCncn ) 375 { 376 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 377 378 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 379 ("CONT SM: Recovery occured!.\n") ); 380 381 /* reset the scan SRV */ 382 MacServices_scanSRV_stopOnFWReset( pScanConcentrator->hMacServices ); 383 384 /* send a scan complete event to the SM */ 385 return scanConcentratorRoamingContSM_SMEvent( hScanCncn, 386 (scan_contSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_CONT ]), 387 CONT_SCAN_EVENT_SCAN_COMPLETE ); 388 } 389 390 /** 391 * \author Ronen Kalish\n 392 * \date 02-Jan-2005\n 393 * \brief SM action - handles a scan complete event (by releasing the SCR and calling the scan complete CB). 394 * 395 * Function Scope \e Public.\n 396 * \param hScanCncn - handle to the scan concentrator object.\n 397 * \return OK if successful, NOK otherwise.\n 398 */ 399 TI_STATUS scanConcentratorRoamingContSM_scanComplete( TI_HANDLE hScanCncn ) 400 { 401 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 402 403 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 404 ("CONT SM: Scan is complete.\n") ); 405 406 /* unregister at the MLME for scan result frames */ 407 mlmeParser_unregisterForBeaconAndProbeResp( pScanConcentrator->hMlme ); 408 409 /* mark that this scan is no longer running */ 410 pScanConcentrator->currentRunningScanClient = SCAN_SCC_NO_CLIENT; 411 412 /* release the SCR */ 413 scr_clientComplete( pScanConcentrator->hSCR, SCR_CID_CONT_SCAN ); 414 415 /* notify the scan complete to the scan mngr */ 416 if ( FALSE == pScanConcentrator->bInRequest ) 417 { 418 pScanConcentrator->scanResultCB[ SCAN_SCC_ROAMING_CONT ]( pScanConcentrator->scanResultCBObj[ SCAN_SCC_ROAMING_CONT ], 419 pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ], 420 NULL, pScanConcentrator->SPSScanResult ); 421 } 422 423 return OK; 424 } 425 426 /** 427 * \author Ronen Kalish\n 428 * \date 02-Jan-2005\n 429 * \brief SM action - handles a scan reject event (abort scan before scan actually started)\n 430 * 431 * Function Scope \e Public.\n 432 * \param hScanCncn - handle to the scan concentrator object.\n 433 * \return OK if successful, NOK otherwise.\n 434 */ 435 TI_STATUS scanConcentratorRoamingContSM_scanRejected( TI_HANDLE hScanCncn ) 436 { 437 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 438 439 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, 440 ("CONT SM: Scan is rejected.\n") ); 441 442 /* release the SCR */ 443 scr_clientComplete( pScanConcentrator->hSCR, SCR_CID_CONT_SCAN ); 444 445 /* notify the scan complete to the scan mngr */ 446 if ( FALSE == pScanConcentrator->bInRequest ) 447 { 448 pScanConcentrator->scanResultCB[ SCAN_SCC_ROAMING_CONT ]( pScanConcentrator->scanResultCBObj[ SCAN_SCC_ROAMING_CONT ], 449 pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_CONT ], 450 NULL, pScanConcentrator->SPSScanResult ); 451 } 452 453 return OK; 454 } 455 456 /** 457 * \author Ronen Kalish\n 458 * \date 11-Jan-2005\n 459 * \brief Handles an unexpected event.\n 460 * 461 * Function Scope \e Private.\n 462 * \param hScanCncn - handle to the scan concentrator object.\n 463 * \return always OK.\n 464 */ 465 TI_STATUS actionUnexpected( TI_HANDLE hScanCncn ) 466 { 467 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn; 468 469 WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG, ("Continuous scan for roaming state machine error, unexpected Event, state=%d\n\n", 470 pScanConcentrator->clientSMState[SCAN_SCC_ROAMING_CONT]) ); 471 472 return OK; 473 } 474 475 /** 476 * \author Ronen Kalish\n 477 * \date 10-Jan-2005\n 478 * \brief Handles an event that doesn't require any action.\n 479 * 480 * Function Scope \e Private.\n 481 * \param hScanCncn - handle to the scan concentrator object.\n 482 * \return always OK.\n 483 */ 484 TI_STATUS actionNop( TI_HANDLE hScanCncn ) 485 { 486 return OK; 487 } 488 489