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