1a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 2a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * smeSm.c 3a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 43bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved. 5a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * All rights reserved. 6a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 7a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Redistribution and use in source and binary forms, with or without 8a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * modification, are permitted provided that the following conditions 9a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * are met: 10a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 11a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Redistributions of source code must retain the above copyright 12a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * notice, this list of conditions and the following disclaimer. 13a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Redistributions in binary form must reproduce the above copyright 14a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * notice, this list of conditions and the following disclaimer in 15a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the documentation and/or other materials provided with the 16a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * distribution. 17a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Neither the name Texas Instruments nor the names of its 18a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * contributors may be used to endorse or promote products derived 19a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * from this software without specific prior written permission. 20a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 21a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 33a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 34a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** \file smeSm.c 35a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief SME state machine implementation 36a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 37a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \see smeSm.h, sme.c, sme.h 38a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 39a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 40a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 41a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define __FILE_ID__ FILE_ID_43 42a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "GenSM.h" 43a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "smeSm.h" 44a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "smePrivate.h" 45a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "connApi.h" 46a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "apConn.h" 47a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "ScanCncn.h" 48a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "scanResultTable.h" 49a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "EvHandler.h" 50a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "regulatoryDomainApi.h" 51a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "siteMgrApi.h" 52a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "DrvMain.h" 53a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 54a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 55a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic OS_802_11_DISASSOCIATE_REASON_E eDisassocConvertTable[ MGMT_STATUS_MAX_NUM +1] = 56a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 57a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 58a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 59a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_AUTH_REJECT, 60a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_ASSOC_REJECT, 61a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_SECURITY_FAILURE, 62a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_AP_DEAUTHENTICATE, 63a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_AP_DISASSOCIATE, 64a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_ROAMING_TRIGGER, 65a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 66a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 67a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 68a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 69a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 70a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 71a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED, 72a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_DISASSOC_STATUS_UNSPECIFIED 73a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt}; 74a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 75a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define SME_CONVERT_DISASSOC_CODES(disassocReason) (eDisassocConvertTable[ (disassocReason) ]) 76a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 77a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Start (TI_HANDLE hSme); 78a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Stop (TI_HANDLE hSme); 79a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_PreConnect (TI_HANDLE hSme); 80a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Connect (TI_HANDLE hSme); 81a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_ConnectSuccess (TI_HANDLE hSme); 82a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_Disconnect (TI_HANDLE hSme); 83a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_DisconnectDone (TI_HANDLE hSme); 84a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_StopScan (TI_HANDLE hSme); 85a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_StopConnect (TI_HANDLE hSme); 86a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_ConnWhenConnecting (TI_HANDLE hSme); 87a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_ActionUnexpected (TI_HANDLE hSme); 88a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_NopAction (TI_HANDLE hSme); 89a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void smeSm_CheckStartConditions (TI_HANDLE hSme); 90a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 91a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic TI_STATUS sme_StartScan (TI_HANDLE hSme); 92a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void sme_updateScanCycles (TI_HANDLE hSme, 93a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bDEnabled, 94a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bCountryValid, 95a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bConstantScan); 96a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic void sme_CalculateCyclesNumber (TI_HANDLE hSme, TI_UINT32 uTotalTimeMs); 97a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 98a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTGenSM_actionCell tSmMatrix[ SME_SM_NUMBER_OF_STATES ][ SME_SM_NUMBER_OF_EVENTS ] = 99a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 100a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { /* SME_SM_STATE_IDLE */ 101a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_Start }, /* SME_SM_EVENT_START */ 102a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_STOP */ 103a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */ 104a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ 105a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_IDLE, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_FAILURE */ 106a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_IDLE, smeSm_CheckStartConditions }, /* SME_SM_EVENT_DISCONNECT */ 107a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }, 108a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { /* SME_SM_STATE_WAIT_CONNECT */ 109a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ 110a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_IDLE, smeSm_Stop }, /* SME_SM_EVENT_STOP */ 111a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_SCANNING, smeSm_PreConnect }, /* SME_SM_EVENT_CONNECT */ 112a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ 113a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_FAILURE */ 114a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_Start }, /* SME_SM_EVENT_DISCONNECT */ 115a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }, 116a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { /* SME_SM_STATE_SCANNING */ 117a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_SCANNING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ 118a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_StopScan }, /* SME_SM_EVENT_STOP */ 119a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTING, smeSm_Connect }, /* SME_SM_EVENT_CONNECT */ 120a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_SCANNING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ 121a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ 122a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_StopScan }, /* SME_SM_EVENT_DISCONNECT */ 123a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }, 124a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { /* SME_SM_STATE_CONNECTING */ 125a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ 126a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_StopConnect }, /* SME_SM_EVENT_STOP */ 127a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTING, smeSm_ConnWhenConnecting }, /* SME_SM_EVENT_CONNECT */ 128a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTED, smeSm_ConnectSuccess }, /* SME_SM_EVENT_CONNECT_SUCCESS */ 129a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ 130a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_StopConnect }, /* SME_SM_EVENT_DISCONNECT */ 131a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }, 132a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { /* SME_SM_STATE_CONNECTED */ 133a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ 134a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_Disconnect }, /* SME_SM_EVENT_STOP */ 135a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */ 136a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_CONNECTED, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ 137a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ 138a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_Disconnect }, /* SME_SM_EVENT_DISCONNECT */ 139a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }, 140a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { /* SME_SM_STATE_DISCONNECTING */ 141a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_START */ 142a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_STOP */ 143a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT */ 144a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_ActionUnexpected }, /* SME_SM_EVENT_CONNECT_SUCCESS */ 145a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_WAIT_CONNECT, smeSm_DisconnectDone }, /* SME_SM_EVENT_CONNECT_FAILURE */ 146a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { SME_SM_STATE_DISCONNECTING, smeSm_NopAction }, /* SME_SM_EVENT_DISCONNECT */ 147a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 148a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }; 149a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 150a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_INT8* uStateDescription[] = 151a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 152a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "IDLE", 153a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "WAIT_CONNECT", 154a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "SCANNING", 155a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "CONNECTING", 156a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "CONNECTED", 157a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "DISCONNECTING" 158a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }; 159a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 160a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_INT8* uEventDescription[] = 161a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 162a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "START", 163a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "STOP", 164a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "CONNECT", 165a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "CONNECT_SUCCESS", 166a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "CONNECT_FAILURE", 167a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt "DISCONNECT" 168a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt }; 169a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 170a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 171a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_Start 172a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Starts STA opeartion by moving SCR out of idle group and starting connection process 173a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 174a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts STA opeartion by moving SCR out of idle group and starting connection process 175a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 176a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 177a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 178a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_Stop, sme_start 179a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 180a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Start (TI_HANDLE hSme) 181a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 182a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 183a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 184a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set SCR group according to connection mode */ 185a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (CONNECT_MODE_AUTO == pSme->eConnectMode) 186a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 187a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_Start: changing SCR group to DRV scan\n"); 188a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scr_setGroup (pSme->hScr, SCR_GID_DRV_SCAN); 189a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 190a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 191a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 192a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_Start: changing SCR group to APP scan\n"); 193a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scr_setGroup (pSme->hScr, SCR_GID_APP_SCAN); 194a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 195a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 196a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if ((TI_FALSE == pSme->bRadioOn) || (TI_FALSE == pSme->bRunning)) 197a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 198a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Radio is off so send stop event */ 1993bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_STOP, hSme); 200a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 201a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else if (TI_TRUE == pSme->bConnectRequired) 202a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 203a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if connection was required, start the process */ 2043bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme); 205a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 206a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 207a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 208a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 209a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_Stop 210a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Turns off the STA 211a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 212a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Turns off the STA by moving the SCr to idle 213a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 214a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 215a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 216a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_Start, sme_Stop 217a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 218a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Stop (TI_HANDLE hSme) 219a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 220a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 221a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 222a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set SCR group to idle */ 223a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scr_setGroup (pSme->hScr, SCR_GID_IDLE); 224a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 225a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_FALSE == pSme->bRunning) 226a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 227a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* call DrvMain */ 228a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt drvMain_SmeStop (pSme->hDrvMain); 229a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 230a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 231a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 232a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 233a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_PreConnect 234a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Initiates the connection process 235a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 236a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Initiates the connection process - for automatic mode, start scan, for manual mode - triggers connection 237a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 238a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 239a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 240a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_Connect, smeSm_ConnectSuccess 241a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 242a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_PreConnect (TI_HANDLE hSme) 243a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 244a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme *)hSme; 245a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt paramInfo_t *pParam; 246a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 247a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set the connection mode with which this connection attempt is starting */ 248a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->eLastConnectMode = pSme->eConnectMode; 249a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 250a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark that no authentication/assocaition was yet sent */ 251a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->bAuthSent = TI_FALSE; 252a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 253a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* try to find a connection candidate (manual mode have already performed scann */ 254a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->pCandidate = sme_Select (hSme); 255a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (NULL != pSme->pCandidate) 256a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 257a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* candidate is available - attempt connection */ 2583bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme); 259a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 260a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* no candidate */ 261a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 262a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 263a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (CONNECT_MODE_AUTO == pSme->eConnectMode) 264a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 265a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* automatic mode - start scanning */ 266a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != sme_StartScan (hSme)) 267a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 268a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_PreConnect: unable to start scan, stopping the SME\n"); 269a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->bRadioOn = TI_FALSE; 2703bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); 271a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 272a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 273a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* update scan count counter */ 274a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if(pSme->uScanCount < PERIODIC_SCAN_MAX_INTERVAL_NUM) 275a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 276a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->uScanCount++; 277a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 278a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 279a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 280a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else /* Manual mode */ 281a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 282a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* for IBSS or any, if no entries where found, add the self site */ 283a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (pSme->eBssType == BSS_INFRASTRUCTURE) 284a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 285a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* makr whether we need to stop the attempt connection in manual mode */ 286a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->bConnectRequired = TI_FALSE; 287ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt 288ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_PreConnect: No candidate available, sending connect failure\n"); 289a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* manual mode and no connection candidate is available - connection failed */ 2903bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); 291a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 292a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 293a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else /* IBSS */ 294a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 295ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt TI_UINT8 uDesiredChannel; 296a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL channelValidity; 297ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt 298a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->bConnectRequired = TI_FALSE; 299a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 300a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); 301a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (!pParam) 302a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 303a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return; 304a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 305a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 306a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramType = SITE_MGR_DESIRED_CHANNEL_PARAM; 307a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt siteMgr_getParam(pSme->hSiteMgr, pParam); 308a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uDesiredChannel = pParam->content.siteMgrDesiredChannel; 309a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 310a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (uDesiredChannel >= SITE_MGR_CHANNEL_A_MIN) 311a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 312a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->content.channelCapabilityReq.band = RADIO_BAND_5_0_GHZ; 313a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 314a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 315a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 316a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->content.channelCapabilityReq.band = RADIO_BAND_2_4_GHZ; 317a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 318a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 319a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 320a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt update the regulatory domain with the selected band 321a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 322a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Check if the selected channel is valid according to regDomain */ 323a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramType = REGULATORY_DOMAIN_GET_SCAN_CAPABILITIES; 324a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->content.channelCapabilityReq.scanOption = ACTIVE_SCANNING; 325a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->content.channelCapabilityReq.channelNum = uDesiredChannel; 326a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 327ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt regulatoryDomain_getParam (pSme->hRegDomain, pParam); 328a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt channelValidity = pParam->content.channelCapabilityRet.channelValidity; 329a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); 330a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (!channelValidity) 331a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 332a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "IBSS SELECT FAILURE - No channel !!!\n\n"); 333a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 3343bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); 335a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 336a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return; 337a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 338a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 339a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->pCandidate = (TSiteEntry *)addSelfSite(pSme->hSiteMgr); 340a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 341a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (pSme->pCandidate == NULL) 342a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 343a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "IBSS SELECT FAILURE - could not open self site !!!\n\n"); 344a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 3453bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); 346a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 347a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return; 348a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 349a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 350a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef REPORT_LOG 351a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 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]); 352a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 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])); 353a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif 354a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* a connection candidate is available, send a connect event */ 3553bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT, hSme); 356a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 357a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 358a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 359a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 360a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 361a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 362a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_Connect 363a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Starts a connection process with the selected network 364a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 365a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts a connection process with the selected network 366a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 367a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 368a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 369a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_PreConnect, smeSm_ConnectSuccess 370a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 371a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Connect (TI_HANDLE hSme) 372a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 373ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt TSme *pSme = (TSme*)hSme; 374a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS tStatus; 375a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt paramInfo_t *pParam; 376a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 377a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Sanity check - if no connection candidate was found so far */ 378a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (NULL == pSme->pCandidate) 379a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 380a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Connect: No candidate available, sending connect failure\n"); 3813bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_CONNECT_FAILURE, hSme); 382a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 383a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 384a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 385a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); 386a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (!pParam) 387a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 388a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return; 389a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 390a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 391a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set SCR group */ 392a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType) 393a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 394a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scr_setGroup (pSme->hScr, SCR_GID_CONNECT); 395a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 396a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 397a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /***************** Config Connection *************************/ 398a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramType = CONN_TYPE_PARAM; 399a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (BSS_INDEPENDENT == pSme->pCandidate->bssType) 400a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (SITE_SELF == pSme->pCandidate->siteType) 401a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 402a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->content.connType = CONNECTION_SELF; 403a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 404a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 405a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 406a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->content.connType = CONNECTION_IBSS; 407a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 408a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 409ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt pParam->content.connType = CONNECTION_INFRA; 410ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt conn_setParam(pSme->hConn, pParam); 411a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); 412a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 413a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* start the connection process */ 414a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tStatus = conn_start (pSme->hConn, CONN_TYPE_FIRST_CONN, sme_ReportConnStatus, hSme, TI_FALSE, TI_FALSE); 415a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != tStatus) 416a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 417a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Connect: conn_start returned status %d\n", tStatus); 418a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 419a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 420a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 421a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 422a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 423a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_ConnectSuccess 424a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Handles connection success indication 425a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 426a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Handles connection success indication - starts AP conn and set SCR group to connected 427a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 428a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 429a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 430a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_PreConnect, smeSm_Connect 431a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 432a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_ConnectSuccess (TI_HANDLE hSme) 433a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 434a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 435a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 436a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->uScanCount = 0; 437a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 438a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* connection succedded to the connection candidate - start AP connection */ 439a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType) 440a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 441a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Start the AP connection */ 442a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt apConn_start (pSme->hApConn, 443a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt (pSme->tSsid.len != 0) && !OS_802_11_SSID_JUNK (pSme->tSsid.str, pSme->tSsid.len)); 444a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 445a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 446a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Set SCR group to connected */ 447a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scr_setGroup (pSme->hScr, SCR_GID_CONNECTED); 448a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 449a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 450a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 451a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_Disconnect 452a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Starts a disconnect by calling the AP connection or connect modules 453a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 454a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts a disconnect by calling the AP connection or connect modules 455a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 456a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 457a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 458a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_DisconnectDone 459a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 460a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_Disconnect (TI_HANDLE hSme) 461a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 462a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 463a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS tStatus; 464a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 465a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set the SCr group to connecting */ 466a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scr_setGroup (pSme->hScr, SCR_GID_CONNECT); 467a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 468a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (BSS_INFRASTRUCTURE == pSme->pCandidate->bssType) 469a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 470a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Call the AP connection to perform disconnect */ 471a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tStatus = apConn_stop (pSme->hApConn, TI_TRUE); 472a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 473a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 474a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 475a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* In IBSS disconnect is done directly with the connection SM */ 476a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tStatus = conn_stop(pSme->hConn, DISCONNECT_DE_AUTH, STATUS_UNSPECIFIED, 477a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_TRUE, sme_ReportConnStatus, hSme); 478a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (tStatus != TI_OK) 479a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 480a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_Disconnect: conn_stop retruned %d\n", tStatus); 481a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 482a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 483a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 484a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 485a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 486a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_DisconnectDone 487a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Finish a disconnect process 488a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 489a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Finish a disconnect process by sending the appropriate event and restarting the state-machine 490a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 491a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 492a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 493a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_Disconnect 494a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 495a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_DisconnectDone (TI_HANDLE hSme) 496a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 497a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 498a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt OS_802_11_DISASSOCIATE_REASON_T tEventReason; 499a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 500a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_FALSE == pSme->bReselect) 501a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 502a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* send an event notifying the disassocation */ 503a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_TRUE == pSme->bAuthSent) 504a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 505a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tEventReason.eDisAssocType = SME_CONVERT_DISASSOC_CODES (pSme->tDisAssoc.eMgmtStatus); 506a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tEventReason.uStatusCode = pSme->tDisAssoc.uStatusCode; 507a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt EvHandlerSendEvent (pSme->hEvHandler, IPC_EVENT_DISASSOCIATED, (TI_UINT8*)&tEventReason, 508a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt sizeof(OS_802_11_DISASSOCIATE_REASON_T)); 509a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 510a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else if (CONNECT_MODE_AUTO != pSme->eLastConnectMode) 511a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 512a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt EvHandlerSendEvent (pSme->hEvHandler, IPC_EVENT_NOT_ASSOCIATED, NULL, 0); 513a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 514a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 515a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 516a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt siteMgr_disSelectSite (pSme->hSiteMgr); 517a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 518a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* try to reconnect */ 519a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt smeSm_Start (hSme); 520a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 521a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 522a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 523a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_StopScan 524a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Stops the SME scan operation 525a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 526a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Stops the SME scan operation 527a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 528a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 529a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 530a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_PreConnect, sme_StartScan 531a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 532a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_StopScan (TI_HANDLE hSme) 533a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 534a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 535a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 536a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt scanCncn_StopPeriodicScan (pSme->hScanCncn, SCAN_SCC_DRIVER); 537a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 538a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 539a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 540a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_StopConnect 541a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Stops the connect module 542a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 543a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Stops the connect module (if the SME is stopped during a connect attempt 544a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 545a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 546a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 547a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_Connect 548a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 549a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_StopConnect (TI_HANDLE hSme) 550a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 551a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 552a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS tStatus; 553a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 554a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tStatus = conn_stop (pSme->hConn, DISCONNECT_DE_AUTH, STATUS_UNSPECIFIED, 555a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_TRUE, sme_ReportConnStatus, hSme); 556a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 557a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != tStatus) 558a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 559a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_StopConnect: conn_stop returned status %d\n", tStatus); 560a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 561a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 562a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 563a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 564a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_ConnWhenConnecting 565a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Starts the connect process again 566a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 567a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Starts the connect process again 568a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 569a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 570a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 571a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_Connect 572a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 573a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_ConnWhenConnecting (TI_HANDLE hSme) 574a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 575a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 576a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS tStatus; 577a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 578a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* start the connection process */ 579a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tStatus = conn_start (pSme->hConn, CONN_TYPE_FIRST_CONN, sme_ReportConnStatus, hSme, TI_FALSE, TI_FALSE); 580a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_OK != tStatus) 581a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 582a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_ConnWhenConnecting: conn_start returned status %d\n", tStatus); 583a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 584a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 585a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 586a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 587a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_ActionUnexpected 588a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Called when an unexpected event (for current state) is received 589a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 590a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Called when an unexpected event (for current state) is received 591a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 592a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 593a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 594a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 595a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_ActionUnexpected (TI_HANDLE hSme) 596a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 597a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 598a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 599a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_ERROR , "smeSm_ActionUnexpected called\n"); 600a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 601a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 602a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 603a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn smeSm_NopAction 604a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Called when event call and don't need to do nothing. 605a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 606a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 607a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 608a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 609a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_NopAction (TI_HANDLE hSme) 610a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 611a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 612a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 613a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "smeSm_NopAction called\n"); 614a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 615a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 616a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid smeSm_CheckStartConditions (TI_HANDLE hSme) 617a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 618a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 619a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 620a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if ((TI_TRUE == pSme->bRunning) && (TI_TRUE == pSme->bRadioOn)) 621a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 622a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* send a start event */ 6233bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt sme_SmEvent (pSme->hSmeSm, SME_SM_EVENT_START, hSme); 624a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 625a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 626a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 627a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 628a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* do we need to verify G only / A only / dual-band with site mgr? or rely on channels only? */ 629a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 630a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 631a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn sme_StartScan 632a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Set scan parameters and calls scan concnetartor to start the scan operation. 633a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 634a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Set scan parameters and calls scan concnetartor to start the scan operation. 635a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 636a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Scan parameters are set according to scan target - find country IE, find desired SSID, or both 637a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (one on each band). To find country IE we use passive scan forever, to find the desired SSID we 638a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * use active scan until the current country IE expires. In addition, we take into account the WSC PB 639a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * mode - scan constantly for two minutes (but under the country validity and expiry constraints) 640a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 641a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 642a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if scan started successfully, TI_NOK otherwise 643a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa smeSm_PreConnect 644a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 645a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS sme_StartScan (TI_HANDLE hSme) 646a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 647a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 648a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt paramInfo_t *pParam; 649a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bDEnabled, bCountryValid; 650a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bBandChannelExist[ RADIO_BAND_NUM_OF_BANDS ]; 651a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bBandCountryFound[ RADIO_BAND_NUM_OF_BANDS ]; 652a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_STATUS tStatus; 653a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex; 654a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 655a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* get 802.11d enable state */ 656a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); 657a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (!pParam) 658a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 659a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_NOK; 660a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 661a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 662a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramType = REGULATORY_DOMAIN_ENABLED_PARAM; 663a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt regulatoryDomain_getParam (pSme->hRegDomain, pParam); 664a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt bDEnabled = pParam->content.regulatoryDomainEnabled; 665a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 666a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramType = REGULATORY_DOMAIN_IS_COUNTRY_FOUND; 667a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* get country validity for all bands */ 668a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < RADIO_BAND_NUM_OF_BANDS; uIndex++) 669a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 6703bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt pParam->content.eRadioBand = (ERadioBand)uIndex; 671a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt regulatoryDomain_getParam (pSme->hRegDomain, pParam); 672a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt bBandCountryFound[ uIndex ] = pParam->content.bIsCountryFound; 673a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* also nullify the channel exist indication for this band */ 674a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt bBandChannelExist[ uIndex ] = TI_FALSE; 675a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 676a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); 677a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 678a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* First fill the channels */ 679a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < pSme->tInitParams.uChannelNum; uIndex++) 680a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 681a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* for each channel, if country is found, set active scan */ 682a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].eBand = pSme->tInitParams.tChannelList[ uIndex ].eBand; 683a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].uChannel = pSme->tInitParams.tChannelList[ uIndex ].uChannel; 684a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs = pSme->tInitParams.uMaxScanDuration; 685a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].uMinDwellTimeMs = pSme->tInitParams.uMinScanDuration; 686a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].uTxPowerLevelDbm = DEF_TX_POWER; 687a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 688a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if 802.11d is disabled, or country is available for this band */ 689a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if ((TI_FALSE == bDEnabled) || 690a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt (TI_TRUE == bBandCountryFound[ pSme->tInitParams.tChannelList[ uIndex ].eBand ])) 691a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 692a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set active scan */ 693a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].eScanType = SCAN_TYPE_NORMAL_ACTIVE; 694a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 695a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 802.11d is enabled and no country available */ 696a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 697a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 698a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set passive scan */ 699a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].eScanType = SCAN_TYPE_NORMAL_PASSIVE; 700a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 701a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 702a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * in order to fined country set uMaxDwellTimeMs ( that at passive scan set the passiveScanDuration ) 703a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * to significant value 704a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 705a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs = SCAN_CNCN_REGULATORY_DOMAIN_PASSIVE_DWELL_TIME_DEF; 706a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 707a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* mark that a channel exists for this band */ 708a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt bBandChannelExist[ pSme->tInitParams.tChannelList[ uIndex ].eBand ] = TI_TRUE; 709a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 710a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set number of channels */ 711a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uChannelNum = pSme->tInitParams.uChannelNum; 712a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 713a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* now, fill global parameters */ 714a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uProbeRequestNum = pSme->tInitParams.uProbeReqNum; 715a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.iRssiThreshold = pSme->tInitParams.iRssiThreshold; 716a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.iSnrThreshold = pSme->tInitParams.iSnrThreshold; 717a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.bTerminateOnReport = TI_TRUE; 718a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uFrameCountReportThreshold = 1; 719a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 720a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 721a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * if for at least one band country is known and scan is performed on this band - means we need to 722a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * take into consideration country expiry, plus we are scanning for the desired SSID 723a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 724a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt bCountryValid = ((TI_TRUE == bBandChannelExist[ RADIO_BAND_2_4_GHZ ]) && (TI_TRUE == bBandCountryFound[ RADIO_BAND_2_4_GHZ ])) || 725a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt ((TI_TRUE == bBandChannelExist[ RADIO_BAND_5_0_GHZ ]) && (TI_TRUE == bBandCountryFound[ RADIO_BAND_5_0_GHZ ])); 726a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 727a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set SSID(s) and BSS type according to 802.11d status, and country availability */ 728a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* if 802.11d is disabled */ 729a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_FALSE == bDEnabled) 730a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 731a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.eBssType = pSme->eBssType; 732a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set the deisred SSID, or any SSID if this is the desired SSID */ 733a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (SSID_TYPE_ANY == pSme->eSsidType) 734a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 735a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidNum = 0; 736a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidListFilterEnabled = 1; 737a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 738a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 739a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 740a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tDesiredSsid[ 0 ].eVisability = SCAN_SSID_VISABILITY_HIDDEN; 741a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pSme->hOS, &(pSme->tScanParams.tDesiredSsid[ 0 ].tSsid), &(pSme->tSsid), sizeof (TSsid)); 742a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidNum = 1; 743a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidListFilterEnabled = 1; 744a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 745a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef XCC_MODULE_INCLUDED 746a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidListFilterEnabled = (TI_UINT8)TI_FALSE; 747a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidNum = 2; 748a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tDesiredSsid[ 1 ].tSsid.len = 0; 749a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tDesiredSsid[ 1 ].eVisability = SCAN_SSID_VISABILITY_PUBLIC; 750a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif 751a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 752a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 753a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 754a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Country code exists and scan is performed on this band - take country expiry timr into account */ 755a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else if (TI_TRUE == bCountryValid) 756a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 757a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "sme_StartScan: performing active scan to find desired SSID\n"); 758a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 759a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* we already know that at least on one band we know the country IE, so we scan for our SSID */ 760a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tDesiredSsid[ 0 ].eVisability = SCAN_SSID_VISABILITY_HIDDEN; 761a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pSme->hOS, &(pSme->tScanParams.tDesiredSsid[ 0 ].tSsid), &(pSme->tSsid), sizeof (TSsid)); 762a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 763a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * if, in addition, we scan the other band to find its country, and the desired SSDI is not any SSID, 764a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * add an empty SSID 765a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 766a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if ((SSID_TYPE_ANY != pSme->eSsidType) && 767a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt (((TI_TRUE == bBandChannelExist[ RADIO_BAND_2_4_GHZ ]) && (TI_FALSE == bBandCountryFound[ RADIO_BAND_2_4_GHZ ])) || 768a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt ((TI_TRUE == bBandChannelExist[ RADIO_BAND_5_0_GHZ ]) && (TI_FALSE == bBandCountryFound[ RADIO_BAND_5_0_GHZ ])))) 769a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 770a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tDesiredSsid[ 1 ].eVisability = SCAN_SSID_VISABILITY_PUBLIC; 771a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.tDesiredSsid[ 1 ].tSsid.len = 0; 772a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidNum = 2; 773a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidListFilterEnabled = 1; 774a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 775a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * since we are also looking for an AP with country IE (not include in IBSS), we need to make sure 776a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the desired BSS type include infrastructure BSSes. 777a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 778a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (BSS_INDEPENDENT == pSme->eBssType) 779a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 780a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* the desired is only IBSS - scan for any */ 781a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.eBssType = BSS_ANY; 782a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 783a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 784a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 785a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* the desired is either infrastructure or any - use it */ 786a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.eBssType = pSme->eBssType; 787a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 788a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 789a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 790a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 791a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidNum = 1; 792a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidListFilterEnabled = 1; 793a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* only looking for the desired SSID - set the desired BSS type */ 794a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.eBssType = pSme->eBssType; 795a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 796a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 797a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* no scanned band has a counrty code - meaning all scan is passive (to find country) */ 798a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 799a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 800a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pSme->hReport, REPORT_SEVERITY_INFORMATION , "sme_StartScan: performing passive scan to find country IE\n"); 801a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.eBssType = BSS_INFRASTRUCTURE; /* only an AP would transmit a country IE */ 802a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidNum = 0; 803a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uSsidListFilterEnabled = 1; 804a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 805a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 806a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* update scan cycle number and scan intervals according to 802.11d status and country availability */ 807a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt sme_updateScanCycles (hSme, bDEnabled, bCountryValid, pSme->bConstantScan); 808a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 809a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Finally(!!!), start the scan */ 810a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt tStatus = scanCncn_StartPeriodicScan (pSme->hScanCncn, SCAN_SCC_DRIVER, &(pSme->tScanParams)); 811a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (SCAN_CRS_SCAN_RUNNING != tStatus) 812a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 813a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE1(pSme->hReport, REPORT_SEVERITY_ERROR , "sme_StartScan: scan concentrator returned status %d\n", tStatus); 814a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_NOK; 815a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 816a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 817a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_OK; 818a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 819a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 820a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 821a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn sme_updateScanCycles 822a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Updates the scan intervals and cycle number according to 802.11d status, country availability and WSC PB mode 823a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 824a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Updates the scan intervals and cycle number according to 802.11d status, country availability and WSC PB mode. 825a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Possible scenarios - D disabled - WSC PB off - scan forever with supplied intervals 826a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * - D enabled - country unknown - WSC PB off - scan forever with supplied intervals 827a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * - D disabled - WSC PB on - scan for two minutes with zero intervals 828a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * - D enabled - country unknown - WSC PB on - scan for two minutes with zero intervals 829a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * - D enabled - country known - WSC PB off - scan until country expiry with supplied intervals 830a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * - D enabled - country known - WSC PB on - scan for the minimu of two minutes and country expiry with zero intervals 831a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 832a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 833a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bDEnabled - TRUE if 802.11d is enabled 834a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bCountryValid - TRUE if a country IE is valid for a band on which we scan 835a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param bConstantScan - TRUE if WSC PB mode is on 836a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 837a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa sme_CalculateCyclesNumber, sme_StartScan 838a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 839a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid sme_updateScanCycles (TI_HANDLE hSme, 840a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bDEnabled, 841a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bCountryValid, 842a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_BOOL bConstantScan) 843a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 844a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 845a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex, uScanPeriodMs, uScanDurationMs; 846a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt paramInfo_t *pParam; 847a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 848a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 802.11d is disabled, or no country is valid */ 849a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if ((TI_FALSE == bDEnabled) || (TI_FALSE == bCountryValid)) 850a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 851a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* WSC PB mode is disabled */ 852a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_FALSE == bConstantScan) 853a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 854a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 855a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * copy intervals 856a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * In order to avoid tight loop of scan-select or scan-select-connecting operation, 857a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the prepare scan function takes into account the value of the scan_count when setting the 16 periods in the scan command 858a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 859a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), 860a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt &(pSme->tInitParams.uScanIntervals[ pSme->uScanCount ]), sizeof (TI_UINT32) * (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount)); 861a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 862a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for(uIndex = (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount); uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM; uIndex++) 863a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 864a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleIntervalMsec[ uIndex ] = pSme->tInitParams.uScanIntervals[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1 ]; 865a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 866a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 867a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* scan for default number (until a result is found) */ 868a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum = pSme->tInitParams.uCycleNum; 869a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 870a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* WSC PB mode is enabled */ 871a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 872a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 873a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 874a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* nullify all intervals */ 875a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryZero (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), 876a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt sizeof (TI_UINT32) * PERIODIC_SCAN_MAX_INTERVAL_NUM); 877a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 878a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* calculate the duration of one scan cycle */ 879a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uScanDurationMs = 0; 880a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < pSme->tScanParams.uChannelNum; uIndex++) 881a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 882a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uScanDurationMs += pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs; 883a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 884a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 885a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set the number of cycles - 2 minutes divided by one cycle duration */ 886a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum = (120000 / uScanDurationMs) + 1; 887a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 888a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 889a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 802.11d is enabled, and country is valid on at least one band */ 890a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 891a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 892a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam = (paramInfo_t *)os_memoryAlloc(pSme->hOS, sizeof(paramInfo_t)); 893a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (!pParam) 894a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 895a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return; 896a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 897a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 898a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* get country expiry time */ 899a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pParam->paramType = REGULATORY_DOMAIN_TIME_TO_COUNTRY_EXPIRY; 900a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt regulatoryDomain_getParam (pSme->hRegDomain, pParam); 901a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 902a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* WSC PB mode is disabled */ 903a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (TI_FALSE == bConstantScan) 904a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 905a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 906a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * copy intervals 907a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * In order to avoid tight loop of scan-select or scan-select-connecting operation, 908a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the prepare scan function takes into account the value of the scan_count when setting the 16 periods in the scan command 909a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 910a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryCopy (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), 911a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt &(pSme->tInitParams.uScanIntervals[ pSme->uScanCount ]), sizeof (TI_UINT32) * (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount)); 912a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 913a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for(uIndex = (PERIODIC_SCAN_MAX_INTERVAL_NUM - pSme->uScanCount); uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM; uIndex++) 914a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 915a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleIntervalMsec[ uIndex ] = pSme->tInitParams.uScanIntervals[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1 ]; 916a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 917a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 918a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set cycle number according to country expiry time */ 919a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt sme_CalculateCyclesNumber (hSme, pParam->content.uTimeToCountryExpiryMs); 920a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 921a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* WSC PB mode is enabled */ 922a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 923a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 924a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* turn off WSC PB mode (for next scan) */ 925a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->bConstantScan = TI_FALSE; 926a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 927a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set scan period to minimum of WSC PB duration (2 minutes) and country expiry time */ 928a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uScanPeriodMs = TI_MIN (120000, pParam->content.uTimeToCountryExpiryMs); 929a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 930a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* nullify all intervals */ 931a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryZero (pSme->hOS, &(pSme->tScanParams.uCycleIntervalMsec[ 0 ]), 932a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt sizeof (TI_UINT32) * PERIODIC_SCAN_MAX_INTERVAL_NUM); 933a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 934a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* calculate the duration of one scan cycle */ 935a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uScanDurationMs = 0; 936a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; uIndex < pSme->tScanParams.uChannelNum; uIndex++) 937a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 938a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uScanDurationMs += pSme->tScanParams.tChannels[ uIndex ].uMaxDwellTimeMs; 939a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 940a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 941a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (uScanDurationMs != 0) 942a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 943a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* set the number of cycles - scan period divided by one cycle duration */ 944a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum = (uScanPeriodMs / uScanDurationMs) + 1; 945a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 946a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt else 947a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 948a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum = pSme->tInitParams.uCycleNum; 949a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 950a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 951a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryFree(pSme->hOS, pParam, sizeof(paramInfo_t)); 952a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 953a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 954a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* in case independent mode and to avoid supplicant send disconnect event after 60s */ 955a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (pSme->eBssType != BSS_INFRASTRUCTURE) 956a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 957a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum = 1; 958a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 959a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 960a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 961a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 962a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn sme_CalculateCyclesNumber 963a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Calculates the cycle number required for a gicen time, according to scan intervals 964a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 965a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Calculates the cycle number required for a gicen time, according to scan intervals. First check the 16 966a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * different intervals, and if more time is available, find how many cycles still fit. Write the result 967a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * to the SME scan command 968a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 969a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hSme - handle to the SME object 970a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param uToTalTimeMs - the total periodic scan operation duartion 971a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return None 972a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa sme_updateScanCycles, sme_StartScan 973a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 974a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid sme_CalculateCyclesNumber (TI_HANDLE hSme, TI_UINT32 uTotalTimeMs) 975a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 976a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TSme *pSme = (TSme*)hSme; 977a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uIndex, uCurrentTimeMs = 0; 978a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 979a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 980a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the total time should exceed country code expiration by one interval (so that next scan wouldn't 981a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * have a valid country code) 982a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 983a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 984a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* nullify cycle number */ 985a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum = 0; 986a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* now find how many cycles fit within this time. First, check if all first 16 configured intervals fit */ 987a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt for (uIndex = 0; 988a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt (uIndex < PERIODIC_SCAN_MAX_INTERVAL_NUM) && (uCurrentTimeMs < uTotalTimeMs); 989a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uIndex++) 990a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 991a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum++; 992a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt uCurrentTimeMs += pSme->tScanParams.uCycleIntervalMsec[ uIndex ]; 993a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 994a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* now find out how many more cycles with the last interval still fits */ 995a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (uCurrentTimeMs < uTotalTimeMs) 996a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 997a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 998a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * divide the reamining time (time until expiry minus the total time calculated so far) 999a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * by the last interval time, to get how many more scans would fit after the first 16 intervals 1000a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 1001a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum += (uTotalTimeMs - uCurrentTimeMs) / 1002a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleIntervalMsec[ PERIODIC_SCAN_MAX_INTERVAL_NUM - 1]; 1003a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* and add one, to compensate for the reminder */ 1004a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pSme->tScanParams.uCycleNum++; 1005a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 1006a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 1007a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 1008