1/** \file reportReplvl.c 2 * \brief Report level implementation 3 * 4 * \see reportReplvl.h 5 */ 6/**************************************************************************** 7**+-----------------------------------------------------------------------+** 8**| |** 9**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 10**| All rights reserved. |** 11**| |** 12**| Redistribution and use in source and binary forms, with or without |** 13**| modification, are permitted provided that the following conditions |** 14**| are met: |** 15**| |** 16**| * Redistributions of source code must retain the above copyright |** 17**| notice, this list of conditions and the following disclaimer. |** 18**| * Redistributions in binary form must reproduce the above copyright |** 19**| notice, this list of conditions and the following disclaimer in |** 20**| the documentation and/or other materials provided with the |** 21**| distribution. |** 22**| * Neither the name Texas Instruments nor the names of its |** 23**| contributors may be used to endorse or promote products derived |** 24**| from this software without specific prior written permission. |** 25**| |** 26**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 27**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 28**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 29**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 30**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 31**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 32**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 33**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 34**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 35**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 36**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 37**| |** 38**+-----------------------------------------------------------------------+** 39****************************************************************************/ 40 41/***************************************************************************/ 42/* */ 43/* MODULE: reportReplvl.c */ 44/* PURPOSE: Report level implementation */ 45/* */ 46/***************************************************************************/ 47#include "report.h" 48#include "osTIType.h" 49#include "osApi.h" 50#include "siteHash.h" 51#include "utils.h" 52#include "rsnApi.h" 53#include "regulatoryDomainApi.h" 54#include "siteMgrApi.h" 55 56/********************************************/ 57/* Functions Implementations */ 58/********************************************/ 59 60/************************************************************************ 61 * buildNullTemplate * 62 ************************************************************************ 63DESCRIPTION: This function build a NULL data template to set to the HAL 64 when joining an infrastructure network 65 performs the following: 66 - Build a template & set the template len, the template type is set in the site mgr 67 68INPUT: pSiteMgr - Handle to site manager 69 pTemplate - Pointer to the template structure 70 71 72OUTPUT: 73 74 75RETURN: OK 76 77************************************************************************/ 78TI_STATUS buildNullTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate) 79{ 80 paramInfo_t param; 81 UINT32 size; 82 nullDataTemplate_t *pBuffer = (nullDataTemplate_t *)pTemplate->pTemplate; 83 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite; 84 UINT16 fc; 85 86 os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(nullDataTemplate_t)); 87 88 /* 89 * Header First 90 */ 91 /* Set destination address */ 92 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.DA.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN); 93 94 /* Set BSSID address */ 95 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.BSSID.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN); 96 97 /* Build Source address */ 98 param.paramType = CTRL_DATA_MAC_ADDRESS; 99 ctrlData_getParam(pSiteMgr->hCtrlData, ¶m); 100 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.SA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN); 101 102 fc = DOT11_FC_DATA_NULL_FUNCTION; 103 fc |= (TRUE << DOT11_FC_TO_DS_SHIFT); 104 105 pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(fc); 106 107 size = sizeof(dot11_mgmtHeader_t); 108 109 pTemplate->templateLen = size; 110 111 return OK; 112} 113 114/************************************************************************ 115 * buildProbeReqTemplate * 116 ************************************************************************ 117DESCRIPTION: This function build a probe request template to set to the HAL in the scan process. 118 performs the following: 119 - Build a template & set the template len, the template type is set in the site mgr 120 121INPUT: pSiteMgr - Handle to site manager 122 pTemplate - Pointer to the template structure 123 pSsid - Desired SSID 124 125 126OUTPUT: 127 128 129RETURN: OK 130 131************************************************************************/ 132TI_STATUS buildProbeReqTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate, ssid_t *pSsid, radioBand_e radioBand) 133{ 134 paramInfo_t param; 135 char *pBuf; 136 int i; 137 probeReqTemplate_t *pBuffer = (probeReqTemplate_t *)pTemplate->pTemplate; 138 UINT32 size; 139 dot11_RATES_t *pDot11Rates; 140 UINT32 len = 0, ofdmIndex = 0; 141 UINT32 suppRatesLen, extSuppRatesLen; 142 UINT8 ratesBuf[MAX_SUPPORTED_RATES]; 143 UINT32 supportedRateMask,basicRateMask; 144 145 os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(probeReqTemplate_t)); 146 147 /* 148 * Header First 149 */ 150 /* Set destination address */ 151 for (i = 0; i < MAC_ADDR_LEN; i++) 152 pBuffer->hdr.DA.addr[i] = 0xFF; 153 154 /* Set BSSID address */ 155 156 for (i = 0; i < MAC_ADDR_LEN; i++) 157 pBuffer->hdr.BSSID.addr[i] = 0xFF; 158 159 160 /* Build Source address */ 161 param.paramType = CTRL_DATA_MAC_ADDRESS; 162 ctrlData_getParam(pSiteMgr->hCtrlData, ¶m); 163 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.SA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN); 164 165 pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(DOT11_FC_PROBE_REQ); 166 167 size = sizeof(dot11_mgmtHeader_t); 168 pBuf = (char *)&(pBuffer->infoElements); 169 170 /* 171 * Informataion elements 172 */ 173 /* SSID */ 174 ((dot11_SSID_t *)(pBuf))->hdr.eleId = DOT11_SSID_ELE_ID; 175 ((dot11_SSID_t *)(pBuf))->hdr.eleLen = pSsid->len; 176 os_memoryCopy(pSiteMgr->hOs, pBuf + sizeof(dot11_eleHdr_t), (void *)pSsid->ssidString, pSsid->len); 177 size += sizeof(dot11_eleHdr_t) + pSsid->len; 178 pBuf += sizeof(dot11_eleHdr_t) + pSsid->len; 179 180 /* Rates */ 181 pDot11Rates = (dot11_RATES_t *) pBuf; 182 183 /* 184 * Supported rates in probe request will always use the default rates for BG or A bands, 185 * regardless of the STA desired rates. 186 */ 187 if (radioBand == RADIO_BAND_2_4_GHZ) 188 { 189 /* Basic rates: 1,2,5.5,11 */ 190 basicRateMask = translateBasicRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[DOT11_G_MODE], FALSE); 191 /* Extended: 6,9,12,18,24,36,48,54 */ 192 supportedRateMask = translateSupportedRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[DOT11_G_MODE], FALSE); 193 } 194 else if (radioBand == RADIO_BAND_5_0_GHZ) 195 { /* Basic rates: 6,12,24 */ 196 basicRateMask = translateBasicRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[DOT11_A_MODE], TRUE); 197 /* Extended: 9,18,24,36,48,54 */ 198 supportedRateMask = translateSupportedRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[DOT11_A_MODE], TRUE); 199 } 200 else 201 { 202 WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, 203 ("buildProbeReqTemplate, radioBand =%d ???\n",radioBand)); 204 /* Use default and pray for the best */ 205 /* Basic rates: 1,2,5.5,11 */ 206 basicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE); 207 /* Extended: 6,9,12,18,24,36,48,54 */ 208 supportedRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_UP_TO_54, FALSE); 209 } 210 211 bitMapToNetworkStringRates(supportedRateMask, 212 basicRateMask, 213 ratesBuf, &len, &ofdmIndex); 214 215 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, 216 ("buildProbeReqTemplate, supportedRateMask=0x%x, basicRateMask=0x%x, len=%d, ofdmIndex=%d, radioBand =%d\n", 217 supportedRateMask,basicRateMask,len, ofdmIndex, radioBand)); 218 219 220 if(radioBand == RADIO_BAND_5_0_GHZ || 221 pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER || 222 ofdmIndex == len) 223 { 224 pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID; 225 pDot11Rates->hdr.eleLen = len; 226 os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen); 227 size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 228 pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 229 } 230 else 231 { 232 pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID; 233 pDot11Rates->hdr.eleLen = ofdmIndex; 234 os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen); 235 suppRatesLen = pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 236 pDot11Rates = (dot11_RATES_t *) (pBuf + suppRatesLen); 237 pDot11Rates->hdr.eleId = DOT11_EXT_SUPPORTED_RATES_ELE_ID; 238 pDot11Rates->hdr.eleLen = len - ofdmIndex; 239 os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr.eleLen); 240 extSuppRatesLen = pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 241 size += suppRatesLen + extSuppRatesLen; 242 pBuf += suppRatesLen + extSuppRatesLen; 243 } 244 245 pTemplate->templateLen = size; 246 247 return OK; 248} 249 250/************************************************************************ 251 * buildProbeRspTemplate * 252 ************************************************************************ 253DESCRIPTION: This function build a probe response template to set to the HAL 254 when joining an IBSS network. 255 performs the following: 256 - Build a template & set the template len, the template type is set in the site mgr 257 - The template is built based on the chosen site attributes 258 259 NOTE: This function is used to build beacon template too. 260 The site manager set the template type (after thos function returns) to beacon or probe response accordingly. 261 262INPUT: pSiteMgr - Handle to site manager 263 pTemplate - Pointer to the template structure 264 265 266OUTPUT: 267 268 269RETURN: OK 270 271************************************************************************/ 272TI_STATUS buildProbeRspTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate) 273{ 274 paramInfo_t param; 275 UINT8 *pBuf; 276 probeRspTemplate_t *pBuffer = (probeRspTemplate_t *)pTemplate->pTemplate; 277 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite; 278 int i; 279 UINT32 size; 280 dot11_RATES_t *pDot11Rates; 281 dot11_ERP_t *pdot11Erp; 282 UINT32 len = 0, ofdmIndex = 0; 283 BOOL extRates = FALSE; 284 BOOL useProtection,NonErpPresent,barkerPreambleType; 285 UINT8 ratesBuf[MAX_SUPPORTED_RATES]; 286 UINT32 supportedRateMask,basicRateMask; 287 288 os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(probeRspTemplate_t)); 289 290 /* 291 * Header First 292 */ 293 /* Set destination address */ 294 for (i = 0; i < MAC_ADDR_LEN; i++) 295 pBuffer->hdr.DA.addr[i] = 0xFF; 296 297 /* Set BSSID address */ 298 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.BSSID.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN); 299 300 /* Build Source address */ 301 param.paramType = CTRL_DATA_MAC_ADDRESS; 302 ctrlData_getParam(pSiteMgr->hCtrlData, ¶m); 303 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.SA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN); 304 305 pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(DOT11_FC_PROBE_RESP); 306 307 size = sizeof(dot11_mgmtHeader_t); 308 pBuf = (UINT8 *)pBuffer->timeStamp; 309 /* 310 * Fixed Fields 311 */ 312 /* we skip the timestamp field */ 313 size += TIME_STAMP_LEN; 314 pBuf += TIME_STAMP_LEN; 315 316 /* Beacon interval */ 317 *((UINT16 *)pBuf) = pPrimarySite->beaconInterval; 318 size += FIX_FIELD_LEN; 319 pBuf += FIX_FIELD_LEN; 320 321 /* capabilities */ 322 *((UINT16 *)pBuf) = pPrimarySite->capabilities; 323 size += FIX_FIELD_LEN; 324 pBuf += FIX_FIELD_LEN; 325 326 /* 327 * Informataion elements 328 */ 329 /* SSID */ 330 ((dot11_SSID_t *)(pBuf))->hdr.eleId = DOT11_SSID_ELE_ID; 331 ((dot11_SSID_t *)(pBuf))->hdr.eleLen = pPrimarySite->ssid.len; 332 os_memoryCopy(pSiteMgr->hOs, pBuf + sizeof(dot11_eleHdr_t), (void *)pPrimarySite->ssid.ssidString, pPrimarySite->ssid.len); 333 size += sizeof(dot11_eleHdr_t) + pPrimarySite->ssid.len; 334 pBuf += sizeof(dot11_eleHdr_t) + pPrimarySite->ssid.len; 335 336 /* Rates */ 337 338 pDot11Rates = (dot11_RATES_t *) pBuf; 339 340 if (pPrimarySite->channel == SPECIAL_BG_CHANNEL) 341 { 342 supportedRateMask = getSupportedRateMaskForSpecialBGchannel() ; 343 basicRateMask = getBasicRateMaskForSpecialBGchannel(); 344 } 345 else 346 { 347 supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask; 348 basicRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask; 349 } 350 351 bitMapToNetworkStringRates(supportedRateMask, 352 basicRateMask, 353 ratesBuf, &len, &ofdmIndex); 354 355 if(pSiteMgr->siteMgrOperationalMode != DOT11_G_MODE || 356 pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER || 357 ofdmIndex == len) 358 { 359 pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID; 360 pDot11Rates->hdr.eleLen = len; 361 os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen); 362 size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 363 pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 364 } 365 else 366 { 367 pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID; 368 pDot11Rates->hdr.eleLen = ofdmIndex; 369 os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen); 370 size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 371 pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 372 extRates = TRUE; 373 } 374 375 /* DS */ 376 ((dot11_DS_PARAMS_t *)(pBuf))->hdr.eleId = DOT11_DS_PARAMS_ELE_ID; 377 ((dot11_DS_PARAMS_t *)(pBuf))->hdr.eleLen = DOT11_DS_PARAMS_ELE_LEN; 378 ((dot11_DS_PARAMS_t *)(pBuf))->currChannel = pPrimarySite->channel; 379 size += sizeof(dot11_eleHdr_t) + DOT11_DS_PARAMS_ELE_LEN; 380 pBuf += sizeof(dot11_eleHdr_t) + DOT11_DS_PARAMS_ELE_LEN; 381 382 /* IBSS */ 383 ((dot11_IBSS_PARAMS_t *)(pBuf))->hdr.eleId = DOT11_IBSS_PARAMS_ELE_ID; 384 ((dot11_IBSS_PARAMS_t *)(pBuf))->hdr.eleLen = DOT11_IBSS_PARAMS_ELE_LEN; 385#if 1 386 ((UINT8 *)&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow)[0] = ((UINT8 *)&pPrimarySite->atimWindow)[0]; 387 ((UINT8 *)&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow)[1] = ((UINT8 *)&pPrimarySite->atimWindow)[1]; 388#else /* fix for WinCE */ 389 COPY_UNALIGNED_WORD(((UINT8 *)&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow), &pPrimarySite->atimWindow); 390#endif 391 pPrimarySite->atimWindow = ENDIAN_HANDLE_WORD(pPrimarySite->atimWindow); 392 393 size += sizeof(dot11_eleHdr_t) + DOT11_IBSS_PARAMS_ELE_LEN; 394 pBuf += sizeof(dot11_eleHdr_t) + DOT11_IBSS_PARAMS_ELE_LEN; 395 396 /* Add country Information Element */ 397 param.paramType = REGULATORY_DOMAIN_ENABLED_PARAM; 398 regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,¶m); 399 400 if( param.content.regulatoryDomainEnabled == TRUE ) 401 { 402 /* get country IE */ 403 param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM; 404 regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain, ¶m); 405 406 /* Check if a country IE was found */ 407 if(param.content.pCountry != NULL) 408 { 409 *pBuf = DOT11_COUNTRY_ELE_ID; 410 pBuf += 1; 411 size += 1; 412 *pBuf = (UINT8)param.content.pCountry->len; 413 pBuf += 1; 414 size += 1; 415 os_memoryCopy(pSiteMgr->hOs, pBuf , ¶m.content.pCountry->countryIE, param.content.pCountry->len); 416 pBuf += param.content.pCountry->len; 417 size += param.content.pCountry->len; 418 } 419 } 420 421 /*ERP IE*/ 422 siteMgr_IsERP_Needed(pSiteMgr,&useProtection,&NonErpPresent,&barkerPreambleType); 423 if (useProtection || NonErpPresent || barkerPreambleType) 424 { 425 pdot11Erp = (dot11_ERP_t *) pBuf; 426 pdot11Erp->hdr.eleId = DOT11_ERP_IE_ID; 427 pdot11Erp->hdr.eleLen = 1; 428 if (NonErpPresent) 429 pdot11Erp->ctrl |= ERP_IE_NON_ERP_PRESENT_MASK; 430 if (useProtection) 431 pdot11Erp->ctrl |= ERP_IE_USE_PROTECTION_MASK; 432 if (barkerPreambleType) 433 pdot11Erp->ctrl |= ERP_IE_BARKER_PREAMBLE_MODE_MASK; 434 size += pdot11Erp->hdr.eleLen + sizeof(dot11_eleHdr_t); 435 pBuf += pdot11Erp->hdr.eleLen + sizeof(dot11_eleHdr_t); 436 437 } 438 439 440 /* Extended supported rates IE */ 441 if(extRates) 442 { 443 pDot11Rates = (dot11_RATES_t *) pBuf; 444 pDot11Rates->hdr.eleId = DOT11_EXT_SUPPORTED_RATES_ELE_ID; 445 pDot11Rates->hdr.eleLen = len - ofdmIndex; 446 os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr.eleLen); 447 size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 448 pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t); 449 } 450 451 /* no need to insert RSN information elements */ 452 453 pTemplate->templateLen = size; 454 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Probe response template len = %d\n",size)); 455 456 return OK; 457} 458 459/************************************************************************ 460 * buildPsPollTemplate * 461 ************************************************************************ 462DESCRIPTION: This function build a ps poll template 463 performs the following: 464 - Build a template & set the template len, the template type is set in the site mgr 465 466INPUT: pSiteMgr - Handle to site manager 467 pTemplate - Pointer to the template structure 468 pSsid - Desired SSID 469 470OUTPUT: 471 472RETURN: OK 473************************************************************************/ 474TI_STATUS buildPsPollTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate) 475{ 476 paramInfo_t param; 477 whalParamInfo_t whalParam; 478 UINT32 size; 479 psPollTemplate_t *pBuffer = (psPollTemplate_t *)pTemplate->pTemplate; 480 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite; 481 UINT16 fc; 482 483 os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(psPollTemplate_t)); 484 485 /* 486 * Header First 487 */ 488 489 /* Set BSSID address */ 490 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.BSSID.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN); 491 492 /* Build Source address */ 493 param.paramType = CTRL_DATA_MAC_ADDRESS; 494 ctrlData_getParam(pSiteMgr->hCtrlData, ¶m); 495 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.TA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN); 496 497 /* 498 ** Building the Frame Control word (16 bits) 499 ** --------------------------------------------- 500 ** Type = Control 501 ** SubType = Power Save (PS) POLL, */ 502 fc = DOT11_FC_PS_POLL; 503 /* 504 ** setting the Power Management bit in the Frame control field 505 ** to be "Power Save mode" 506 */ 507 fc |= (0x1 << DOT11_FC_PWR_MGMT_SHIFT); 508 509 pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(fc); 510 511 /* 512 ** Association ID 513 ** ----------------- 514 */ 515 whalParam.paramType = HAL_CTRL_AID_PARAM; 516 whalCtrl_GetParam (pSiteMgr->hHalCtrl, &whalParam) ; 517 518 /* AID should have its two MSB bit Set to "1"*/ 519 pBuffer->hdr.AID = whalParam.content.halCtrlAid | 0xC000; 520 521 size = sizeof(dot11_PsPollFrameHeader_t); 522 523 pTemplate->templateLen = size; 524 525 526 527 return OK; 528} 529 530 531/************************************************************************ 532 * buildQosNullDataTemplate * 533 ************************************************************************ 534DESCRIPTION: This function build a qos null data template 535 performs the following: 536 - Build a template & set the template len, the template type is set in the site mgr 537 538INPUT: pSiteMgr - Handle to site manager 539 pTemplate - Pointer to the template structure 540 pSsid - Desired SSID 541 542OUTPUT: 543 544RETURN: OK 545************************************************************************/ 546TI_STATUS buildQosNullDataTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate, UINT8 userPriority) 547{ 548 paramInfo_t param; 549 UINT32 size; 550 QosNullDataTemplate_t *pBuffer = (QosNullDataTemplate_t *)pTemplate->pTemplate; 551 siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite; 552 UINT16 fc; 553 554 os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(QosNullDataTemplate_t)); 555 556 /* 557 * Header First 558 */ 559 /* Set destination address */ 560 if (pPrimarySite) 561 { 562 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.address1.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN); 563 564 /* Set BSSID address */ 565 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.address3.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN); 566 } 567 else 568 { 569 WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("No Primary site so cannot fill QosNullData template\n")); 570 } 571 572 /* Build Source address */ 573 param.paramType = CTRL_DATA_MAC_ADDRESS; 574 ctrlData_getParam(pSiteMgr->hCtrlData, ¶m); 575 os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.address2.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN); 576 577 fc = DOT11_FC_DATA_NULL_QOS; 578 fc |= (TRUE << DOT11_FC_TO_DS_SHIFT); 579 580 pBuffer->hdr.qosControl = (userPriority << QOS_CONTROL_UP_SHIFT); 581 582 pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(fc); 583 584 size = sizeof(dot11_header_t); 585 586 pTemplate->templateLen = size; 587 588 return OK; 589} 590 591 592 593 594 595