1 /* 2 * spectrumMngmntMgr.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 /** \file spectrumMngmntMgr.c 35 * 36 * 37 * \see spectrumMngmntMgr.h 38 */ 39 40 /****************************************************************************************************/ 41 /* */ 42 /* MODULE: spectrumMngmntMgr.c */ 43 /* PURPOSE: */ 44 /* */ 45 /****************************************************************************************************/ 46 47 #define __FILE_ID__ FILE_ID_6 48 #include "report.h" 49 #include "osApi.h" 50 #include "siteMgrApi.h" 51 #include "regulatoryDomainApi.h" 52 #include "mlmeBuilder.h" 53 #include "Ctrl.h" 54 #include "spectrumMngmntMgr.h" 55 56 #define RADAR_THRESHOLD_IN_PRECENTS (5) 57 #define DOT11H_REQUEST_IE_HDR_LEN 3 58 #define DOT11H_REQUEST_IE_LEN 7 59 #define DOT11_MEASUREMENT_REQUEST_ELE_ID (38) 60 61 62 /********************************************************************************/ 63 /* Internal functions prototypes. */ 64 /********************************************************************************/ 65 66 /* The following function uses features from the old Measurement module. */ 67 /* It will have to be adapted to using the new Measurement Manager. */ 68 #if 0 69 70 static void buildMapSubFieldForBasicReport(TI_HANDLE hMeasurementMgr, TI_UINT8* map); 71 72 #endif 73 74 75 /********************************************************************************/ 76 /* Internal Structures. */ 77 /********************************************************************************/ 78 typedef struct 79 { 80 TI_UINT8 dialogToken; 81 TI_UINT8 activatioDelay; 82 TI_UINT8 measurementOffset; 83 } dot11hFrameReqHdr_t; 84 85 typedef struct 86 { 87 TI_UINT8 IeId; 88 TI_UINT8 Length; 89 TI_UINT8 Token; 90 } dot11hReqIEHdr_t; 91 92 /********************************************************************************/ 93 /* Interface functions Implementation. */ 94 /********************************************************************************/ 95 96 /*************************************************************************** 97 * NOTE: The next 3 functions represent the following situations: Receiving 98 * of TPC request, receving Quite IE and receiving Switch Channel IE. 99 * The Measurement SM should be updated to handle this states. 100 ***************************************************************************/ 101 102 103 /*********************************************************************** 104 * measurementMgr_getBasicMeasurementParam 105 *********************************************************************** 106 DESCRIPTION: 107 108 109 INPUT: hMeasurementMgr - MeasurementMgr Handle 110 111 OUTPUT: pAcxStatisitics - 112 pMediumOccupancy - 113 114 RETURN: TI_OK on success, TI_NOK otherwise 115 ************************************************************************/ 116 117 /* The following function uses features from the old Measurement module. */ 118 /* It will have to be adapted to using the new Measurement Manager. */ 119 #if 0 120 121 TI_STATUS measurementMgr_getBasicMeasurementParam(TI_HANDLE hMeasurementMgr, 122 acxStatisitcs_t* pAcxStatisitics, 123 mediumOccupancy_t* pMediumOccupancy) 124 { 125 126 whalParamInfo_t whalParam; 127 measurementMgr_t *pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr; 128 129 /* getting the ACX statisitc counters by calling the HAL */ 130 whalParam.paramType = HAL_CTRL_ACX_STATISTICS_PARAM; 131 if( (status = whalCtrl_GetParam(pMeasurementMgr->hHalCtrl,&whalParam)) == TI_OK) 132 { 133 pAcxStatisitics->FWpacketReceived = whalParam.content.acxStatisitics.FWpacketReceived; 134 pAcxStatisitics->HALpacketReceived = whalParam.content.acxStatisitics.HALpacketReceived; 135 } 136 137 /*FIXME*/ 138 WLAN_OS_REPORT(("-------------- FW total---------------, %d\n\n", 139 pAcxStatisitics->FWpacketReceived)); 140 WLAN_OS_REPORT(("-------------- Driver Total---------------, %d\n\n", 141 pAcxStatisitics->HALpacketReceived)); 142 143 /******************************************************* 144 * NOTE: If not using a call back function the required * 145 * information will not be received * 146 *******************************************************/ 147 /* getting the Medium Occupancy by calling the HAL */ 148 whalParam.paramType = HAL_CTRL_MEDIUM_OCCUPANCY_PARAM; 149 whalParam.content.interogateCmdCBParams.CB_Func = NULL; 150 whalParam.content.interogateCmdCBParams.CB_handle = hMeasurementMgr; 151 whalParam.content.interogateCmdCBParams.CB_buf = NULL; 152 153 if( (status = whalCtrl_GetParam(pMeasurementMgr->hHalCtrl,&whalParam)) == TI_OK) 154 { 155 return status; 156 } 157 158 return status; 159 } 160 161 #endif 162 163 /*********************************************************************** 164 * NOTE: The next 4 functions (dot11h...) should be corrected according 165 * to the 802.11h standered. 166 ***********************************************************************/ 167 168 /************************************************************************ 169 * measurementMgr_dot11hParserFrameReq * 170 ************************************************************************ 171 DESCRIPTION: Frame Request Parser function, called by the Measurement 172 object when a measurement request frame is received. 173 performs the following: 174 - Parsers the received frame request. 175 176 INPUT: hMeasurementMgr - MeasurementMgr Handle 177 pData - The frame request 178 dataLen - The frame'sa length 179 180 OUTPUT: fraemReq - The Parsered Frame Request 181 182 RETURN: TI_OK on success, TI_NOK otherwise 183 184 ************************************************************************/ 185 TI_STATUS measurementMgr_dot11hParseFrameReq(TI_HANDLE hMeasurementMgr, 186 TI_UINT8 *pData, TI_INT32 dataLen, 187 TMeasurementFrameRequest *frameReq) 188 { 189 dot11hFrameReqHdr_t *dot11hFrameReqHdr; 190 191 dot11hFrameReqHdr = (dot11hFrameReqHdr_t*)pData; 192 193 frameReq->hdr->dialogToken = (TI_UINT16)dot11hFrameReqHdr->dialogToken; 194 frameReq->hdr->activatioDelay = dot11hFrameReqHdr->activatioDelay; 195 frameReq->hdr->measurementOffset = dot11hFrameReqHdr->measurementOffset; 196 197 frameReq->requests = pData + DOT11H_REQUEST_IE_HDR_LEN; 198 frameReq->requestsLen = dataLen - DOT11H_REQUEST_IE_HDR_LEN; 199 200 return TI_OK; 201 } 202 203 /************************************************************************ 204 * measurementMgr_dot11hParserRequestIEHdr * 205 ************************************************************************ 206 DESCRIPTION: Spectrom Manager Request IE Header Parser function, 207 called by the Request Handler object when inserting 208 a request IE to the queue. 209 performs the following: 210 - Parsers the received request IE hdr. 211 212 INPUT: hRequestHandler - Request Handler handle 213 pData - The request IE 214 215 OUTPUT: reqestLen - The Request length 216 measurementToken - The Request IE token 217 218 RETURN: TI_OK on success, TI_NOK otherwise 219 220 ************************************************************************/ 221 TI_STATUS measurementMgr_dot11hParseRequestIEHdr(TI_UINT8 *pData, TI_UINT16 *reqestHdrLen, 222 TI_UINT16 *measurementToken) 223 { 224 dot11hReqIEHdr_t *dot11hReqIEHdr; 225 226 dot11hReqIEHdr = (dot11hReqIEHdr_t*)pData; 227 228 /* checking if received the correct information element ID */ 229 if(dot11hReqIEHdr->IeId != DOT11_MEASUREMENT_REQUEST_ELE_ID) 230 return TI_NOK; 231 232 /* checking that len is valid */ 233 if(dot11hReqIEHdr->Length != DOT11H_REQUEST_IE_LEN) 234 return TI_NOK; 235 236 *measurementToken = (TI_UINT16)dot11hReqIEHdr->Token; 237 238 *reqestHdrLen = DOT11H_REQUEST_IE_HDR_LEN; 239 240 return TI_OK; 241 } 242 243 /************************************************************************ 244 * measurementMgr_dot11hIsTypeValid * 245 ************************************************************************ 246 DESCRIPTION: Spectrom Manager function that checks if the given 247 measurement type is valid. 248 249 INPUT: hMeasurementMgr - MeasurementMgr Handle 250 type - The measurement type. 251 scanMode - The Measurement scan Mode. 252 253 OUTPUT: 254 255 RETURN: TI_TRUE if type is valid, TI_FALSE otherwise 256 257 ************************************************************************/ 258 TI_BOOL measurementMgr_dot11hIsTypeValid(TI_HANDLE hMeasurementMgr, 259 EMeasurementType type, 260 EMeasurementScanMode scanMode) 261 { 262 if(type != MSR_TYPE_BASIC_MEASUREMENT) 263 return TI_FALSE; 264 265 return TI_TRUE; 266 } 267 268 /*********************************************************************** 269 * measurementMgr_dot11hBuildRejectReport 270 *********************************************************************** 271 DESCRIPTION: Send reject measurement report frame Function. 272 The function does the following: 273 - checking the reason for reject. 274 - builds measurement report Frame. 275 - Calls the mlmeBuolder to allocate a mangement frame 276 and to transmit it. 277 278 INPUT: hMeasurementMgr - MeasurementMgr Handle 279 pRequestArr - Array of pointer to all measurement 280 request that should be rejected. 281 numOfRequestsInParallel - indicates the number of 282 request that should be rejected. 283 rejectReason - Indicated the rejection reason. 284 285 OUTPUT: None 286 287 RETURN: TI_OK on success, TI_NOK otherwise 288 ************************************************************************/ 289 TI_STATUS measurementMgr_dot11hBuildRejectReport(TI_HANDLE hMeasurementMgr, 290 MeasurementRequest_t* pRequestArr[], 291 TI_UINT8 numOfRequestsInParallel, 292 EMeasurementRejectReason rejectReason) 293 { 294 measurementMgr_t *pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr; 295 MeasurementReportFrame_t measurementReport; 296 TI_UINT8 measurementMode = 0; 297 298 /* Building the measurement report frame contents */ 299 measurementReport.actionField[0] = CATAGORY_SPECTRUM_MANAGEMENT; 300 measurementReport.actionField[1] = MEASUREMENT_REPORT; 301 measurementReport.dialogToken = (TI_UINT8)pRequestArr[0]->frameToken; 302 303 measurementReport.hdr[0] = DOT11_MEASUREMENT_REPORT_ELE_ID; 304 measurementReport.hdr[1] = DOT11_MIN_MEASUREMENT_REPORT_IE_LEN; 305 measurementReport.measurementToken = (TI_UINT8)pRequestArr[0]->measurementToken; 306 measurementReport.measurementType = pRequestArr[0]->Type; 307 308 /* Building the measurement mode bit field */ 309 310 /* setting Parallel Bit */ 311 if(numOfRequestsInParallel > 0 ) 312 measurementMode |= 0x1; 313 314 /* setting Incapable and Refused bits */ 315 switch(rejectReason) 316 { 317 case MSR_REJECT_DTIM_OVERLAP: 318 case MSR_REJECT_DURATION_EXCEED_MAX_DURATION: 319 case MSR_REJECT_TRAFFIC_INTENSITY_TOO_HIGH: 320 case MSR_REJECT_SCR_UNAVAILABLE: 321 case MSR_REJECT_INVALID_CHANNEL: 322 case MSR_REJECT_NOISE_HIST_FAIL: 323 case MSR_REJECT_CHANNEL_LOAD_FAIL: 324 case MSR_REJECT_EMPTY_REPORT: 325 case MSR_REJECT_MAX_DELAY_PASSED: 326 case MSR_REJECT_INVALID_MEASUREMENT_TYPE: 327 { 328 /* Setting the Refused bit */ 329 measurementMode |= 0x4; 330 break; 331 } 332 333 default: 334 { 335 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "Reject reason is not supported, %d\n\n", rejectReason); 336 337 break; 338 } 339 } 340 341 measurementReport.measurementMode = measurementMode; 342 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_WARNING, "Measurement was rejected due to %d,\n\n", rejectReason); 343 344 /* Note: The Measurement report reject frame body includes 8 TI_UINT8 */ 345 return mlmeBuilder_sendFrame(pMeasurementMgr->hMlme,ACTION,(TI_UINT8*)&measurementReport,8,0); 346 } 347 348 349 /*********************************************************************** 350 * measurementMgr_dot11hBuildReport 351 *********************************************************************** 352 DESCRIPTION: build measurement report Function. 353 The function does the following: 354 - builds measurement report IE. 355 356 INPUT: hMeasurementMgr - MeasurementMgr Handle 357 pRequestArr - Array of pointer to all measurement 358 request that should be reported. 359 numOfRequestsInParallel - indicates the number of 360 request that should be reported. 361 362 OUTPUT: None 363 364 RETURN: TI_OK on success, TI_NOK otherwise 365 ************************************************************************/ 366 TI_STATUS measurementMgr_dot11hBuildReport(TI_HANDLE hMeasurementMgr, MeasurementRequest_t request, TMeasurementTypeReply * reply) 367 { 368 /*measurementMgr_t *pMeasurement = (measurementMgr_t*)hMeasurementMgr;*/ 369 MeasurementReportFrame_t measurementReport; 370 TI_UINT8 totalReportLen = 0; 371 TI_UINT8 map = 0; 372 TI_UINT8* pMeasurReport = (TI_UINT8 *)&(measurementReport.measurementReports[0]); 373 374 /* Building the measurement report frame contents */ 375 measurementReport.actionField[0] = CATAGORY_SPECTRUM_MANAGEMENT; 376 measurementReport.actionField[1] = MEASUREMENT_REPORT; 377 measurementReport.dialogToken = (TI_UINT8)request.frameToken; 378 379 measurementReport.hdr[0] = DOT11_MEASUREMENT_REPORT_ELE_ID; 380 measurementReport.measurementToken = (TI_UINT8)request.measurementToken; 381 382 /* setting Parallel Bit in the measurement mode */ 383 if(request.isParallel) 384 measurementReport.measurementMode = 0x1; 385 386 measurementReport.measurementType = request.Type; 387 388 389 /* Building the reports included in the current measurement report IE */ 390 /* Note: The current implementation supports only Basic Report */ 391 if(request.Type == MSR_TYPE_BASIC_MEASUREMENT) 392 { 393 *pMeasurReport++ = request.channelNumber; 394 *pMeasurReport++ = (TI_UINT8)request.DurationTime; 395 396 /* The following function uses features from the old Measurement module. */ 397 /* It will have to be adapted to using the new Measurement Manager. */ 398 #if 0 399 /* building the map subfield */ 400 buildMapSubFieldForBasicReport(hMeasurementMgr,&map); 401 #endif /* 0 */ 402 403 *pMeasurReport++ = map; 404 totalReportLen += 3; 405 } 406 return TI_OK; 407 } 408 409 /*********************************************************************** 410 * measurementMgr_dot11hSendReportAndCleanObject 411 *********************************************************************** 412 DESCRIPTION: Send measurement report frame Function. 413 The function does the following: 414 - Calls the mlmeBuilder to allocate a mangement frame 415 and to transmit it. 416 - Cleans the Measurement Object and reset its Params. 417 418 INPUT: hMeasurementMgr - MeasurementMgr Handle 419 420 OUTPUT: None 421 422 RETURN: TI_OK on success, TI_NOK otherwise 423 ************************************************************************/ 424 TI_STATUS measurementMgr_dot11hSendReportAndCleanObject(TI_HANDLE hMeasurementMgr) 425 { 426 measurementMgr_t *pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr; 427 TI_STATUS status; 428 429 /* Building the Report Frame Header */ 430 /* TO DO */ 431 432 if(pMeasurementMgr->frameLength != 0) 433 { 434 /* Setting the IE Length field */ 435 /* TO DO */ 436 437 /* Sending the Rport Frame */ 438 status = mlmeBuilder_sendFrame(pMeasurementMgr->hMlme,ACTION, 439 (TI_UINT8*)&pMeasurementMgr->dot11hFrameReport, 440 sizeof(dot11_ACTION_FIELD_t) + sizeof(TI_UINT8) + 441 sizeof(dot11_eleHdr_t) + 442 DOT11_MIN_MEASUREMENT_REPORT_IE_LEN + 443 pMeasurementMgr->frameLength,0); 444 if(status != TI_OK) 445 return status; 446 447 /* clearing reports data base */ 448 os_memoryZero(pMeasurementMgr->hOs,&(pMeasurementMgr->dot11hFrameReport), 449 sizeof(MeasurementReportFrame_t)); 450 pMeasurementMgr->frameLength = 0; 451 pMeasurementMgr->nextEmptySpaceInReport = 0; 452 } 453 454 /* Reset the Measurement Object Params */ 455 pMeasurementMgr->currentFrameType = MSR_FRAME_TYPE_NO_ACTIVE; 456 requestHandler_clearRequests(pMeasurementMgr->hRequestH); 457 458 return TI_OK; 459 } 460 461 462 /********************************************************************************/ 463 /* Internal functions Implementation. */ 464 /********************************************************************************/ 465 466 467 468 /*********************************************************************** 469 * buildMapSubFieldForBasicReport 470 *********************************************************************** 471 DESCRIPTION: 472 473 474 INPUT: hMeasurementMgr - MeasurementMgr Handle 475 476 OUTPUT: map - 477 478 RETURN: None 479 ************************************************************************/ 480 481 /* The following function uses features from the old Measurement module. */ 482 /* It will have to be adapted to using the new Measurement Manager. */ 483 #if 0 484 485 static void buildMapSubFieldForBasicReport(TI_HANDLE hMeasurementMgr,TI_UINT8* map) 486 { 487 488 489 TI_INT32 deltaHALReceivedPacked; 490 TI_INT32 deltaFWReceivedPacked; 491 TI_INT32 deltaFCSError; 492 TI_INT32 periodTimeDelta; 493 TI_INT32 occupancyDelta; 494 measurementMgr_t* pMeasurementMgr = (measurementMgr_t*)hMeasurementMgr; 495 496 /* getting the AcxStatisitcs from the FW */ 497 /* NOTE: The medium occupancy will not be updated - FIX */ 498 499 /* The following function uses features from the old Measurement module. */ 500 /* It will have to be adapted to using the new Measurement Manager. */ 501 #if 0 502 measurementMgr_getBasicMeasurementParam(hMeasurementMgr, &pMeasurementMgr->acxStatisticEnd, 503 &pMeasurementMgr->mediumOccupancyEnd); 504 #endif 505 506 /* Calculating the delta for packetReceived from the HAL*/ 507 deltaHALReceivedPacked = pMeasurementMgr->acxStatisticEnd.HALpacketReceived - 508 pMeasurementMgr->acxStatisticStart.HALpacketReceived; 509 510 if(deltaHALReceivedPacked < 0) 511 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "HAL delta packets is negative , %d\n\n", deltaHALReceivedPacked); 512 513 if(deltaHALReceivedPacked != 0 ) 514 *map = DOT11_BSS_ONLY; 515 else 516 { 517 /* Calculating the delta for FCS Error*/ 518 deltaFWReceivedPacked = pMeasurementMgr->acxStatisticEnd.FWpacketReceived - 519 pMeasurementMgr->acxStatisticStart.FWpacketReceived; 520 521 if(deltaFWReceivedPacked < 0) 522 { 523 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "FW delta packets is negative , %d\n\n", deltaFWReceivedPacked); 524 } 525 526 deltaFCSError = deltaFWReceivedPacked - deltaHALReceivedPacked; 527 528 if(deltaFCSError < 0) 529 { 530 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "FCS error is negative , %d\n\n", deltaFCSError); 531 } 532 533 if(deltaFCSError != 0 ) 534 *map = DOT11_OFDM_ONLY; 535 else 536 { 537 /* Calculating the delta for Medium occupancy */ 538 occupancyDelta = pMeasurementMgr->mediumOccupancyEnd.MediumUsage - 539 pMeasurementMgr->mediumOccupancyStart.MediumUsage; 540 541 if(occupancyDelta < 0) 542 { 543 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "Medium Occupancy is negative , %d\n\n", occupancyDelta); 544 } 545 546 periodTimeDelta = pMeasurementMgr->mediumOccupancyEnd.Period - 547 pMeasurementMgr->mediumOccupancyStart.Period; 548 549 if(periodTimeDelta < 0) 550 { 551 TRACE1(pMeasurementMgr->hReport, REPORT_SEVERITY_ERROR, "Period time delta is negative , %d\n\n", periodTimeDelta); 552 } 553 554 if( ((occupancyDelta * 100) / periodTimeDelta) > RADAR_THRESHOLD_IN_PRECENTS ) 555 *map = DOT11_RADAR_AND_UNIDENTIFIED; 556 else 557 *map = 0; 558 } 559 } 560 561 return; 562 } 563 564 #endif /* 0 */ 565