diff options
Diffstat (limited to 'wl1271/stad/src/Connection_Managment/smeSm.c')
-rw-r--r-- | wl1271/stad/src/Connection_Managment/smeSm.c | 1007 |
1 files changed, 0 insertions, 1007 deletions
diff --git a/wl1271/stad/src/Connection_Managment/smeSm.c b/wl1271/stad/src/Connection_Managment/smeSm.c deleted file mode 100644 index f582c7f..0000000 --- a/wl1271/stad/src/Connection_Managment/smeSm.c +++ /dev/null @@ -1,1007 +0,0 @@ -/* - * smeSm.c - * - * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** \file smeSm.c - * \brief SME state machine implementation - * - * \see smeSm.h, sme.c, sme.h - */ - - -#define __FILE_ID__ FILE_ID_43 -#include "GenSM.h" -#include "smeSm.h" -#include "smePrivate.h" -#include "connApi.h" -#include "apConn.h" -#include "ScanCncn.h" -#include "scanResultTable.h" -#include "EvHandler.h" -#include "regulatoryDomainApi.h" -#include "siteMgrApi.h" -#include "DrvMain.h" - - -static OS_802_11_DISASSOCIATE_REASON_E eDisassocConvertTable[ MGMT_STATUS_MAX_NUM +1] = -{ - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_AUTH_REJECT, - OS_DISASSOC_STATUS_ASSOC_REJECT, - OS_DISASSOC_STATUS_SECURITY_FAILURE, - OS_DISASSOC_STATUS_AP_DEAUTHENTICATE, - OS_DISASSOC_STATUS_AP_DISASSOCIATE, - OS_DISASSOC_STATUS_ROAMING_TRIGGER, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED, - OS_DISASSOC_STATUS_UNSPECIFIED -}; - -#define SME_CONVERT_DISASSOC_CODES(disassocReason) (eDisassocConvertTable[ (disassocReason) ]) - -static void smeSm_Start (TI_HANDLE hSme); -static void smeSm_Stop (TI_HANDLE hSme); -static void smeSm_PreConnect (TI_HANDLE hSme); -static void smeSm_Connect (TI_HANDLE hSme); -static void smeSm_ConnectSuccess (TI_HANDLE hSme); -static void smeSm_Disconnect (TI_HANDLE hSme); -static void smeSm_DisconnectDone (TI_HANDLE hSme); -static void smeSm_StopScan (TI_HANDLE hSme); -static void smeSm_StopConnect (TI_HANDLE hSme); -static void smeSm_ConnWhenConnecting (TI_HANDLE hSme); -static void smeSm_ActionUnexpected (TI_HANDLE hSme); -static void smeSm_NopAction (TI_HANDLE hSme); -static void smeSm_CheckStartConditions (TI_HANDLE hSme); - -static TI_STATUS sme_StartScan (TI_HANDLE hSme); -static void sme_updateScanCycles (TI_HANDLE hSme, - TI_BOOL bDEnabled, - TI_BOOL bCountryValid, - TI_BOOL bConstantScan); -static void sme_CalculateCyclesNumber (TI_HANDLE hSme, TI_UINT32 uTotalTimeMs); - -TGenSM_actionCell tSmMatrix[ SME_SM_NUMBER_OF_STATES ][ SME_SM_NUMBER_OF_EVENTS ] = - { - { /* SME_SM_STATE_IDLE */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_Start }, /* SME_SM_EVENT_START */ - { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_STOP */ - { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */ - { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ - { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_FAILURE */ - { SME_SM_STATE_IDLE, smeSm_CheckStartConditions }, /* SME_SM_EVENT_DISCONNECT */ - }, - { /* SME_SM_STATE_WAIT_CONNECT */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ - { SME_SM_STATE_IDLE, smeSm_Stop }, /* SME_SM_EVENT_STOP */ - { SME_SM_STATE_SCANNING, smeSm_PreConnect }, /* SME_SM_EVENT_CONNECT */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_FAILURE */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_Start }, /* SME_SM_EVENT_DISCONNECT */ - }, - { /* SME_SM_STATE_SCANNING */ - { SME_SM_STATE_SCANNING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ - { SME_SM_STATE_DISCONNECTING, smeSm_StopScan }, /* SME_SM_EVENT_STOP */ - { SME_SM_STATE_CONNECTING, smeSm_Connect }, /* SME_SM_EVENT_CONNECT */ - { SME_SM_STATE_SCANNING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ - { SME_SM_STATE_DISCONNECTING, smeSm_StopScan }, /* SME_SM_EVENT_DISCONNECT */ - }, - { /* SME_SM_STATE_CONNECTING */ - { SME_SM_STATE_CONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ - { SME_SM_STATE_DISCONNECTING, smeSm_StopConnect }, /* SME_SM_EVENT_STOP */ - { SME_SM_STATE_CONNECTING, smeSm_ConnWhenConnecting }, /* SME_SM_EVENT_CONNECT */ - { SME_SM_STATE_CONNECTED, smeSm_ConnectSuccess }, /* SME_SM_EVENT_CONNECT_SUCCESS */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ - { SME_SM_STATE_DISCONNECTING, smeSm_StopConnect }, /* SME_SM_EVENT_DISCONNECT */ - }, - { /* SME_SM_STATE_CONNECTED */ - { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ - { SME_SM_STATE_DISCONNECTING, smeSm_Disconnect }, /* SME_SM_EVENT_STOP */ - { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */ - { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ - { SME_SM_STATE_DISCONNECTING, smeSm_Disconnect }, /* SME_SM_EVENT_DISCONNECT */ - }, - { /* SME_SM_STATE_DISCONNECTING */ - { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ - { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_STOP */ - { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */ - { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ - { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ - { SME_SM_STATE_DISCONNECTING, smeSm_NopAction }, /* SME_SM_EVENT_DISCONNECT */ - } - }; - -TI_INT8* uStateDescription[] = - { - "IDLE", - "WAIT_CONNECT", - "SCANNING", - "CONNECTING", - "CONNECTED", - "DISCONNECTING" - }; - -TI_INT8* uEventDescription[] = - { - "START", - "STOP", - "CONNECT", - "CONNECT_SUCCESS", - "CONNECT_FAILURE", - "DISCONNECT" - }; - -/** - * \fn smeSm_Start - * \brief Starts STA opeartion by moving SCR out of idle group and starting connection process - * - * Starts STA opeartion by moving SCR out of idle group and starting connection process - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_Stop, sme_start - */ -void smeSm_Start (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - /* set SCR group according to connection mode */ - if (CONNECT_MODE_AUTO == pSme->eConnectMode) - { - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_Start: changing SCR group to DRV scan\n"); - scr_setGroup (pSme->hScr, SCR_GID_DRV_SCAN); - } - else - { - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_Start: changing SCR group to APP scan\n"); - scr_setGroup (pSme->hScr, SCR_GID_APP_SCAN); - } - - if ((TI_FALSE == pSme->bRadioOn) || (TI_FALSE == pSme->bRunning)) - { - /* Radio is off so send stop event */ - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_STOP, hSme); - } - else if (TI_TRUE == pSme->bConnectRequired) - { - /* if connection was required, start the process */ - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme); - } -} - -/** - * \fn smeSm_Stop - * \brief Turns off the STA - * - * Turns off the STA by moving the SCr to idle - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_Start, sme_Stop - */ -void smeSm_Stop (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - /* set SCR group to idle */ - scr_setGroup (pSme->hScr, SCR_GID_IDLE); - - if (TI_FALSE == pSme->bRunning) - { - /* call DrvMain */ - drvMain_SmeStop (pSme->hDrvMain); - } -} - -/** - * \fn smeSm_PreConnect - * \brief Initiates the connection process - * - * Initiates the connection process - for automatic mode, start scan, for manual mode - triggers connection - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_Connect, smeSm_ConnectSuccess - */ -void smeSm_PreConnect (TI_HANDLE hSme) -{ - TSme *pSme = (TSme *)hSme; - paramInfo_t *pParam; - - /* set the connection mode with which this connection attempt is starting */ - pSme->eLastConnectMode = pSme->eConnectMode; - - /* mark that no authentication/assocaition was yet sent */ - pSme->bAuthSent = TI_FALSE; - - /* try to find a connection candidate (manual mode have already performed scann */ - pSme->pCandidate = sme_Select (hSme); - if (NULL != pSme->pCandidate) - { - /* candidate is available - attempt connection */ - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme); - } - /* no candidate */ - else - { - if (CONNECT_MODE_AUTO == pSme->eConnectMode) - { - /* automatic mode - start scanning */ - if (TI_OK != sme_StartScan (hSme)) - { - TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_PreConnect: unable to start scan, stopping the SME\n"); - pSme->bRadioOn = TI_FALSE; - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); - } - - /* update scan count counter */ - if(pSme->uScanCount < PERIODIC_SCAN_MAX_INTERVAL_NUM) - { - pSme->uScanCount++; - } - - } - else /* Manual mode */ - { - /* for IBSS or any, if no entries where found, add the self site */ - if (pSme->eBssType == BSS_INFRASTRUCTURE) - { - /* makr whether we need to stop the attempt connection in manual mode */ - pSme->bConnectRequired = TI_FALSE; - - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_PreConnect: No candidate available, sending connect failure\n"); - /* manual mode and no connection candidate is available - connection failed */ - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); - } - - else /* IBSS */ - { - TI_UINT8 uDesiredChannel; - TI_BOOL channelValidity; - - pSme->bConnectRequired = TI_FALSE; - - pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); - if (!pParam) - { - return; - } - - pParam->paramType = SITE_MGR_DESIRED_CHANNEL_PARAM; - siteMgr_getParam(pSme->hSiteMgr, pParam); - uDesiredChannel = pParam->content.siteMgrDesiredChannel; - - if (uDesiredChannel >= SITE_MGR_CHANNEL_A_MIN) - { - pParam->content.channelCapabilityReq.band = RADIO_BAND_5_0_GHZ; - } - else - { - pParam->content.channelCapabilityReq.band = RADIO_BAND_2_4_GHZ; - } - - /* - update the regulatory domain with the selected band - */ - /* Check if the selected channel is valid according to regDomain */ - pParam->paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; - pParam->content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; - pParam->content.channelCapabilityReq.channelNum = uDesiredChannel; - - regulatoryDomain_getParam (pSme->hRegDomain, pParam); - channelValidity = pParam->content.channelCapabilityRet.channelValidity; - os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); - if (!channelValidity) - { - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "IBSS SELECT FAILURE - No channel !!!\n\n"); - - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); - - return; - } - - pSme->pCandidate = (TSiteEntry *)addSelfSite(pSme->hSiteMgr); - - if (pSme->pCandidate == NULL) - { - TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "IBSS SELECT FAILURE - could not open self site !!!\n\n"); - - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); - - return; - } - -#ifdef REPORT_LOG - TRACE6(pSme->hReport, REPORT_SEVERITY_CONSOLE,"%%%%%%%%%%%%%% SELF SELECT SUCCESS, bssid: %X-%X-%X-%X-%X-%X %%%%%%%%%%%%%%\n\n", pSme->pCandidate->bssid[0], pSme->pCandidate->bssid[1], pSme->pCandidate->bssid[2], pSme->pCandidate->bssid[3], pSme->pCandidate->bssid[4], pSme->pCandidate->bssid[5]); - WLAN_OS_REPORT (("%%%%%%%%%%%%%% SELF SELECT SUCCESS, bssid: %02x.%02x.%02x.%02x.%02x.%02x %%%%%%%%%%%%%%\n\n", pSme->pCandidate->bssid[0], pSme->pCandidate->bssid[1], pSme->pCandidate->bssid[2], pSme->pCandidate->bssid[3], pSme->pCandidate->bssid[4], pSme->pCandidate->bssid[5])); -#endif - /* a connection candidate is available, send a connect event */ - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme); - } - } - } -} - -/** - * \fn smeSm_Connect - * \brief Starts a connection process with the selected network - * - * Starts a connection process with the selected network - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_PreConnect, smeSm_ConnectSuccess - */ -void smeSm_Connect (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - TI_STATUS tStatus; - paramInfo_t *pParam; - - /* Sanity check - if no connection candidate was found so far */ - if (NULL == pSme->pCandidate) - { - TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Connect: No candidate available, sending connect failure\n"); - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); - } - else - { - pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); - if (!pParam) - { - return; - } - - /* set SCR group */ - if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType) - { - scr_setGroup (pSme->hScr, SCR_GID_CONNECT); - } - - /***************** Config Connection *************************/ - pParam->paramType = CONN_TYPE_PARAM; - if (BSS_INDEPENDENT == pSme->pCandidate->bssType) - if (SITE_SELF == pSme->pCandidate->siteType) - { - pParam->content.connType = CONNECTION_SELF; - } - else - { - pParam->content.connType = CONNECTION_IBSS; - } - else - pParam->content.connType = CONNECTION_INFRA; - conn_setParam(pSme->hConn, pParam); - os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); - - /* start the connection process */ - tStatus = conn_start (pSme->hConn, CONN_TYPE_FIRST_CONN, sme_ReportConnStatus, hSme, TI_FALSE, TI_FALSE); - if (TI_OK != tStatus) - { - TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Connect: conn_start returned status %d\n", tStatus); - } - } -} - -/** - * \fn smeSm_ConnectSuccess - * \brief Handles connection success indication - * - * Handles connection success indication - starts AP conn and set SCR group to connected - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_PreConnect, smeSm_Connect - */ -void smeSm_ConnectSuccess (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - pSme->uScanCount = 0; - - /* connection succedded to the connection candidate - start AP connection */ - if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType) - { - /* Start the AP connection */ - apConn_start (pSme->hApConn, - (pSme->tSsid.len != 0) && !OS_802_11_SSID_JUNK (pSme->tSsid.str, pSme->tSsid.len)); - } - - /* Set SCR group to connected */ - scr_setGroup (pSme->hScr, SCR_GID_CONNECTED); -} - -/** - * \fn smeSm_Disconnect - * \brief Starts a disconnect by calling the AP connection or connect modules - * - * Starts a disconnect by calling the AP connection or connect modules - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_DisconnectDone - */ -void smeSm_Disconnect (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - TI_STATUS tStatus; - - /* set the SCr group to connecting */ - scr_setGroup (pSme->hScr, SCR_GID_CONNECT); - - if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType) - { - /* Call the AP connection to perform disconnect */ - tStatus = apConn_stop (pSme->hApConn, TI_TRUE); - } - else - { - /* In IBSS disconnect is done directly with the connection SM */ - tStatus = conn_stop(pSme->hConn, DISCONNECT_DE_AUTH, STATUS_UNSPECIFIED, - TI_TRUE, sme_ReportConnStatus, hSme); - if (tStatus != TI_OK) - { -TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Disconnect: conn_stop retruned %d\n", tStatus); - } - } -} - -/** - * \fn smeSm_DisconnectDone - * \brief Finish a disconnect process - * - * Finish a disconnect process by sending the appropriate event and restarting the state-machine - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_Disconnect - */ -void smeSm_DisconnectDone (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - OS_802_11_DISASSOCIATE_REASON_T tEventReason; - - if (TI_FALSE == pSme->bReselect) - { - /* send an event notifying the disassocation */ - if (TI_TRUE == pSme->bAuthSent) - { - tEventReason.eDisAssocType = SME_CONVERT_DISASSOC_CODES (pSme->tDisAssoc.eMgmtStatus); - tEventReason.uStatusCode = pSme->tDisAssoc.uStatusCode; - EvHandlerSendEvent (pSme->hEvHandler, IPC_EVENT_DISASSOCIATED, (TI_UINT8*)&tEventReason, - sizeof(OS_802_11_DISASSOCIATE_REASON_T)); - } - else if (CONNECT_MODE_AUTO != pSme->eLastConnectMode) - { - EvHandlerSendEvent (pSme->hEvHandler, IPC_EVENT_NOT_ASSOCIATED, NULL, 0); - } - } - - siteMgr_disSelectSite (pSme->hSiteMgr); - - /* try to reconnect */ - smeSm_Start (hSme); -} - -/** - * \fn smeSm_StopScan - * \brief Stops the SME scan operation - * - * Stops the SME scan operation - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_PreConnect, sme_StartScan - */ -void smeSm_StopScan (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - scanCncn_StopPeriodicScan (pSme->hScanCncn, SCAN_SCC_DRIVER); -} - -/** - * \fn smeSm_StopConnect - * \brief Stops the connect module - * - * Stops the connect module (if the SME is stopped during a connect attempt - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_Connect - */ -void smeSm_StopConnect (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - TI_STATUS tStatus; - - tStatus = conn_stop (pSme->hConn, DISCONNECT_DE_AUTH, STATUS_UNSPECIFIED, - TI_TRUE, sme_ReportConnStatus, hSme); - - if (TI_OK != tStatus) - { - TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_StopConnect: conn_stop returned status %d\n", tStatus); - } -} - -/** - * \fn smeSm_ConnWhenConnecting - * \brief Starts the connect process again - * - * Starts the connect process again - * - * \param hSme - handle to the SME object - * \return None - * \sa smeSm_Connect - */ -void smeSm_ConnWhenConnecting (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - TI_STATUS tStatus; - - /* start the connection process */ - tStatus = conn_start (pSme->hConn, CONN_TYPE_FIRST_CONN, sme_ReportConnStatus, hSme, TI_FALSE, TI_FALSE); - if (TI_OK != tStatus) - { - TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_ConnWhenConnecting: conn_start returned status %d\n", tStatus); - } -} - -/** - * \fn smeSm_ActionUnexpected - * \brief Called when an unexpected event (for current state) is received - * - * Called when an unexpected event (for current state) is received - * - * \param hSme - handle to the SME object - * \return None - */ -void smeSm_ActionUnexpected (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_ActionUnexpected called\n"); -} - -/** - * \fn smeSm_NopAction - * \brief Called when event call and don't need to do nothing. - * - * \param hSme - handle to the SME object - * \return None - */ -void smeSm_NopAction (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_NopAction called\n"); -} - -void smeSm_CheckStartConditions (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - - if ((TI_TRUE == pSme->bRunning) && (TI_TRUE == pSme->bRadioOn)) - { - /* send a start event */ - sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_START, hSme); - } -} - - -/* do we need to verify G only / A only / dual-band with site mgr? or rely on channels only? */ - -/** - * \fn sme_StartScan - * \brief Set scan parameters and calls scan concnetartor to start the scan operation. - * - * Set scan parameters and calls scan concnetartor to start the scan operation. - * - * Scan parameters are set according to scan target - find country IE, find desired SSID, or both - * (one on each band). To find country IE we use passive scan forever, to find the desired SSID we - * use active scan until the current country IE expires. In addition, we take into account the WSC PB - * mode - scan constantly for two minutes (but under the country validity and expiry constraints) - * - * \param hSme - handle to the SME object - * \return TI_OK if scan started successfully, TI_NOK otherwise - * \sa smeSm_PreConnect - */ -TI_STATUS sme_StartScan (TI_HANDLE hSme) -{ - TSme *pSme = (TSme*)hSme; - paramInfo_t *pParam; - TI_BOOL bDEnabled, bCountryValid; - TI_BOOL bBandChannelExist[ RADIO_BAND_NUM_OF_BANDS ]; - TI_BOOL bBandCountryFound[ RADIO_BAND_NUM_OF_BANDS ]; - TI_STATUS tStatus; - TI_UINT32 uIndex; - - /* get 802.11d enable state */ - pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); - if (!pParam) - { - return TI_NOK; - } - - pParam->paramType = REGULATORY_DOMAIN_ENABLED_PARAM; - regulatoryDomain_getParam (pSme->hRegDomain, pParam); - bDEnabled = pParam->content.regulatoryDomainEnabled; - - pParam->paramType = REGULATORY_DOMAIN_IS_COUNTRY_FOUND; - /* get country validity for all bands */ - for (uIndex = 0; uIndex < RADIO_BAND_NUM_OF_BANDS; uIndex++) - { - pParam->content.eRadioBand = (ERadioBand)uIndex; - regulatoryDomain_getParam (pSme->hRegDomain, pParam); - bBandCountryFound[ uIndex ] = pParam->content.bIsCountryFound; - /* also nullify the channel exist indication for this band */ - bBandChannelExist[ uIndex ] = TI_FALSE; - } - os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); - - /* First fill the channels */ - for (uIndex = 0; uIndex < pSme->tInitParams.uChannelNum; uIndex++) - { - /* for each channel, if country is found, set active scan */ - pSme->tScanParams.tChannels[ uIndex ].eBand = pSme->tInitParams.tChannelList[ uIndex ].eBand; - pSme->tScanParams.tChannels[ uIndex ].uChannel = pSme->tInitParams.tChannelList[ uIndex ].uChannel; - pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs = pSme->tInitParams.uMaxScanDuration; - pSme->tScanParams.tChannels[ uIndex ].uMinDwellTimeMs = pSme->tInitParams.uMinScanDuration; - pSme->tScanParams.tChannels[ uIndex ].uTxPowerLevelDbm = DEF_TX_POWER; - - /* if 802.11d is disabled, or country is available for this band */ - if ((TI_FALSE == bDEnabled) || - (TI_TRUE == bBandCountryFound[ pSme->tInitParams.tChannelList[ uIndex ].eBand ])) - { - /* set active scan */ - pSme->tScanParams.tChannels[ uIndex ].eScanType = SCAN_TYPE_NORMAL_ACTIVE; - } - /* 802.11d is enabled and no country available */ - else - { - /* set passive scan */ - pSme->tScanParams.tChannels[ uIndex ].eScanType = SCAN_TYPE_NORMAL_PASSIVE; - - /* - * in order to fined country set uMaxDwellTimeMs ( that at passive scan set the passiveScanDuration ) - * to significant value - */ - pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs = SCAN_CNCN_REGULATORY_DOMAIN_PASSIVE_DWELL_TIME_DEF; - } - /* mark that a channel exists for this band */ - bBandChannelExist[ pSme->tInitParams.tChannelList[ uIndex ].eBand ] = TI_TRUE; - } - /* set number of channels */ - pSme->tScanParams.uChannelNum = pSme->tInitParams.uChannelNum; - - /* now, fill global parameters */ - pSme->tScanParams.uProbeRequestNum = pSme->tInitParams.uProbeReqNum; - pSme->tScanParams.iRssiThreshold = pSme->tInitParams.iRssiThreshold; - pSme->tScanParams.iSnrThreshold = pSme->tInitParams.iSnrThreshold; - pSme->tScanParams.bTerminateOnReport = TI_TRUE; - pSme->tScanParams.uFrameCountReportThreshold = 1; - - /* - * if for at least one band country is known and scan is performed on this band - means we need to - * take into consideration country expiry, plus we are scanning for the desired SSID - */ - bCountryValid = ((TI_TRUE == bBandChannelExist[ RADIO_BAND_2_4_GHZ ]) && (TI_TRUE == bBandCountryFound[ RADIO_BAND_2_4_GHZ ])) || - ((TI_TRUE == bBandChannelExist[ RADIO_BAND_5_0_GHZ ]) && (TI_TRUE == bBandCountryFound[ RADIO_BAND_5_0_GHZ ])); - - /* set SSID(s) and BSS type according to 802.11d status, and country availability */ - /* if 802.11d is disabled */ - if (TI_FALSE == bDEnabled) - { - pSme->tScanParams.eBssType = pSme->eBssType; - /* set the deisred SSID, or any SSID if this is the desired SSID */ - if (SSID_TYPE_ANY == pSme->eSsidType) - { - pSme->tScanParams.uSsidNum = 0; - pSme->tScanParams.uSsidListFilterEnabled = 1; - } - else - { - pSme->tScanParams.tDesiredSsid[ 0 ].eVisability = SCAN_SSID_VISABILITY_HIDDEN; - os_memoryCopy (pSme->hOS, &(pSme->tScanParams.tDesiredSsid[ 0 ].tSsid), &(pSme->tSsid), sizeof (TSsid)); - pSme->tScanParams.uSsidNum = 1; - pSme->tScanParams.uSsidListFilterEnabled = 1; - -#ifdef XCC_MODULE_INCLUDED - pSme->tScanParams.uSsidListFilterEnabled = (TI_UINT8)TI_FALSE; - pSme->tScanParams.uSsidNum = 2; - pSme->tScanParams.tDesiredSsid[ 1 ].tSsid.len = 0; - pSme->tScanParams.tDesiredSsid[ 1 ].eVisability = SCAN_SSID_VISABILITY_PUBLIC; -#endif - - } - } - /* Country code exists and scan is performed on this band - take country expiry timr into account */ - else if (TI_TRUE == bCountryValid) - { - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "sme_StartScan: performing active scan to find desired SSID\n"); - - /* we already know that at least on one band we know the country IE, so we scan for our SSID */ - pSme->tScanParams.tDesiredSsid[ 0 ].eVisability = SCAN_SSID_VISABILITY_HIDDEN; - os_memoryCopy (pSme->hOS, &(pSme->tScanParams.tDesiredSsid[ 0 ].tSsid), &(pSme->tSsid), sizeof (TSsid)); - /* - * if, in addition, we scan the other band to find its country, and the desired SSDI is not any SSID, - * add an empty SSID - */ - if ((SSID_TYPE_ANY != pSme->eSsidType) && - (((TI_TRUE == bBandChannelExist[ RADIO_BAND_2_4_GHZ ]) && (TI_FALSE == bBandCountryFound[ RADIO_BAND_2_4_GHZ ])) || - ((TI_TRUE == bBandChannelExist[ RADIO_BAND_5_0_GHZ ]) && (TI_FALSE == bBandCountryFound[ RADIO_BAND_5_0_GHZ ])))) - { - pSme->tScanParams.tDesiredSsid[ 1 ].eVisability = SCAN_SSID_VISABILITY_PUBLIC; - pSme->tScanParams.tDesiredSsid[ 1 ].tSsid.len = 0; - pSme->tScanParams.uSsidNum = 2; - pSme->tScanParams.uSsidListFilterEnabled = 1; - /* - * since we are also looking for an AP with country IE (not include in IBSS), we need to make sure - * the desired BSS type include infrastructure BSSes. - */ - if (BSS_INDEPENDENT == pSme->eBssType) - { - /* the desired is only IBSS - scan for any */ - pSme->tScanParams.eBssType = BSS_ANY; - } - else - { - /* the desired is either infrastructure or any - use it */ - pSme->tScanParams.eBssType = pSme->eBssType; - } - } - else - { - pSme->tScanParams.uSsidNum = 1; - pSme->tScanParams.uSsidListFilterEnabled = 1; - /* only looking for the desired SSID - set the desired BSS type */ - pSme->tScanParams.eBssType = pSme->eBssType; - } - } - /* no scanned band has a counrty code - meaning all scan is passive (to find country) */ - else - { - TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "sme_StartScan: performing passive scan to find country IE\n"); - pSme->tScanParams.eBssType = BSS_INFRASTRUCTURE; /* only an AP would transmit a country IE */ - pSme->tScanParams.uSsidNum = 0; - pSme->tScanParams.uSsidListFilterEnabled = 1; - } - - /* update scan cycle number and scan intervals according to 802.11d status and country availability */ - sme_updateScanCycles (hSme, bDEnabled, bCountryValid, pSme->bConstantScan); - - /* Finally(!!!), start the scan */ - tStatus = scanCncn_StartPeriodicScan (pSme->hScanCncn, SCAN_SCC_DRIVER, &(pSme->tScanParams)); - if (SCAN_CRS_SCAN_RUNNING != tStatus) - { - TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "sme_StartScan: scan concentrator returned status %d\n", tStatus); - return TI_NOK; - } - - return TI_OK; -} - -/** - * \fn sme_updateScanCycles - * \brief Updates the scan intervals and cycle number according to 802.11d status, country availability and WSC PB mode - * - * Updates the scan intervals and cycle number according to 802.11d status, country availability and WSC PB mode. - * Possible scenarios - D disabled - WSC PB off - scan forever with supplied intervals - * - D enabled - country unknown - WSC PB off - scan forever with supplied intervals - * - D disabled - WSC PB on - scan for two minutes with zero intervals - * - D enabled - country unknown - WSC PB on - scan for two minutes with zero intervals - * - D enabled - country known - WSC PB off - scan until country expiry with supplied intervals - * - D enabled - country known - WSC PB on - scan for the minimu of two minutes and country expiry with zero intervals - * - * \param hSme - handle to the SME object - * \param bDEnabled - TRUE if 802.11d is enabled - * \param bCountryValid - TRUE if a country IE is valid for a band on which we scan - * \param bConstantScan - TRUE if WSC PB mode is on - * \return None - * \sa sme_CalculateCyclesNumber, sme_StartScan - */ -void sme_updateScanCycles (TI_HANDLE hSme, - TI_BOOL bDEnabled, - TI_BOOL bCountryValid, - TI_BOOL bConstantScan) -{ - TSme *pSme = (TSme*)hSme; - TI_UINT32 uIndex, uScanPeriodMs, uScanDurationMs; - paramInfo_t *pParam; - - /* 802.11d is disabled, or no country is valid */ - if ((TI_FALSE == bDEnabled) || (TI_FALSE == bCountryValid)) - { - /* WSC PB mode is disabled */ - if (TI_FALSE == bConstantScan) - { - /* - * copy intervals - * In order to avoid tight loop of scan-select or scan-select-connecting operation, - * the prepare scan function takes into account the value of the scan_count when setting the 16 periods in the scan command - */ - os_memoryCopy (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), - &(pSme->tInitParams.uScanIntervals[ pSme->uScanCount ]), sizeof (TI_UINT32) * (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount)); - - for(uIndex = (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount); uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM; uIndex++) - { - pSme->tScanParams.uCycleIntervalMsec[ uIndex ] = pSme->tInitParams.uScanIntervals[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1 ]; - } - - /* scan for default number (until a result is found) */ - pSme->tScanParams.uCycleNum = pSme->tInitParams.uCycleNum; - } - /* WSC PB mode is enabled */ - else - { - - /* nullify all intervals */ - os_memoryZero (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), - sizeof (TI_UINT32) * PERIODIC_SCAN_MAX_INTERVAL_NUM); - - /* calculate the duration of one scan cycle */ - uScanDurationMs = 0; - for (uIndex = 0; uIndex < pSme->tScanParams.uChannelNum; uIndex++) - { - uScanDurationMs += pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs; - } - - /* set the number of cycles - 2 minutes divided by one cycle duration */ - pSme->tScanParams.uCycleNum = (120000 / uScanDurationMs) + 1; - } - } - /* 802.11d is enabled, and country is valid on at least one band */ - else - { - pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); - if (!pParam) - { - return; - } - - /* get country expiry time */ - pParam->paramType = REGULATORY_DOMAIN_TIME_TO_COUNTRY_EXPIRY; - regulatoryDomain_getParam (pSme->hRegDomain, pParam); - - /* WSC PB mode is disabled */ - if (TI_FALSE == bConstantScan) - { - /* - * copy intervals - * In order to avoid tight loop of scan-select or scan-select-connecting operation, - * the prepare scan function takes into account the value of the scan_count when setting the 16 periods in the scan command - */ - os_memoryCopy (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), - &(pSme->tInitParams.uScanIntervals[ pSme->uScanCount ]), sizeof (TI_UINT32) * (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount)); - - for(uIndex = (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount); uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM; uIndex++) - { - pSme->tScanParams.uCycleIntervalMsec[ uIndex ] = pSme->tInitParams.uScanIntervals[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1 ]; - } - - /* set cycle number according to country expiry time */ - sme_CalculateCyclesNumber (hSme, pParam->content.uTimeToCountryExpiryMs); - } - /* WSC PB mode is enabled */ - else - { - /* turn off WSC PB mode (for next scan) */ - pSme->bConstantScan = TI_FALSE; - - /* set scan period to minimum of WSC PB duration (2 minutes) and country expiry time */ - uScanPeriodMs = TI_MIN (120000, pParam->content.uTimeToCountryExpiryMs); - - /* nullify all intervals */ - os_memoryZero (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), - sizeof (TI_UINT32) * PERIODIC_SCAN_MAX_INTERVAL_NUM); - - /* calculate the duration of one scan cycle */ - uScanDurationMs = 0; - for (uIndex = 0; uIndex < pSme->tScanParams.uChannelNum; uIndex++) - { - uScanDurationMs += pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs; - } - - if (uScanDurationMs != 0) - { - /* set the number of cycles - scan period divided by one cycle duration */ - pSme->tScanParams.uCycleNum = (uScanPeriodMs / uScanDurationMs) + 1; - } - else - { - pSme->tScanParams.uCycleNum = pSme->tInitParams.uCycleNum; - } - } - os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); - } - - /* in case independent mode and to avoid supplicant send disconnect event after 60s */ - if (pSme->eBssType != BSS_INFRASTRUCTURE) - { - pSme->tScanParams.uCycleNum = 1; - } -} - -/** - * \fn sme_CalculateCyclesNumber - * \brief Calculates the cycle number required for a gicen time, according to scan intervals - * - * Calculates the cycle number required for a gicen time, according to scan intervals. First check the 16 - * different intervals, and if more time is available, find how many cycles still fit. Write the result - * to the SME scan command - * - * \param hSme - handle to the SME object - * \param uToTalTimeMs - the total periodic scan operation duartion - * \return None - * \sa sme_updateScanCycles, sme_StartScan - */ -void sme_CalculateCyclesNumber (TI_HANDLE hSme, TI_UINT32 uTotalTimeMs) -{ - TSme *pSme = (TSme*)hSme; - TI_UINT32 uIndex, uCurrentTimeMs = 0; - - /* - * the total time should exceed country code expiration by one interval (so that next scan wouldn't - * have a valid country code) - */ - - /* nullify cycle number */ - pSme->tScanParams.uCycleNum = 0; - /* now find how many cycles fit within this time. First, check if all first 16 configured intervals fit */ - for (uIndex = 0; - (uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM) && (uCurrentTimeMs < uTotalTimeMs); - uIndex++) - { - pSme->tScanParams.uCycleNum++; - uCurrentTimeMs += pSme->tScanParams.uCycleIntervalMsec[ uIndex ]; - } - /* now find out how many more cycles with the last interval still fits */ - if (uCurrentTimeMs < uTotalTimeMs) - { - /* - * divide the reamining time (time until expiry minus the total time calculated so far) - * by the last interval time, to get how many more scans would fit after the first 16 intervals - */ - pSme->tScanParams.uCycleNum += (uTotalTimeMs - uCurrentTimeMs) / - pSme->tScanParams.uCycleIntervalMsec[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1]; - /* and add one, to compensate for the reminder */ - pSme->tScanParams.uCycleNum++; - } -} - |