• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * measurementMgr.c
3  *
4  * Copyright(c) 1998 - 2009 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 /*                                                                         */
37 /*    MODULE:   measurementMgr.c                                           */
38 /*    PURPOSE:  measurement Manager module file                            */
39 /*                                                                         */
40 /***************************************************************************/
41 
42 
43 
44 
45 #define __FILE_ID__  FILE_ID_1
46 #include "measurementMgr.h"
47 #include "regulatoryDomainApi.h"
48 #include "healthMonitor.h"
49 #include "DrvMainModules.h"
50 #include "siteMgrApi.h"
51 #include "TrafficMonitorAPI.h"
52 #include "smeApi.h"
53 #include "sme.h"
54 #ifdef XCC_MODULE_INCLUDED
55 #include "XCCTSMngr.h"
56 #endif
57 #include "TWDriver.h"
58 
59 /* default measurement parameters */
60 #define MEASUREMENT_CAPABILITIES_NONE                   0x00
61 #define MEASUREMENT_CAPABILITIES_DOT11H                 0x01
62 #define MEASUREMENT_CAPABILITIES_XCC_RM                 0x02
63 
64 
65 #define MEASUREMENT_BEACON_INTERVAL_IN_MICRO_SEC        1024
66 #define MEASUREMENT_MSEC_IN_MICRO                       1000
67 
68 
69 
70 
71 /********************************************************************************/
72 /*                      Internal functions prototypes.                          */
73 /********************************************************************************/
74 
75 static void measurementMgr_releaseModule(measurementMgr_t *pMeasurementMgr);
76 
77 static TI_BOOL measurementMgr_isTrafficIntensityHigherThanThreshold(measurementMgr_t * pMeasurementMgr);
78 
79 static TI_BOOL  measurementMgr_isRequestValid(TI_HANDLE hMeasurementMgr, MeasurementRequest_t *pRequestArr[], TI_UINT8 numOfRequest);
80 
81 static TI_BOOL measurementMgrSM_measureInProgress(TI_HANDLE hMeasurementMgr);
82 
83 
84 
85 
86 
87 /********************************************************************************/
88 /*                      Interface functions Implementation.                     */
89 /********************************************************************************/
90 
91 
92 /**
93  * Creates the Measurement Manager moodule.
94  *
95  * @param hOs A handle to the OS object.
96  *
97  * @date 16-Dec-2005
98  */
measurementMgr_create(TI_HANDLE hOs)99 TI_HANDLE measurementMgr_create(TI_HANDLE hOs)
100 {
101     measurementMgr_t * pMeasurementMgr = NULL;
102     TI_STATUS status;
103 
104     /* allocating the MeasurementMgr object */
105     pMeasurementMgr = os_memoryAlloc(hOs, sizeof(measurementMgr_t));
106 
107     if (pMeasurementMgr == NULL)
108         return NULL;
109 
110     os_memoryZero(hOs, pMeasurementMgr, sizeof(measurementMgr_t));
111     pMeasurementMgr->hOs = hOs;
112 
113     /* creating the Measurement SM */
114     status = fsm_Create(pMeasurementMgr->hOs, &(pMeasurementMgr->pMeasurementMgrSm),
115                         MEASUREMENTMGR_NUM_STATES , MEASUREMENTMGR_NUM_EVENTS);
116     if(status != TI_OK)
117     {
118         measurementMgr_releaseModule(pMeasurementMgr);
119         return NULL;
120     }
121 
122     /* creating the sub modules of measurement module */
123 
124     /* creating Request Handler sub module */
125     if( (pMeasurementMgr->hRequestH = requestHandler_create(hOs)) == NULL)
126     {
127         measurementMgr_releaseModule(pMeasurementMgr);
128         return NULL;
129     }
130 
131     return(pMeasurementMgr);
132 }
133 
134 
135 
136 
137 
138 /**
139  * Configures the Measurement Manager module.
140  *
141  * @param pStadHandles Handles to other modules the Measurement Manager needs.
142  *
143  * @date 16-Dec-2005
144  */
measurementMgr_init(TStadHandlesList * pStadHandles)145 void measurementMgr_init (TStadHandlesList *pStadHandles)
146 {
147     measurementMgr_t *pMeasurementMgr = (measurementMgr_t *)(pStadHandles->hMeasurementMgr);
148     paramInfo_t param;
149 
150     /* Init Handlers */
151     pMeasurementMgr->hRegulatoryDomain  = pStadHandles->hRegulatoryDomain;
152     pMeasurementMgr->hXCCMngr           = pStadHandles->hXCCMngr;
153     pMeasurementMgr->hSiteMgr           = pStadHandles->hSiteMgr;
154     pMeasurementMgr->hTWD               = pStadHandles->hTWD;
155     pMeasurementMgr->hMlme              = pStadHandles->hMlmeSm;
156     pMeasurementMgr->hTrafficMonitor    = pStadHandles->hTrafficMon;
157     pMeasurementMgr->hReport            = pStadHandles->hReport;
158     pMeasurementMgr->hOs                = pStadHandles->hOs;
159     pMeasurementMgr->hScr               = pStadHandles->hSCR;
160     pMeasurementMgr->hApConn            = pStadHandles->hAPConnection;
161     pMeasurementMgr->hTxCtrl            = pStadHandles->hTxCtrl;
162     pMeasurementMgr->hTimer             = pStadHandles->hTimer;
163     pMeasurementMgr->hSme               = pStadHandles->hSme;
164 
165     /* initialize variables to default values */
166     pMeasurementMgr->Enabled = TI_TRUE;
167     pMeasurementMgr->Connected = TI_FALSE;
168     pMeasurementMgr->Capabilities = MEASUREMENT_CAPABILITIES_NONE;
169     pMeasurementMgr->Mode = MSR_MODE_NONE;
170 
171     /* Getting management capability status */
172     param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
173     regulatoryDomain_getParam (pMeasurementMgr->hRegulatoryDomain, &param);
174     if (param.content.spectrumManagementEnabled)
175     {
176         pMeasurementMgr->Capabilities |= MEASUREMENT_CAPABILITIES_DOT11H;
177     }
178 
179     /* Init Functions */
180     pMeasurementMgr->parserFrameReq = NULL;
181     pMeasurementMgr->isTypeValid = NULL;
182     pMeasurementMgr->buildReport = NULL;
183     pMeasurementMgr->buildRejectReport = NULL;
184     pMeasurementMgr->sendReportAndCleanObj = NULL;
185 
186     /* initialize variables */
187     pMeasurementMgr->currentState = MEASUREMENTMGR_STATE_IDLE;
188     pMeasurementMgr->isModuleRegistered = TI_FALSE;
189     pMeasurementMgr->currentFrameType = MSR_FRAME_TYPE_NO_ACTIVE;
190     pMeasurementMgr->measuredChannelID = 0;
191     pMeasurementMgr->currentNumOfRequestsInParallel = 0;
192 
193     /* config sub modules */
194     RequestHandler_config(pMeasurementMgr->hRequestH, pStadHandles->hReport, pStadHandles->hOs);
195 
196     /* Register to the SCR module */
197     scr_registerClientCB(pMeasurementMgr->hScr, SCR_CID_XCC_MEASURE, measurementMgr_scrResponseCB, (TI_HANDLE)pMeasurementMgr);
198 
199     measurementMgrSM_config ((TI_HANDLE)pMeasurementMgr);
200 
201     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INIT , ": Measurement Manager configured successfully\n");
202 }
203 
204 
measurementMgr_SetDefaults(TI_HANDLE hMeasurementMgr,measurementInitParams_t * pMeasurementInitParams)205 TI_STATUS measurementMgr_SetDefaults (TI_HANDLE hMeasurementMgr, measurementInitParams_t * pMeasurementInitParams)
206 {
207     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
208 #ifdef XCC_MODULE_INCLUDED
209     TI_UINT32 currAC;
210 #endif
211 
212     pMeasurementMgr->trafficIntensityThreshold = pMeasurementInitParams->trafficIntensityThreshold;
213     pMeasurementMgr->maxDurationOnNonServingChannel = pMeasurementInitParams->maxDurationOnNonServingChannel;
214 
215     /* allocating the measurement Activation Delay timer */
216     pMeasurementMgr->hActivationDelayTimer = tmr_CreateTimer (pMeasurementMgr->hTimer);
217     if (pMeasurementMgr->hActivationDelayTimer == NULL)
218     {
219         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "measurementMgr_SetDefaults(): Failed to create hActivationDelayTimer!\n");
220         return TI_NOK;
221     }
222 
223 #ifdef XCC_MODULE_INCLUDED
224     /* allocating the per AC TS Metrics report timers */
225     for (currAC = 0; currAC < MAX_NUM_OF_AC; currAC++)
226     {
227         pMeasurementMgr->isTsMetricsEnabled[currAC] = TI_FALSE;
228 
229         pMeasurementMgr->hTsMetricsReportTimer[currAC] = tmr_CreateTimer (pMeasurementMgr->hTimer);
230         if (pMeasurementMgr->hTsMetricsReportTimer[currAC] == NULL)
231         {
232             TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "measurementMgr_SetDefaults(): Failed to create hTsMetricsReportTimer!\n");
233             return TI_NOK;
234         }
235     }
236 
237     /* Check in the Registry if the station supports XCC RM */
238     if (pMeasurementInitParams->XCCEnabled == XCC_MODE_ENABLED)
239     {
240         pMeasurementMgr->Capabilities |= MEASUREMENT_CAPABILITIES_XCC_RM;
241     }
242 #endif
243 
244     return TI_OK;
245 }
246 
247 
248 
249 
250 
251 /**
252  * Sets the specified Measurement Manager parameter.
253  *
254  * @param hMeasurementMgr A handle to the Measurement Manager module.
255  * @param pParam The parameter to set.
256  *
257  * @date 16-Dec-2005
258  */
measurementMgr_setParam(TI_HANDLE hMeasurementMgr,paramInfo_t * pParam)259 TI_STATUS measurementMgr_setParam(TI_HANDLE hMeasurementMgr, paramInfo_t * pParam)
260 {
261     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
262 
263     switch (pParam->paramType)
264     {
265         case MEASUREMENT_ENABLE_DISABLE_PARAM:
266         {
267             TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MEASUREMENT_ENABLE_DISABLE_PARAM <- %d\n", pParam->content.measurementEnableDisableStatus);
268 
269             if (pParam->content.measurementEnableDisableStatus)
270             {
271                 measurementMgr_enable(pMeasurementMgr);
272             }
273             else
274             {
275                 measurementMgr_disable(pMeasurementMgr);
276             }
277 
278             break;
279         }
280 
281         case MEASUREMENT_TRAFFIC_THRESHOLD_PARAM:
282         {
283             if ((pParam->content.measurementTrafficThreshold >= MEASUREMENT_TRAFFIC_THRSHLD_MIN) &&
284                 (pParam->content.measurementTrafficThreshold <= MEASUREMENT_TRAFFIC_THRSHLD_MAX))
285             {
286                 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MEASUREMENT_TRAFFIC_THRESHOLD_PARAM <- %d\n", pParam->content.measurementTrafficThreshold);
287 
288                 pMeasurementMgr->trafficIntensityThreshold = pParam->content.measurementTrafficThreshold;
289             }
290             else
291             {
292                 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": Invalid value for MEASUREMENT_TRAFFIC_THRESHOLD_PARAM (%d)\n", pParam->content.measurementTrafficThreshold);
293             }
294 
295             break;
296         }
297 
298 
299         case MEASUREMENT_MAX_DURATION_PARAM:
300         {
301             TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MEASUREMENT_MAX_DURATION_PARAM <- %d\n", pParam->content.measurementMaxDuration);
302 
303             pMeasurementMgr->maxDurationOnNonServingChannel = pParam->content.measurementMaxDuration;
304 
305             break;
306         }
307 
308 
309         default:
310         {
311             TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": Specified parameter is not supported (%d)\n", pParam->paramType);
312 
313             return PARAM_NOT_SUPPORTED;
314         }
315 
316     }
317 
318     return TI_OK;
319 }
320 
321 
322 
323 
324 
325 /**
326  * Gets the specified parameter from the Measurement Manager.
327  *
328  * @param hMeasurementMgr A handle to the Measurement Manager module.
329  * @param pParam The parameter to get.
330  *
331  * @date 16-Dec-2005
332  */
measurementMgr_getParam(TI_HANDLE hMeasurementMgr,paramInfo_t * pParam)333 TI_STATUS measurementMgr_getParam(TI_HANDLE hMeasurementMgr, paramInfo_t * pParam)
334 {
335     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
336 
337     switch(pParam->paramType)
338     {
339 
340         case MEASUREMENT_GET_STATUS_PARAM:
341         {
342             WLAN_OS_REPORT(("%s: \n\n", __FUNCTION__));
343             WLAN_OS_REPORT(("MeasurementMgr Status Report:\n\n"));
344 
345             WLAN_OS_REPORT(("Current State: %d\n\n", pMeasurementMgr->currentState));
346 
347             WLAN_OS_REPORT(("Connected: %d\n", pMeasurementMgr->Connected));
348             WLAN_OS_REPORT(("Enabled: %d\n\n", pMeasurementMgr->Enabled));
349 
350             WLAN_OS_REPORT(("Mode: %d\n", pMeasurementMgr->Mode));
351             WLAN_OS_REPORT(("Capabilities: %d\n\n", pMeasurementMgr->Capabilities));
352 
353             WLAN_OS_REPORT(("current Frame Type: %d\n", pMeasurementMgr->currentFrameType));
354             WLAN_OS_REPORT(("Measured Channel: %d\n", pMeasurementMgr->measuredChannelID));
355             WLAN_OS_REPORT(("Serving Channel: %d\n", pMeasurementMgr->servingChannelID));
356             WLAN_OS_REPORT(("Traffic Intensity Threshold: %d\n", pMeasurementMgr->trafficIntensityThreshold));
357             WLAN_OS_REPORT(("Max Duration on Nonserving Channel: %d\n", pMeasurementMgr->maxDurationOnNonServingChannel));
358 
359             break;
360         }
361 
362 
363         default:
364         {
365             TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": Specified parameter is not supported (%d)\n", pParam->paramType);
366 
367             return PARAM_NOT_SUPPORTED;
368         }
369 
370     }
371 
372     return TI_OK;
373 }
374 
375 
376 
377 
378 
379 
380 /**
381  * Signals the Measurement Manager that the STA is connected.
382  *
383  * @param hMeasurementMgr A handle to the Measurement Manager module.
384  *
385  * @date 16-Dec-2005
386  */
measurementMgr_connected(TI_HANDLE hMeasurementMgr)387 TI_STATUS measurementMgr_connected(TI_HANDLE hMeasurementMgr)
388 {
389     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
390 
391     /* checking if measurement is enabled */
392     if (pMeasurementMgr->Mode == MSR_MODE_NONE)
393         return TI_OK;
394 
395     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to connected.\n");
396 
397     return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
398                                MEASUREMENTMGR_EVENT_CONNECTED, pMeasurementMgr);
399 }
400 
401 
402 
403 
404 
405 /**
406  * Signals the Measurement Manager that the STA is disconnected.
407  *
408  * @param hMeasurementMgr A handle to the Measurement Manager module.
409  *
410  * @date 16-Dec-2005
411  */
measurementMgr_disconnected(TI_HANDLE hMeasurementMgr)412 TI_STATUS measurementMgr_disconnected(TI_HANDLE hMeasurementMgr)
413 {
414     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
415 
416     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to disconnected.\n");
417 
418     return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
419                                 MEASUREMENTMGR_EVENT_DISCONNECTED, pMeasurementMgr);
420 }
421 
422 
423 
424 
425 /**
426  * Enables the Measurement Manager module.
427  *
428  * @date 10-Jan-2006
429  */
measurementMgr_enable(TI_HANDLE hMeasurementMgr)430 TI_STATUS measurementMgr_enable(TI_HANDLE hMeasurementMgr)
431 {
432     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
433 
434     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to enabled.\n");
435 
436     return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
437                                 MEASUREMENTMGR_EVENT_ENABLE, pMeasurementMgr);
438 }
439 
440 
441 
442 
443 
444 /**
445  * Disables the Measurement Manager module.
446  *
447  * @date 10-Jan-2006
448  */
measurementMgr_disable(TI_HANDLE hMeasurementMgr)449 TI_STATUS measurementMgr_disable(TI_HANDLE hMeasurementMgr)
450 {
451     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
452 
453     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to disabled.\n");
454 
455     return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
456                                 MEASUREMENTMGR_EVENT_DISABLE, pMeasurementMgr);
457 }
458 
459 
460 
461 
462 
463 /**
464  * Destroys the Measurement Manager module.
465  *
466  * @param hMeasurementMgr A handle to the Measurement Manager module.
467  *
468  * @date 16-Dec-2005
469  */
measurementMgr_destroy(TI_HANDLE hMeasurementMgr)470 TI_STATUS measurementMgr_destroy(TI_HANDLE hMeasurementMgr)
471 {
472     measurementMgr_t *pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
473     TI_UINT32 initVec;
474 
475     if (pMeasurementMgr == NULL)
476         return TI_OK;
477 
478     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr is being destroyed\n");
479 
480     initVec = 0xFFFF;   /* release everything */
481 
482     measurementMgr_releaseModule (pMeasurementMgr);
483 
484     return TI_OK;
485 }
486 
487 
488 
489 
490 
491 
492 /**
493  * Sets the Measurement Mode.
494  *
495  * @param hMeasurementMgr A handle to the Measurement Manager module.
496  * @param capabilities The AP capabilities.
497  * @param pIeBuffer Pointer to the list of IEs.
498  * @param length Length of the IE list.
499  *
500  * @date 16-Dec-2005
501  */
measurementMgr_setMeasurementMode(TI_HANDLE hMeasurementMgr,TI_UINT16 capabilities,TI_UINT8 * pIeBuffer,TI_UINT16 length)502 TI_STATUS measurementMgr_setMeasurementMode(TI_HANDLE hMeasurementMgr, TI_UINT16 capabilities,
503                                          TI_UINT8 * pIeBuffer, TI_UINT16 length)
504 {
505     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
506 
507     /*
508      * 11h Measurement is not supported in the current version.
509      */
510 /*  if( (pMeasurementMgr->Capabilities & MEASUREMENT_CAPABILITIES_DOT11H) &&
511         (capabilities & DOT11_SPECTRUM_MANAGEMENT) )
512     {
513         pMeasurementMgr->Mode = MSR_MODE_SPECTRUM_MANAGEMENT;
514     }
515     else
516     {
517 */
518 #ifdef XCC_MODULE_INCLUDED
519 
520         if(pMeasurementMgr->Capabilities & MEASUREMENT_CAPABILITIES_XCC_RM)
521         {
522                     pMeasurementMgr->Mode = MSR_MODE_XCC;
523         }
524         else
525 #endif
526         {
527             pMeasurementMgr->Mode = MSR_MODE_NONE;
528         }
529 
530 
531     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr mode changed to: %d\n", pMeasurementMgr->Mode);
532 
533     return TI_OK;
534 }
535 
536 
537 
538 
539 
540 
541 /**
542  * Called when a frame with type measurement request is received.
543  *
544  * @param hMeasurementMgr A handle to the Measurement Manager module.
545  * @param frameType The frame type.
546  * @param dataLen The length of the frame.
547  * @param pData A pointer to the frame's content.
548  *
549  * @date 16-Dec-2005
550  */
measurementMgr_receiveFrameRequest(TI_HANDLE hMeasurementMgr,EMeasurementFrameType frameType,TI_INT32 dataLen,TI_UINT8 * pData)551 TI_STATUS measurementMgr_receiveFrameRequest(TI_HANDLE hMeasurementMgr,
552                                              EMeasurementFrameType frameType,
553                                              TI_INT32 dataLen,
554                                              TI_UINT8 * pData)
555 {
556     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
557 
558     TMeasurementFrameRequest * frame = &(pMeasurementMgr->newFrameRequest);
559     TI_UINT16 currentFrameToken;
560 
561     /* checking if measurement is enabled */
562     if (pMeasurementMgr->Mode == MSR_MODE_NONE)
563         return TI_NOK;
564 
565     /* ignore broadcast/multicast request if unicast request is active */
566     if (frameType != MSR_FRAME_TYPE_UNICAST && pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST)
567     {
568         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Broadcast/Multicast measurement frame has been ignored\n");
569 
570         return TI_NOK;
571     }
572 
573     /* ignore broadcast request if multicast request is active */
574     if (frameType == MSR_FRAME_TYPE_BROADCAST && pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_MULTICAST)
575     {
576         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Broadcast measurement frame has been ignored\n");
577 
578         return TI_NOK;
579     }
580 
581     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement frame received\n");
582 
583     /* Parsing the Frame Request Header */
584     pMeasurementMgr->parserFrameReq(hMeasurementMgr, pData, dataLen,
585                                         frame);
586 
587     frame->frameType = frameType;
588 
589     /* checking if the received token frame is the same as the one that is being processed */
590     if ((requestHandler_getFrameToken(pMeasurementMgr->hRequestH, &currentFrameToken) == TI_OK)
591         && (currentFrameToken == frame->hdr->dialogToken))
592     {
593         os_memoryZero(pMeasurementMgr->hOs, &pMeasurementMgr->newFrameRequest,
594                       sizeof(TMeasurementFrameRequest));
595 
596         TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement frame token %d is identical to current frame token - ignoring frame\n", currentFrameToken);
597 
598         return TI_NOK;
599     }
600 
601     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement frame token is %d\n", frame->hdr->dialogToken);
602 
603     /* Frame is Received for processing */
604     return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
605                                MEASUREMENTMGR_EVENT_FRAME_RECV, pMeasurementMgr);
606 }
607 
608 
609 
610 
611 
612 /**
613  * Activates the next measurement request.
614  *
615  * @param hMeasurementMgr A handle to the Measurement Manager module.
616  *
617  * @date 16-Dec-2005
618  */
measurementMgr_activateNextRequest(TI_HANDLE hMeasurementMgr)619 TI_STATUS measurementMgr_activateNextRequest(TI_HANDLE hMeasurementMgr)
620 {
621     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
622     requestHandler_t * pRequestH = (requestHandler_t *) pMeasurementMgr->hRequestH;
623     MeasurementRequest_t * pRequestArr[MAX_NUM_REQ];
624     TI_UINT8 numOfRequestsInParallel = 0;
625     TI_BOOL valid;
626     TI_UINT8 index;
627 
628 	/* Keep note of the time we started processing the request. this will be used */
629     /* to give the measurementSRV a time frame to perform the measurement operation */
630     pMeasurementMgr->currentRequestStartTime = os_timeStampMs(pMeasurementMgr->hOs);
631 
632     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Timer started at %d, we have 20ms to begin measurement...\n", pMeasurementMgr->currentRequestStartTime);
633 
634     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Looking for a valid request\n");
635 
636     do
637     {
638         TI_STATUS status;
639 
640         if (numOfRequestsInParallel != 0)
641         {
642             TRACE4(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Changing activeRequestID from %d to %d, and numOfWaitingRequests from %d to %d.\n", pRequestH->activeRequestID, pRequestH->activeRequestID + numOfRequestsInParallel, pRequestH->numOfWaitingRequests, pRequestH->numOfWaitingRequests - numOfRequestsInParallel);
643         }
644 
645         pRequestH->activeRequestID += numOfRequestsInParallel;
646         pRequestH->numOfWaitingRequests -= numOfRequestsInParallel;
647 
648         for (index = 0; index < MAX_NUM_REQ; index++)
649         {
650             pRequestArr[index] = NULL;
651         }
652         numOfRequestsInParallel = 0;
653 
654         /* Getting the next request/requests from the request handler */
655         status = requestHandler_getNextReq(pMeasurementMgr->hRequestH, TI_FALSE, pRequestArr,
656                                            &numOfRequestsInParallel);
657 
658         /* Checking if there are no waiting requests */
659         if (status != TI_OK)
660         {
661             TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": There are no waiting requests in the queue\n");
662 
663             return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
664                                MEASUREMENTMGR_EVENT_SEND_REPORT, pMeasurementMgr);
665         }
666 
667         /* Checking validity of request/s */
668         valid = measurementMgr_isRequestValid(pMeasurementMgr, pRequestArr,
669                                 numOfRequestsInParallel);
670 
671         /* Checking if the current request is Beacon Table */
672         if( (numOfRequestsInParallel == 1) &&
673             (pRequestArr[0]->Type == MSR_TYPE_BEACON_MEASUREMENT) &&
674             (pRequestArr[0]->ScanMode == MSR_SCAN_MODE_BEACON_TABLE) )
675         {
676             TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received Beacon Table request, building a report for it and continuing\n");
677 
678             pMeasurementMgr->buildReport(hMeasurementMgr, *(pRequestArr[0]), NULL);
679             valid = TI_FALSE; /* In order to get the next request/s*/
680         }
681 
682     } while (valid == TI_FALSE);
683 
684 
685     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request(s) for activation:\n");
686 
687     for (index = 0; index < numOfRequestsInParallel; index++)
688     {
689         TRACE6(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": \n\nRequest #%d:\n Type: %d\n Measured Channel: %d (Serving Channel: %d)\n Scan Mode: %d\n Duration: %d\n\n", index+1, pRequestArr[index]->Type, pRequestArr[index]->channelNumber, pMeasurementMgr->servingChannelID, pRequestArr[index]->ScanMode, pRequestArr[index]->DurationTime);
690     }
691 
692     /* Ignore requests if traffic intensity is high */
693     if (measurementMgr_isTrafficIntensityHigherThanThreshold(pMeasurementMgr) == TI_TRUE)
694     {
695         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Traffic intensity too high, giving up...\n");
696 
697         measurementMgr_rejectPendingRequests(pMeasurementMgr, MSR_REJECT_TRAFFIC_INTENSITY_TOO_HIGH);
698 
699         return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
700                                MEASUREMENTMGR_EVENT_SEND_REPORT, pMeasurementMgr);
701     }
702 
703     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request is Valid, about to start\n");
704 
705     pMeasurementMgr->measuredChannelID = pRequestArr[0]->channelNumber;
706 
707     /* Request resource from the SCR */
708     return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
709         MEASUREMENTMGR_EVENT_REQUEST_SCR, pMeasurementMgr);
710 }
711 
712 
713 
measurementMgr_rejectPendingRequests(TI_HANDLE hMeasurementMgr,EMeasurementRejectReason rejectReason)714 void measurementMgr_rejectPendingRequests(TI_HANDLE hMeasurementMgr, EMeasurementRejectReason rejectReason)
715 {
716     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
717     requestHandler_t * pRequestH = (requestHandler_t *) pMeasurementMgr->hRequestH;
718     MeasurementRequest_t * pRequestArr[MAX_NUM_REQ];
719     TI_UINT8 numOfRequestsInParallel;
720 
721     /* reject all pending measurement requests */
722     while (requestHandler_getNextReq(pMeasurementMgr->hRequestH, TI_TRUE,
723                 pRequestArr, &numOfRequestsInParallel) == TI_OK)
724     {
725         TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Rejecting pending request (activeRequestID = %d)...\n", pRequestH->activeRequestID);
726 
727         pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr,
728                 numOfRequestsInParallel, rejectReason);
729 
730         pRequestH->activeRequestID += numOfRequestsInParallel;
731     }
732 }
733 
734 
735 
736 
737 
738 /********************************************************************************/
739 /*                      Callback functions Implementation.                      */
740 /********************************************************************************/
741 
742 
743 /**
744  * The callback called by the MeasurementSRV module when then
745  * measurement operation has ended.
746  *
747  * @param clientObj A handle to the Measurement Manager module.
748  * @param msrReply An array of replies sent by the MeasurementSRV module,
749  * where each reply contains the result of a single measurement request.
750  *
751  * @date 01-Jan-2006
752  */
measurementMgr_MeasurementCompleteCB(TI_HANDLE clientObj,TMeasurementReply * msrReply)753 void measurementMgr_MeasurementCompleteCB(TI_HANDLE clientObj, TMeasurementReply * msrReply)
754 {
755     measurementMgr_t    *pMeasurementMgr = (measurementMgr_t *) clientObj;
756     TI_UINT8            index;
757 
758     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Building reports for measurement requests\n");
759 
760     /* build a report for each measurement request/reply pair */
761     for (index = 0; index < msrReply->numberOfTypes; index++)
762     {
763         pMeasurementMgr->buildReport(pMeasurementMgr, *(pMeasurementMgr->currentRequest[index]), &msrReply->msrTypes[index]);
764     }
765 
766     measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
767             MEASUREMENTMGR_EVENT_COMPLETE, pMeasurementMgr);
768 }
769 
770 
771 /**
772  * The callback called when the SCR responds to the SCR request.
773  *
774  * @param hClient A handle to the Measurement Manager module.
775  * @param requestStatus The request's status
776  * @param eResource The resource for which the CB is issued
777  * @param pendReason The reason of a PEND status.
778  *
779  * @date 01-Jan-2006
780  */
measurementMgr_scrResponseCB(TI_HANDLE hClient,EScrClientRequestStatus requestStatus,EScrResourceId eResource,EScePendReason pendReason)781 void measurementMgr_scrResponseCB(TI_HANDLE hClient, EScrClientRequestStatus requestStatus,
782                                   EScrResourceId eResource, EScePendReason pendReason )
783 {
784     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hClient;
785     measurementMgrSM_Events event;
786 
787     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": SCR callback entered\n");
788 
789     /* If the SM is in a state where it waits for the CB, status of RUN */
790     /* results in the SM asking the measurementSRV to start measurement; */
791     /* otherwise we got an ABORT or a PEND reason worse than the one we */
792     /* got when calling the SCR, so the SM aborts the measurement */
793     if (pMeasurementMgr->currentState == MEASUREMENTMGR_STATE_WAITING_FOR_SCR)
794     {
795         if (requestStatus == SCR_CRS_RUN)
796         {
797             TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status RUN, running...\n");
798 
799             event = MEASUREMENTMGR_EVENT_SCR_RUN;
800         }
801         else
802         {
803             if (requestStatus == SCR_CRS_PEND)
804             {
805                 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status PEND with reason %d, aborting...\n", pendReason);
806             }
807             else
808             {
809                 TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status ABORT/FW_RESET, aborting...\n");
810             }
811 
812             event = MEASUREMENTMGR_EVENT_ABORT;
813         }
814     }
815     else
816     {
817         /* This can only occur if FW reset occurs or when higher priority client is running. */
818 
819         if (requestStatus == SCR_CRS_FW_RESET)
820         {
821             TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status FW_RESET\n");
822 
823             event = MEASUREMENTMGR_EVENT_FW_RESET;
824         }
825         else
826         {
827         TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgrSM current state is %d (which isn't WAITING_FOR_SCR), aborting...\n", pMeasurementMgr->currentState);
828 
829         event = MEASUREMENTMGR_EVENT_ABORT;
830     }
831     }
832 
833     measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState),
834         event, pMeasurementMgr);
835 }
836 
837 
838 
839 
840 
841 
842 /**
843  * The callback called by the MLME.
844  *
845  * @param hMeasurementMgr A handle to the Measurement Manager module.
846  *
847  * @date 01-Jan-2006
848  */
measurementMgr_mlmeResultCB(TI_HANDLE hMeasurementMgr,TMacAddr * bssid,mlmeFrameInfo_t * frameInfo,TRxAttr * pRxAttr,TI_UINT8 * buffer,TI_UINT16 bufferLength)849 void measurementMgr_mlmeResultCB(TI_HANDLE hMeasurementMgr, TMacAddr * bssid, mlmeFrameInfo_t * frameInfo,
850                                  TRxAttr * pRxAttr, TI_UINT8 * buffer, TI_UINT16 bufferLength)
851 {
852     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
853     TScanFrameInfo      tScanFrameInfo;
854 
855 	if (measurementMgrSM_measureInProgress(pMeasurementMgr) == TI_FALSE)
856 	{
857 		TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION , "measurementMgr_mlmeResultCB: measurement not in progress, return\n");
858 		return;
859 	}
860 
861 
862 	/* erroneous frames are notifed to the measurmenet manager to update counter
863     (add counter sometimes in the future) Look at: scanCncn_ScanCompleteNotificationCB and
864     scanCncn_MlmeResultCB */
865     if (NULL == bssid)
866     {
867         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION , "measurementMgr_mlmeResultCB: received an empty frame notification from MLME\n");
868         return;
869     }
870 
871     if (pMeasurementMgr == NULL || pRxAttr == NULL)
872     {
873 		if(pMeasurementMgr != NULL)
874 		{
875 			TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": MLME callback called with NULL object\n");
876 		}
877         return;
878     }
879 
880     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MLME callback entered\n");
881 
882     /* build the scan frame info object */
883     tScanFrameInfo.bssId = bssid;
884     tScanFrameInfo.band = (ERadioBand)pRxAttr->band;
885     tScanFrameInfo.channel = pRxAttr->channel;
886     tScanFrameInfo.parsedIEs = frameInfo;
887     tScanFrameInfo.rate = pRxAttr->Rate;
888     tScanFrameInfo.rssi = pRxAttr->Rssi;
889     tScanFrameInfo.snr = pRxAttr->SNR;
890     tScanFrameInfo.staTSF = pRxAttr->TimeStamp;
891     tScanFrameInfo.buffer = buffer;
892     tScanFrameInfo.bufferLength = bufferLength;
893 
894     /* update the driver (SME) result table */
895     sme_MeansurementScanResult (pMeasurementMgr->hSme, SCAN_CRS_RECEIVED_FRAME, &tScanFrameInfo);
896 
897     TRACE8(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MLME Frame: Subtype = %d, MAC = %x-%x-%x-%x-%x-%x, RSSI = %d\n", frameInfo->subType, (*bssid)[0], (*bssid)[1], (*bssid)[2], (*bssid)[3], (*bssid)[4], (*bssid)[5], pRxAttr->Rssi);
898 }
899 
900 
901 /********************************************************************************/
902 /*                      Internal functions Implementation.                      */
903 /********************************************************************************/
904 
905 
906 /**
907  * Releases the module's allocated objects according to the given init vector.
908  *
909  * @param pMeasurementMgr A handle to the Measurement Manager module.
910  * @param initVec The init vector with a bit set for each allocated object.
911  *
912  * @date 01-Jan-2006
913  */
measurementMgr_releaseModule(measurementMgr_t * pMeasurementMgr)914 static void measurementMgr_releaseModule (measurementMgr_t * pMeasurementMgr)
915 {
916 #ifdef XCC_MODULE_INCLUDED
917     TI_UINT32 currAC;
918 #endif
919 
920     if (pMeasurementMgr->hActivationDelayTimer)
921     {
922         tmr_DestroyTimer (pMeasurementMgr->hActivationDelayTimer);
923     }
924 
925 #ifdef XCC_MODULE_INCLUDED
926     for (currAC = 0; currAC < MAX_NUM_OF_AC; currAC++)
927     {
928         if (pMeasurementMgr->hTsMetricsReportTimer[currAC])
929         {
930             tmr_DestroyTimer (pMeasurementMgr->hTsMetricsReportTimer[currAC]);
931         }
932     }
933 #endif
934 
935     if (pMeasurementMgr->pMeasurementMgrSm)
936     {
937         fsm_Unload(pMeasurementMgr->hOs, pMeasurementMgr->pMeasurementMgrSm);
938     }
939 
940     if (pMeasurementMgr->hRequestH)
941     {
942         requestHandler_destroy(pMeasurementMgr->hRequestH);
943     }
944 
945     os_memoryFree(pMeasurementMgr->hOs, pMeasurementMgr, sizeof(measurementMgr_t));
946 }
947 
948 
949 
950 /**
951  * Checks whether the traffic intensity, i.e. number of packets per seconds, is higher
952  * than the preconfigured threshold.
953  *
954  * @param pMeasurementMgr A handle to the Measurement Manager module.
955  *
956  * @return True iff the traffic intensity is high
957  *
958  * @date 01-Jan-2006
959  */
measurementMgr_isTrafficIntensityHigherThanThreshold(measurementMgr_t * pMeasurementMgr)960 static TI_BOOL measurementMgr_isTrafficIntensityHigherThanThreshold(measurementMgr_t * pMeasurementMgr)
961 {
962     TI_BOOL trafficIntensityHigh = TI_FALSE;
963     int pcksPerSec;
964 
965     pcksPerSec = TrafficMonitor_GetFrameBandwidth(pMeasurementMgr->hTrafficMonitor);
966 
967     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": pcksPerSec = %d\n", pcksPerSec);
968 
969     if (pcksPerSec >= pMeasurementMgr->trafficIntensityThreshold)
970         trafficIntensityHigh = TI_TRUE;
971 
972     return trafficIntensityHigh;
973 }
974 
975 
976 
977 
978 /**
979  * Checks whether the given measurement request is valid.
980  *
981  * @param hMeasurementMgr A handle to the Measurement Manager module.
982  * @param pRequestArr The measurement request.
983  * @param numOfRequest Number of type requests
984  *
985  * @return True iff the request is valid
986  *
987  * @date 01-Jan-2006
988  */
measurementMgr_isRequestValid(TI_HANDLE hMeasurementMgr,MeasurementRequest_t * pRequestArr[],TI_UINT8 numOfRequest)989 static TI_BOOL  measurementMgr_isRequestValid(TI_HANDLE hMeasurementMgr, MeasurementRequest_t *pRequestArr[],
990                            TI_UINT8 numOfRequest)
991 {
992     measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr;
993     TI_UINT8 requestIndex;
994     paramInfo_t param;
995 
996     /* Checking validity of the measured channel number */
997     param.content.channel = pRequestArr[0]->channelNumber;
998     param.paramType = REGULATORY_DOMAIN_IS_CHANNEL_SUPPORTED;
999     regulatoryDomain_getParam(pMeasurementMgr->hRegulatoryDomain, &param);
1000     if ( !param.content.bIsChannelSupprted  )
1001     {
1002         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request rejected due to invalid channel\n");
1003 
1004         if (pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST)
1005             pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest,
1006                                     MSR_REJECT_INVALID_CHANNEL);
1007 
1008         return TI_FALSE;
1009     }
1010     else
1011     {
1012         TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request channel is Valid\n");
1013     }
1014 
1015     TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Starting to check each request:\n");
1016 
1017     /* Check Validity of each request */
1018     for (requestIndex = 0; requestIndex < numOfRequest; requestIndex++)
1019     {
1020         TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Checking request #%d:\n", requestIndex+1);
1021 
1022         /* Checking validity of the Request Type */
1023         if (pMeasurementMgr->isTypeValid(hMeasurementMgr, pRequestArr[requestIndex]->Type,
1024                 pRequestArr[requestIndex]->ScanMode) == TI_FALSE)
1025         {
1026             TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request rejected due to invalid measurement type of request #%d (type = %d)\n", requestIndex+1, pRequestArr[requestIndex]->Type);
1027 
1028             if(pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST)
1029                 pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest,
1030                                         MSR_REJECT_INVALID_MEASUREMENT_TYPE);
1031 
1032             return TI_FALSE;
1033         }
1034         else
1035         {
1036             TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement type of request #%d is supported (type = %d)\n", requestIndex+1, pRequestArr[requestIndex]->Type);
1037         }
1038 
1039         /* For measurement types different than Beacon Table */
1040         if ((pRequestArr[requestIndex]->Type != MSR_TYPE_BEACON_MEASUREMENT) ||
1041             (pRequestArr[requestIndex]->ScanMode != MSR_SCAN_MODE_BEACON_TABLE))
1042         {
1043             /* Checking Measurement request's duration only when request is on a non-serving channel */
1044             if (pMeasurementMgr->servingChannelID != pRequestArr[requestIndex]->channelNumber)
1045             {
1046                 TI_UINT8 dtimPeriod;
1047                 TI_UINT32 beaconInterval;
1048                 TI_UINT32 dtimDuration;
1049 
1050 
1051                 /* Checking duration doesn't exceed given max duration */
1052                 if (pRequestArr[requestIndex]->DurationTime > pMeasurementMgr->maxDurationOnNonServingChannel)
1053                 {
1054                     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request #%d rejected because duration exceeds maximum duration\n", requestIndex+1);
1055 
1056                     TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Duration = %d, MaxDurationOnNonServingChannel = %d\n", pRequestArr[requestIndex]->DurationTime, pMeasurementMgr->maxDurationOnNonServingChannel);
1057 
1058                     if (pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST)
1059                         pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest,
1060                                 MSR_REJECT_DURATION_EXCEED_MAX_DURATION);
1061 
1062                     return TI_FALSE;
1063                 }
1064                 else
1065                 {
1066                     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Duration of request #%d doesn't exceed max duration\n", requestIndex+1);
1067                 }
1068 
1069 
1070                 /* Checking DTIM */
1071 
1072                 /* Getting the DTIM count */
1073                 param.paramType = SITE_MGR_DTIM_PERIOD_PARAM;
1074                 siteMgr_getParam(pMeasurementMgr->hSiteMgr, &param);
1075                 dtimPeriod = param.content.siteMgrDtimPeriod;
1076 
1077                 /* Getting the beacon Interval */
1078                 param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
1079                 siteMgr_getParam(pMeasurementMgr->hSiteMgr, &param);
1080                 beaconInterval = param.content.beaconInterval;
1081 
1082                 dtimDuration = beaconInterval * MEASUREMENT_BEACON_INTERVAL_IN_MICRO_SEC/MEASUREMENT_MSEC_IN_MICRO*dtimPeriod;
1083                 if (pRequestArr[requestIndex]->DurationTime > dtimDuration)
1084                 {
1085                     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_WARNING, ": Request rejected due to DTIM overlap of request #%d\n", requestIndex+1);
1086 
1087                     TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_WARNING, ": Duration = %d, DTIM Duration = %d\n", pRequestArr[requestIndex]->DurationTime, dtimDuration);
1088 
1089                     if (pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST)
1090                         pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest,
1091                                                 MSR_REJECT_DTIM_OVERLAP);
1092 
1093                     return TI_FALSE;
1094                 }
1095                 else
1096                 {
1097                     TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": DTIM of request #%d doesn't overlap\n", requestIndex+1);
1098                 }
1099             }
1100         }
1101     }
1102 
1103     return TI_TRUE;
1104 }
1105 
measurementMgrSM_measureInProgress(TI_HANDLE hMeasurementMgr)1106 static TI_BOOL measurementMgrSM_measureInProgress(TI_HANDLE hMeasurementMgr)
1107 {
1108 	measurementMgr_t * pMeasurementMgr = (measurementMgr_t *)hMeasurementMgr;
1109 
1110 	if (pMeasurementMgr->currentState == MEASUREMENTMGR_STATE_MEASURING)
1111 		return TI_TRUE;
1112 
1113 	else
1114 		return TI_FALSE;
1115 }
1116 
1117 
1118