1/*
2 * templates.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 reportReplvl.c
35 *  \brief Report level implementation
36 *
37 *  \see reportReplvl.h
38 */
39
40/***************************************************************************/
41/*																		   */
42/*		MODULE:	reportReplvl.c											   */
43/*    PURPOSE:	Report level implementation	 							   */
44/*																		   */
45/***************************************************************************/
46
47#define __FILE_ID__  FILE_ID_88
48#include "tidef.h"
49#include "report.h"
50#include "osApi.h"
51#include "siteHash.h"
52#include "rate.h"
53#include "rsnApi.h"
54#include "regulatoryDomainApi.h"
55#include "siteMgrApi.h"
56#include "TWDriver.h"
57#include "StaCap.h"
58
59/********************************************/
60/*		Functions Implementations			*/
61/********************************************/
62
63/************************************************************************
64 *                        buildNullTemplate								*
65 ************************************************************************
66DESCRIPTION: This function build a NULL data template to set to the HAL
67				when joining an infrastructure network
68				performs the following:
69				-	Build a template & set the template len, the template type is set in the site mgr
70
71INPUT:      pSiteMgr	-	Handle to site manager
72			pTemplate	-	Pointer to the template structure
73
74
75OUTPUT:
76
77
78RETURN:     TI_OK
79
80************************************************************************/
81TI_STATUS buildNullTemplate(siteMgr_t *pSiteMgr, TSetTemplate *pTemplate)
82{
83	paramInfo_t			param;
84	TI_UINT32				size;
85	nullDataTemplate_t	*pBuffer = (nullDataTemplate_t	*)pTemplate->ptr;
86	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
87	TI_UINT16				fc;
88
89	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(nullDataTemplate_t));
90
91	/*
92	 * Header First
93	 */
94	/* Set destination address */
95	MAC_COPY (pBuffer->hdr.DA, pPrimarySite->bssid);
96
97	/* Set BSSID address */
98	MAC_COPY (pBuffer->hdr.BSSID, pPrimarySite->bssid);
99
100	/* Build Source address */
101	param.paramType = CTRL_DATA_MAC_ADDRESS;
102	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
103	MAC_COPY (pBuffer->hdr.SA, param.content.ctrlDataDeviceMacAddress);
104
105	fc = DOT11_FC_DATA_NULL_FUNCTION;
106	fc |= (TI_TRUE << DOT11_FC_TO_DS_SHIFT);
107
108	COPY_WLAN_WORD(&pBuffer->hdr.fc, &fc); /* copy with endianess handling. */
109
110	size = sizeof(dot11_mgmtHeader_t);
111
112	pTemplate->len = size;
113
114	return TI_OK;
115}
116
117/************************************************************************
118 *                        buildDisconnTemplate								*
119 ************************************************************************
120DESCRIPTION: This function build a Death/Disassoc template to set to the HAL
121				when joining an infrastructure network
122				performs the following:
123				-	Build a template & set the template len, the template type is set in the site mgr
124
125INPUT:      pSiteMgr	-	Handle to site manager
126			pTemplate	-	Pointer to the template structure
127
128
129OUTPUT:
130
131
132RETURN:     TI_OK
133
134************************************************************************/
135TI_STATUS buildDisconnTemplate(siteMgr_t *pSiteMgr, TSetTemplate *pTemplate)
136{
137	paramInfo_t			param;
138	TI_UINT32				size;
139	disconnTemplate_t	*pBuffer = (disconnTemplate_t	*)pTemplate->ptr;
140	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
141	TI_UINT16				fc;
142
143	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(disconnTemplate_t));
144
145	/*
146	 * Header First
147	 */
148	/* Set destination address */
149	MAC_COPY (pBuffer->hdr.DA, pPrimarySite->bssid);
150
151	/* Set BSSID address */
152	MAC_COPY (pBuffer->hdr.BSSID, pPrimarySite->bssid);
153
154	/* Build Source address */
155	param.paramType = CTRL_DATA_MAC_ADDRESS;
156	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
157	MAC_COPY (pBuffer->hdr.SA, param.content.ctrlDataDeviceMacAddress);
158
159	fc = DOT11_FC_DISASSOC; /* will be change by firmware to DOT11_FC_DEAUTH if needed */
160	fc |= (TI_TRUE << DOT11_FC_TO_DS_SHIFT);
161
162	COPY_WLAN_WORD(&pBuffer->hdr.fc, &fc); /* copy with endianess handling. */
163
164	pBuffer->disconnReason = 0; /* filled by firmware */
165
166	size = sizeof(disconnTemplate_t);
167
168	pTemplate->len = size;
169
170	return TI_OK;
171}
172
173/**
174 * \fn     setDefaultProbeReqTemplate
175 * \brief  set Default Probe Req Template tp the FW.
176 *
177 * set Default Probe Req Template tp the FW.
178 *
179 * \param  hSiteMgr	-	Handle to site manager
180 * \return None
181 * \sa
182 */
183void setDefaultProbeReqTemplate (TI_HANDLE	hSiteMgr)
184{
185    siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
186    TSetTemplate        tTemplateStruct;
187    probeReqTemplate_t  tProbeReqTemplate;
188    TSsid               tBroadcastSSID;
189
190    /*
191     * Setting probe request temapltes for both bands.
192     * allocating EMPTY 32 bytes for the SSID IE, to reserve space for different SSIDs the FW will set
193     */
194    tBroadcastSSID.len = MAX_SSID_LEN;
195    os_memorySet (pSiteMgr->hOs, &(tBroadcastSSID.str[ 0 ]), 0, MAX_SSID_LEN);
196    tTemplateStruct.ptr = (TI_UINT8 *)&tProbeReqTemplate;
197    tTemplateStruct.type = PROBE_REQUEST_TEMPLATE;
198    tTemplateStruct.eBand = RADIO_BAND_2_4_GHZ;
199    tTemplateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
200    buildProbeReqTemplate (hSiteMgr, &tTemplateStruct, &tBroadcastSSID, RADIO_BAND_2_4_GHZ);
201    TWD_CmdTemplate (pSiteMgr->hTWD, &tTemplateStruct, NULL, NULL);
202    tTemplateStruct.eBand = RADIO_BAND_5_0_GHZ;
203    buildProbeReqTemplate (hSiteMgr, &tTemplateStruct, &tBroadcastSSID, RADIO_BAND_5_0_GHZ);
204    TWD_CmdTemplate (pSiteMgr->hTWD, &tTemplateStruct, NULL, NULL);
205}
206
207/************************************************************************
208 *                        buildProbeReqTemplate							*
209 ************************************************************************
210DESCRIPTION: This function build a probe request template to set to the HAL in the scan process.
211				performs the following:
212				-	Build a template & set the template len, the template type is set in the site mgr
213
214INPUT:      pSiteMgr	-	Handle to site manager
215			pTemplate	-	Pointer to the template structure
216			pSsid		-	Desired SSID
217
218
219OUTPUT:
220
221
222RETURN:     TI_OK
223
224************************************************************************/
225TI_STATUS buildProbeReqTemplate(siteMgr_t *pSiteMgr, TSetTemplate *pTemplate, TSsid *pSsid, ERadioBand radioBand)
226{
227	paramInfo_t			param;
228	char				*pBuf;
229	int i;
230	probeReqTemplate_t	*pBuffer = (probeReqTemplate_t	*)pTemplate->ptr;
231	TI_UINT32			 size;
232	dot11_RATES_t		*pDot11Rates;
233	TI_UINT32			 len = 0, ofdmIndex = 0;
234	TI_UINT32			 suppRatesLen, extSuppRatesLen;
235	TI_UINT8			 ratesBuf[DOT11_MAX_SUPPORTED_RATES];
236	TI_UINT8             WSCOuiIe[4] = { 0x00, 0x50, 0xf2, 0x04};
237	TI_UINT32			 supportedRateMask,basicRateMask;
238	TI_UINT16			 fc = DOT11_FC_PROBE_REQ;
239
240	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(probeReqTemplate_t));
241
242	/*
243	 * Header First
244	 */
245	/* Set destination address */
246	for (i = 0; i < MAC_ADDR_LEN; i++)
247		pBuffer->hdr.DA[i] = 0xFF;
248
249	/* Set BSSID address */
250
251	for (i = 0; i < MAC_ADDR_LEN; i++)
252		pBuffer->hdr.BSSID[i] = 0xFF;
253
254
255	/* Build Source address */
256	param.paramType = CTRL_DATA_MAC_ADDRESS;
257	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
258	MAC_COPY (pBuffer->hdr.SA, param.content.ctrlDataDeviceMacAddress);
259
260	COPY_WLAN_WORD(&pBuffer->hdr.fc, &fc); /* copy with endianess handling. */
261
262	size = sizeof(dot11_mgmtHeader_t);
263	pBuf = (char *)&(pBuffer->infoElements);
264
265   /*
266	* Informataion elements
267	*/
268	/* SSID */
269	((dot11_SSID_t *)(pBuf))->hdr[0] = DOT11_SSID_ELE_ID;
270	((dot11_SSID_t *)(pBuf))->hdr[1] = pSsid->len;
271	os_memoryCopy(pSiteMgr->hOs, pBuf + sizeof(dot11_eleHdr_t), (void *)pSsid->str, pSsid->len);
272	size += sizeof(dot11_eleHdr_t) + pSsid->len;
273	pBuf += sizeof(dot11_eleHdr_t) + pSsid->len;
274
275	/* Rates */
276	pDot11Rates = (dot11_RATES_t *) pBuf;
277
278    /*
279     * Supported rates in probe request will always use the default rates for BG or A bands,
280     * regardless of the STA desired rates.
281     */
282    if (radioBand == RADIO_BAND_2_4_GHZ)
283	{
284        /* Basic rates: 1,2,5.5,11 */
285		basicRateMask = rate_BasicToDrvBitmap(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[DOT11_G_MODE], TI_FALSE);
286        /* Extended: 6,9,12,18,24,36,48,54 */
287        supportedRateMask = rate_SupportedToDrvBitmap(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[DOT11_G_MODE], TI_FALSE);
288    }
289    else if (radioBand == RADIO_BAND_5_0_GHZ)
290    {   /* Basic rates: 6,12,24 */
291        basicRateMask = rate_BasicToDrvBitmap(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[DOT11_A_MODE], TI_TRUE);
292         /* Extended: 9,18,24,36,48,54 */
293        supportedRateMask = rate_SupportedToDrvBitmap(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[DOT11_A_MODE], TI_TRUE);
294	}
295	else
296	{
297        TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_ERROR, "buildProbeReqTemplate, radioBand =%d ???\n",radioBand);
298        /* Use default and pray for the best */
299        /* Basic rates: 1,2,5.5,11 */
300        basicRateMask = rate_BasicToDrvBitmap(BASIC_RATE_SET_1_2_5_5_11, TI_FALSE);
301        /* Extended: 6,9,12,18,24,36,48,54 */
302        supportedRateMask = rate_SupportedToDrvBitmap(SUPPORTED_RATE_SET_UP_TO_54, TI_FALSE);
303	}
304
305	rate_DrvBitmapToNetStr (supportedRateMask, basicRateMask, ratesBuf, &len, &ofdmIndex);
306
307TRACE5(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, "buildProbeReqTemplate, supportedRateMask=0x%x, basicRateMask=0x%x, len=%d, ofdmIndex=%d, radioBand =%d\n",							 supportedRateMask,basicRateMask,len, ofdmIndex, radioBand);
308
309       if(radioBand == RADIO_BAND_5_0_GHZ ||
310       pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
311	   ofdmIndex == len)
312	{
313		pDot11Rates->hdr[0] = DOT11_SUPPORTED_RATES_ELE_ID;
314		pDot11Rates->hdr[1] = len;
315		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr[1]);
316		size += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
317		pBuf += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
318	}
319	else
320	{
321		pDot11Rates->hdr[0] = DOT11_SUPPORTED_RATES_ELE_ID;
322		pDot11Rates->hdr[1] = ofdmIndex;
323		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr[1]);
324		suppRatesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
325		pDot11Rates = (dot11_RATES_t *) (pBuf + suppRatesLen);
326		pDot11Rates->hdr[0] = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
327		pDot11Rates->hdr[1] = len - ofdmIndex;
328		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr[1]);
329		extSuppRatesLen = pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
330		size += suppRatesLen + extSuppRatesLen;
331		pBuf += suppRatesLen + extSuppRatesLen;
332	}
333
334
335    /* add HT capabilities IE */
336    StaCap_GetHtCapabilitiesIe (pSiteMgr->hStaCap, pBuf, &len);
337    size += len;
338    pBuf += len;
339
340
341	/* WiFi Simple Config */
342	if (pSiteMgr->includeWSCinProbeReq)
343    {
344	if(pSiteMgr->siteMgrWSCCurrMode != TIWLN_SIMPLE_CONFIG_OFF)
345	{
346		((dot11_WSC_t *)(pBuf))->hdr[0] = DOT11_WSC_PARAM_ELE_ID;
347		 ((dot11_WSC_t *)(pBuf))->hdr[1] = DOT11_WSC_PROBE_REQ_MAX_LENGTH + DOT11_OUI_LEN + 1;
348        pBuf += sizeof(dot11_eleHdr_t);
349         os_memoryCopy(pSiteMgr->hOs, pBuf, &WSCOuiIe, DOT11_OUI_LEN+2);
350		 os_memoryCopy(pSiteMgr->hOs, pBuf + DOT11_OUI_LEN+1, &pSiteMgr->siteMgrWSCProbeReqParams, DOT11_WSC_PROBE_REQ_MAX_LENGTH - (DOT11_OUI_LEN+2));
351		 size += sizeof(dot11_eleHdr_t) + DOT11_WSC_PROBE_REQ_MAX_LENGTH + DOT11_OUI_LEN + 1;
352		 pBuf += sizeof(dot11_eleHdr_t) + DOT11_WSC_PROBE_REQ_MAX_LENGTH + DOT11_OUI_LEN + 1;
353	  }
354	}
355	pTemplate->len = size;
356
357	return TI_OK;
358}
359
360/************************************************************************
361 *                        buildProbeRspTemplate							*
362 ************************************************************************
363DESCRIPTION: This function build a probe response template to set to the HAL
364				when joining an IBSS network.
365				performs the following:
366				-	Build a template & set the template len, the template type is set in the site mgr
367				-	The template is built based on the chosen site attributes
368
369			NOTE: This function is used to build beacon template too.
370			The site manager set the template type (after thos function returns) to beacon or probe response accordingly.
371
372INPUT:      pSiteMgr	-	Handle to site manager
373			pTemplate	-	Pointer to the template structure
374
375
376OUTPUT:
377
378
379RETURN:     TI_OK
380
381************************************************************************/
382TI_STATUS buildProbeRspTemplate(siteMgr_t *pSiteMgr, TSetTemplate *pTemplate)
383{
384	paramInfo_t			param;
385	TI_UINT8			*pBuf;
386	probeRspTemplate_t	*pBuffer = (probeRspTemplate_t	*)pTemplate->ptr;
387	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
388	TI_INT32			i, j;
389	TI_UINT32			size;
390	dot11_RATES_t		*pDot11Rates;
391	dot11_ERP_t         *pdot11Erp;
392	TI_UINT32			len = 0, ofdmIndex = 0;
393	TI_BOOL				extRates = TI_FALSE;
394	TI_BOOL             useProtection,NonErpPresent,barkerPreambleType;
395	TCountry			*pCountry = NULL;
396	TI_UINT8			ratesBuf[DOT11_MAX_SUPPORTED_RATES];
397	TI_UINT32			supportedRateMask,basicRateMask;
398	TI_UINT16			headerFC = DOT11_FC_PROBE_RESP;
399
400	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(probeRspTemplate_t));
401
402
403	/*
404	 * Build WLAN Header:
405	 * ==================
406	 */
407
408	/* Set destination address */
409	for (i = 0; i < MAC_ADDR_LEN; i++)
410		pBuffer->hdr.DA[i] = 0xFF;
411
412	/* Set BSSID address */
413	MAC_COPY (pBuffer->hdr.BSSID, pPrimarySite->bssid);
414
415	/* Build Source address */
416	param.paramType = CTRL_DATA_MAC_ADDRESS;
417	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
418	MAC_COPY (pBuffer->hdr.SA, param.content.ctrlDataDeviceMacAddress);
419
420    COPY_WLAN_WORD(&pBuffer->hdr.fc, &headerFC);
421
422	size = sizeof(dot11_mgmtHeader_t);
423	pBuf = (TI_UINT8 *)pBuffer->timeStamp;
424   /*
425	* Fixed Fields
426	*/
427	/* we skip the timestamp field */
428	size += TIME_STAMP_LEN;
429	pBuf += TIME_STAMP_LEN;
430
431	/* Beacon interval */
432    COPY_WLAN_WORD(pBuf, &pPrimarySite->beaconInterval);
433	size += FIX_FIELD_LEN;
434	pBuf += FIX_FIELD_LEN;
435
436	/* capabilities */
437    COPY_WLAN_WORD(pBuf, &pPrimarySite->capabilities);
438	size += FIX_FIELD_LEN;
439	pBuf += FIX_FIELD_LEN;
440
441	/*
442	 * Build Informataion Elements:
443	 * ============================
444	 */
445
446	/* SSID IE */
447	((dot11_SSID_t *)(pBuf))->hdr[0] = DOT11_SSID_ELE_ID;
448	((dot11_SSID_t *)(pBuf))->hdr[1] = pPrimarySite->ssid.len;
449	os_memoryCopy(pSiteMgr->hOs, pBuf + sizeof(dot11_eleHdr_t), (void *)pPrimarySite->ssid.str, pPrimarySite->ssid.len);
450	size += sizeof(dot11_eleHdr_t) + pPrimarySite->ssid.len;
451	pBuf += sizeof(dot11_eleHdr_t) + pPrimarySite->ssid.len;
452
453
454	/* Rates IE */
455
456	pDot11Rates = (dot11_RATES_t *) pBuf;
457
458	if (pPrimarySite->channel == SPECIAL_BG_CHANNEL)
459	{
460		supportedRateMask = rate_GetDrvBitmapForDefaultSupporteSet ();
461		basicRateMask	  = rate_GetDrvBitmapForDefaultBasicSet ();
462	}
463	else
464	{
465		supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
466		basicRateMask     = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
467	}
468
469	rate_DrvBitmapToNetStr (supportedRateMask, basicRateMask, ratesBuf, &len, &ofdmIndex);
470
471    if(pSiteMgr->siteMgrOperationalMode != DOT11_G_MODE ||
472       pSiteMgr->pDesiredParams->siteMgrUseDraftNum == DRAFT_5_AND_EARLIER ||
473	   ofdmIndex == len)
474	{
475		pDot11Rates->hdr[0] = DOT11_SUPPORTED_RATES_ELE_ID;
476		pDot11Rates->hdr[1] = len;
477		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr[1]);
478		size += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
479		pBuf += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
480	}
481	else
482	{
483		pDot11Rates->hdr[0] = DOT11_SUPPORTED_RATES_ELE_ID;
484		pDot11Rates->hdr[1] = ofdmIndex;
485		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, ratesBuf, pDot11Rates->hdr[1]);
486		size += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
487		pBuf += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
488		extRates = TI_TRUE;
489	}
490
491	/* DS IE */
492	((dot11_DS_PARAMS_t *)(pBuf))->hdr[0] = DOT11_DS_PARAMS_ELE_ID;
493	((dot11_DS_PARAMS_t *)(pBuf))->hdr[1] = DOT11_DS_PARAMS_ELE_LEN;
494	((dot11_DS_PARAMS_t *)(pBuf))->currChannel = pPrimarySite->channel;
495	size += sizeof(dot11_eleHdr_t) + DOT11_DS_PARAMS_ELE_LEN;
496	pBuf += sizeof(dot11_eleHdr_t) + DOT11_DS_PARAMS_ELE_LEN;
497
498	/* IBSS IE */
499	((dot11_IBSS_PARAMS_t *)(pBuf))->hdr[0] = DOT11_IBSS_PARAMS_ELE_ID;
500	((dot11_IBSS_PARAMS_t *)(pBuf))->hdr[1] = DOT11_IBSS_PARAMS_ELE_LEN;
501	COPY_WLAN_WORD(&((dot11_IBSS_PARAMS_t *)(pBuf))->atimWindow, &pPrimarySite->atimWindow);
502	size += sizeof(dot11_eleHdr_t) + DOT11_IBSS_PARAMS_ELE_LEN;
503	pBuf += sizeof(dot11_eleHdr_t) + DOT11_IBSS_PARAMS_ELE_LEN;
504
505	/* Country IE */
506	param.paramType = REGULATORY_DOMAIN_ENABLED_PARAM;
507	regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
508
509	if(	param.content.regulatoryDomainEnabled == TI_TRUE )
510	{
511        /* get country IE */
512        param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM;
513		regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain, &param);
514		pCountry = param.content.pCountry;
515
516        /* Check if a country IE was found */
517		if(pCountry != NULL)
518		{
519			*pBuf = DOT11_COUNTRY_ELE_ID;
520			pBuf++;
521			size++;
522			*pBuf = (TI_UINT8)(pCountry->len);
523			pBuf++;
524			size++;
525
526			/* Note: The country structure is not byte-aligned so it is copied as follows to ensure
527			           that there are no gaps in the output structure (pBuf). */
528
529			os_memoryCopy(pSiteMgr->hOs, pBuf , &pCountry->countryIE.CountryString, DOT11_COUNTRY_STRING_LEN);
530			pBuf += DOT11_COUNTRY_STRING_LEN;
531			size += DOT11_COUNTRY_STRING_LEN;
532
533			/* Loop on all tripletChannels. Each item has three fields ('i' counts rows and 'j' counts bytes). */
534			for (i = 0, j = 0;  j < (pCountry->len - DOT11_COUNTRY_STRING_LEN);  i++, j+=3)
535			{
536				*(pBuf + j    ) = pCountry->countryIE.tripletChannels[i].firstChannelNumber;
537				*(pBuf + j + 1) = pCountry->countryIE.tripletChannels[i].maxTxPowerLevel;
538				*(pBuf + j + 2) = pCountry->countryIE.tripletChannels[i].numberOfChannels;
539			}
540
541			pBuf += (pCountry->len - DOT11_COUNTRY_STRING_LEN);
542			size += (pCountry->len - DOT11_COUNTRY_STRING_LEN);
543		}
544	}
545
546	/*ERP IE*/
547	siteMgr_IsERP_Needed(pSiteMgr,&useProtection,&NonErpPresent,&barkerPreambleType);
548	if (useProtection || NonErpPresent || barkerPreambleType)
549	{
550		pdot11Erp = (dot11_ERP_t *) pBuf;
551		pdot11Erp->hdr[0] = DOT11_ERP_IE_ID;
552		pdot11Erp->hdr[1] = 1;
553		pdot11Erp->ctrl = 0;
554		if (NonErpPresent)
555			pdot11Erp->ctrl |= ERP_IE_NON_ERP_PRESENT_MASK;
556		if (useProtection)
557			pdot11Erp->ctrl |= ERP_IE_USE_PROTECTION_MASK;
558		if (barkerPreambleType)
559			pdot11Erp->ctrl |= ERP_IE_BARKER_PREAMBLE_MODE_MASK;
560		size += pdot11Erp->hdr[1] + sizeof(dot11_eleHdr_t);
561		pBuf += pdot11Erp->hdr[1] + sizeof(dot11_eleHdr_t);
562
563	}
564
565
566	/* Extended supported rates IE */
567	if(extRates)
568	{
569		pDot11Rates = (dot11_RATES_t *) pBuf;
570		pDot11Rates->hdr[0] = DOT11_EXT_SUPPORTED_RATES_ELE_ID;
571		pDot11Rates->hdr[1] = len - ofdmIndex;
572		os_memoryCopy(pSiteMgr->hOs, (void *)pDot11Rates->rates, &ratesBuf[ofdmIndex], pDot11Rates->hdr[1]);
573		size += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
574		pBuf += pDot11Rates->hdr[1] + sizeof(dot11_eleHdr_t);
575	}
576
577    /* no need to insert RSN information elements */
578
579	pTemplate->len = size;
580TRACE1(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, "Probe response template len = %d\n",size);
581
582	return TI_OK;
583}
584
585/************************************************************************
586 *                        buildPsPollTemplate							*
587 ************************************************************************
588DESCRIPTION: This function build a ps poll template
589				performs the following:
590				-	Build a template & set the template len, the template type is set in the site mgr
591
592INPUT:      pSiteMgr	-	Handle to site manager
593			pTemplate	-	Pointer to the template structure
594			pSsid		-	Desired SSID
595
596OUTPUT:
597
598RETURN:     TI_OK
599************************************************************************/
600TI_STATUS buildPsPollTemplate(siteMgr_t *pSiteMgr, TSetTemplate *pTemplate)
601{
602    paramInfo_t			param;
603    TTwdParamInfo       tTwdParam;
604	TI_UINT32				size;
605	psPollTemplate_t	*pBuffer = (psPollTemplate_t *)pTemplate->ptr;
606	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
607	TI_UINT16				fc;
608
609	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(psPollTemplate_t));
610
611	/*
612	 * Header First
613	 */
614
615	/* Set BSSID address */
616	MAC_COPY (pBuffer->hdr.BSSID, pPrimarySite->bssid);
617
618	/* Build Source address */
619	param.paramType = CTRL_DATA_MAC_ADDRESS;
620	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
621	MAC_COPY (pBuffer->hdr.TA, param.content.ctrlDataDeviceMacAddress);
622
623    /*
624    **   Building the Frame Control word (16 bits)
625    ** ---------------------------------------------
626    ** Type = Control
627    ** SubType = Power Save (PS) POLL,  */
628    fc = DOT11_FC_PS_POLL;
629    /*
630    ** setting the Power Management bit in the Frame control field
631    ** to be "Power Save mode"
632    */
633    fc |= (0x1 << DOT11_FC_PWR_MGMT_SHIFT);
634
635	COPY_WLAN_WORD(&pBuffer->hdr.fc, &fc); /* copy with endianess handling. */
636
637    /*
638    **   Association ID
639    ** -----------------
640    */
641    tTwdParam.paramType = TWD_AID_PARAM_ID;
642    TWD_GetParam (pSiteMgr->hTWD, &tTwdParam);
643
644    /* AID should have its two MSB bit Set to "1"*/
645    pBuffer->hdr.AID = tTwdParam.content.halCtrlAid | 0xC000;
646
647	size = sizeof(dot11_PsPollFrameHeader_t);
648
649	pTemplate->len = size;
650
651	return TI_OK;
652}
653
654
655/************************************************************************
656 *                        buildQosNullDataTemplate							*
657 ************************************************************************
658DESCRIPTION: This function build a qos null data template
659				performs the following:
660				-	Build a template & set the template len, the template type is set in the site mgr
661
662INPUT:      pSiteMgr	-	Handle to site manager
663			pTemplate	-	Pointer to the template structure
664			pSsid		-	Desired SSID
665
666OUTPUT:
667
668RETURN:     TI_OK
669************************************************************************/
670TI_STATUS buildQosNullDataTemplate(siteMgr_t *pSiteMgr, TSetTemplate *pTemplate, TI_UINT8 userPriority)
671{
672	paramInfo_t			param;
673	TI_UINT32				size;
674	QosNullDataTemplate_t	*pBuffer = (QosNullDataTemplate_t	*)pTemplate->ptr;
675	siteEntry_t			*pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
676	TI_UINT16				fc;
677	TI_UINT16				qosControl;
678
679	os_memoryZero(pSiteMgr->hOs, pBuffer, sizeof(QosNullDataTemplate_t));
680
681	/*
682	 * Header First
683	 */
684	/* Set destination address */
685    if (pPrimarySite)
686    {
687	  MAC_COPY (pBuffer->hdr.address1, pPrimarySite->bssid);
688
689	  /* Set BSSID address */
690	  MAC_COPY (pBuffer->hdr.address3, pPrimarySite->bssid);
691    }
692    else
693    {
694TRACE0(pSiteMgr->hReport, REPORT_SEVERITY_INFORMATION, "No Primary site so cannot fill QosNullData template\n");
695    }
696
697	/* Build Source address */
698	param.paramType = CTRL_DATA_MAC_ADDRESS;
699	ctrlData_getParam(pSiteMgr->hCtrlData, &param);
700	MAC_COPY (pBuffer->hdr.address2, param.content.ctrlDataDeviceMacAddress);
701
702	fc = DOT11_FC_DATA_NULL_QOS | (1 << DOT11_FC_TO_DS_SHIFT);
703	COPY_WLAN_WORD(&pBuffer->hdr.fc, &fc); /* copy with endianess handling. */
704
705    qosControl = (TI_UINT16)userPriority;
706	qosControl <<= QOS_CONTROL_UP_SHIFT;
707	COPY_WLAN_WORD(&pBuffer->hdr.qosControl, &qosControl); /* copy with endianess handling. */
708
709	size = WLAN_QOS_HDR_LEN;
710
711	pTemplate->len = size;
712
713	return TI_OK;
714}
715
716
717
718
719
720