1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
3 **| |**
4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
5 **| All rights reserved. |**
6 **| |**
7 **| Redistribution and use in source and binary forms, with or without |**
8 **| modification, are permitted provided that the following conditions |**
9 **| are met: |**
10 **| |**
11 **| * Redistributions of source code must retain the above copyright |**
12 **| notice, this list of conditions and the following disclaimer. |**
13 **| * Redistributions in binary form must reproduce the above copyright |**
14 **| notice, this list of conditions and the following disclaimer in |**
15 **| the documentation and/or other materials provided with the |**
16 **| distribution. |**
17 **| * Neither the name Texas Instruments nor the names of its |**
18 **| contributors may be used to endorse or promote products derived |**
19 **| from this software without specific prior written permission. |**
20 **| |**
21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
32 **| |**
33 **+-----------------------------------------------------------------------+**
34 ****************************************************************************/
35
36 /** \file ScanCncnAppApi.c
37 * \brief This file include implementation of application scan requests adapter.\n
38 * \author Ronen Kalish
39 * \date 30-Jan-2005
40 */
41
42 #include "ScanCncnAppApi.h"
43 #include "ScanCncn.h"
44 #include "EvHandler.h"
45 #include "report.h"
46 #include "smeApi.h"
47 #include "siteMgrApi.h"
48 #include "ScanCncnOidSM.h"
49
50 /**
51 * \author Ronen Kalish\n
52 * \date 30-Jan-2005\n
53 * \brief Parses and executes a set param command.\n
54 *
55 * Function Scope \e Public.\n
56 * \param hScanCncn - handle to the scan concentrator object.\n
57 * \param pParam - the param to set.\n
58 * \return OK if the scan started successfully, NOK otherwise.\n
59 */
scanConcentrator_setParam(TI_HANDLE hScanCncn,paramInfo_t * pParam)60 TI_STATUS scanConcentrator_setParam( TI_HANDLE hScanCncn, paramInfo_t *pParam )
61 {
62 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t *)hScanCncn;
63 scan_Params_t* pScanParam;
64 UINT32 currentTimeStamp;
65
66 switch ( pParam->paramType )
67 {
68 case SCAN_CNCN_START_APP_SCAN:
69 pScanParam = pParam->content.pScanParams;
70 /*
71 * Prepare scan complete's aging, by increasing the scanned sites
72 * scan attemps counter. The counter will be checked upon scan complete,
73 * and the sites with no update scan results will be dropped.
74 */
75 siteMgr_setNotReceivedParameter( pScanConcentrator->hSiteManager, &(pScanParam->desiredSsid), pScanParam->band );
76
77 if ( SCAN_CRS_SCAN_RUNNING !=
78 scanConcentrator_scan( hScanCncn, SCAN_SCC_APP, pScanParam ) )
79 {
80 /* Scan was not started successfully, send a scan complete event to the user */
81 EvHandlerSendEvent( pScanConcentrator->hEventSrv, IPC_EVENT_SCAN_COMPLETE, NULL, 0 );
82 return NOK;
83 }
84 break;
85
86 case SCAN_CNCN_STOP_APP_SCAN:
87 scanConcentrator_stopScan( hScanCncn, SCAN_SCC_APP );
88 break;
89 case SCAN_CNCN_BSSID_LIST_SCAN_PARAM:
90 /* check if OID scans are enabled in the registry */
91 if ( 0 == pScanConcentrator->initParams.minimumDurationBetweenOidScans )
92 {
93 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
94 ("Received OID scan request when OID scans are disabled, quitting...\n") );
95 return OK; /* TODO ronen: return correct Windows value */
96 }
97
98 /* check if the last OID scan didn't start at a shorter duration than the configured minimum */
99 currentTimeStamp = os_timeStampMs( pScanConcentrator->hOS );
100 if ( (currentTimeStamp - pScanConcentrator->oidScanLastTimeStamp) <
101 (pScanConcentrator->initParams.minimumDurationBetweenOidScans * 1000) ) /*converted to ms */
102 {
103 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
104 ("Last OID scan performed at:%d, now is:%d, min duration is %d, too early for another scan!\n", \
105 pScanConcentrator->oidScanLastTimeStamp, currentTimeStamp, pScanConcentrator->initParams.minimumDurationBetweenOidScans) );
106 return OK; /* TODO ronen: return correct Windows value */
107 }
108
109 /* mark that an OID scan process has started */
110 pScanConcentrator->bOidScanRunning = TRUE;
111 pScanConcentrator->oidScanLastTimeStamp = currentTimeStamp;
112 WLAN_REPORT_INFORMATION( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
113 ("Starting OID scan process...\n") );
114
115 /* and actually start the scan */
116 scanConcentratorOidSM_SMEvent( hScanCncn, (scan_oidSMStates_e*)&(pScanConcentrator->oidSMState), OID_SCAN_EVENT_START_SCAN );
117 break;
118
119 default:
120 WLAN_REPORT_ERROR( pScanConcentrator->hReport, SCAN_CNCN_MODULE_LOG,
121 ("Set param, Params is not supported:%d\n\n", pParam->paramType) );
122 return PARAM_NOT_SUPPORTED;
123 }
124
125 return OK;
126 }
127
128 /**
129 * \author Ronen Kalish\n
130 * \date 30-Jan-2005\n
131 * \brief Parses and executes a get param command.\n
132 *
133 * Function Scope \e Public.\n
134 * \param hScanCncn - handle to the scan concentrator object.\n
135 * \param pParam - the param to get.\n
136 * \return always PARAM_NOT_SUPPORTED (not supposed to be called).\n
137 */
scanConcentrator_getParam(TI_HANDLE hScanCncn,paramInfo_t * pParam)138 TI_STATUS scanConcentrator_getParam( TI_HANDLE hScanCncn, paramInfo_t *pParam )
139 {
140 return PARAM_NOT_SUPPORTED;
141 }
142
143 /**
144 * \author Ronen Kalish\n
145 * \date 30-Jan-2005\n
146 * \brief Scan result callback for application scan.\n
147 *
148 * Function Scope \e Public.\n
149 * \param hScanCncn - handle to the scan concentrator object.\n
150 * \param status - the scan result status (scan complete, result received etc.).\n
151 * \param frameInfo - a pointer to the structure holding all frame related info (in case a frame was received).\n
152 * \prama SPSStatus - a bitmap indicating on which channels scan was attempted (valid for SPS scan only!).\n
153 */
scanConcentrator_appScanResultCB(TI_HANDLE hScanCncn,scan_cncnResultStatus_e status,scan_frameInfo_t * frameInfo,UINT16 SPSStatus)154 void scanConcentrator_appScanResultCB( TI_HANDLE hScanCncn, scan_cncnResultStatus_e status,
155 scan_frameInfo_t* frameInfo, UINT16 SPSStatus )
156 {
157 scanConcentrator_t* pScanConcentrator = (scanConcentrator_t*)hScanCncn;
158
159 switch ( status )
160 {
161 case SCAN_CRS_RECEIVED_FRAME:
162 /* forward scan results to site manager, like in the good old days... */
163 siteMgr_updateSite( pScanConcentrator->hSiteManager, frameInfo->bssId,
164 frameInfo->parsedIEs, frameInfo->channel, frameInfo->band, FALSE );
165 if ( BEACON == frameInfo->parsedIEs->subType )
166 {
167 siteMgr_saveBeaconBuffer( pScanConcentrator->hSiteManager, frameInfo->bssId,
168 frameInfo->buffer, frameInfo->bufferLength );
169 }
170 else
171 {
172 siteMgr_saveProbeRespBuffer( pScanConcentrator->hSiteManager, frameInfo->bssId,
173 frameInfo->buffer, frameInfo->bufferLength );
174 }
175 break;
176
177 case SCAN_CRS_SCAN_COMPLETE_OK:
178 siteMgr_removeNotReceivedSites( pScanConcentrator->hSiteManager );
179
180 /* There's no break on purpose! */
181 /* if the current running app scan is an OID scan, send a scan complete event to its state machine */
182 if ( TRUE == pScanConcentrator->bOidScanRunning )
183 {
184 scanConcentratorOidSM_SMEvent(hScanCncn, (scan_oidSMStates_e*)&(pScanConcentrator->oidSMState), OID_SCAN_EVENT_SCAN_COMPLETE );
185 }
186 else
187 {
188 /* send a scan complete event to the user */
189 EvHandlerSendEvent( pScanConcentrator->hEventSrv, IPC_EVENT_SCAN_COMPLETE, NULL, 0 );
190 }
191 break;
192 case SCAN_CRS_TSF_ERROR:
193 case SCAN_CRS_SCAN_STOPPED:
194 case SCAN_CRS_SCAN_RUNNING:
195 case SCAN_CRS_SCAN_FAILED:
196 case SCAN_CRS_SCAN_ABORTED_HIGHER_PRIORITY:
197 case SCAN_CRS_SCAN_ABORTED_FW_RESET:
198 case SCAN_CRS_NUM_OF_RES_STATUS:
199 default:
200 /* The scan was finished, send a scan complete event to the user
201 (regardless of why the scan was completed) */
202 if ( TRUE == pScanConcentrator->bOidScanRunning )
203 {
204 scanConcentratorOidSM_SMEvent(hScanCncn, (scan_oidSMStates_e*)&(pScanConcentrator->oidSMState), OID_SCAN_EVENT_SCAN_FAILED );
205 }
206 else
207 {
208 EvHandlerSendEvent( pScanConcentrator->hEventSrv, IPC_EVENT_SCAN_COMPLETE, NULL, 0 );
209 }
210 break;
211 }
212 }
213
214