164064216a8433360745f69edddce19a606659163The Android Open Source Project/** \file reportReplvl.c
264064216a8433360745f69edddce19a606659163The Android Open Source Project *  \brief Report level implementation
364064216a8433360745f69edddce19a606659163The Android Open Source Project *
464064216a8433360745f69edddce19a606659163The Android Open Source Project *  \see reportReplvl.h
564064216a8433360745f69edddce19a606659163The Android Open Source Project */
664064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
764064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
864064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3564064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3664064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3764064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3864064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
3964064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
4064064216a8433360745f69edddce19a606659163The Android Open Source Project
4164064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************/
4264064216a8433360745f69edddce19a606659163The Android Open Source Project/*																			*/
4364064216a8433360745f69edddce19a606659163The Android Open Source Project/*		MODULE:	reportReplvl.c																*/
4464064216a8433360745f69edddce19a606659163The Android Open Source Project/*    PURPOSE:	Report level implementation	 										*/
4564064216a8433360745f69edddce19a606659163The Android Open Source Project/*																			*/
4664064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************/
4764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
4864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osTIType.h"
4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h"
5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "siteHash.h"
5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
5264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "rsnApi.h"
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "regulatoryDomainApi.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "siteMgrApi.h"
5564064216a8433360745f69edddce19a606659163The Android Open Source Project
5664064216a8433360745f69edddce19a606659163The Android Open Source Project/********************************************/
5764064216a8433360745f69edddce19a606659163The Android Open Source Project/*		Functions Implementations			*/
5864064216a8433360745f69edddce19a606659163The Android Open Source Project/********************************************/
5964064216a8433360745f69edddce19a606659163The Android Open Source Project
6064064216a8433360745f69edddce19a606659163The Android Open Source Project/************************************************************************
6164064216a8433360745f69edddce19a606659163The Android Open Source Project *                        buildNullTemplate								*
6264064216a8433360745f69edddce19a606659163The Android Open Source Project ************************************************************************
6364064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function build a NULL data template to set to the HAL
6464064216a8433360745f69edddce19a606659163The Android Open Source Project				when joining an infrastructure network
6564064216a8433360745f69edddce19a606659163The Android Open Source Project				performs the following:
6664064216a8433360745f69edddce19a606659163The Android Open Source Project				-	Build a template & set the template len, the template type is set in the site mgr
6764064216a8433360745f69edddce19a606659163The Android Open Source Project
6864064216a8433360745f69edddce19a606659163The Android Open Source ProjectINPUT:      pSiteMgr	-	Handle to site manager
6964064216a8433360745f69edddce19a606659163The Android Open Source Project			pTemplate	-	Pointer to the template structure
7064064216a8433360745f69edddce19a606659163The Android Open Source Project
7164064216a8433360745f69edddce19a606659163The Android Open Source Project
7264064216a8433360745f69edddce19a606659163The Android Open Source ProjectOUTPUT:
7364064216a8433360745f69edddce19a606659163The Android Open Source Project
7464064216a8433360745f69edddce19a606659163The Android Open Source Project
7564064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN:     OK
7664064216a8433360745f69edddce19a606659163The Android Open Source Project
7764064216a8433360745f69edddce19a606659163The Android Open Source Project************************************************************************/
7864064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS buildNullTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate)
7964064216a8433360745f69edddce19a606659163The Android Open Source Project{
8064064216a8433360745f69edddce19a606659163The Android Open Source Project	paramInfo_t			param;
8164064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				size;
8264064216a8433360745f69edddce19a606659163The Android Open Source Project	nullDataTemplate_t	*pBuffer = (nullDataTemplate_t	*)pTemplate->pTemplate;
8364064216a8433360745f69edddce19a606659163The Android Open Source Project	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
8464064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT16				fc;
8564064216a8433360745f69edddce19a606659163The Android Open Source Project
8664064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(nullDataTemplate_t));
8764064216a8433360745f69edddce19a606659163The Android Open Source Project
8864064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
8964064216a8433360745f69edddce19a606659163The Android Open Source Project	 * Header First
9064064216a8433360745f69edddce19a606659163The Android Open Source Project	 */
9164064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set destination address */
9264064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.DA.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN);
9364064216a8433360745f69edddce19a606659163The Android Open Source Project
9464064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set BSSID address */
9564064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.BSSID.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN);
9664064216a8433360745f69edddce19a606659163The Android Open Source Project
9764064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Build Source address */
9864064216a8433360745f69edddce19a606659163The Android Open Source Project	param.paramType = CTRL_DATA_MAC_ADDRESS;
9964064216a8433360745f69edddce19a606659163The Android Open Source Project	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
10064064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.SA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN);
10164064216a8433360745f69edddce19a606659163The Android Open Source Project
10264064216a8433360745f69edddce19a606659163The Android Open Source Project	fc = DOT11_FC_DATA_NULL_FUNCTION;
10364064216a8433360745f69edddce19a606659163The Android Open Source Project	fc |= (TRUE << DOT11_FC_TO_DS_SHIFT);
10464064216a8433360745f69edddce19a606659163The Android Open Source Project
10564064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(fc);
10664064216a8433360745f69edddce19a606659163The Android Open Source Project
10764064216a8433360745f69edddce19a606659163The Android Open Source Project	size = sizeof(dot11_mgmtHeader_t);
10864064216a8433360745f69edddce19a606659163The Android Open Source Project
10964064216a8433360745f69edddce19a606659163The Android Open Source Project	pTemplate->templateLen = size;
11064064216a8433360745f69edddce19a606659163The Android Open Source Project
11164064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
11264064216a8433360745f69edddce19a606659163The Android Open Source Project}
11364064216a8433360745f69edddce19a606659163The Android Open Source Project
11464064216a8433360745f69edddce19a606659163The Android Open Source Project/************************************************************************
11564064216a8433360745f69edddce19a606659163The Android Open Source Project *                        buildProbeReqTemplate							*
11664064216a8433360745f69edddce19a606659163The Android Open Source Project ************************************************************************
11764064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function build a probe request template to set to the HAL in the scan process.
11864064216a8433360745f69edddce19a606659163The Android Open Source Project				performs the following:
11964064216a8433360745f69edddce19a606659163The Android Open Source Project				-	Build a template & set the template len, the template type is set in the site mgr
12064064216a8433360745f69edddce19a606659163The Android Open Source Project
12164064216a8433360745f69edddce19a606659163The Android Open Source ProjectINPUT:      pSiteMgr	-	Handle to site manager
12264064216a8433360745f69edddce19a606659163The Android Open Source Project			pTemplate	-	Pointer to the template structure
12364064216a8433360745f69edddce19a606659163The Android Open Source Project			pSsid		-	Desired SSID
12464064216a8433360745f69edddce19a606659163The Android Open Source Project
12564064216a8433360745f69edddce19a606659163The Android Open Source Project
12664064216a8433360745f69edddce19a606659163The Android Open Source ProjectOUTPUT:
12764064216a8433360745f69edddce19a606659163The Android Open Source Project
12864064216a8433360745f69edddce19a606659163The Android Open Source Project
12964064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN:     OK
13064064216a8433360745f69edddce19a606659163The Android Open Source Project
13164064216a8433360745f69edddce19a606659163The Android Open Source Project************************************************************************/
13264064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS buildProbeReqTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate, ssid_t *pSsid, radioBand_e radioBand)
13364064216a8433360745f69edddce19a606659163The Android Open Source Project{
13464064216a8433360745f69edddce19a606659163The Android Open Source Project	paramInfo_t			param;
13564064216a8433360745f69edddce19a606659163The Android Open Source Project	char				*pBuf;
13664064216a8433360745f69edddce19a606659163The Android Open Source Project	int i;
13764064216a8433360745f69edddce19a606659163The Android Open Source Project	probeReqTemplate_t	*pBuffer = (probeReqTemplate_t	*)pTemplate->pTemplate;
13864064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				size;
13964064216a8433360745f69edddce19a606659163The Android Open Source Project	dot11_RATES_t		*pDot11Rates;
14064064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				len = 0, ofdmIndex = 0;
14164064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				suppRatesLen, extSuppRatesLen;
14264064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT8				ratesBuf[MAX_SUPPORTED_RATES];
14364064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				supportedRateMask,basicRateMask;
14464064216a8433360745f69edddce19a606659163The Android Open Source Project
14564064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(probeReqTemplate_t));
14664064216a8433360745f69edddce19a606659163The Android Open Source Project
14764064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
14864064216a8433360745f69edddce19a606659163The Android Open Source Project	 * Header First
14964064216a8433360745f69edddce19a606659163The Android Open Source Project	 */
15064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set destination address */
15164064216a8433360745f69edddce19a606659163The Android Open Source Project	for (i = 0; i < MAC_ADDR_LEN; i++)
15264064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuffer->hdr.DA.addr[i] = 0xFF;
15364064216a8433360745f69edddce19a606659163The Android Open Source Project
15464064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set BSSID address */
15564064216a8433360745f69edddce19a606659163The Android Open Source Project
15664064216a8433360745f69edddce19a606659163The Android Open Source Project	for (i = 0; i < MAC_ADDR_LEN; i++)
15764064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuffer->hdr.BSSID.addr[i] = 0xFF;
15864064216a8433360745f69edddce19a606659163The Android Open Source Project
15964064216a8433360745f69edddce19a606659163The Android Open Source Project
16064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Build Source address */
16164064216a8433360745f69edddce19a606659163The Android Open Source Project	param.paramType = CTRL_DATA_MAC_ADDRESS;
16264064216a8433360745f69edddce19a606659163The Android Open Source Project	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
16364064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.SA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN);
16464064216a8433360745f69edddce19a606659163The Android Open Source Project
16564064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(DOT11_FC_PROBE_REQ);
16664064216a8433360745f69edddce19a606659163The Android Open Source Project
16764064216a8433360745f69edddce19a606659163The Android Open Source Project	size = sizeof(dot11_mgmtHeader_t);
16864064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf = (char *)&(pBuffer->infoElements);
16964064216a8433360745f69edddce19a606659163The Android Open Source Project
17064064216a8433360745f69edddce19a606659163The Android Open Source Project   /*
17164064216a8433360745f69edddce19a606659163The Android Open Source Project	* Informataion elements
17264064216a8433360745f69edddce19a606659163The Android Open Source Project	*/
17364064216a8433360745f69edddce19a606659163The Android Open Source Project	/* SSID */
17464064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_SSID_t *)(pBuf))->hdr.eleId = DOT11_SSID_ELE_ID;
17564064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_SSID_t *)(pBuf))->hdr.eleLen = pSsid->len;
17664064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, pBuf + sizeof(dot11_eleHdr_t), (void *)pSsid->ssidString, pSsid->len);
17764064216a8433360745f69edddce19a606659163The Android Open Source Project	size += sizeof(dot11_eleHdr_t) + pSsid->len;
17864064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += sizeof(dot11_eleHdr_t) + pSsid->len;
17964064216a8433360745f69edddce19a606659163The Android Open Source Project
18064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Rates */
18164064216a8433360745f69edddce19a606659163The Android Open Source Project	pDot11Rates = (dot11_RATES_t *) pBuf;
18264064216a8433360745f69edddce19a606659163The Android Open Source Project
18364064216a8433360745f69edddce19a606659163The Android Open Source Project    /*
18464064216a8433360745f69edddce19a606659163The Android Open Source Project     * Supported rates in probe request will always use the default rates for BG or A bands,
18564064216a8433360745f69edddce19a606659163The Android Open Source Project     * regardless of the STA desired rates.
18664064216a8433360745f69edddce19a606659163The Android Open Source Project     */
18764064216a8433360745f69edddce19a606659163The Android Open Source Project    if (radioBand == RADIO_BAND_2_4_GHZ)
18864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
18964064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Basic rates: 1,2,5.5,11 */
19064064216a8433360745f69edddce19a606659163The Android Open Source Project		basicRateMask = translateBasicRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[DOT11_G_MODE], FALSE);
19164064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Extended: 6,9,12,18,24,36,48,54 */
19264064216a8433360745f69edddce19a606659163The Android Open Source Project        supportedRateMask = translateSupportedRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[DOT11_G_MODE], FALSE);
19364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
19464064216a8433360745f69edddce19a606659163The Android Open Source Project    else if (radioBand == RADIO_BAND_5_0_GHZ)
19564064216a8433360745f69edddce19a606659163The Android Open Source Project    {   /* Basic rates: 6,12,24 */
19664064216a8433360745f69edddce19a606659163The Android Open Source Project        basicRateMask = translateBasicRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[DOT11_A_MODE], TRUE);
19764064216a8433360745f69edddce19a606659163The Android Open Source Project         /* Extended: 9,18,24,36,48,54 */
19864064216a8433360745f69edddce19a606659163The Android Open Source Project        supportedRateMask = translateSupportedRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[DOT11_A_MODE], TRUE);
19964064216a8433360745f69edddce19a606659163The Android Open Source Project	}
20064064216a8433360745f69edddce19a606659163The Android Open Source Project	else
20164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
20264064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
20364064216a8433360745f69edddce19a606659163The Android Open Source Project            ("buildProbeReqTemplate, radioBand =%d ???\n",radioBand));
20464064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Use default and pray for the best */
20564064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Basic rates: 1,2,5.5,11 */
20664064216a8433360745f69edddce19a606659163The Android Open Source Project        basicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
20764064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Extended: 6,9,12,18,24,36,48,54 */
20864064216a8433360745f69edddce19a606659163The Android Open Source Project        supportedRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_UP_TO_54, FALSE);
20964064216a8433360745f69edddce19a606659163The Android Open Source Project	}
21064064216a8433360745f69edddce19a606659163The Android Open Source Project
21164064216a8433360745f69edddce19a606659163The Android Open Source Project	bitMapToNetworkStringRates(supportedRateMask,
21264064216a8433360745f69edddce19a606659163The Android Open Source Project							   basicRateMask,
21364064216a8433360745f69edddce19a606659163The Android Open Source Project                           ratesBuf, &len, &ofdmIndex);
21464064216a8433360745f69edddce19a606659163The Android Open Source Project
21564064216a8433360745f69edddce19a606659163The Android Open Source Project	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
21664064216a8433360745f69edddce19a606659163The Android Open Source Project                            ("buildProbeReqTemplate, supportedRateMask=0x%x, basicRateMask=0x%x, len=%d, ofdmIndex=%d, radioBand =%d\n",
21764064216a8433360745f69edddce19a606659163The Android Open Source Project                             supportedRateMask,basicRateMask,len, ofdmIndex, radioBand));
21864064216a8433360745f69edddce19a606659163The Android Open Source Project
21964064216a8433360745f69edddce19a606659163The Android Open Source Project
22064064216a8433360745f69edddce19a606659163The Android Open Source Project    if(radioBand == RADIO_BAND_5_0_GHZ ||
22164064216a8433360745f69edddce19a606659163The Android Open Source Project       pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
22264064216a8433360745f69edddce19a606659163The Android Open Source Project	   ofdmIndex == len)
22364064216a8433360745f69edddce19a606659163The Android Open Source Project	{
22464064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
22564064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleLen = len;
22664064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen);
22764064216a8433360745f69edddce19a606659163The Android Open Source Project		size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
22864064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
22964064216a8433360745f69edddce19a606659163The Android Open Source Project	}
23064064216a8433360745f69edddce19a606659163The Android Open Source Project	else
23164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
23264064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
23364064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleLen = ofdmIndex;
23464064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen);
23564064216a8433360745f69edddce19a606659163The Android Open Source Project		suppRatesLen = pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
23664064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates = (dot11_RATES_t *) (pBuf + suppRatesLen);
23764064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleId = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
23864064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleLen = len - ofdmIndex;
23964064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr.eleLen);
24064064216a8433360745f69edddce19a606659163The Android Open Source Project		extSuppRatesLen = pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
24164064216a8433360745f69edddce19a606659163The Android Open Source Project		size += suppRatesLen + extSuppRatesLen;
24264064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuf += suppRatesLen + extSuppRatesLen;
24364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
24464064216a8433360745f69edddce19a606659163The Android Open Source Project
24564064216a8433360745f69edddce19a606659163The Android Open Source Project	pTemplate->templateLen = size;
24664064216a8433360745f69edddce19a606659163The Android Open Source Project
24764064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
24864064216a8433360745f69edddce19a606659163The Android Open Source Project}
24964064216a8433360745f69edddce19a606659163The Android Open Source Project
25064064216a8433360745f69edddce19a606659163The Android Open Source Project/************************************************************************
25164064216a8433360745f69edddce19a606659163The Android Open Source Project *                        buildProbeRspTemplate							*
25264064216a8433360745f69edddce19a606659163The Android Open Source Project ************************************************************************
25364064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function build a probe response template to set to the HAL
25464064216a8433360745f69edddce19a606659163The Android Open Source Project				when joining an IBSS network.
25564064216a8433360745f69edddce19a606659163The Android Open Source Project				performs the following:
25664064216a8433360745f69edddce19a606659163The Android Open Source Project				-	Build a template & set the template len, the template type is set in the site mgr
25764064216a8433360745f69edddce19a606659163The Android Open Source Project				-	The template is built based on the chosen site attributes
25864064216a8433360745f69edddce19a606659163The Android Open Source Project
25964064216a8433360745f69edddce19a606659163The Android Open Source Project			NOTE: This function is used to build beacon template too.
26064064216a8433360745f69edddce19a606659163The Android Open Source Project			The site manager set the template type (after thos function returns) to beacon or probe response accordingly.
26164064216a8433360745f69edddce19a606659163The Android Open Source Project
26264064216a8433360745f69edddce19a606659163The Android Open Source ProjectINPUT:      pSiteMgr	-	Handle to site manager
26364064216a8433360745f69edddce19a606659163The Android Open Source Project			pTemplate	-	Pointer to the template structure
26464064216a8433360745f69edddce19a606659163The Android Open Source Project
26564064216a8433360745f69edddce19a606659163The Android Open Source Project
26664064216a8433360745f69edddce19a606659163The Android Open Source ProjectOUTPUT:
26764064216a8433360745f69edddce19a606659163The Android Open Source Project
26864064216a8433360745f69edddce19a606659163The Android Open Source Project
26964064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN:     OK
27064064216a8433360745f69edddce19a606659163The Android Open Source Project
27164064216a8433360745f69edddce19a606659163The Android Open Source Project************************************************************************/
27264064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS buildProbeRspTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate)
27364064216a8433360745f69edddce19a606659163The Android Open Source Project{
27464064216a8433360745f69edddce19a606659163The Android Open Source Project	paramInfo_t			param;
27564064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT8				*pBuf;
27664064216a8433360745f69edddce19a606659163The Android Open Source Project	probeRspTemplate_t	*pBuffer = (probeRspTemplate_t	*)pTemplate->pTemplate;
27764064216a8433360745f69edddce19a606659163The Android Open Source Project	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
27864064216a8433360745f69edddce19a606659163The Android Open Source Project	int i;
27964064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				size;
28064064216a8433360745f69edddce19a606659163The Android Open Source Project	dot11_RATES_t		*pDot11Rates;
28164064216a8433360745f69edddce19a606659163The Android Open Source Project	dot11_ERP_t         *pdot11Erp;
28264064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				len = 0, ofdmIndex = 0;
28364064216a8433360745f69edddce19a606659163The Android Open Source Project	BOOL				extRates = FALSE;
28464064216a8433360745f69edddce19a606659163The Android Open Source Project	BOOL                useProtection,NonErpPresent,barkerPreambleType;
28564064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT8				ratesBuf[MAX_SUPPORTED_RATES];
28664064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				supportedRateMask,basicRateMask;
28764064216a8433360745f69edddce19a606659163The Android Open Source Project
28864064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(probeRspTemplate_t));
28964064216a8433360745f69edddce19a606659163The Android Open Source Project
29064064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
29164064216a8433360745f69edddce19a606659163The Android Open Source Project	 * Header First
29264064216a8433360745f69edddce19a606659163The Android Open Source Project	 */
29364064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set destination address */
29464064216a8433360745f69edddce19a606659163The Android Open Source Project	for (i = 0; i < MAC_ADDR_LEN; i++)
29564064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuffer->hdr.DA.addr[i] = 0xFF;
29664064216a8433360745f69edddce19a606659163The Android Open Source Project
29764064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set BSSID address */
29864064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.BSSID.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN);
29964064216a8433360745f69edddce19a606659163The Android Open Source Project
30064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Build Source address */
30164064216a8433360745f69edddce19a606659163The Android Open Source Project	param.paramType = CTRL_DATA_MAC_ADDRESS;
30264064216a8433360745f69edddce19a606659163The Android Open Source Project	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
30364064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.SA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN);
30464064216a8433360745f69edddce19a606659163The Android Open Source Project
30564064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(DOT11_FC_PROBE_RESP);
30664064216a8433360745f69edddce19a606659163The Android Open Source Project
30764064216a8433360745f69edddce19a606659163The Android Open Source Project	size = sizeof(dot11_mgmtHeader_t);
30864064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf = (UINT8 *)pBuffer->timeStamp;
30964064216a8433360745f69edddce19a606659163The Android Open Source Project   /*
31064064216a8433360745f69edddce19a606659163The Android Open Source Project	* Fixed Fields
31164064216a8433360745f69edddce19a606659163The Android Open Source Project	*/
31264064216a8433360745f69edddce19a606659163The Android Open Source Project	/* we skip the timestamp field */
31364064216a8433360745f69edddce19a606659163The Android Open Source Project	size += TIME_STAMP_LEN;
31464064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += TIME_STAMP_LEN;
31564064216a8433360745f69edddce19a606659163The Android Open Source Project
31664064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Beacon interval */
31764064216a8433360745f69edddce19a606659163The Android Open Source Project	*((UINT16 *)pBuf) = pPrimarySite->beaconInterval;
31864064216a8433360745f69edddce19a606659163The Android Open Source Project	size += FIX_FIELD_LEN;
31964064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += FIX_FIELD_LEN;
32064064216a8433360745f69edddce19a606659163The Android Open Source Project
32164064216a8433360745f69edddce19a606659163The Android Open Source Project	/* capabilities */
32264064216a8433360745f69edddce19a606659163The Android Open Source Project	*((UINT16 *)pBuf) = pPrimarySite->capabilities;
32364064216a8433360745f69edddce19a606659163The Android Open Source Project	size += FIX_FIELD_LEN;
32464064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += FIX_FIELD_LEN;
32564064216a8433360745f69edddce19a606659163The Android Open Source Project
32664064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
32764064216a8433360745f69edddce19a606659163The Android Open Source Project	* Informataion elements
32864064216a8433360745f69edddce19a606659163The Android Open Source Project	*/
32964064216a8433360745f69edddce19a606659163The Android Open Source Project	/* SSID */
33064064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_SSID_t *)(pBuf))->hdr.eleId = DOT11_SSID_ELE_ID;
33164064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_SSID_t *)(pBuf))->hdr.eleLen = pPrimarySite->ssid.len;
33264064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, pBuf + sizeof(dot11_eleHdr_t), (void *)pPrimarySite->ssid.ssidString, pPrimarySite->ssid.len);
33364064216a8433360745f69edddce19a606659163The Android Open Source Project	size += sizeof(dot11_eleHdr_t) + pPrimarySite->ssid.len;
33464064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += sizeof(dot11_eleHdr_t) + pPrimarySite->ssid.len;
33564064216a8433360745f69edddce19a606659163The Android Open Source Project
33664064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Rates */
33764064216a8433360745f69edddce19a606659163The Android Open Source Project
33864064216a8433360745f69edddce19a606659163The Android Open Source Project	pDot11Rates = (dot11_RATES_t *) pBuf;
33964064216a8433360745f69edddce19a606659163The Android Open Source Project
34064064216a8433360745f69edddce19a606659163The Android Open Source Project	if (pPrimarySite->channel == SPECIAL_BG_CHANNEL)
34164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
34264064216a8433360745f69edddce19a606659163The Android Open Source Project		supportedRateMask = getSupportedRateMaskForSpecialBGchannel() ;
34364064216a8433360745f69edddce19a606659163The Android Open Source Project		basicRateMask	  = getBasicRateMaskForSpecialBGchannel();
34464064216a8433360745f69edddce19a606659163The Android Open Source Project	}
34564064216a8433360745f69edddce19a606659163The Android Open Source Project	else
34664064216a8433360745f69edddce19a606659163The Android Open Source Project	{
34764064216a8433360745f69edddce19a606659163The Android Open Source Project		supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
34864064216a8433360745f69edddce19a606659163The Android Open Source Project		basicRateMask     = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
34964064216a8433360745f69edddce19a606659163The Android Open Source Project	}
35064064216a8433360745f69edddce19a606659163The Android Open Source Project
35164064216a8433360745f69edddce19a606659163The Android Open Source Project	bitMapToNetworkStringRates(supportedRateMask,
35264064216a8433360745f69edddce19a606659163The Android Open Source Project							   basicRateMask,
35364064216a8433360745f69edddce19a606659163The Android Open Source Project							   ratesBuf, &len, &ofdmIndex);
35464064216a8433360745f69edddce19a606659163The Android Open Source Project
35564064216a8433360745f69edddce19a606659163The Android Open Source Project    if(pSiteMgr->siteMgrOperationalMode != DOT11_G_MODE ||
35664064216a8433360745f69edddce19a606659163The Android Open Source Project       pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
35764064216a8433360745f69edddce19a606659163The Android Open Source Project	   ofdmIndex == len)
35864064216a8433360745f69edddce19a606659163The Android Open Source Project	{
35964064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
36064064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleLen = len;
36164064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen);
36264064216a8433360745f69edddce19a606659163The Android Open Source Project		size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
36364064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
36464064216a8433360745f69edddce19a606659163The Android Open Source Project	}
36564064216a8433360745f69edddce19a606659163The Android Open Source Project	else
36664064216a8433360745f69edddce19a606659163The Android Open Source Project	{
36764064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleId = DOT11_SUPPORTED_RATES_ELE_ID;
36864064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleLen = ofdmIndex;
36964064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr.eleLen);
37064064216a8433360745f69edddce19a606659163The Android Open Source Project		size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
37164064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
37264064216a8433360745f69edddce19a606659163The Android Open Source Project		extRates = TRUE;
37364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
37464064216a8433360745f69edddce19a606659163The Android Open Source Project
37564064216a8433360745f69edddce19a606659163The Android Open Source Project	/* DS */
37664064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_DS_PARAMS_t *)(pBuf))->hdr.eleId = DOT11_DS_PARAMS_ELE_ID;
37764064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_DS_PARAMS_t *)(pBuf))->hdr.eleLen = DOT11_DS_PARAMS_ELE_LEN;
37864064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_DS_PARAMS_t *)(pBuf))->currChannel = pPrimarySite->channel;
37964064216a8433360745f69edddce19a606659163The Android Open Source Project	size += sizeof(dot11_eleHdr_t) + DOT11_DS_PARAMS_ELE_LEN;
38064064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += sizeof(dot11_eleHdr_t) + DOT11_DS_PARAMS_ELE_LEN;
38164064216a8433360745f69edddce19a606659163The Android Open Source Project
38264064216a8433360745f69edddce19a606659163The Android Open Source Project	/* IBSS */
38364064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_IBSS_PARAMS_t *)(pBuf))->hdr.eleId = DOT11_IBSS_PARAMS_ELE_ID;
38464064216a8433360745f69edddce19a606659163The Android Open Source Project	((dot11_IBSS_PARAMS_t *)(pBuf))->hdr.eleLen = DOT11_IBSS_PARAMS_ELE_LEN;
38564064216a8433360745f69edddce19a606659163The Android Open Source Project#if 1
38664064216a8433360745f69edddce19a606659163The Android Open Source Project	((UINT8 *)&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow)[0] = ((UINT8 *)&pPrimarySite->atimWindow)[0];
38764064216a8433360745f69edddce19a606659163The Android Open Source Project	((UINT8 *)&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow)[1] = ((UINT8 *)&pPrimarySite->atimWindow)[1];
38864064216a8433360745f69edddce19a606659163The Android Open Source Project#else /* fix for WinCE */
38964064216a8433360745f69edddce19a606659163The Android Open Source Project	COPY_UNALIGNED_WORD(((UINT8 *)&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow), &pPrimarySite->atimWindow);
39064064216a8433360745f69edddce19a606659163The Android Open Source Project#endif
39164064216a8433360745f69edddce19a606659163The Android Open Source Project	pPrimarySite->atimWindow = ENDIAN_HANDLE_WORD(pPrimarySite->atimWindow);
39264064216a8433360745f69edddce19a606659163The Android Open Source Project
39364064216a8433360745f69edddce19a606659163The Android Open Source Project	size += sizeof(dot11_eleHdr_t) + DOT11_IBSS_PARAMS_ELE_LEN;
39464064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuf += sizeof(dot11_eleHdr_t) + DOT11_IBSS_PARAMS_ELE_LEN;
39564064216a8433360745f69edddce19a606659163The Android Open Source Project
39664064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Add country Information Element */
39764064216a8433360745f69edddce19a606659163The Android Open Source Project	param.paramType = REGULATORY_DOMAIN_ENABLED_PARAM;
39864064216a8433360745f69edddce19a606659163The Android Open Source Project	regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
39964064216a8433360745f69edddce19a606659163The Android Open Source Project
40064064216a8433360745f69edddce19a606659163The Android Open Source Project	if(	param.content.regulatoryDomainEnabled == TRUE )
40164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
40264064216a8433360745f69edddce19a606659163The Android Open Source Project        /* get country IE */
40364064216a8433360745f69edddce19a606659163The Android Open Source Project        param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM;
40464064216a8433360745f69edddce19a606659163The Android Open Source Project		regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain, &param);
40564064216a8433360745f69edddce19a606659163The Android Open Source Project
40664064216a8433360745f69edddce19a606659163The Android Open Source Project        /* Check if a country IE was found */
40764064216a8433360745f69edddce19a606659163The Android Open Source Project		if(param.content.pCountry != NULL)
40864064216a8433360745f69edddce19a606659163The Android Open Source Project		{
40964064216a8433360745f69edddce19a606659163The Android Open Source Project			*pBuf = DOT11_COUNTRY_ELE_ID;
41064064216a8433360745f69edddce19a606659163The Android Open Source Project			pBuf += 1;
41164064216a8433360745f69edddce19a606659163The Android Open Source Project			size += 1;
41264064216a8433360745f69edddce19a606659163The Android Open Source Project			*pBuf = (UINT8)param.content.pCountry->len;
41364064216a8433360745f69edddce19a606659163The Android Open Source Project			pBuf += 1;
41464064216a8433360745f69edddce19a606659163The Android Open Source Project			size += 1;
41564064216a8433360745f69edddce19a606659163The Android Open Source Project			os_memoryCopy(pSiteMgr->hOs, pBuf , &param.content.pCountry->countryIE, param.content.pCountry->len);
41664064216a8433360745f69edddce19a606659163The Android Open Source Project			pBuf += param.content.pCountry->len;
41764064216a8433360745f69edddce19a606659163The Android Open Source Project			size += param.content.pCountry->len;
41864064216a8433360745f69edddce19a606659163The Android Open Source Project		}
41964064216a8433360745f69edddce19a606659163The Android Open Source Project	}
42064064216a8433360745f69edddce19a606659163The Android Open Source Project
42164064216a8433360745f69edddce19a606659163The Android Open Source Project	/*ERP IE*/
42264064216a8433360745f69edddce19a606659163The Android Open Source Project	siteMgr_IsERP_Needed(pSiteMgr,&useProtection,&NonErpPresent,&barkerPreambleType);
42364064216a8433360745f69edddce19a606659163The Android Open Source Project	if (useProtection || NonErpPresent || barkerPreambleType)
42464064216a8433360745f69edddce19a606659163The Android Open Source Project	{
42564064216a8433360745f69edddce19a606659163The Android Open Source Project		pdot11Erp = (dot11_ERP_t *) pBuf;
42664064216a8433360745f69edddce19a606659163The Android Open Source Project		pdot11Erp->hdr.eleId = DOT11_ERP_IE_ID;
42764064216a8433360745f69edddce19a606659163The Android Open Source Project		pdot11Erp->hdr.eleLen = 1;
42864064216a8433360745f69edddce19a606659163The Android Open Source Project		if (NonErpPresent)
42964064216a8433360745f69edddce19a606659163The Android Open Source Project			pdot11Erp->ctrl |= ERP_IE_NON_ERP_PRESENT_MASK;
43064064216a8433360745f69edddce19a606659163The Android Open Source Project		if (useProtection)
43164064216a8433360745f69edddce19a606659163The Android Open Source Project			pdot11Erp->ctrl |= ERP_IE_USE_PROTECTION_MASK;
43264064216a8433360745f69edddce19a606659163The Android Open Source Project		if (barkerPreambleType)
43364064216a8433360745f69edddce19a606659163The Android Open Source Project			pdot11Erp->ctrl |= ERP_IE_BARKER_PREAMBLE_MODE_MASK;
43464064216a8433360745f69edddce19a606659163The Android Open Source Project		size += pdot11Erp->hdr.eleLen + sizeof(dot11_eleHdr_t);
43564064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuf += pdot11Erp->hdr.eleLen + sizeof(dot11_eleHdr_t);
43664064216a8433360745f69edddce19a606659163The Android Open Source Project
43764064216a8433360745f69edddce19a606659163The Android Open Source Project	}
43864064216a8433360745f69edddce19a606659163The Android Open Source Project
43964064216a8433360745f69edddce19a606659163The Android Open Source Project
44064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Extended supported rates IE */
44164064216a8433360745f69edddce19a606659163The Android Open Source Project	if(extRates)
44264064216a8433360745f69edddce19a606659163The Android Open Source Project	{
44364064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates = (dot11_RATES_t *) pBuf;
44464064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleId = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
44564064216a8433360745f69edddce19a606659163The Android Open Source Project		pDot11Rates->hdr.eleLen = len - ofdmIndex;
44664064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr.eleLen);
44764064216a8433360745f69edddce19a606659163The Android Open Source Project		size += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
44864064216a8433360745f69edddce19a606659163The Android Open Source Project		pBuf += pDot11Rates->hdr.eleLen + sizeof(dot11_eleHdr_t);
44964064216a8433360745f69edddce19a606659163The Android Open Source Project	}
45064064216a8433360745f69edddce19a606659163The Android Open Source Project
45164064216a8433360745f69edddce19a606659163The Android Open Source Project    /* no need to insert RSN information elements */
45264064216a8433360745f69edddce19a606659163The Android Open Source Project
45364064216a8433360745f69edddce19a606659163The Android Open Source Project	pTemplate->templateLen = size;
45464064216a8433360745f69edddce19a606659163The Android Open Source Project	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("Probe response template len = %d\n",size));
45564064216a8433360745f69edddce19a606659163The Android Open Source Project
45664064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
45764064216a8433360745f69edddce19a606659163The Android Open Source Project}
45864064216a8433360745f69edddce19a606659163The Android Open Source Project
45964064216a8433360745f69edddce19a606659163The Android Open Source Project/************************************************************************
46064064216a8433360745f69edddce19a606659163The Android Open Source Project *                        buildPsPollTemplate							*
46164064216a8433360745f69edddce19a606659163The Android Open Source Project ************************************************************************
46264064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function build a ps poll template
46364064216a8433360745f69edddce19a606659163The Android Open Source Project				performs the following:
46464064216a8433360745f69edddce19a606659163The Android Open Source Project				-	Build a template & set the template len, the template type is set in the site mgr
46564064216a8433360745f69edddce19a606659163The Android Open Source Project
46664064216a8433360745f69edddce19a606659163The Android Open Source ProjectINPUT:      pSiteMgr	-	Handle to site manager
46764064216a8433360745f69edddce19a606659163The Android Open Source Project			pTemplate	-	Pointer to the template structure
46864064216a8433360745f69edddce19a606659163The Android Open Source Project			pSsid		-	Desired SSID
46964064216a8433360745f69edddce19a606659163The Android Open Source Project
47064064216a8433360745f69edddce19a606659163The Android Open Source ProjectOUTPUT:
47164064216a8433360745f69edddce19a606659163The Android Open Source Project
47264064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN:     OK
47364064216a8433360745f69edddce19a606659163The Android Open Source Project************************************************************************/
47464064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS buildPsPollTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate)
47564064216a8433360745f69edddce19a606659163The Android Open Source Project{
47664064216a8433360745f69edddce19a606659163The Android Open Source Project    paramInfo_t			param;
47764064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParamInfo_t     whalParam;
47864064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				size;
47964064216a8433360745f69edddce19a606659163The Android Open Source Project	psPollTemplate_t	*pBuffer = (psPollTemplate_t *)pTemplate->pTemplate;
48064064216a8433360745f69edddce19a606659163The Android Open Source Project	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
48164064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT16				fc;
48264064216a8433360745f69edddce19a606659163The Android Open Source Project
48364064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(psPollTemplate_t));
48464064216a8433360745f69edddce19a606659163The Android Open Source Project
48564064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
48664064216a8433360745f69edddce19a606659163The Android Open Source Project	 * Header First
48764064216a8433360745f69edddce19a606659163The Android Open Source Project	 */
48864064216a8433360745f69edddce19a606659163The Android Open Source Project
48964064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set BSSID address */
49064064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.BSSID.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN);
49164064216a8433360745f69edddce19a606659163The Android Open Source Project
49264064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Build Source address */
49364064216a8433360745f69edddce19a606659163The Android Open Source Project	param.paramType = CTRL_DATA_MAC_ADDRESS;
49464064216a8433360745f69edddce19a606659163The Android Open Source Project	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
49564064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.TA.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN);
49664064216a8433360745f69edddce19a606659163The Android Open Source Project
49764064216a8433360745f69edddce19a606659163The Android Open Source Project    /*
49864064216a8433360745f69edddce19a606659163The Android Open Source Project    **   Building the Frame Control word (16 bits)
49964064216a8433360745f69edddce19a606659163The Android Open Source Project    ** ---------------------------------------------
50064064216a8433360745f69edddce19a606659163The Android Open Source Project    ** Type = Control
50164064216a8433360745f69edddce19a606659163The Android Open Source Project    ** SubType = Power Save (PS) POLL,  */
50264064216a8433360745f69edddce19a606659163The Android Open Source Project    fc = DOT11_FC_PS_POLL;
50364064216a8433360745f69edddce19a606659163The Android Open Source Project    /*
50464064216a8433360745f69edddce19a606659163The Android Open Source Project    ** setting the Power Management bit in the Frame control field
50564064216a8433360745f69edddce19a606659163The Android Open Source Project    ** to be "Power Save mode"
50664064216a8433360745f69edddce19a606659163The Android Open Source Project    */
50764064216a8433360745f69edddce19a606659163The Android Open Source Project    fc |= (0x1 << DOT11_FC_PWR_MGMT_SHIFT);
50864064216a8433360745f69edddce19a606659163The Android Open Source Project
50964064216a8433360745f69edddce19a606659163The Android Open Source Project    pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(fc);
51064064216a8433360745f69edddce19a606659163The Android Open Source Project
51164064216a8433360745f69edddce19a606659163The Android Open Source Project    /*
51264064216a8433360745f69edddce19a606659163The Android Open Source Project    **   Association ID
51364064216a8433360745f69edddce19a606659163The Android Open Source Project    ** -----------------
51464064216a8433360745f69edddce19a606659163The Android Open Source Project    */
51564064216a8433360745f69edddce19a606659163The Android Open Source Project    whalParam.paramType = HAL_CTRL_AID_PARAM;
51664064216a8433360745f69edddce19a606659163The Android Open Source Project    whalCtrl_GetParam (pSiteMgr->hHalCtrl, &whalParam) ;
51764064216a8433360745f69edddce19a606659163The Android Open Source Project
51864064216a8433360745f69edddce19a606659163The Android Open Source Project    /* AID should have its two MSB bit Set to "1"*/
51964064216a8433360745f69edddce19a606659163The Android Open Source Project    pBuffer->hdr.AID = whalParam.content.halCtrlAid | 0xC000;
52064064216a8433360745f69edddce19a606659163The Android Open Source Project
52164064216a8433360745f69edddce19a606659163The Android Open Source Project	size = sizeof(dot11_PsPollFrameHeader_t);
52264064216a8433360745f69edddce19a606659163The Android Open Source Project
52364064216a8433360745f69edddce19a606659163The Android Open Source Project	pTemplate->templateLen = size;
52464064216a8433360745f69edddce19a606659163The Android Open Source Project
52564064216a8433360745f69edddce19a606659163The Android Open Source Project
52664064216a8433360745f69edddce19a606659163The Android Open Source Project
52764064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
52864064216a8433360745f69edddce19a606659163The Android Open Source Project}
52964064216a8433360745f69edddce19a606659163The Android Open Source Project
53064064216a8433360745f69edddce19a606659163The Android Open Source Project
53164064216a8433360745f69edddce19a606659163The Android Open Source Project/************************************************************************
53264064216a8433360745f69edddce19a606659163The Android Open Source Project *                        buildQosNullDataTemplate							*
53364064216a8433360745f69edddce19a606659163The Android Open Source Project ************************************************************************
53464064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function build a qos null data template
53564064216a8433360745f69edddce19a606659163The Android Open Source Project				performs the following:
53664064216a8433360745f69edddce19a606659163The Android Open Source Project				-	Build a template & set the template len, the template type is set in the site mgr
53764064216a8433360745f69edddce19a606659163The Android Open Source Project
53864064216a8433360745f69edddce19a606659163The Android Open Source ProjectINPUT:      pSiteMgr	-	Handle to site manager
53964064216a8433360745f69edddce19a606659163The Android Open Source Project			pTemplate	-	Pointer to the template structure
54064064216a8433360745f69edddce19a606659163The Android Open Source Project			pSsid		-	Desired SSID
54164064216a8433360745f69edddce19a606659163The Android Open Source Project
54264064216a8433360745f69edddce19a606659163The Android Open Source ProjectOUTPUT:
54364064216a8433360745f69edddce19a606659163The Android Open Source Project
54464064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN:     OK
54564064216a8433360745f69edddce19a606659163The Android Open Source Project************************************************************************/
54664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS buildQosNullDataTemplate(siteMgr_t *pSiteMgr, whalCtrl_setTemplate_t *pTemplate, UINT8 userPriority)
54764064216a8433360745f69edddce19a606659163The Android Open Source Project{
54864064216a8433360745f69edddce19a606659163The Android Open Source Project	paramInfo_t			param;
54964064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT32				size;
55064064216a8433360745f69edddce19a606659163The Android Open Source Project	QosNullDataTemplate_t	*pBuffer = (QosNullDataTemplate_t	*)pTemplate->pTemplate;
55164064216a8433360745f69edddce19a606659163The Android Open Source Project	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
55264064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT16				fc;
55364064216a8433360745f69edddce19a606659163The Android Open Source Project
55464064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(QosNullDataTemplate_t));
55564064216a8433360745f69edddce19a606659163The Android Open Source Project
55664064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
55764064216a8433360745f69edddce19a606659163The Android Open Source Project	 * Header First
55864064216a8433360745f69edddce19a606659163The Android Open Source Project	 */
55964064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Set destination address */
56064064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pPrimarySite)
56164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
56264064216a8433360745f69edddce19a606659163The Android Open Source Project	  os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.address1.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN);
56364064216a8433360745f69edddce19a606659163The Android Open Source Project
56464064216a8433360745f69edddce19a606659163The Android Open Source Project	  /* Set BSSID address */
56564064216a8433360745f69edddce19a606659163The Android Open Source Project	  os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.address3.addr), &(pPrimarySite->bssid), MAC_ADDR_LEN);
56664064216a8433360745f69edddce19a606659163The Android Open Source Project    }
56764064216a8433360745f69edddce19a606659163The Android Open Source Project    else
56864064216a8433360745f69edddce19a606659163The Android Open Source Project    {
56964064216a8433360745f69edddce19a606659163The Android Open Source Project	  WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  ("No Primary site so cannot fill QosNullData template\n"));
57064064216a8433360745f69edddce19a606659163The Android Open Source Project    }
57164064216a8433360745f69edddce19a606659163The Android Open Source Project
57264064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Build Source address */
57364064216a8433360745f69edddce19a606659163The Android Open Source Project	param.paramType = CTRL_DATA_MAC_ADDRESS;
57464064216a8433360745f69edddce19a606659163The Android Open Source Project	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
57564064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pSiteMgr->hOs, &(pBuffer->hdr.address2.addr), &(param.content.ctrlDataDeviceMacAddress), MAC_ADDR_LEN);
57664064216a8433360745f69edddce19a606659163The Android Open Source Project
57764064216a8433360745f69edddce19a606659163The Android Open Source Project	fc = DOT11_FC_DATA_NULL_QOS;
57864064216a8433360745f69edddce19a606659163The Android Open Source Project	fc |= (TRUE << DOT11_FC_TO_DS_SHIFT);
57964064216a8433360745f69edddce19a606659163The Android Open Source Project
58064064216a8433360745f69edddce19a606659163The Android Open Source Project    pBuffer->hdr.qosControl = (userPriority << QOS_CONTROL_UP_SHIFT);
58164064216a8433360745f69edddce19a606659163The Android Open Source Project
58264064216a8433360745f69edddce19a606659163The Android Open Source Project	pBuffer->hdr.fc = ENDIAN_HANDLE_WORD(fc);
58364064216a8433360745f69edddce19a606659163The Android Open Source Project
58464064216a8433360745f69edddce19a606659163The Android Open Source Project	size = sizeof(dot11_header_t);
58564064216a8433360745f69edddce19a606659163The Android Open Source Project
58664064216a8433360745f69edddce19a606659163The Android Open Source Project	pTemplate->templateLen = size;
58764064216a8433360745f69edddce19a606659163The Android Open Source Project
58864064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
58964064216a8433360745f69edddce19a606659163The Android Open Source Project}
59064064216a8433360745f69edddce19a606659163The Android Open Source Project
59164064216a8433360745f69edddce19a606659163The Android Open Source Project
59264064216a8433360745f69edddce19a606659163The Android Open Source Project
59364064216a8433360745f69edddce19a606659163The Android Open Source Project
59464064216a8433360745f69edddce19a606659163The Android Open Source Project
595