Home | History | Annotate | Download | only in scanCncn
      1 /** \file ScanCncnRoamingImmedSM.c
      2  *  \brief This file include the scan concentrator immediate 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 "ScanCncnRoamingImmedSM.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 extern BOOLEAN apConn_isPsRequiredBeforeScan(TI_HANDLE hAPConnection);
     51 
     52 /**
     53  * \author Ronen Kalish\n
     54  * \date 02-Jan-2005\n
     55  * \brief Initialize the scan concentrator immediate scan for roaming SM.
     56  *
     57  * Function Scope \e Public.\n
     58  * \param hScanCncn - handle to the scan concentrator object.\n
     59  * \return OK if successful, NOK otherwise.\n
     60  */
     61 TI_STATUS scanConcentratorRoamingImmedSM_init( TI_HANDLE hScanCncn )
     62 {
     63     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
     64 
     65     fsm_actionCell_t    smMatrix[ IMMED_SCAN_NUM_OF_STATES ][ IMMED_SCAN_NUM_OF_EVENTS ] =
     66 	{
     67 		/* next state and actions for IDLE state */
     68 		{
     69             {IMMED_SCAN_STATE_SCR_REQUEST, scanConcentratorRoamingImmedSM_requestSCR},     /*"START_SCAN",*/
     70 			{IMMED_SCAN_STATE_IDLE, actionUnexpected},                                     /*"SCR_RUN",*/
     71 			{IMMED_SCAN_STATE_IDLE, actionUnexpected},                                     /*"SCR_PEND",  */
     72 			{IMMED_SCAN_STATE_IDLE, actionUnexpected},                                     /*"SCR_REJECT",*/
     73             {IMMED_SCAN_STATE_IDLE, actionUnexpected},                                     /*"ABORT_SCAN"*/
     74             {IMMED_SCAN_STATE_IDLE, actionUnexpected},                                     /*"FW_RESET"*/
     75             {IMMED_SCAN_STATE_IDLE, actionNop},                                            /*"STOP_SCAN"*/
     76             {IMMED_SCAN_STATE_IDLE, actionUnexpected}                                      /*"SCAN_COMPLETE"*/
     77 
     78 		},
     79 
     80 		/* next state and actions for SCR_REQUEST state */
     81 		{
     82             {IMMED_SCAN_STATE_SCR_REQUEST, actionUnexpected},                                     /*"START_SCAN",*/
     83             {IMMED_SCAN_STATE_SCANNING, scanConcentratorRoamingImmedSM_startScan},         /*"SCR_RUN",*/
     84 			{IMMED_SCAN_STATE_SCR_WAIT, actionNop},                                        /*"SCR_PEND",  */
     85 			{IMMED_SCAN_STATE_IDLE, scanConcentratorRoamingImmedSM_scanRejected},          /*"SCR_REJECT",*/
     86             {IMMED_SCAN_STATE_SCR_REQUEST, actionUnexpected},                                     /*"ABORT_SCAN"*/
     87             {IMMED_SCAN_STATE_SCR_REQUEST, actionUnexpected},                                     /*"FW_RESET"*/
     88             {IMMED_SCAN_STATE_SCR_REQUEST, actionUnexpected},                                     /*"STOP_SCAN"*/
     89             {IMMED_SCAN_STATE_SCR_REQUEST, actionUnexpected}                                      /*"SCAN_COMPLETE"*/
     90 		},
     91 
     92 		/* next state and actions for SCR_WAIT state */
     93 		{
     94             {IMMED_SCAN_STATE_SCR_WAIT, actionUnexpected},                                      /*"START_SCAN",*/
     95 			{IMMED_SCAN_STATE_SCANNING, scanConcentratorRoamingImmedSM_startScan},         /*"SCR_RUN",*/
     96 			{IMMED_SCAN_STATE_SCR_WAIT, actionNop},                                        /*"SCR_PEND",  */
     97 			{IMMED_SCAN_STATE_IDLE, scanConcentratorRoamingImmedSM_scanRejected},          /*"SCR_REJECT",*/
     98             {IMMED_SCAN_STATE_SCR_WAIT, actionUnexpected},                                      /*"ABORT_SCAN"*/
     99             {IMMED_SCAN_STATE_SCR_WAIT, actionUnexpected},                                      /*"FW_RESET"*/
    100             {IMMED_SCAN_STATE_IDLE, scanConcentratorRoamingImmedSM_scanRejected},          /*"STOP_SCAN"*/
    101             {IMMED_SCAN_STATE_SCR_WAIT, actionUnexpected}                                       /*"SCAN_COMPLETE"*/
    102 		},
    103 
    104         /* next state and actions for SCANNING state */
    105         {
    106             {IMMED_SCAN_STATE_SCANNING, actionUnexpected},                                     /*"START_SCAN",*/
    107 			{IMMED_SCAN_STATE_SCANNING, actionUnexpected},                                     /*"SCR_RUN",*/
    108 			{IMMED_SCAN_STATE_SCANNING, actionUnexpected},                                     /*"SCR_PEND",  */
    109 			{IMMED_SCAN_STATE_SCANNING, actionUnexpected},                                     /*"SCR_REJECT",*/
    110             {IMMED_SCAN_STATE_STOPPING, scanConcentratorRoamingImmedSM_abortScan},         /*"ABORT_SCAN"*/
    111             {IMMED_SCAN_STATE_SCANNING, scanConcentratorRoamingImmedSM_recoveryDuringScan},/*"FW_RESET"*/
    112             {IMMED_SCAN_STATE_STOPPING, scanConcentratorRoamingImmedSM_abortScan},         /*"STOP_SCAN"*/
    113             {IMMED_SCAN_STATE_IDLE, scanConcentratorRoamingImmedSM_scanComplete}           /*"SCAN_COMPLETE"*/
    114 		},
    115 
    116         /* next state and actions for STOPPING state */
    117 		{
    118             {IMMED_SCAN_STATE_STOPPING, actionUnexpected},                                     /*"START_SCAN",*/
    119 			{IMMED_SCAN_STATE_STOPPING, actionUnexpected},                                     /*"SCR_RUN",*/
    120 			{IMMED_SCAN_STATE_STOPPING, actionUnexpected},                                     /*"SCR_PEND",  */
    121 			{IMMED_SCAN_STATE_STOPPING, actionUnexpected},                                     /*"SCR_REJECT",*/
    122             {IMMED_SCAN_STATE_STOPPING, actionNop},                                        /*"ABORT_SCAN"*/
    123             {IMMED_SCAN_STATE_STOPPING, scanConcentratorRoamingImmedSM_recoveryDuringScan},/*"FW_RESET"*/
    124             {IMMED_SCAN_STATE_STOPPING, actionNop},                                        /*"STOP_SCAN"*/
    125             {IMMED_SCAN_STATE_IDLE, scanConcentratorRoamingImmedSM_scanComplete}           /*"SCAN_COMPLETE"*/
    126 		}
    127     };
    128 
    129     /* initialize current state */
    130     pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ] = IMMED_SCAN_STATE_IDLE;
    131 
    132     /* configure the state machine */
    133 	return fsm_Config( pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_IMMED ], (fsm_Matrix_t)smMatrix,
    134                        IMMED_SCAN_NUM_OF_STATES, IMMED_SCAN_NUM_OF_EVENTS,
    135                        (fsm_eventActivation_t)scanConcentratorRoamingImmedSM_SMEvent, pScanConcentrator->hOS );
    136 }
    137 
    138 
    139 #ifdef REPORT_LOG
    140 
    141 /* state descriptions, for state machine logging */
    142 static char stateDesc[ IMMED_SCAN_NUM_OF_STATES ][ MAX_DESC_STRING_LEN ] =
    143 {
    144     "STATE_IDLE",
    145     "STATE_SCR_REQUEST",
    146     "STATE_SCR_WAIT",
    147     "STATE_SCANNING",
    148     "STATE_STOPPING"
    149 };
    150 
    151 /* event descriptions, for state machine logging */
    152 static char eventDesc[ IMMED_SCAN_NUM_OF_EVENTS ][ MAX_DESC_STRING_LEN ] =
    153 {
    154     "EVENT_START_SCAN",
    155     "EVENT_SCR_RUN",
    156     "EVENT_SCR_PEND",
    157     "EVENT_SCR_REJECT",
    158     "EVENT_ABORT_SCAN",
    159     "EVENT_FW_RESET",
    160     "EVENT_STOP_SCAN",
    161     "EVENT_SCAN_COMPLETE"
    162 };
    163 
    164 #endif
    165 
    166 /**
    167  * \author Ronen Kalish\n
    168  * \date 02-Jan-2005\n
    169  * \brief Processes an event.
    170  *
    171  * Function Scope \e Public.\n
    172  * \param hScanCncn - handle to the scan concentrator object.\n
    173  * \param currentState - the current immediate scan for roaming SM state.\n
    174  * \param event - the event to handle.\n
    175  * \return OK if successful, NOK otherwise.\n
    176  */
    177 TI_STATUS scanConcentratorRoamingImmedSM_SMEvent( TI_HANDLE hScanCncn, scan_immedSMStates_e* currentState,
    178                                                   scan_immedSMEvents_e event )
    179 {
    180     scanConcentrator_t *pScanConcentrator = (scanConcentrator_t *)hScanCncn;
    181 	TI_STATUS status = OK;
    182 	UINT8 nextState;
    183 
    184     /* obtain the next state */
    185 	status = fsm_GetNextState( pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_IMMED ],
    186                  *(UINT8*)currentState, (UINT8)event, &nextState );
    187 	if ( status != OK )
    188 	{
    189 		WLAN_REPORT_SM( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    190                         ("Failed getting immediate scan for roaming next state.\n") );
    191 		return NOK;
    192 	}
    193 
    194     /* report the move */
    195     WLAN_REPORT_SM( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    196                     ("IMMED ROAMING SCAN: <%s, %s> --> %s\n\n",
    197                     stateDesc[(UINT8)*currentState],
    198                     eventDesc[(UINT8)event],
    199                     stateDesc[nextState]) );
    200 
    201     /* move */
    202     return fsm_Event( pScanConcentrator->clientSM[ SCAN_SCC_ROAMING_IMMED ], (UINT8*)currentState,
    203                       (UINT8)event, hScanCncn );
    204 }
    205 
    206 /**
    207  * \author Ronen Kalish\n
    208  * \date 02-Jan-2005\n
    209  * \brief SM action - handles a start scan event (by requesting the SCR)
    210  *
    211  * Function Scope \e Public.\n
    212  * \param hScanCncn - handle to the scan concentrator object.\n
    213  * \return OK if successful, NOK otherwise.\n
    214  */
    215 TI_STATUS scanConcentratorRoamingImmedSM_requestSCR( TI_HANDLE hScanCncn )
    216 {
    217     scr_clientRequestStatus_e scrReplyStatus;
    218 	scr_pendReason_e scrPendReason;
    219     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    220 
    221     WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    222                              ("IMMED SM: Requesting SCR.\n") );
    223 
    224     /* request the SCR as immediate roaming client, and act according to return status */
    225     switch ( scrReplyStatus = scr_clientRequest( pScanConcentrator->hSCR, SCR_CID_IMMED_SCAN, &scrPendReason ) )
    226     {
    227     case SCR_CRS_PEND:
    228         WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    229                                  ("IMMED SM: SCR pending, pend Reason: %d.\n", scrPendReason) );
    230 
    231         if ( SCR_PR_DIFFERENT_GROUP_RUNNING == scrPendReason )
    232         {
    233             /* send a reject event to the SM - will not scan if not in connected group */
    234 			pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_FAILED;
    235 			return scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    236                                                            (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    237                                                            IMMED_SCAN_EVENT_SCR_REJECT );
    238         }
    239         else
    240         {
    241             /* send a pend event to the SM */
    242             return scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    243                                                            (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    244                                                            IMMED_SCAN_EVENT_SCR_PEND );
    245         }
    246 /*        break; - unreachable */
    247 
    248     case SCR_CRS_RUN:
    249         /* send a run event to the SM */
    250         WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    251                                  ("IMMED SM: SCR acquired.\n") );
    252         return scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    253                                                        (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    254                                                        IMMED_SCAN_EVENT_SCR_RUN );
    255 /*        break; - unreachable */
    256 
    257     default:
    258         WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    259                              ("IMMED SM: SCR returned unrecognized status: %d.\n", scrReplyStatus) );
    260 		pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_FAILED;
    261         /* Notify scan complete to recover from this error */
    262         scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    263                                                 (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    264                                                 IMMED_SCAN_EVENT_SCAN_COMPLETE );
    265         return NOK;
    266 /*        break;  - unreachable */
    267     }
    268 
    269 /*    return OK; - unreachable */
    270 }
    271 
    272 /**
    273  * \author Ronen Kalish\n
    274  * \date 02-Jan-2005\n
    275  * \brief SM action - handles a SCR run event (by starting the actual scan)
    276  *
    277  * Function Scope \e Public.\n
    278  * \param hScanCncn - handle to the scan concentrator object.\n
    279  * \return OK if successful, NOK otherwise.\n
    280  */
    281 TI_STATUS scanConcentratorRoamingImmedSM_startScan( TI_HANDLE hScanCncn )
    282 {
    283     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    284     TI_STATUS status;
    285     BOOLEAN psRequest;
    286 
    287     WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    288                              ("IMMED SM: Sending scan command to scan SRV.\n") );
    289 
    290     /* mark that this scan is currently running */
    291     pScanConcentrator->currentRunningScanClient = SCAN_SCC_ROAMING_IMMED;
    292 
    293     /* register for scan results with the MLME parser */
    294     if ( OK != mlmeParser_registerForBeaconAndProbeResp( pScanConcentrator->hMlme,
    295                                                          scanConcentrator_mlmeResultCB,
    296                                                          hScanCncn ) )
    297     {
    298         WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    299                              ("IMMED SM: MLME result registration failed.\n") );
    300 
    301         /* mark the return status */
    302         pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_FAILED;
    303 
    304         /* could not start scan, send a scan complete event */
    305         scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    306                                                 (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    307                                                 IMMED_SCAN_EVENT_SCAN_COMPLETE );
    308 
    309         return NOK;
    310     }
    311 
    312 	 /* stop built-in test timer, to avoid TX stuck due to heavy traffic and unknown scan result time originally at scanSrv*/
    313 	healthMonitor_suspendPeriodicTest( pScanConcentrator->hHealthMonitor );
    314 
    315 	psRequest = apConn_isPsRequiredBeforeScan(pScanConcentrator->hAPConn);
    316 
    317     /* call the scan SRV start scan */
    318     if ( OK != (status = MacServices_scanSRV_scan( pScanConcentrator->hMacServices,
    319                                        &(pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ]),
    320                                        ( (SCAN_TYPE_TRIGGERED_ACTIVE == pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].scanType) ||
    321                                          (SCAN_TYPE_TRIGGERED_PASSIVE == pScanConcentrator->clientScanParams[ SCAN_SCC_ROAMING_IMMED ].scanType)
    322                                          ? FALSE : TRUE ), /* Triggered scan cannot be high priority */
    323                                        TRUE,
    324                                        TRUE,
    325 									   ( psRequest ? POWER_SAVE_ON : POWER_SAVE_KEEP_CURRENT ),
    326                                        psRequest,
    327 									   NULL,NULL)) )
    328     {
    329         WLAN_REPORT_WARNING( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    330                              ("IMMED SM: scan SRV returned status %d, quitting immediate scan.\n", status) );
    331 
    332         /* mark the return status */
    333         pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ] = SCAN_CRS_SCAN_FAILED;
    334 
    335 	    /* unregister at the MLME for scan result frames */
    336         mlmeParser_unregisterForBeaconAndProbeResp( pScanConcentrator->hMlme );
    337 
    338         /* could not start scan, send a scan complete event */
    339         scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    340                                                 (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    341                                                 IMMED_SCAN_EVENT_SCAN_COMPLETE );
    342 
    343         return NOK;
    344     }
    345 
    346     return OK;
    347 }
    348 
    349 /**
    350  * \author Ronen Kalish\n
    351  * \date 02-Jan-2005\n
    352  * \brief SM action - handles a stop scan or abort scan event (by stopping the actual scan)
    353  *
    354  * Function Scope \e Public.\n
    355  * \param hScanCncn - handle to the scan concentrator object.\n
    356  * \return OK if successful, NOK otherwise.\n
    357  */
    358 TI_STATUS scanConcentratorRoamingImmedSM_abortScan( TI_HANDLE hScanCncn )
    359 {
    360     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    361     BOOLEAN     bSendNullData;
    362 
    363     WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    364                              ("IMMED SM: aborting scan.\n") );
    365 
    366     bSendNullData = (pScanConcentrator->bAbortOrStop == SCAN_CNCN_STOP) ? TRUE : FALSE;
    367 
    368     /* call the scan SRV stop scan */
    369     MacServices_scanSRV_stopScan( pScanConcentrator->hMacServices, bSendNullData , NULL , NULL );
    370 
    371     return OK;
    372 }
    373 
    374 /**
    375  * \author Ronen Kalish\n
    376  * \date 10-July-2005\n
    377  * \brief SM action - handles a recovery event (calls the scan SRV abort on FW reset and than finishes scan)
    378  *
    379  * Function Scope \e Public.\n
    380  * \param hScanCncn - handle to the scan concentrator object.\n
    381  * \return OK if successful, NOK otherwise.\n
    382  */
    383 TI_STATUS scanConcentratorRoamingImmedSM_recoveryDuringScan( TI_HANDLE hScanCncn )
    384 {
    385     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    386 
    387     WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    388                              ("IMMED SM: Recovery occured!.\n") );
    389 
    390     /* reset the scan SRV */
    391     MacServices_scanSRV_stopOnFWReset( pScanConcentrator->hMacServices );
    392 
    393     /* send a scan complete event to the SM */
    394     return scanConcentratorRoamingImmedSM_SMEvent( hScanCncn,
    395                                                    (scan_immedSMStates_e*)&(pScanConcentrator->clientSMState[ SCAN_SCC_ROAMING_IMMED ]),
    396                                                    IMMED_SCAN_EVENT_SCAN_COMPLETE );
    397 }
    398 
    399 /**
    400  * \author Ronen Kalish\n
    401  * \date 02-Jan-2005\n
    402  * \brief SM action - handles a scan complete event (by releasing the SCR and calling the scan complete CB).
    403  *
    404  * Function Scope \e Public.\n
    405  * \param hScanCncn - handle to the scan concentrator object.\n
    406  * \return OK if successful, NOK otherwise.\n
    407  */
    408 TI_STATUS scanConcentratorRoamingImmedSM_scanComplete( TI_HANDLE hScanCncn )
    409 {
    410     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    411 
    412     WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    413                              ("IMMED SM: Scan is complete.\n") );
    414 
    415 	/* unregister at the MLME for scan result frames */
    416     mlmeParser_unregisterForBeaconAndProbeResp( pScanConcentrator->hMlme );
    417 
    418     /* mark that this scan is no longer running */
    419     pScanConcentrator->currentRunningScanClient = SCAN_SCC_NO_CLIENT;
    420 
    421     /* release the SCR */
    422     scr_clientComplete( pScanConcentrator->hSCR, SCR_CID_IMMED_SCAN );
    423 
    424     /* notify the scan complete to the scan mngr */
    425     if ( FALSE == pScanConcentrator->bInRequest )
    426     {
    427         pScanConcentrator->scanResultCB[ SCAN_SCC_ROAMING_IMMED ]( pScanConcentrator->scanResultCBObj[ SCAN_SCC_ROAMING_IMMED ],
    428                                                                    pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ],
    429                                                                    NULL, 0xffff );
    430     }
    431 
    432     return OK;
    433 }
    434 
    435 /**
    436  * \author Ronen Kalish\n
    437  * \date 02-Jan-2005\n
    438  * \brief SM action - handles a scan reject event (abort scan before scan actually started)\n
    439  *
    440  * Function Scope \e Public.\n
    441  * \param hScanCncn - handle to the scan concentrator object.\n
    442  * \return OK if successful, NOK otherwise.\n
    443  */
    444 TI_STATUS scanConcentratorRoamingImmedSM_scanRejected( TI_HANDLE hScanCncn )
    445 {
    446     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    447 
    448     WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    449                              ("IMMED SM: Scan is rejected.\n") );
    450 
    451     /* release the SCR */
    452     scr_clientComplete( pScanConcentrator->hSCR, SCR_CID_IMMED_SCAN );
    453 
    454     /* notify the scan complete to the scan mngr */
    455     if ( FALSE == pScanConcentrator->bInRequest )
    456     {
    457         pScanConcentrator->scanResultCB[ SCAN_SCC_ROAMING_IMMED ]( pScanConcentrator->scanResultCBObj[ SCAN_SCC_ROAMING_IMMED ],
    458                                                                    pScanConcentrator->scanResult[ SCAN_SCC_ROAMING_IMMED ],
    459                                                                    NULL, 0xffff );
    460     }
    461 
    462     return OK;
    463 }
    464 
    465 /**
    466  * \author Ronen Kalish\n
    467  * \date 11-Jan-2005\n
    468  * \brief Handles an unexpected event.\n
    469  *
    470  * Function Scope \e Private.\n
    471  * \param hScanCncn - handle to the scan concentrator object.\n
    472  * \return always OK.\n
    473  */
    474 TI_STATUS actionUnexpected( TI_HANDLE hScanCncn )
    475 {
    476     scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
    477 
    478     WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
    479                     ("Immediate scan for roaming state machine error, unexpected Event, state=%d\n\n",
    480 					 pScanConcentrator->clientSMState[SCAN_SCC_ROAMING_IMMED]) );
    481 
    482     return OK;
    483 }
    484 
    485 /**
    486  * \author Ronen Kalish\n
    487  * \date 10-Jan-2005\n
    488  * \brief Handles an event that doesn't require any action.\n
    489  *
    490  * Function Scope \e Private.\n
    491  * \param hScanCncn - handle to the scan concentrator object.\n
    492  * \return always OK.\n
    493  */
    494 TI_STATUS actionNop( TI_HANDLE hScanCncn )
    495 {
    496     return OK;
    497 }
    498 
    499