diff options
Diffstat (limited to 'wl1271/stad/src/AirLink_Managment/measurementMgr.c')
-rw-r--r-- | wl1271/stad/src/AirLink_Managment/measurementMgr.c | 1115 |
1 files changed, 0 insertions, 1115 deletions
diff --git a/wl1271/stad/src/AirLink_Managment/measurementMgr.c b/wl1271/stad/src/AirLink_Managment/measurementMgr.c deleted file mode 100644 index 6af3660..0000000 --- a/wl1271/stad/src/AirLink_Managment/measurementMgr.c +++ /dev/null @@ -1,1115 +0,0 @@ -/* - * measurementMgr.c - * - * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/***************************************************************************/ -/* */ -/* MODULE: measurementMgr.c */ -/* PURPOSE: measurement Manager module file */ -/* */ -/***************************************************************************/ - - - - -#define __FILE_ID__ FILE_ID_1 -#include "measurementMgr.h" -#include "regulatoryDomainApi.h" -#include "healthMonitor.h" -#include "DrvMainModules.h" -#include "siteMgrApi.h" -#include "TrafficMonitorAPI.h" -#include "smeApi.h" -#include "sme.h" -#ifdef XCC_MODULE_INCLUDED -#include "XCCTSMngr.h" -#endif -#include "TWDriver.h" - -/* default measurement parameters */ -#define MEASUREMENT_CAPABILITIES_NONE 0x00 -#define MEASUREMENT_CAPABILITIES_DOT11H 0x01 -#define MEASUREMENT_CAPABILITIES_XCC_RM 0x02 - - -#define MEASUREMENT_BEACON_INTERVAL_IN_MICRO_SEC 1024 -#define MEASUREMENT_MSEC_IN_MICRO 1000 - - - - -/********************************************************************************/ -/* Internal functions prototypes. */ -/********************************************************************************/ - -static void measurementMgr_releaseModule(measurementMgr_t *pMeasurementMgr); - -static TI_BOOL measurementMgr_isTrafficIntensityHigherThanThreshold(measurementMgr_t * pMeasurementMgr); - -static TI_BOOL measurementMgr_isRequestValid(TI_HANDLE hMeasurementMgr, MeasurementRequest_t *pRequestArr[], TI_UINT8 numOfRequest); - -static TI_BOOL measurementMgrSM_measureInProgress(TI_HANDLE hMeasurementMgr); - - - - - -/********************************************************************************/ -/* Interface functions Implementation. */ -/********************************************************************************/ - - -/** - * Creates the Measurement Manager moodule. - * - * @param hOs A handle to the OS object. - * - * @date 16-Dec-2005 - */ -TI_HANDLE measurementMgr_create(TI_HANDLE hOs) -{ - measurementMgr_t * pMeasurementMgr = NULL; - TI_STATUS status; - - /* allocating the MeasurementMgr object */ - pMeasurementMgr = os_memoryAlloc(hOs, sizeof(measurementMgr_t)); - - if (pMeasurementMgr == NULL) - return NULL; - - os_memoryZero(hOs, pMeasurementMgr, sizeof(measurementMgr_t)); - pMeasurementMgr->hOs = hOs; - - /* creating the Measurement SM */ - status = fsm_Create(pMeasurementMgr->hOs, &(pMeasurementMgr->pMeasurementMgrSm), - MEASUREMENTMGR_NUM_STATES , MEASUREMENTMGR_NUM_EVENTS); - if(status != TI_OK) - { - measurementMgr_releaseModule(pMeasurementMgr); - return NULL; - } - - /* creating the sub modules of measurement module */ - - /* creating Request Handler sub module */ - if( (pMeasurementMgr->hRequestH = requestHandler_create(hOs)) == NULL) - { - measurementMgr_releaseModule(pMeasurementMgr); - return NULL; - } - - return(pMeasurementMgr); -} - - - - - -/** - * Configures the Measurement Manager module. - * - * @param pStadHandles Handles to other modules the Measurement Manager needs. - * - * @date 16-Dec-2005 - */ -void measurementMgr_init (TStadHandlesList *pStadHandles) -{ - measurementMgr_t *pMeasurementMgr = (measurementMgr_t *)(pStadHandles->hMeasurementMgr); - paramInfo_t param; - - /* Init Handlers */ - pMeasurementMgr->hRegulatoryDomain = pStadHandles->hRegulatoryDomain; - pMeasurementMgr->hXCCMngr = pStadHandles->hXCCMngr; - pMeasurementMgr->hSiteMgr = pStadHandles->hSiteMgr; - pMeasurementMgr->hTWD = pStadHandles->hTWD; - pMeasurementMgr->hMlme = pStadHandles->hMlmeSm; - pMeasurementMgr->hTrafficMonitor = pStadHandles->hTrafficMon; - pMeasurementMgr->hReport = pStadHandles->hReport; - pMeasurementMgr->hOs = pStadHandles->hOs; - pMeasurementMgr->hScr = pStadHandles->hSCR; - pMeasurementMgr->hApConn = pStadHandles->hAPConnection; - pMeasurementMgr->hTxCtrl = pStadHandles->hTxCtrl; - pMeasurementMgr->hTimer = pStadHandles->hTimer; - pMeasurementMgr->hSme = pStadHandles->hSme; - - /* initialize variables to default values */ - pMeasurementMgr->Enabled = TI_TRUE; - pMeasurementMgr->Connected = TI_FALSE; - pMeasurementMgr->Capabilities = MEASUREMENT_CAPABILITIES_NONE; - pMeasurementMgr->Mode = MSR_MODE_NONE; - - /* Getting management capability status */ - param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM; - regulatoryDomain_getParam (pMeasurementMgr->hRegulatoryDomain, ¶m); - if (param.content.spectrumManagementEnabled) - { - pMeasurementMgr->Capabilities |= MEASUREMENT_CAPABILITIES_DOT11H; - } - - /* Init Functions */ - pMeasurementMgr->parserFrameReq = NULL; - pMeasurementMgr->isTypeValid = NULL; - pMeasurementMgr->buildReport = NULL; - pMeasurementMgr->buildRejectReport = NULL; - pMeasurementMgr->sendReportAndCleanObj = NULL; - - /* initialize variables */ - pMeasurementMgr->currentState = MEASUREMENTMGR_STATE_IDLE; - pMeasurementMgr->isModuleRegistered = TI_FALSE; - pMeasurementMgr->currentFrameType = MSR_FRAME_TYPE_NO_ACTIVE; - pMeasurementMgr->measuredChannelID = 0; - pMeasurementMgr->currentNumOfRequestsInParallel = 0; - pMeasurementMgr->bMeasurementScanExecuted = TI_FALSE; - - /* config sub modules */ - RequestHandler_config(pMeasurementMgr->hRequestH, pStadHandles->hReport, pStadHandles->hOs); - - /* Register to the SCR module */ - scr_registerClientCB(pMeasurementMgr->hScr, SCR_CID_XCC_MEASURE, measurementMgr_scrResponseCB, (TI_HANDLE)pMeasurementMgr); - - measurementMgrSM_config ((TI_HANDLE)pMeasurementMgr); - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INIT , ": Measurement Manager configured successfully\n"); -} - - -TI_STATUS measurementMgr_SetDefaults (TI_HANDLE hMeasurementMgr, measurementInitParams_t * pMeasurementInitParams) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; -#ifdef XCC_MODULE_INCLUDED - TI_UINT32 currAC; -#endif - - pMeasurementMgr->trafficIntensityThreshold = pMeasurementInitParams->trafficIntensityThreshold; - pMeasurementMgr->maxDurationOnNonServingChannel = pMeasurementInitParams->maxDurationOnNonServingChannel; - - /* allocating the measurement Activation Delay timer */ - pMeasurementMgr->hActivationDelayTimer = tmr_CreateTimer (pMeasurementMgr->hTimer); - if (pMeasurementMgr->hActivationDelayTimer == NULL) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "measurementMgr_SetDefaults(): Failed to create hActivationDelayTimer!\n"); - return TI_NOK; - } - -#ifdef XCC_MODULE_INCLUDED - /* allocating the per AC TS Metrics report timers */ - for (currAC = 0; currAC < MAX_NUM_OF_AC; currAC++) - { - pMeasurementMgr->isTsMetricsEnabled[currAC] = TI_FALSE; - - pMeasurementMgr->hTsMetricsReportTimer[currAC] = tmr_CreateTimer (pMeasurementMgr->hTimer); - if (pMeasurementMgr->hTsMetricsReportTimer[currAC] == NULL) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "measurementMgr_SetDefaults(): Failed to create hTsMetricsReportTimer!\n"); - return TI_NOK; - } - } - - /* Check in the Registry if the station supports XCC RM */ - if (pMeasurementInitParams->XCCEnabled == XCC_MODE_ENABLED) - { - pMeasurementMgr->Capabilities |= MEASUREMENT_CAPABILITIES_XCC_RM; - } -#endif - - return TI_OK; -} - - - - - -/** - * Sets the specified Measurement Manager parameter. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * @param pParam The parameter to set. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_setParam(TI_HANDLE hMeasurementMgr, paramInfo_t * pParam) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - switch (pParam->paramType) - { - case MEASUREMENT_ENABLE_DISABLE_PARAM: - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MEASUREMENT_ENABLE_DISABLE_PARAM <- %d\n", pParam->content.measurementEnableDisableStatus); - - if (pParam->content.measurementEnableDisableStatus) - { - measurementMgr_enable(pMeasurementMgr); - } - else - { - measurementMgr_disable(pMeasurementMgr); - } - - break; - } - - case MEASUREMENT_TRAFFIC_THRESHOLD_PARAM: - { - if ((pParam->content.measurementTrafficThreshold >= MEASUREMENT_TRAFFIC_THRSHLD_MIN) && - (pParam->content.measurementTrafficThreshold <= MEASUREMENT_TRAFFIC_THRSHLD_MAX)) - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MEASUREMENT_TRAFFIC_THRESHOLD_PARAM <- %d\n", pParam->content.measurementTrafficThreshold); - - pMeasurementMgr->trafficIntensityThreshold = pParam->content.measurementTrafficThreshold; - } - else - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": Invalid value for MEASUREMENT_TRAFFIC_THRESHOLD_PARAM (%d)\n", pParam->content.measurementTrafficThreshold); - } - - break; - } - - - case MEASUREMENT_MAX_DURATION_PARAM: - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MEASUREMENT_MAX_DURATION_PARAM <- %d\n", pParam->content.measurementMaxDuration); - - pMeasurementMgr->maxDurationOnNonServingChannel = pParam->content.measurementMaxDuration; - - break; - } - - - default: - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": Specified parameter is not supported (%d)\n", pParam->paramType); - - return PARAM_NOT_SUPPORTED; - } - - } - - return TI_OK; -} - - - - - -/** - * Gets the specified parameter from the Measurement Manager. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * @param pParam The parameter to get. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_getParam(TI_HANDLE hMeasurementMgr, paramInfo_t * pParam) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - switch(pParam->paramType) - { - - case MEASUREMENT_GET_STATUS_PARAM: - { - WLAN_OS_REPORT(("%s: \n\n", __FUNCTION__)); - WLAN_OS_REPORT(("MeasurementMgr Status Report:\n\n")); - - WLAN_OS_REPORT(("Current State: %d\n\n", pMeasurementMgr->currentState)); - - WLAN_OS_REPORT(("Connected: %d\n", pMeasurementMgr->Connected)); - WLAN_OS_REPORT(("Enabled: %d\n\n", pMeasurementMgr->Enabled)); - - WLAN_OS_REPORT(("Mode: %d\n", pMeasurementMgr->Mode)); - WLAN_OS_REPORT(("Capabilities: %d\n\n", pMeasurementMgr->Capabilities)); - - WLAN_OS_REPORT(("current Frame Type: %d\n", pMeasurementMgr->currentFrameType)); - WLAN_OS_REPORT(("Measured Channel: %d\n", pMeasurementMgr->measuredChannelID)); - WLAN_OS_REPORT(("Serving Channel: %d\n", pMeasurementMgr->servingChannelID)); - WLAN_OS_REPORT(("Traffic Intensity Threshold: %d\n", pMeasurementMgr->trafficIntensityThreshold)); - WLAN_OS_REPORT(("Max Duration on Nonserving Channel: %d\n", pMeasurementMgr->maxDurationOnNonServingChannel)); - - break; - } - - - default: - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": Specified parameter is not supported (%d)\n", pParam->paramType); - - return PARAM_NOT_SUPPORTED; - } - - } - - return TI_OK; -} - - - - - - -/** - * Signals the Measurement Manager that the STA is connected. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_connected(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - /* checking if measurement is enabled */ - if (pMeasurementMgr->Mode == MSR_MODE_NONE) - return TI_OK; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to connected.\n"); - - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_CONNECTED, pMeasurementMgr); -} - - - - - -/** - * Signals the Measurement Manager that the STA is disconnected. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_disconnected(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to disconnected.\n"); - - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_DISCONNECTED, pMeasurementMgr); -} - - - - -/** - * Enables the Measurement Manager module. - * - * @date 10-Jan-2006 - */ -TI_STATUS measurementMgr_enable(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to enabled.\n"); - - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_ENABLE, pMeasurementMgr); -} - - - - - -/** - * Disables the Measurement Manager module. - * - * @date 10-Jan-2006 - */ -TI_STATUS measurementMgr_disable(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr set to disabled.\n"); - - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_DISABLE, pMeasurementMgr); -} - - - - - -/** - * Destroys the Measurement Manager module. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_destroy(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t *pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - if (pMeasurementMgr == NULL) - return TI_OK; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr is being destroyed\n"); - - measurementMgr_releaseModule (pMeasurementMgr); - - return TI_OK; -} - - - - - - -/** - * Sets the Measurement Mode. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * @param capabilities The AP capabilities. - * @param pIeBuffer Pointer to the list of IEs. - * @param length Length of the IE list. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_setMeasurementMode(TI_HANDLE hMeasurementMgr, TI_UINT16 capabilities, - TI_UINT8 * pIeBuffer, TI_UINT16 length) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - /* - * 11h Measurement is not supported in the current version. - */ -/* if( (pMeasurementMgr->Capabilities & MEASUREMENT_CAPABILITIES_DOT11H) && - (capabilities & DOT11_SPECTRUM_MANAGEMENT) ) - { - pMeasurementMgr->Mode = MSR_MODE_SPECTRUM_MANAGEMENT; - } - else - { -*/ -#ifdef XCC_MODULE_INCLUDED - - if(pMeasurementMgr->Capabilities & MEASUREMENT_CAPABILITIES_XCC_RM) - { - pMeasurementMgr->Mode = MSR_MODE_XCC; - } - else -#endif - { - pMeasurementMgr->Mode = MSR_MODE_NONE; - } - - - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgr mode changed to: %d\n", pMeasurementMgr->Mode); - - return TI_OK; -} - - - - - - -/** - * Called when a frame with type measurement request is received. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * @param frameType The frame type. - * @param dataLen The length of the frame. - * @param pData A pointer to the frame's content. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_receiveFrameRequest(TI_HANDLE hMeasurementMgr, - EMeasurementFrameType frameType, - TI_INT32 dataLen, - TI_UINT8 * pData) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - - TMeasurementFrameRequest * frame = &(pMeasurementMgr->newFrameRequest); - TI_UINT16 currentFrameToken; - - /* checking if measurement is enabled */ - if (pMeasurementMgr->Mode == MSR_MODE_NONE) - return TI_NOK; - - /* ignore broadcast/multicast request if unicast request is active */ - if (frameType != MSR_FRAME_TYPE_UNICAST && pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Broadcast/Multicast measurement frame has been ignored\n"); - - return TI_NOK; - } - - /* ignore broadcast request if multicast request is active */ - if (frameType == MSR_FRAME_TYPE_BROADCAST && pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_MULTICAST) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Broadcast measurement frame has been ignored\n"); - - return TI_NOK; - } - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement frame received\n"); - - /* Parsing the Frame Request Header */ - pMeasurementMgr->parserFrameReq(hMeasurementMgr, pData, dataLen, - frame); - - frame->frameType = frameType; - - /* checking if the received token frame is the same as the one that is being processed */ - if ((requestHandler_getFrameToken(pMeasurementMgr->hRequestH, ¤tFrameToken) == TI_OK) - && (currentFrameToken == frame->hdr->dialogToken)) - { - os_memoryZero(pMeasurementMgr->hOs, &pMeasurementMgr->newFrameRequest, - sizeof(TMeasurementFrameRequest)); - - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement frame token %d is identical to current frame token - ignoring frame\n", currentFrameToken); - - return TI_NOK; - } - - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement frame token is %d\n", frame->hdr->dialogToken); - - /* Frame is Received for processing */ - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_FRAME_RECV, pMeasurementMgr); -} - - - - - -/** - * Activates the next measurement request. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * - * @date 16-Dec-2005 - */ -TI_STATUS measurementMgr_activateNextRequest(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - requestHandler_t * pRequestH = (requestHandler_t *) pMeasurementMgr->hRequestH; - MeasurementRequest_t * pRequestArr[MAX_NUM_REQ]; - TI_UINT8 numOfRequestsInParallel = 0; - TI_BOOL valid; - TI_UINT8 index; - - /* Keep note of the time we started processing the request. this will be used */ - /* to give the measurementSRV a time frame to perform the measurement operation */ - pMeasurementMgr->currentRequestStartTime = os_timeStampMs(pMeasurementMgr->hOs); - - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Timer started at %d, we have 20ms to begin measurement...\n", pMeasurementMgr->currentRequestStartTime); - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Looking for a valid request\n"); - - do - { - TI_STATUS status; - - if (numOfRequestsInParallel != 0) - { - 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); - } - - pRequestH->activeRequestID += numOfRequestsInParallel; - pRequestH->numOfWaitingRequests -= numOfRequestsInParallel; - - for (index = 0; index < MAX_NUM_REQ; index++) - { - pRequestArr[index] = NULL; - } - numOfRequestsInParallel = 0; - - /* Getting the next request/requests from the request handler */ - status = requestHandler_getNextReq(pMeasurementMgr->hRequestH, TI_FALSE, pRequestArr, - &numOfRequestsInParallel); - - /* Checking if there are no waiting requests */ - if (status != TI_OK) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": There are no waiting requests in the queue\n"); - - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_SEND_REPORT, pMeasurementMgr); - } - - /* Checking validity of request/s */ - valid = measurementMgr_isRequestValid(pMeasurementMgr, pRequestArr, - numOfRequestsInParallel); - - /* Checking if the current request is Beacon Table */ - if( (numOfRequestsInParallel == 1) && - (pRequestArr[0]->Type == MSR_TYPE_BEACON_MEASUREMENT) && - (pRequestArr[0]->ScanMode == MSR_SCAN_MODE_BEACON_TABLE) ) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received Beacon Table request, building a report for it and continuing\n"); - - pMeasurementMgr->buildReport(hMeasurementMgr, *(pRequestArr[0]), NULL); - valid = TI_FALSE; /* In order to get the next request/s*/ - } - - } while (valid == TI_FALSE); - - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request(s) for activation:\n"); - - for (index = 0; index < numOfRequestsInParallel; index++) - { - 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); - } - - /* Ignore requests if traffic intensity is high */ - if (measurementMgr_isTrafficIntensityHigherThanThreshold(pMeasurementMgr) == TI_TRUE) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Traffic intensity too high, giving up...\n"); - - measurementMgr_rejectPendingRequests(pMeasurementMgr, MSR_REJECT_TRAFFIC_INTENSITY_TOO_HIGH); - - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_SEND_REPORT, pMeasurementMgr); - } - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request is Valid, about to start\n"); - - pMeasurementMgr->measuredChannelID = pRequestArr[0]->channelNumber; - - /* Request resource from the SCR */ - return measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_REQUEST_SCR, pMeasurementMgr); -} - - - -void measurementMgr_rejectPendingRequests(TI_HANDLE hMeasurementMgr, EMeasurementRejectReason rejectReason) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - requestHandler_t * pRequestH = (requestHandler_t *) pMeasurementMgr->hRequestH; - MeasurementRequest_t * pRequestArr[MAX_NUM_REQ]; - TI_UINT8 numOfRequestsInParallel; - - /* reject all pending measurement requests */ - while (requestHandler_getNextReq(pMeasurementMgr->hRequestH, TI_TRUE, - pRequestArr, &numOfRequestsInParallel) == TI_OK) - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Rejecting pending request (activeRequestID = %d)...\n", pRequestH->activeRequestID); - - pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, - numOfRequestsInParallel, rejectReason); - - pRequestH->activeRequestID += numOfRequestsInParallel; - } -} - - - - - -/********************************************************************************/ -/* Callback functions Implementation. */ -/********************************************************************************/ - - -/** - * The callback called by the MeasurementSRV module when then - * measurement operation has ended. - * - * @param clientObj A handle to the Measurement Manager module. - * @param msrReply An array of replies sent by the MeasurementSRV module, - * where each reply contains the result of a single measurement request. - * - * @date 01-Jan-2006 - */ -void measurementMgr_MeasurementCompleteCB(TI_HANDLE clientObj, TMeasurementReply * msrReply) -{ - measurementMgr_t *pMeasurementMgr = (measurementMgr_t *) clientObj; - TI_UINT8 index; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Building reports for measurement requests\n"); - - /* build a report for each measurement request/reply pair */ - for (index = 0; index < msrReply->numberOfTypes; index++) - { - pMeasurementMgr->buildReport(pMeasurementMgr, *(pMeasurementMgr->currentRequest[index]), &msrReply->msrTypes[index]); - } - - measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - MEASUREMENTMGR_EVENT_COMPLETE, pMeasurementMgr); -} - - -/** - * The callback called when the SCR responds to the SCR request. - * - * @param hClient A handle to the Measurement Manager module. - * @param requestStatus The request's status - * @param eResource The resource for which the CB is issued - * @param pendReason The reason of a PEND status. - * - * @date 01-Jan-2006 - */ -void measurementMgr_scrResponseCB(TI_HANDLE hClient, EScrClientRequestStatus requestStatus, - EScrResourceId eResource, EScePendReason pendReason ) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hClient; - measurementMgrSM_Events event; - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": SCR callback entered\n"); - - /* If the SM is in a state where it waits for the CB, status of RUN */ - /* results in the SM asking the measurementSRV to start measurement; */ - /* otherwise we got an ABORT or a PEND reason worse than the one we */ - /* got when calling the SCR, so the SM aborts the measurement */ - if (pMeasurementMgr->currentState == MEASUREMENTMGR_STATE_WAITING_FOR_SCR) - { - if (requestStatus == SCR_CRS_RUN) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status RUN, running...\n"); - - event = MEASUREMENTMGR_EVENT_SCR_RUN; - } - else - { - if (requestStatus == SCR_CRS_PEND) - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status PEND with reason %d, aborting...\n", pendReason); - } - else - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status ABORT/FW_RESET, aborting...\n"); - } - - event = MEASUREMENTMGR_EVENT_ABORT; - } - } - else - { - /* This can only occur if FW reset occurs or when higher priority client is running. */ - - if (requestStatus == SCR_CRS_FW_RESET) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Received SCR status FW_RESET\n"); - - event = MEASUREMENTMGR_EVENT_FW_RESET; - } - else - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MeasurementMgrSM current state is %d (which isn't WAITING_FOR_SCR), aborting...\n", pMeasurementMgr->currentState); - - event = MEASUREMENTMGR_EVENT_ABORT; - } - } - - measurementMgrSM_event((TI_UINT8 *) &(pMeasurementMgr->currentState), - event, pMeasurementMgr); -} - - - - - - -/** - * The callback called by the MLME. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * - * @date 01-Jan-2006 - */ -void measurementMgr_mlmeResultCB(TI_HANDLE hMeasurementMgr, TMacAddr * bssid, mlmeFrameInfo_t * frameInfo, - TRxAttr * pRxAttr, TI_UINT8 * buffer, TI_UINT16 bufferLength) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - TScanFrameInfo tScanFrameInfo; - - if (measurementMgrSM_measureInProgress(pMeasurementMgr) == TI_FALSE) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION , "measurementMgr_mlmeResultCB: measurement not in progress, return\n"); - return; - } - - - /* erroneous frames are notifed to the measurmenet manager to update counter - (add counter sometimes in the future) Look at: scanCncn_ScanCompleteNotificationCB and - scanCncn_MlmeResultCB */ - if (NULL == bssid) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION , "measurementMgr_mlmeResultCB: received an empty frame notification from MLME\n"); - return; - } - - if (pMeasurementMgr == NULL || pRxAttr == NULL) - { - if(pMeasurementMgr != NULL) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, ": MLME callback called with NULL object\n"); - } - return; - } - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": MLME callback entered\n"); - - /* build the scan frame info object */ - tScanFrameInfo.bssId = bssid; - tScanFrameInfo.band = (ERadioBand)pRxAttr->band; - tScanFrameInfo.channel = pRxAttr->channel; - tScanFrameInfo.parsedIEs = frameInfo; - tScanFrameInfo.rate = pRxAttr->Rate; - tScanFrameInfo.rssi = pRxAttr->Rssi; - tScanFrameInfo.snr = pRxAttr->SNR; - tScanFrameInfo.staTSF = pRxAttr->TimeStamp; - tScanFrameInfo.buffer = buffer; - tScanFrameInfo.bufferLength = bufferLength; - - /* update the driver (SME) result table */ - sme_MeansurementScanResult (pMeasurementMgr->hSme, SCAN_CRS_RECEIVED_FRAME, &tScanFrameInfo); - - 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); -} - - -/********************************************************************************/ -/* Internal functions Implementation. */ -/********************************************************************************/ - - -/** - * Releases the module's allocated objects according to the given init vector. - * - * @param pMeasurementMgr A handle to the Measurement Manager module. - * @param initVec The init vector with a bit set for each allocated object. - * - * @date 01-Jan-2006 - */ -static void measurementMgr_releaseModule (measurementMgr_t * pMeasurementMgr) -{ -#ifdef XCC_MODULE_INCLUDED - TI_UINT32 currAC; -#endif - - if (pMeasurementMgr->hActivationDelayTimer) - { - tmr_DestroyTimer (pMeasurementMgr->hActivationDelayTimer); - } - -#ifdef XCC_MODULE_INCLUDED - for (currAC = 0; currAC < MAX_NUM_OF_AC; currAC++) - { - if (pMeasurementMgr->hTsMetricsReportTimer[currAC]) - { - tmr_DestroyTimer (pMeasurementMgr->hTsMetricsReportTimer[currAC]); - } - } -#endif - - if (pMeasurementMgr->pMeasurementMgrSm) - { - fsm_Unload(pMeasurementMgr->hOs, pMeasurementMgr->pMeasurementMgrSm); - } - - if (pMeasurementMgr->hRequestH) - { - requestHandler_destroy(pMeasurementMgr->hRequestH); - } - - os_memoryFree(pMeasurementMgr->hOs, pMeasurementMgr, sizeof(measurementMgr_t)); -} - - - -/** - * Checks whether the traffic intensity, i.e. number of packets per seconds, is higher - * than the preconfigured threshold. - * - * @param pMeasurementMgr A handle to the Measurement Manager module. - * - * @return True iff the traffic intensity is high - * - * @date 01-Jan-2006 - */ -static TI_BOOL measurementMgr_isTrafficIntensityHigherThanThreshold(measurementMgr_t * pMeasurementMgr) -{ - TI_BOOL trafficIntensityHigh = TI_FALSE; - int pcksPerSec; - - pcksPerSec = TrafficMonitor_GetFrameBandwidth(pMeasurementMgr->hTrafficMonitor); - - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": pcksPerSec = %d\n", pcksPerSec); - - if (pcksPerSec >= pMeasurementMgr->trafficIntensityThreshold) - trafficIntensityHigh = TI_TRUE; - - return trafficIntensityHigh; -} - - - - -/** - * Checks whether the given measurement request is valid. - * - * @param hMeasurementMgr A handle to the Measurement Manager module. - * @param pRequestArr The measurement request. - * @param numOfRequest Number of type requests - * - * @return True iff the request is valid - * - * @date 01-Jan-2006 - */ -static TI_BOOL measurementMgr_isRequestValid(TI_HANDLE hMeasurementMgr, MeasurementRequest_t *pRequestArr[], - TI_UINT8 numOfRequest) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *) hMeasurementMgr; - TI_UINT8 requestIndex; - paramInfo_t param; - - /* Checking validity of the measured channel number */ - param.content.channel = pRequestArr[0]->channelNumber; - param.paramType = REGULATORY_DOMAIN_IS_CHANNEL_SUPPORTED; - regulatoryDomain_getParam(pMeasurementMgr->hRegulatoryDomain, ¶m); - if ( !param.content.bIsChannelSupprted ) - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request rejected due to invalid channel\n"); - - if (pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST) - pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest, - MSR_REJECT_INVALID_CHANNEL); - - return TI_FALSE; - } - else - { - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request channel is Valid\n"); - } - - TRACE0(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Starting to check each request:\n"); - - /* Check Validity of each request */ - for (requestIndex = 0; requestIndex < numOfRequest; requestIndex++) - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Checking request #%d:\n", requestIndex+1); - - /* Checking validity of the Request Type */ - if (pMeasurementMgr->isTypeValid(hMeasurementMgr, pRequestArr[requestIndex]->Type, - pRequestArr[requestIndex]->ScanMode) == TI_FALSE) - { - TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request rejected due to invalid measurement type of request #%d (type = %d)\n", requestIndex+1, pRequestArr[requestIndex]->Type); - - if(pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST) - pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest, - MSR_REJECT_INVALID_MEASUREMENT_TYPE); - - return TI_FALSE; - } - else - { - TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Measurement type of request #%d is supported (type = %d)\n", requestIndex+1, pRequestArr[requestIndex]->Type); - } - - /* For measurement types different than Beacon Table */ - if ((pRequestArr[requestIndex]->Type != MSR_TYPE_BEACON_MEASUREMENT) || - (pRequestArr[requestIndex]->ScanMode != MSR_SCAN_MODE_BEACON_TABLE)) - { - /* Checking Measurement request's duration only when request is on a non-serving channel */ - if (pMeasurementMgr->servingChannelID != pRequestArr[requestIndex]->channelNumber) - { - TI_UINT8 dtimPeriod; - TI_UINT32 beaconInterval; - TI_UINT32 dtimDuration; - - - /* Checking duration doesn't exceed given max duration */ - if (pRequestArr[requestIndex]->DurationTime > pMeasurementMgr->maxDurationOnNonServingChannel) - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Request #%d rejected because duration exceeds maximum duration\n", requestIndex+1); - - TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Duration = %d, MaxDurationOnNonServingChannel = %d\n", pRequestArr[requestIndex]->DurationTime, pMeasurementMgr->maxDurationOnNonServingChannel); - - if (pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST) - pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest, - MSR_REJECT_DURATION_EXCEED_MAX_DURATION); - - return TI_FALSE; - } - else - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": Duration of request #%d doesn't exceed max duration\n", requestIndex+1); - } - - - /* Checking DTIM */ - - /* Getting the DTIM count */ - param.paramType = SITE_MGR_DTIM_PERIOD_PARAM; - siteMgr_getParam(pMeasurementMgr->hSiteMgr, ¶m); - dtimPeriod = param.content.siteMgrDtimPeriod; - - /* Getting the beacon Interval */ - param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM; - siteMgr_getParam(pMeasurementMgr->hSiteMgr, ¶m); - beaconInterval = param.content.beaconInterval; - - dtimDuration = beaconInterval * MEASUREMENT_BEACON_INTERVAL_IN_MICRO_SEC/MEASUREMENT_MSEC_IN_MICRO*dtimPeriod; - if (pRequestArr[requestIndex]->DurationTime > dtimDuration) - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_WARNING, ": Request rejected due to DTIM overlap of request #%d\n", requestIndex+1); - - TRACE2(pMeasurementMgr->hReport, REPORT_SEVERITY_WARNING, ": Duration = %d, DTIM Duration = %d\n", pRequestArr[requestIndex]->DurationTime, dtimDuration); - - if (pMeasurementMgr->currentFrameType == MSR_FRAME_TYPE_UNICAST) - pMeasurementMgr->buildRejectReport(pMeasurementMgr, pRequestArr, numOfRequest, - MSR_REJECT_DTIM_OVERLAP); - - return TI_FALSE; - } - else - { - TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_INFORMATION, ": DTIM of request #%d doesn't overlap\n", requestIndex+1); - } - } - } - } - - return TI_TRUE; -} - -static TI_BOOL measurementMgrSM_measureInProgress(TI_HANDLE hMeasurementMgr) -{ - measurementMgr_t * pMeasurementMgr = (measurementMgr_t *)hMeasurementMgr; - - if (pMeasurementMgr->currentState == MEASUREMENTMGR_STATE_MEASURING) - return TI_TRUE; - - else - return TI_FALSE; -} - - |