1 /*
2 * qosMngr.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 qosMngr.c
35 * \brief QOS module interface
36 *
37 * \see qosMngr.h
38 */
39
40 /****************************************************************************************************/
41 /* */
42 /* MODULE: qosMGr.c */
43 /* PURPOSE: QOS module interface. */
44 /* This module handles the QOS manager configuration. */
45 /* */
46 /****************************************************************************************************/
47 #define __FILE_ID__ FILE_ID_74
48 #include "report.h"
49 #include "osApi.h"
50 #include "paramOut.h"
51 #include "siteMgrApi.h"
52 #include "qosMngr.h"
53 #include "qosMngr_API.h"
54 #include "sme.h"
55 #include "EvHandler.h"
56 #ifdef XCC_MODULE_INCLUDED
57 #include "XCCMngr.h"
58 #include "XCCTSMngr.h"
59 #endif
60 #include "TWDriver.h"
61 #include "DrvMainModules.h"
62 #include "StaCap.h"
63
64
65 extern int WMEQosTagToACTable[MAX_NUM_OF_802_1d_TAGS];
66
67 /* Translate input AC to TID */
68 const TI_UINT8 WMEQosAcToTid[MAX_NUM_OF_AC] = { 0, 2, 4, 6 };
69
70 /* Translate input TID to the other TID of the same AC */
71 const TI_UINT32 WMEQosMateTid[MAX_NUM_OF_802_1d_TAGS] = { 3, 2, 1, 0, 5, 4, 7, 6 };
72
73 /* Used to indicate no user priority is assigned for AC */
74 #define INACTIVE_USER_PRIORITY 0xFF
75
76
77 /********************************************************************************/
78 /* Internal functions prototypes. */
79 /********************************************************************************/
80 static void release_module(qosMngr_t *pQosMngr, TI_UINT32 initVec);
81 static TI_STATUS verifyAndConfigTrafficParams(qosMngr_t *pQosMngr, TQueueTrafficParams *pQtrafficParams);
82 static TI_STATUS verifyAndConfigQosParams(qosMngr_t *pQosMngr,TAcQosParams *pAcQosParams);
83 static TI_STATUS getWMEInfoElement(qosMngr_t *pQosMngr,TI_UINT8 *pWMEie,TI_UINT8 *pLen);
84 static TI_STATUS verifyWmeIeParams(qosMngr_t *pQosMngr,TI_UINT8 *pQosIeParams);
85 static TI_STATUS updateACParams(qosMngr_t *pQosMngr,dot11_ACParameters_t *pAcParams);
86 static TI_STATUS setWmeSiteParams(qosMngr_t *pQosMngr, TI_UINT8 *pQosIeParams);
87 static void qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr);
88 static TI_STATUS qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr, OS_802_11_AC_UPSD_STATUS_PARAMS *pAcStatusParams);
89 static void deleteTspecConfiguration(qosMngr_t *pQosMngr, TI_UINT8 acID);
90 static void setNonQosAdmissionState(qosMngr_t *pQosMngr, TI_UINT8 acID);
91 static void qosMngr_storeTspecCandidateParams (tspecInfo_t *pCandidateParams, OS_802_11_QOS_TSPEC_PARAMS *pTSPECParams, TI_UINT8 ac);
92 static TI_STATUS qosMngr_SetPsRxStreaming (qosMngr_t *pQosMngr, TPsRxStreaming *pNewParams);
93
94 /********************************************************************************
95 * qosMngr_create *
96 ********************************************************************************
97 DESCRIPTION: QOS module creation function, called by the config mgr in creation phase.
98 performs the following:
99 - Allocate the QOS MNGR handle.
100 INPUT: hOs - Handle to OS
101
102
103 OUTPUT:
104
105 RETURN: Handle to the QOS MNGR module on success, NULL otherwise
106
107 ************************************************************************/
qosMngr_create(TI_HANDLE hOs)108 TI_HANDLE qosMngr_create(TI_HANDLE hOs)
109 {
110 qosMngr_t *pQosMngr = NULL;
111 TI_UINT32 initVec = 0;
112
113 if(!hOs)
114 return NULL;
115
116 /* allocating the WME object */
117 pQosMngr = os_memoryAlloc(hOs,sizeof(qosMngr_t));
118
119 if (pQosMngr == NULL)
120 return NULL;
121
122 os_memoryZero (hOs, pQosMngr, sizeof(qosMngr_t));
123
124 initVec |= (1 << QOS_MNGR_INIT_BIT_LOCAL_VECTOR);
125
126 /* create admission control object */
127 pQosMngr->pTrafficAdmCtrl = trafficAdmCtrl_create(hOs);
128
129 if (pQosMngr->pTrafficAdmCtrl == NULL)
130 {
131 qosMngr_destroy(pQosMngr);
132 return NULL;
133 }
134
135 initVec |= (1 << QOS_MNGR_INIT_BIT_ADM_CTRL);
136
137 return(pQosMngr);
138 }
139
140 /************************************************************************
141 * qosMngr_destroy *
142 ************************************************************************
143 DESCRIPTION: QOS MNGR module destroy function, called by the config mgr in
144 the destroy phase
145 performs the following:
146 - Free all memory alocated by the module
147
148 INPUT: hQosMngr - QOS Manager handle.
149
150 OUTPUT:
151
152 RETURN: TI_OK on success, TI_NOK otherwise
153
154 ************************************************************************/
qosMngr_destroy(TI_HANDLE hQosMngr)155 TI_STATUS qosMngr_destroy(TI_HANDLE hQosMngr)
156 {
157 TI_UINT32 initVec;
158 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
159
160 if (pQosMngr == NULL)
161 return TI_OK;
162
163 initVec = 0xFFFF;
164 release_module(pQosMngr, initVec);
165
166 return TI_OK;
167 }
168
169 /***********************************************************************
170 * release_module
171 ***********************************************************************
172 DESCRIPTION: Called by the destroy function or by the create function (on failure)
173 Go over the vector, for each bit that is set, release the corresponding module.
174
175 INPUT: pQosMngr - QOS Mngr pointer.
176 initVec - Vector that contains a bit set for each module thah had been initiualized
177
178 OUTPUT:
179
180 RETURN: TI_OK on success, TI_NOK otherwise
181 ************************************************************************/
release_module(qosMngr_t * pQosMngr,TI_UINT32 initVec)182 static void release_module(qosMngr_t *pQosMngr, TI_UINT32 initVec)
183 {
184
185 if (initVec & (1 << QOS_MNGR_INIT_BIT_ADM_CTRL))
186 trafficAdmCtrl_unload(pQosMngr->pTrafficAdmCtrl);
187
188 if (initVec & (1 << QOS_MNGR_INIT_BIT_LOCAL_VECTOR))
189 os_memoryFree(pQosMngr->hOs, pQosMngr, sizeof(qosMngr_t));
190
191 initVec = 0;
192 }
193
194 /************************************************************************
195 * qosMngr_init *
196 ************************************************************************
197 DESCRIPTION: QOS Manager module configuration function, called by the config
198 mgr in configuration phase
199 performs the following:
200 - Reset & initiailzes local variables
201 - Init the handles to be used by the module
202
203 INPUT: pStadHandles - The driver modules handles
204
205
206 OUTPUT:
207
208 RETURN: void
209 ************************************************************************/
qosMngr_init(TStadHandlesList * pStadHandles)210 void qosMngr_init (TStadHandlesList *pStadHandles)
211 {
212 qosMngr_t *pQosMngr = (qosMngr_t *)(pStadHandles->hQosMngr);
213
214 /* init handles */
215 pQosMngr->hOs = pStadHandles->hOs;
216 pQosMngr->hReport = pStadHandles->hReport;
217 pQosMngr->hSiteMgr = pStadHandles->hSiteMgr;
218 pQosMngr->hTWD = pStadHandles->hTWD;
219 pQosMngr->hTxCtrl = pStadHandles->hTxCtrl;
220 pQosMngr->hTxMgmtQ = pStadHandles->hTxMgmtQ;
221 pQosMngr->hMeasurementMngr = pStadHandles->hMeasurementMgr;
222 pQosMngr->hSmeSm = pStadHandles->hSme;
223 pQosMngr->hCtrlData = pStadHandles->hCtrlData;
224 pQosMngr->hEvHandler = pStadHandles->hEvHandler;
225 pQosMngr->hXCCMgr = pStadHandles->hXCCMngr;
226 pQosMngr->hTimer = pStadHandles->hTimer;
227 pQosMngr->hStaCap = pStadHandles->hStaCap;
228
229 pQosMngr->isConnected = TI_FALSE;
230 }
231
232
qosMngr_SetDefaults(TI_HANDLE hQosMngr,QosMngrInitParams_t * pQosMngrInitParams)233 TI_STATUS qosMngr_SetDefaults (TI_HANDLE hQosMngr, QosMngrInitParams_t *pQosMngrInitParams)
234 {
235 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
236 TI_UINT8 acID, uTid;
237 TI_STATUS status;
238
239 /* init params */
240 pQosMngr->WMEEnable = pQosMngrInitParams->wmeEnable;
241 pQosMngr->trafficAdmCtrlEnable = pQosMngrInitParams->trafficAdmCtrlEnable;
242 pQosMngr->tagZeroConverHeader = pQosMngrInitParams->qosTagZeroConverHeader;
243 pQosMngr->qosPacketBurstEnable = pQosMngrInitParams->PacketBurstEnable;
244 pQosMngr->qosPacketBurstTxOpLimit = pQosMngrInitParams->PacketBurstTxOpLimit;
245 pQosMngr->desiredPsMode = pQosMngrInitParams->desiredPsMode;
246 pQosMngr->bCwFromUserEnable = pQosMngrInitParams->bCwFromUserEnable;
247 pQosMngr->uDesireCwMin = pQosMngrInitParams->uDesireCwMin;
248 pQosMngr->uDesireCwMax = pQosMngrInitParams->uDesireCwMax;
249 pQosMngr->bEnableBurstMode = pQosMngrInitParams->bEnableBurstMode;
250
251
252 pQosMngr->activeProtocol = QOS_NONE;
253 pQosMngr->WMESiteSupport = TI_FALSE;
254
255 pQosMngr->desiredMaxSpLen = pQosMngrInitParams->desiredMaxSpLen;
256
257 pQosMngr->voiceTspecConfigured = TI_FALSE;
258 pQosMngr->videoTspecConfigured = TI_FALSE;
259 pQosMngr->performTSPECRenegotiation = TI_FALSE;
260 pQosMngr->TSPECNegotiationResultCallb = NULL;
261 pQosMngr->TSPECNegotiationResultModule = NULL;
262
263 /* No template has been set for UPSD */
264 pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
265
266 TWD_CfgBurstMode(pQosMngr->hTWD, pQosMngr->bEnableBurstMode);
267
268 /* configure admission control parameters */
269 qosMngr_resetAdmCtrlParameters(pQosMngr);
270
271 status = trafficAdmCtrl_config (pQosMngr->pTrafficAdmCtrl,
272 pQosMngr->hTxMgmtQ,
273 pQosMngr->hReport,
274 pQosMngr->hOs,
275 pQosMngr,
276 pQosMngr->hCtrlData,
277 pQosMngr->hXCCMgr,
278 pQosMngr->hTimer,
279 pQosMngr->hTWD,
280 pQosMngr->hTxCtrl,
281 &pQosMngrInitParams->trafficAdmCtrlInitParams);
282 if(status != TI_OK)
283 return TI_NOK;
284
285 /*
286 * configure per AC traffic parameters
287 */
288 for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
289 {
290 /*
291 * setting ac traffic params for TrafficCategoryCfg (TNET configuration
292 * The parameters can be changed in run-time, so they are saved in "init params"
293 * for 'disconnecting' .
294 * the parameters being set in setSite; "select" phase.
295 */
296 pQosMngr->acParams[acID].QtrafficParams.queueID = acID;
297 pQosMngr->acParams[acID].QtrafficParams.channelType = CHANNEL_TYPE_EDCF;
298 pQosMngr->acParams[acID].QtrafficParams.tsid = acID;
299 pQosMngr->acParams[acID].QtrafficParams.dot11EDCATableMSDULifeTime = 0;
300 pQosMngr->acParams[acID].QtrafficParams.psScheme = PS_SCHEME_LEGACY;
301 pQosMngr->acParams[acID].QtrafficParams.ackPolicy = pQosMngrInitParams->acAckPolicy[acID];
302 pQosMngr->acParams[acID].QtrafficParams.APSDConf[0] = 0;
303 pQosMngr->acParams[acID].QtrafficParams.APSDConf[1] = 0;
304
305
306 /*
307 * Update the qTrafficInitParams as well
308 */
309 os_memoryCopy(pQosMngr->hOs,
310 &pQosMngr->acParams[acID].QTrafficInitParams,
311 &pQosMngr->acParams[acID].QtrafficParams,
312 sizeof(TQueueTrafficParams));
313
314 /* will be config only after select */
315 verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
316
317 /*
318 * setting ac QoS params for acQosParams (TNET configuration)
319 * The parameters can be changed in run-time, so they are saved in "init params"
320 * for 'disconnecting'.
321 * the parameters being set in setSite; "select" phase.
322 */
323 pQosMngr->acParams[acID].acQosParams.ac = acID;
324 pQosMngr->acParams[acID].acQosParams.aifsn = AIFS_DEF;
325 pQosMngr->acParams[acID].acQosParams.cwMax = pQosMngr->uDesireCwMax;
326 pQosMngr->acParams[acID].acQosParams.cwMin = pQosMngr->uDesireCwMin;
327 pQosMngr->acParams[acID].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
328 pQosMngr->acParams[acID].msduLifeTimeParam = pQosMngrInitParams->MsduLifeTime[acID];
329
330 /* The protocol is QOS_NONE. If Packet Burst is Enable, */
331 /* then, the BE queue is configured to the TxOP Limit of Packet burst */
332 /* (that is, 3 ms) and the txopContinuation is set to qosPacketBurstEnable */
333 /* The protocol is QOS_NONE. If Packet Burst is Enable, */
334 /* then, the BE queue is configured to the TxOP Limit of Packet burst */
335 /* (that is, 3 ms) and the txopContinuation is set to qosPacketBurstEnable */
336
337 if (acID == QOS_AC_BE)
338 {
339 if (pQosMngr->qosPacketBurstEnable==TI_TRUE)
340 {
341 pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
342 }
343 else
344 {
345 pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
346 }
347 }
348
349 /*
350 * Update the acQosInitParams as well
351 */
352 os_memoryCopy(pQosMngr->hOs,
353 &pQosMngr->acParams[acID].acQosInitParams,
354 &pQosMngr->acParams[acID].acQosParams,
355 sizeof(TAcQosParams));
356
357 /* will be config only after select */
358 if(verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[acID].acQosParams)) != TI_OK)
359 {
360 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetDefault: failed on verifyAndConfigQosParams\n");
361 }
362
363 /*
364 * setting ps mode per ac for protocol specific configuration.
365 */
366
367 /* validity check - allow to set the desired Ps mode per-AC to UPSD ONLY IF the station supports UPSD */
368 if ((pQosMngrInitParams->desiredPsMode == PS_SCHEME_UPSD_TRIGGER) && (pQosMngrInitParams->desiredWmeAcPsMode[acID] == PS_SCHEME_UPSD_TRIGGER))
369 {
370 pQosMngr->acParams[acID].desiredWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
371 }
372 else
373 {
374 pQosMngr->acParams[acID].desiredWmeAcPsMode = PS_SCHEME_LEGACY;
375 }
376
377 pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY; /* default configuration is legacy PS for all queues */
378
379 /* configure AC params to TxCtrl. */
380 txCtrlParams_setAcMsduLifeTime(pQosMngr->hTxCtrl, acID, pQosMngrInitParams->MsduLifeTime[acID]);
381 txCtrlParams_setAcAckPolicy(pQosMngr->hTxCtrl, acID, ACK_POLICY_LEGACY);
382
383 /* setting wme Ack Policy */
384 pQosMngr->acParams[acID].wmeAcAckPolicy = pQosMngrInitParams->acAckPolicy[acID];
385
386 /* Set admission state per AC for non-QoS and update the Tx module. */
387 setNonQosAdmissionState(pQosMngr, acID);
388 }
389
390 /* Reset all PS-Rx-Streaming configurations */
391 for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; uTid++)
392 {
393 pQosMngr->aTidPsRxStreaming[uTid].uTid = uTid;
394 pQosMngr->aTidPsRxStreaming[uTid].bEnabled = TI_FALSE;
395 }
396 pQosMngr->uNumEnabledPsRxStreams = 0;
397
398 /* update Tx header convert mode */
399 txCtrlParams_setQosHeaderConverMode(pQosMngr->hTxCtrl, HDR_CONVERT_LEGACY);
400
401
402 /* 802.11n BA session setting */
403 for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; ++uTid)
404 {
405 pQosMngr->aBaPolicy[uTid] = pQosMngrInitParams->aBaPolicy[uTid];
406 pQosMngr->aBaInactivityTimeout[uTid] = pQosMngrInitParams->aBaInactivityTimeout[uTid];
407 }
408
409
410
411 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_config : QoS configuration complete!");
412
413 return TI_OK;
414 }
415
416 /************************************************************************
417 * qosMngr_resetAdmCtrlParameters *
418 ************************************************************************
419 DESCRIPTION: reset the admCtrl parameters
420
421 INPUT: hQosMngr - Qos Manager handle.
422
423 OUTPUT:
424
425 RETURN:
426
427 ************************************************************************/
428
qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr)429 void qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr)
430 {
431 TI_UINT8 acID;
432 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
433
434 /* reset admission control parameters */
435 for(acID = FIRST_AC_INDEX ; acID < MAX_NUM_OF_AC ; acID++)
436 {
437 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].AC = (EAcTrfcType)acID;
438 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY; /* Setting invalid user Priority to prevent GET_TSPEC or DELETE */
439 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize = 0;
440 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate = 0;
441 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate = 0;
442 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance = 0;
443 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime = 0;
444 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag = 0;
445 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMinimumServiceInterval = 0;
446 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMaximumServiceInterval = 0;
447 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
448 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
449
450 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].AC = (EAcTrfcType)acID;
451 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY; /* Setting invalid user Priority to prevent GET_TSPEC or DELETE */
452 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].nominalMsduSize = 0;
453 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].minimumPHYRate = 0;
454 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].meanDataRate = 0;
455 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].surplausBwAllowance = 0;
456 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].mediumTime = 0;
457 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].UPSDFlag = 0;
458 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].uMinimumServiceInterval = 0;
459 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].uMaximumServiceInterval = 0;
460 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
461 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
462
463 pQosMngr->resourceMgmtTable.totalAllocatedMediumTime = 0;
464 }
465 }
466
467
468 /************************************************************************
469 * qosMngr_disconnect *
470 ************************************************************************
471 DESCRIPTION: the function is called upon driver disconnecting to reset all
472 QOS parameters to init values.
473
474 INPUT: hQosMngr - Qos Manager handle.
475 bDisconnect - True if full AP disconnection, False if roaming to another AP
476
477 OUTPUT:
478
479 RETURN: TI_OK on success, TI_NOK otherwise
480
481 ************************************************************************/
qosMngr_disconnect(TI_HANDLE hQosMngr,TI_BOOL bDisconnect)482 TI_STATUS qosMngr_disconnect (TI_HANDLE hQosMngr, TI_BOOL bDisconnect)
483 {
484 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
485 TI_UINT32 acID;
486 TI_STATUS status;
487
488 if(hQosMngr == NULL)
489 return TI_OK;
490
491 pQosMngr->activeProtocol = QOS_NONE;
492 pQosMngr->WMESiteSupport = TI_FALSE;
493
494 /* clear admission control params */
495 qosMngr_resetAdmCtrlParameters(pQosMngr);
496
497 trafficAdmCtrl_stop(pQosMngr->pTrafficAdmCtrl);
498
499 for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
500 {
501 /* Disable medium time events in TX */
502 txCtrlParams_setAdmissionCtrlParams(pQosMngr->hTxCtrl, acID, 0 , 0, TI_FALSE);
503
504 /* The protocol after disconnect is QOS_NONE. If Packet Burst is Enabled, the BE queue InitParams
505 is configured to the TxOP Limit of Packet burst (that is, 3 ms) and the
506 txopContinuation is set to qosPacketBurstEnable. */
507
508 if (acID == QOS_AC_BE)
509 {
510 if (pQosMngr->qosPacketBurstEnable==TI_TRUE)
511 {
512 pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
513 }
514 else
515 {
516 pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
517 }
518 }
519
520 /* Copy init traffic params (non-QoS defaults) to current traffic params, and config to HAL and TNET. */
521 os_memoryCopy(pQosMngr->hOs,&(pQosMngr->acParams[acID].acQosParams),&(pQosMngr->acParams[acID].acQosInitParams),sizeof(TAcQosParams));
522
523 /*
524 * Update the qTrafficInitParams as well
525 */
526 os_memoryCopy(pQosMngr->hOs,&(pQosMngr->acParams[acID].QtrafficParams),&(pQosMngr->acParams[acID].QTrafficInitParams),sizeof(TQueueTrafficParams));
527
528
529 pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY; /* default configuration is legacy PS for all queues */
530
531 /* configure Ack-Policy to TxCtrl (working in Non-QoS method). */
532 txCtrlParams_setAcAckPolicy(pQosMngr->hTxCtrl, acID, ACK_POLICY_LEGACY);
533
534 /* Set admission state per AC for non-QoS and update the Tx module. */
535 setNonQosAdmissionState(pQosMngr, acID);
536 }
537
538 /*
539 * configure only BE AC
540 * NOTE : this is done after "disconnect" or Init phase so those are defaults BE params
541 */
542
543 /*
544 * configureQueue
545 */
546 status = verifyAndConfigTrafficParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].QtrafficParams));
547 if (status != TI_OK)
548 {
549 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite:failed to init NON_QOS Queue Traffic parameters!!!\n\n");
550 return status;
551 }
552
553 /*
554 * configureAC
555 */
556
557 status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
558 if (status != TI_OK)
559 {
560 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite:failed to init NON_QOS AC QoS parameters!!!\n\n");
561 return status;
562 }
563
564 /* update Tx header convert mode */
565 txCtrlParams_setQosHeaderConverMode(pQosMngr->hTxCtrl, HDR_CONVERT_LEGACY);
566
567 /* If disconnect (not roaming), reset all PS-Rx-Streaming configurations. */
568 if (bDisconnect)
569 {
570 TI_UINT32 uTid;
571 for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; uTid++)
572 {
573 TPsRxStreaming *pCurrTidParams = &pQosMngr->aTidPsRxStreaming[uTid];
574
575 if (pCurrTidParams->bEnabled)
576 {
577 pCurrTidParams->bEnabled = TI_FALSE;
578 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pCurrTidParams, NULL, NULL);
579 }
580 }
581 pQosMngr->uNumEnabledPsRxStreams = 0;
582 }
583
584 /* Update our internal state */
585 pQosMngr->isConnected = TI_FALSE;
586
587 /* Mark that no Qos Null template is currently set into firmware */
588 pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
589
590 pQosMngr->voiceTspecConfigured = TI_FALSE;
591 pQosMngr->videoTspecConfigured = TI_FALSE;
592
593 /* Mark that no Qos Null template is currently set into firmware */
594 pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
595
596 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_disconnect : QoS disconnect complete!");
597
598 #ifdef XCC_MODULE_INCLUDED
599 measurementMgr_stopTsMetrics(pQosMngr->hMeasurementMngr);
600 #endif
601
602 return TI_OK;
603 }
604
605
606 /************************************************************************
607 * qosMngr_connect *
608 ************************************************************************
609 DESCRIPTION: the function is called upon driver connection to inform all
610 the other modules about the voice mode
611
612 INPUT: hQosMngr - Qos Manager handle.
613
614 OUTPUT:
615
616 RETURN: TI_OK on success, TI_NOK otherwise
617
618 ************************************************************************/
619
qosMngr_connect(TI_HANDLE hQosMngr)620 TI_STATUS qosMngr_connect(TI_HANDLE hQosMngr)
621 {
622 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
623 psPollTemplate_t psPollTemplate;
624 TSetTemplate templateStruct;
625 QosNullDataTemplate_t QosNullDataTemplate;
626 TI_UINT8 acID,UPSDCnt=0;
627
628 if (pQosMngr->isConnected == TI_TRUE)
629 {
630 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_connect : Already connected !!!\n");
631 return TI_OK;
632 }
633
634 /* Send PsPoll template to HAL */
635
636 templateStruct.ptr = (TI_UINT8 *)&psPollTemplate;
637 templateStruct.type = PS_POLL_TEMPLATE;
638 templateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
639 buildPsPollTemplate(pQosMngr->hSiteMgr, &templateStruct);
640 TWD_CmdTemplate (pQosMngr->hTWD, &templateStruct, NULL, NULL);
641
642 /* Update our internal state */
643 pQosMngr->isConnected = TI_TRUE;
644
645 /* Set Qos-Null Data template into firmware */
646 for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
647 {
648 /* Set QOS Null data template into the firmware (only if at least one AC is configured as UPSD )*/
649 if (pQosMngr->acParams[acID].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
650 {
651 UPSDCnt++;
652 if ( pQosMngr->acParams[acID].apInitAdmissionState != ADMISSION_REQUIRED )
653 {
654 pQosMngr->QosNullDataTemplateUserPriority = WMEQosAcToTid[acID];
655
656 templateStruct.ptr = (TI_UINT8 *)&QosNullDataTemplate;
657 templateStruct.type = QOS_NULL_DATA_TEMPLATE;
658 templateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
659 buildQosNullDataTemplate(pQosMngr->hSiteMgr, &templateStruct,pQosMngr->QosNullDataTemplateUserPriority);
660 TWD_CmdTemplate (pQosMngr->hTWD, &templateStruct, NULL, NULL);
661
662 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "setWmeSiteParams: Setting QOS Null data for UserPriority %d (belongs to AC %d)\n", WMEQosAcToTid[acID], acID);
663
664 break; /* Only need to set ONE template, so after setting it, we can exit the loop */
665 }
666 }
667
668 }
669
670 /* If MAX_NUM_OF_AC (4) ACs were found as UPSD, but we still haven't configured any UP in the Qos Null data template, it must mean all ACs require admission - not valid*/
671 if ((pQosMngr->QosNullDataTemplateUserPriority == 0xFF) && (UPSDCnt == MAX_NUM_OF_AC))
672 {
673 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_connect : QOS Null Data template not set since all ACs require admission !!!\n");
674 }
675
676 return TI_OK;
677 }
678
679 /**
680 * \fn qosMngr_SetBaPolicies
681 * \brief Set the BA session policies to the FW.
682 *
683 * \note
684 * \param hQosMngr - Qos Manager handle.
685 * \return None
686 * \sa
687 */
qosMngr_SetBaPolicies(TI_HANDLE hQosMngr)688 void qosMngr_SetBaPolicies(TI_HANDLE hQosMngr)
689 {
690 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
691 TI_BOOL b11nEnable;
692 TI_UINT32 uTidIndex;
693 paramInfo_t param;
694
695 StaCap_IsHtEnable(pQosMngr->hStaCap, &b11nEnable);
696
697 if (b11nEnable)
698 {
699
700 param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
701 ctrlData_getParam(pQosMngr->hCtrlData, ¶m);
702
703 /* 802.11n BA session setting */
704 for (uTidIndex = 0; uTidIndex < MAX_NUM_OF_802_1d_TAGS; ++uTidIndex)
705 {
706 if ((pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_INITIATOR) ||
707 (pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_INITIATOR_AND_RECEIVER))
708 {
709 TWD_CfgSetBaInitiator (pQosMngr->hTWD,
710 uTidIndex,
711 TI_TRUE,
712 param.content.ctrlDataCurrentBSSID,
713 RX_QUEUE_WIN_SIZE,
714 pQosMngr->aBaInactivityTimeout[uTidIndex]);
715 }
716
717 if ((pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_RECEIVER) ||
718 (pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_INITIATOR_AND_RECEIVER))
719 {
720 TWD_CfgSetBaReceiver (pQosMngr->hTWD,
721 uTidIndex,
722 TI_TRUE,
723 param.content.ctrlDataCurrentBSSID,
724 RX_QUEUE_WIN_SIZE);
725 }
726 }
727 }
728 }
729
730
731 /************************************************************************
732 * qosMngr_evalSite *
733 ************************************************************************
734 DESCRIPTION: Evaluate the site for the selction algorithm
735 In case the station is configure to work in UPSD mode
736 prefer a site that support UPSD and return 1.
737 All other case return 0.
738
739 INPUT: siteAPSDSupport - the UPSD capabilit of the site
740
741 OUTPUT:
742
743 RETURN: 1 - evaluation is good...
744 0 - evaluation can be better....
745
746 ************************************************************************/
qosMngr_evalSite(TI_HANDLE hQosMngr,TI_BOOL siteAPSDSupport)747 TI_UINT8 qosMngr_evalSite(TI_HANDLE hQosMngr, TI_BOOL siteAPSDSupport)
748 {
749 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
750
751 if (pQosMngr->desiredPsMode == PS_SCHEME_UPSD_TRIGGER && siteAPSDSupport)
752 {
753 return 1;
754 }
755
756 return 0;
757 }
758
qosMngr_getParamsActiveProtocol(TI_HANDLE hQosMngr,EQosProtocol * actProt)759 TI_STATUS qosMngr_getParamsActiveProtocol(TI_HANDLE hQosMngr, EQosProtocol *actProt)
760 {
761 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
762
763 if (pQosMngr == NULL)
764 return TI_NOK;
765 *actProt = pQosMngr->activeProtocol;
766 return TI_OK;
767 }
768
769 /************************************************************************
770 * qosMngr_getACparams *
771 ************************************************************************
772 DESCRIPTION: The function is an API for external modules to qet qos parameters
773
774 INPUT: hQosMngr - Qos Manager handle.
775 pParamInfo - qos parameters information.
776
777
778 OUTPUT:
779
780 RETURN: TI_OK on success, TI_NOK otherwise
781
782 ************************************************************************/
783
qosMngr_getParams(TI_HANDLE hQosMngr,paramInfo_t * pParamInfo)784 TI_STATUS qosMngr_getParams(TI_HANDLE hQosMngr,paramInfo_t *pParamInfo)
785 {
786 EAcTrfcType acID;
787 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
788
789 if(pQosMngr == NULL)
790 return TI_NOK;
791
792 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_getParams: %x\n", pParamInfo->paramType);
793
794 switch(pParamInfo->paramType)
795 {
796 case QOS_PACKET_BURST_ENABLE:
797 pParamInfo->content.qosPacketBurstEnb = pQosMngr->qosPacketBurstEnable;
798 break;
799 case QOS_MNGR_CURRENT_PS_MODE:
800 pParamInfo->content.currentPsMode = pQosMngr->currentPsMode;
801 break;
802
803 case QOS_MNGR_ACTIVE_PROTOCOL:
804 pParamInfo->content.qosSiteProtocol = pQosMngr->activeProtocol;
805 break;
806
807 case QOS_MNGR_GET_DESIRED_PS_MODE:
808 pParamInfo->content.qosDesiredPsMode.uDesiredPsMode = pQosMngr->desiredPsMode;
809 for(acID = FIRST_AC_INDEX; acID < MAX_NUM_OF_AC ; acID++ )
810 pParamInfo->content.qosDesiredPsMode.uDesiredWmeAcPsMode[acID] = pQosMngr->acParams[acID].desiredWmeAcPsMode;
811 break;
812
813 case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
814 /* Check if voice call present. If so, store current TSPEC configuration */
815 pParamInfo->content.TspecConfigure.voiceTspecConfigure = (TI_UINT8)pQosMngr->voiceTspecConfigured;
816 pParamInfo->content.TspecConfigure.videoTspecConfigure = (TI_UINT8)pQosMngr->videoTspecConfigured;
817
818 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_getParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->voiceTspecConfigured);
819
820 if (pQosMngr->voiceTspecConfigured == TI_TRUE)
821 {
822 OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
823 tspecInfo_t *pConfiguredParams;
824
825 /* Store voice TSPEC params - must be configured */
826 pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6];
827 pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6];
828
829 pTspecParams->uUserPriority = pConfiguredParams->userPriority;
830 pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
831 pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
832 pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
833 pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
834 pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
835 pTspecParams->uMinimumServiceInterval = pConfiguredParams->uMinimumServiceInterval;
836 pTspecParams->uMaximumServiceInterval = pConfiguredParams->uMaximumServiceInterval;
837 pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
838 }
839 else
840 {
841 pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6].uUserPriority = MAX_USER_PRIORITY;
842 }
843
844 if (pQosMngr->videoTspecConfigured == TI_TRUE)
845 {
846 OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
847 tspecInfo_t *pConfiguredParams;
848
849 /* Store signalling TSPEC params if configured in user priority 4 */
850 pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4];
851 pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4];
852
853 pTspecParams->uUserPriority = pConfiguredParams->userPriority;
854 pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
855 pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
856 pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
857 pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
858 pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
859 pTspecParams->uMinimumServiceInterval = pConfiguredParams->uMinimumServiceInterval;
860 pTspecParams->uMaximumServiceInterval = pConfiguredParams->uMaximumServiceInterval;
861 pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
862 }
863 else
864 {
865 pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority = MAX_USER_PRIORITY;
866 }
867 break;
868
869 case QOS_MNGR_AC_STATUS:
870 switch (qosMngr_getCurrAcStatus (hQosMngr,&pParamInfo->content.qosCurrentAcStatus))
871 {
872 case TI_OK:
873 return TI_OK;
874 case NOT_CONNECTED:
875 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
876 break;
877 case NO_QOS_AP:
878 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
879 break;
880 case TI_NOK:
881 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Invalid parameter...\n");
882 break;
883 default:
884 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Unknown return value...\n");
885 break;
886 }
887 return TI_NOK;
888
889 case QOS_MNGR_OS_TSPEC_PARAMS:
890
891 if( pParamInfo->content.qosTspecParameters.uUserPriority > MAX_USER_PRIORITY )
892 {
893 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: userPriority > 7 -> Ignore !!!\n");
894 return TI_NOK;
895 }
896
897 if(pQosMngr->isConnected == TI_FALSE)
898 {
899 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: Not connected - Ignoring request !!!\n");
900 return NOT_CONNECTED;
901 }
902
903 if(pQosMngr->activeProtocol == QOS_NONE)
904 {
905 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: Not connected to QOS AP - Ignoring reqeust !!!\n");
906 return NO_QOS_AP;
907 }
908
909 acID = (EAcTrfcType)WMEQosTagToACTable[pParamInfo->content.qosTspecParameters.uUserPriority];
910
911 /* check if signaling is already in process*/
912 if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
913 {
914 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: AC = %d , TSPEC Signaling is in progress -> Ignoring request !!!\n",acID);
915 return TRAFIC_ADM_PENDING;
916 }
917
918 /* check if UP is admitted or not */
919 if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != pParamInfo->content.qosTspecParameters.uUserPriority)
920 {
921 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: user priority is not admitted. -> Ignore !!!\n");
922 return USER_PRIORITY_NOT_ADMITTED;
923 }
924
925 pParamInfo->content.qosTspecParameters.uMeanDataRate = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate;
926 pParamInfo->content.qosTspecParameters.uNominalMSDUsize = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize;
927 pParamInfo->content.qosTspecParameters.uAPSDFlag = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag;
928 pParamInfo->content.qosTspecParameters.uMinimumServiceInterval = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMinimumServiceInterval;
929 pParamInfo->content.qosTspecParameters.uMaximumServiceInterval = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMaximumServiceInterval;
930 pParamInfo->content.qosTspecParameters.uMinimumPHYRate = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate;
931 pParamInfo->content.qosTspecParameters.uSurplusBandwidthAllowance = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance;
932 pParamInfo->content.qosTspecParameters.uMediumTime = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime;
933 break;
934
935 case QOS_MNGR_AP_QOS_PARAMETERS: /* API GetAPQosParameters */
936 acID = (EAcTrfcType) pParamInfo->content.qosApQosParams.uAC;
937
938 if(acID > QOS_HIGHEST_AC_INDEX)
939 {
940 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set invalid acId: %d param\n",pParamInfo->content.qosApQosParams.uAC);
941 return (PARAM_VALUE_NOT_VALID);
942 }
943 if(pQosMngr->isConnected == TI_FALSE)
944 {
945 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
946 return NOT_CONNECTED;
947 }
948 if(pQosMngr->activeProtocol == QOS_NONE)
949 {
950 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
951 return NO_QOS_AP;
952 }
953
954 pParamInfo->content.qosApQosParams.uAssocAdmissionCtrlFlag = pQosMngr->acParams[acID].apInitAdmissionState; /* admission flag */
955 pParamInfo->content.qosApQosParams.uAIFS = pQosMngr->acParams[acID].acQosParams.aifsn;
956 pParamInfo->content.qosApQosParams.uCwMin = (1 << pQosMngr->acParams[acID].acQosParams.cwMin)-1;
957 pParamInfo->content.qosApQosParams.uCwMax = (1 << pQosMngr->acParams[acID].acQosParams.cwMax)-1;
958 pParamInfo->content.qosApQosParams.uTXOPLimit = pQosMngr->acParams[acID].acQosParams.txopLimit << 5;
959
960 break;
961
962 case QOS_MNGR_PS_RX_STREAMING:
963 {
964 TPsRxStreaming *pParams = &pParamInfo->content.tPsRxStreaming;
965 TI_UINT32 uTid = pParams->uTid;
966 TPsRxStreaming *pTidStream = &pQosMngr->aTidPsRxStreaming[uTid];
967
968 os_memoryCopy (pQosMngr->hOs, (void *)pParams, (void *)pTidStream, sizeof(TPsRxStreaming));
969 }
970 break;
971
972
973 default:
974 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType);
975 return (PARAM_NOT_SUPPORTED);
976
977 }
978 return TI_OK;
979 }
980
981 /************************************************************************
982 * qosMngr_setParams *
983 ************************************************************************
984 DESCRIPTION: The function is an API for external modules to set qos parameters
985
986 INPUT: hQosMngr - Qos Manager handle.
987 pParamInfo - qos parameters information.
988
989
990 OUTPUT:
991
992 RETURN: TI_OK on success, TI_NOK otherwise
993
994 ************************************************************************/
995
qosMngr_setParams(TI_HANDLE hQosMngr,paramInfo_t * pParamInfo)996 TI_STATUS qosMngr_setParams(TI_HANDLE hQosMngr,paramInfo_t *pParamInfo)
997 {
998 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
999 TTwdParamInfo param;
1000 EAcTrfcType acID;
1001 TI_STATUS status;
1002
1003 if(pQosMngr == NULL)
1004 return TI_NOK;
1005
1006 if(pParamInfo == NULL)
1007 {
1008 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set NULL params!\n");
1009 return TI_NOK;
1010 }
1011
1012 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setParams: %x\n", pParamInfo->paramType);
1013
1014 switch(pParamInfo->paramType)
1015 {
1016
1017 case QOS_PACKET_BURST_ENABLE:
1018
1019 if (pParamInfo->content.qosPacketBurstEnb > QOS_PACKET_BURST_ENABLE_MAX)
1020 return (PARAM_VALUE_NOT_VALID);
1021
1022 /* No change */
1023 if (pParamInfo->content.qosPacketBurstEnb == pQosMngr->qosPacketBurstEnable)
1024 return TI_OK;
1025
1026 /* Update the qosPacketBurstEnable parameter */
1027 pQosMngr->qosPacketBurstEnable = pParamInfo->content.qosPacketBurstEnb;
1028
1029 /* Packet burst enable changed from F to T */
1030 if (pParamInfo->content.qosPacketBurstEnb == TI_TRUE)
1031 {
1032 /* Update the acTrafficInitParams of BE to the packet burst def*/
1033 pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
1034
1035 /* Update the acTrafficParams of BE and the hal to the packet burst def*/
1036 if (pQosMngr->activeProtocol == QOS_NONE)
1037 {
1038 pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
1039 /* verify the parameters and update the hal */
1040 status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
1041 if(status != TI_OK)
1042 return status;
1043 }
1044 }
1045
1046 /* Packet burst enable changed from T to F*/
1047 else
1048 {
1049 /* Update the acTrafficInitParams of BE to the AC def*/
1050 pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
1051
1052 /* Update the acTrafficParams of BE and the hal to the AC def*/
1053 if (pQosMngr->activeProtocol == QOS_NONE)
1054 {
1055 pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
1056 /* verify the parameters and update the hal */
1057 status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
1058 if(status != TI_OK)
1059 return status;
1060 }
1061 }
1062 break;
1063
1064 case QOS_MNGR_SET_SITE_PROTOCOL:
1065 if(pParamInfo->content.qosSiteProtocol == QOS_WME)
1066 pQosMngr->WMESiteSupport = TI_TRUE;
1067 else
1068 pQosMngr->WMESiteSupport = TI_FALSE;
1069 break;
1070
1071
1072 case QOS_MNGR_PS_RX_STREAMING:
1073 return qosMngr_SetPsRxStreaming (pQosMngr, &pParamInfo->content.tPsRxStreaming);
1074
1075
1076 case QOS_MNGR_SET_OS_PARAMS:
1077 if((EAcTrfcType)pParamInfo->content.qosOsParams.acID > QOS_HIGHEST_AC_INDEX)
1078 {
1079 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set invalid acId: %d param\n",pParamInfo->content.qosOsParams.acID);
1080
1081 return (PARAM_VALUE_NOT_VALID);
1082 }
1083
1084 if(((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol != PS_SCHEME_LEGACY) && ((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol != PS_SCHEME_UPSD_TRIGGER))
1085 {
1086 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set invalid PSDeliveryProtocol: %d param\n",pParamInfo->content.qosOsParams.PSDeliveryProtocol);
1087
1088 return (PARAM_VALUE_NOT_VALID);
1089 }
1090
1091 /* config tidConf */
1092 acID = (EAcTrfcType)pParamInfo->content.qosOsParams.acID;
1093
1094 if( (pParamInfo->content.qosOsParams.PSDeliveryProtocol != pQosMngr->acParams[acID].desiredWmeAcPsMode) &&
1095 (pQosMngr->isConnected == TI_TRUE) )
1096 {
1097 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set new PS protocol while connected");
1098
1099 return (PARAM_VALUE_NOT_VALID);
1100 }
1101
1102
1103 /* UPSD_FW open in upsd integration */
1104 /* set the current PS mode. In not connected state it is always Legacy since the currentPsMode only
1105 update after connection */
1106 pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
1107 pQosMngr->acParams[acID].msduLifeTimeParam = pParamInfo->content.qosOsParams.MaxLifeTime;
1108
1109 status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
1110 if(status != TI_OK)
1111 return status;
1112
1113 /* configure MSDU-Lifetime to TxCtrl. */
1114 txCtrlParams_setAcMsduLifeTime(pQosMngr->hTxCtrl, acID, pParamInfo->content.qosOsParams.MaxLifeTime);
1115
1116 /* synch psPoll mode with qosMngr */
1117 /* Update the PsMode parameter */
1118 pQosMngr->acParams[acID].desiredWmeAcPsMode = (PSScheme_e) pParamInfo->content.qosOsParams.PSDeliveryProtocol;
1119 break;
1120
1121 case QOS_MNGR_CURRENT_PS_MODE:
1122 if( (pQosMngr->activeProtocol == QOS_WME) && (pQosMngr->desiredPsMode == PS_SCHEME_UPSD_TRIGGER) && (pParamInfo->content.currentPsMode == PS_SCHEME_UPSD_TRIGGER) )
1123 pQosMngr->currentPsMode = PS_SCHEME_UPSD_TRIGGER;
1124 else
1125 pQosMngr->currentPsMode = PS_SCHEME_LEGACY;
1126 break;
1127
1128 case QOS_MNGR_ADD_TSPEC_REQUEST:
1129 pQosMngr->TSPECNegotiationResultCallb = NULL;
1130 pQosMngr->TSPECNegotiationResultModule = NULL;
1131 status = qosMngr_requestAdmission(hQosMngr, &pParamInfo->content.qosAddTspecRequest);
1132 switch (status)
1133 {
1134 case TI_OK:
1135 return TI_OK;
1136
1137 case TRAFIC_ADM_PENDING:
1138 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Driver is still waiting for a response of previous request...\n");
1139 break;
1140 case AC_ALREADY_IN_USE:
1141 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Other user priority from the same AC has already used a TSPEC...\n");
1142 break;
1143 case NOT_CONNECTED:
1144 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
1145 break;
1146 case NO_QOS_AP:
1147 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
1148 break;
1149 case TI_NOK:
1150 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Invalid parameter...\n");
1151 break;
1152 default:
1153 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Unknown return value...\n");
1154 break;
1155 }
1156 return TI_NOK;
1157
1158 case QOS_MNGR_RESEND_TSPEC_REQUEST:
1159 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setParams: QOS_MNGR_RESEND_TSPEC_REQUEST\n");
1160 pQosMngr->TSPECNegotiationResultCallb = (qosMngrCallb_t)pParamInfo->content.qosRenegotiateTspecRequest.callback;
1161 pQosMngr->TSPECNegotiationResultModule = pParamInfo->content.qosRenegotiateTspecRequest.handler;
1162 status = qosMngr_requestAdmission(hQosMngr, &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6]);
1163
1164 if ((status == TI_OK) && (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY))
1165 {
1166 status = qosMngr_requestAdmission(hQosMngr, &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4]);
1167 }
1168 return (status);
1169
1170 case QOS_MNGR_DEL_TSPEC_REQUEST:
1171 status = qosMngr_deleteAdmission(hQosMngr, &pParamInfo->content.qosDelTspecRequest);
1172 switch (status)
1173 {
1174 case TI_OK:
1175 return TI_OK;
1176 case NOT_CONNECTED:
1177 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
1178 break;
1179 case NO_QOS_AP:
1180 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
1181 break;
1182 case TI_NOK:
1183 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Invalid parameter...\n");
1184 break;
1185 default:
1186 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Unknown return value...\n");
1187 break;
1188 }
1189 return TI_NOK;
1190
1191 case QOS_SET_RX_TIME_OUT:
1192 if (pParamInfo->content.rxTimeOut.UPSD == 0)
1193 {
1194 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, " :Error trying to set invalid zero timeout for UPSD \n");
1195 return PARAM_VALUE_NOT_VALID;
1196
1197 }
1198 pQosMngr->rxTimeOut.psPoll = (TI_UINT16)pParamInfo->content.rxTimeOut.psPoll;
1199 pQosMngr->rxTimeOut.UPSD = (TI_UINT16)pParamInfo->content.rxTimeOut.UPSD;
1200
1201
1202 /* set RxTimeOut to FW */
1203 param.paramType = TWD_RX_TIME_OUT_PARAM_ID;
1204 param.content.halCtrlRxTimeOut = pQosMngr->rxTimeOut;
1205 TWD_SetParam (pQosMngr->hTWD, ¶m);
1206 break;
1207
1208 case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
1209
1210 if( pParamInfo->content.TspecConfigure.voiceTspecConfigure || pParamInfo->content.TspecConfigure.videoTspecConfigure)
1211 pQosMngr->performTSPECRenegotiation = TI_TRUE;
1212 else
1213 pQosMngr->performTSPECRenegotiation = TI_FALSE;
1214
1215 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->performTSPECRenegotiation);
1216 break;
1217
1218 default:
1219 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType);
1220 return (PARAM_NOT_SUPPORTED);
1221 }
1222
1223 return TI_OK;
1224
1225
1226 }
1227
1228 /************************************************************************
1229 * verifyAndConfigTrafficParams *
1230 ************************************************************************
1231 DESCRIPTION: The function verifies the parameters set by qosMngr to
1232 the queue traffic params in whalCtrl to be configured to TNET.
1233
1234 INPUT: hQosMngr - Qos Manager handle.
1235 pAcTrafficParams - pointer to ac parameters.
1236
1237 OUTPUT:
1238
1239 RETURN: TI_OK on success, TI_NOK otherwise
1240
1241 ************************************************************************/
1242
verifyAndConfigTrafficParams(qosMngr_t * pQosMngr,TQueueTrafficParams * pQtrafficParams)1243 static TI_STATUS verifyAndConfigTrafficParams(qosMngr_t *pQosMngr, TQueueTrafficParams *pQtrafficParams)
1244 {
1245 TTwdParamInfo param;
1246 TQueueTrafficParams queueTrafficParams;
1247
1248 if(pQtrafficParams->queueID > MAX_NUM_OF_AC - 1)
1249 {
1250 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error trying to set invalid queueID: %d param",pQtrafficParams->queueID);
1251
1252 return (PARAM_VALUE_NOT_VALID);
1253 }
1254
1255
1256 if(pQtrafficParams->channelType > MAX_CHANNEL_TYPE)
1257 {
1258 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error trying to set invalid channelType: %d param",pQtrafficParams->channelType);
1259
1260 return (PARAM_VALUE_NOT_VALID);
1261
1262 }
1263
1264 /* TBD */
1265 if(pQtrafficParams->tsid > AC_PARAMS_MAX_TSID)
1266 {
1267 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error trying to set invalid tsid: %d param",pQtrafficParams->tsid);
1268
1269 return (PARAM_VALUE_NOT_VALID);
1270
1271 }
1272
1273 if(pQtrafficParams->psScheme > MAX_PS_SCHEME)
1274 {
1275 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error trying to set invalid psScheme: %d param",pQtrafficParams->psScheme);
1276
1277 return (PARAM_VALUE_NOT_VALID);
1278 }
1279
1280 if(pQtrafficParams->ackPolicy > MAX_ACK_POLICY)
1281 {
1282 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error trying to set invalid ackPolicy: %d param",pQtrafficParams->ackPolicy);
1283
1284 return (PARAM_VALUE_NOT_VALID);
1285 }
1286
1287 queueTrafficParams = *pQtrafficParams;
1288
1289 param.paramType = TWD_QUEUES_PARAM_ID;
1290 /* set parameters */
1291 param.content.pQueueTrafficParams = &queueTrafficParams;
1292
1293 return TWD_SetParam (pQosMngr->hTWD, ¶m);
1294 }
1295
1296 /************************************************************************
1297 * verifyAndConfigQosParams *
1298 ************************************************************************
1299 DESCRIPTION: The function verifies the parameters set by qosMngr to
1300 the AC Qos params in whalCtrl to be configured to TNET.
1301
1302 INPUT: hQosMngr - Qos Manager handle.
1303 pAcTrafficParams - pointer to ac parameters.
1304
1305 OUTPUT:
1306
1307 RETURN: TI_OK on success, TI_NOK otherwise
1308
1309 ************************************************************************/
1310
verifyAndConfigQosParams(qosMngr_t * pQosMngr,TAcQosParams * pAcQosParams)1311 static TI_STATUS verifyAndConfigQosParams(qosMngr_t *pQosMngr,TAcQosParams *pAcQosParams)
1312 {
1313 TAcQosParams acQosParams;
1314
1315 if(pAcQosParams->ac > MAX_NUM_OF_AC - 1 )
1316 {
1317 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error trying to set invalid ac : %d param",pAcQosParams->ac);
1318 return (PARAM_VALUE_NOT_VALID);
1319 }
1320 /* verification is unnecessary due to limited range of pAcQosParams->aifsn data type (TI_UINT8)
1321 if(pAcQosParams->aifsn > QOS_AIFS_MAX )
1322 {
1323 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error trying to set invalid aifsn : %d param",pAcQosParams->aifsn);
1324
1325 return (PARAM_VALUE_NOT_VALID);
1326 }
1327 */
1328 if(pAcQosParams->cwMax > QOS_CWMAX_MAX )
1329 {
1330 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error trying to set invalid cwMax : %d param",pAcQosParams->cwMax);
1331 return (PARAM_VALUE_NOT_VALID);
1332 }
1333
1334 if(pAcQosParams->cwMin > QOS_CWMIN_MAX )
1335 {
1336 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error trying to set invalid cwMax : %d param",pAcQosParams->cwMax);
1337 return (PARAM_VALUE_NOT_VALID);
1338 }
1339
1340 if(pAcQosParams->txopLimit > QOS_TX_OP_LIMIT_MAX )
1341 {
1342 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error trying to set invalid txopLimit : %d param",pAcQosParams->txopLimit);
1343 return (PARAM_VALUE_NOT_VALID);
1344 }
1345
1346 acQosParams.ac = pAcQosParams->ac;
1347 acQosParams.aifsn = pAcQosParams->aifsn;
1348
1349 /* convert to TNET units */
1350 acQosParams.cwMax = (1 << pAcQosParams->cwMax) - 1; /* CwMax = 2^CwMax - 1*/
1351 acQosParams.cwMin = (1 << pAcQosParams->cwMin) - 1; /* CwMin = 2^CwMin - 1*/
1352 acQosParams.txopLimit = pAcQosParams->txopLimit << 5; /* in us */
1353
1354 return TWD_CfgAcParams (pQosMngr->hTWD, &acQosParams, NULL, NULL);
1355 }
1356
1357 /************************************************************************
1358 * qosMngr_GetWmeEnableFlag *
1359 ************************************************************************
1360 DESCRIPTION: The function is called in order to get the WME enable flag
1361 of qosMngr according to init file desired mode.
1362 called from StaCap_GetHtCapabilitiesIe.
1363
1364 INPUT: hQosMngr - Qos Manager handle.
1365 bWmeEnable - return flag.
1366
1367 OUTPUT:
1368
1369 RETURN: TI_OK on success, TI_NOK otherwise
1370
1371 ************************************************************************/
qosMngr_GetWmeEnableFlag(TI_HANDLE hQosMngr,TI_BOOL * bWmeEnable)1372 TI_STATUS qosMngr_GetWmeEnableFlag(TI_HANDLE hQosMngr, TI_BOOL *bWmeEnable)
1373 {
1374 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1375
1376 *bWmeEnable = pQosMngr->WMEEnable;
1377
1378 return TI_OK;
1379 }
1380
1381 /************************************************************************
1382 * qosMngr_selectActiveProtocol *
1383 ************************************************************************
1384 DESCRIPTION: The function is called in order to set the active protocol in
1385 the qosMngr according to site capabilities and desired mode.
1386 called from SystemConfig.
1387
1388 INPUT:
1389
1390 OUTPUT:
1391
1392 RETURN: TI_OK on success, TI_NOK otherwise
1393
1394 ************************************************************************/
qosMngr_selectActiveProtocol(TI_HANDLE hQosMngr)1395 TI_STATUS qosMngr_selectActiveProtocol(TI_HANDLE hQosMngr)
1396 {
1397 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1398
1399 /* decide qos protocol */
1400 /* NOTE: if both XCC qnd wme supported wme is chosen */
1401 if(pQosMngr->WMESiteSupport && pQosMngr->WMEEnable)
1402 {
1403 pQosMngr->activeProtocol = QOS_WME;
1404 }
1405 else
1406 {
1407 pQosMngr->activeProtocol = QOS_NONE;
1408 }
1409 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, " qosMngr_selectActiveProtocol() : pQosMngr->activeProtocol %d\n",pQosMngr->activeProtocol);
1410
1411 return TI_OK;
1412 }
1413
1414 /************************************************************************
1415 * qosMngr_setAcPsDeliveryMode *
1416 ************************************************************************
1417 DESCRIPTION: The function is called in order to set the upsd/ps_poll according
1418 to the desired and current upsd mode (per AC as well).
1419 called from systemConfig.
1420
1421 INPUT:
1422
1423 OUTPUT:
1424
1425 RETURN: TI_OK on success, TI_NOK otherwise
1426
1427 ************************************************************************/
qosMngr_setAcPsDeliveryMode(TI_HANDLE hQosMngr)1428 TI_STATUS qosMngr_setAcPsDeliveryMode(TI_HANDLE hQosMngr)
1429 {
1430 TI_UINT8 acID;
1431 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1432
1433 /* in case the current PS mode is not UPSD - the IE is empty */
1434 if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
1435 {
1436 for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
1437 {
1438 if(pQosMngr->acParams[acID].desiredWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1439 {
1440 pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
1441 }
1442 }
1443 }
1444
1445 return TI_OK;
1446
1447 }
1448
1449
1450 /************************************************************************
1451 * qosMngr_getQosCapabiltyInfeElement *
1452 ************************************************************************
1453 DESCRIPTION: The function is called in order to build the Qos Capability
1454 IE for the associatiomn request.
1455
1456 INPUT:
1457
1458 OUTPUT:
1459
1460 RETURN: TI_OK on success, TI_NOK otherwise
1461
1462 ************************************************************************/
qosMngr_getQosCapabiltyInfeElement(TI_HANDLE hQosMngr,TI_UINT8 * pQosIe,TI_UINT32 * pLen)1463 TI_STATUS qosMngr_getQosCapabiltyInfeElement(TI_HANDLE hQosMngr, TI_UINT8 *pQosIe, TI_UINT32 *pLen)
1464 {
1465 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1466 dot11_QOS_CAPABILITY_IE_t *dot11_QOS_CAPABILITY_IE = (dot11_QOS_CAPABILITY_IE_t *)pQosIe;
1467 TI_STATUS status = TI_OK;
1468 TI_UINT8 extraIeLen = 0;
1469
1470 if(pQosMngr->activeProtocol == QOS_WME)
1471 {
1472 dot11_QOS_CAPABILITY_IE->hdr[0] = DOT11_QOS_CAPABILITY_ELE_ID;
1473 dot11_QOS_CAPABILITY_IE->hdr[1] = DOT11_QOS_CAPABILITY_ELE_LEN;
1474
1475 /* The default configuration of QoS info Field is legacy PS for all ACs */
1476 dot11_QOS_CAPABILITY_IE->QosInfoField = 0;
1477
1478 /* in case the current PS mode is not UPSD - the IE is empty */
1479 if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
1480 {
1481 if(pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1482 {
1483 dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_VO_APSD_FLAGS_SHIFT);
1484 }
1485 if(pQosMngr->acParams[QOS_AC_VI].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1486 {
1487 dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_VI_APSD_FLAGS_SHIFT);
1488 }
1489
1490 if(pQosMngr->acParams[QOS_AC_BK].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1491 {
1492 dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_BK_APSD_FLAGS_SHIFT);
1493 }
1494
1495 if(pQosMngr->acParams[QOS_AC_BE].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1496 {
1497 dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_BE_APSD_FLAGS_SHIFT);
1498 }
1499
1500 dot11_QOS_CAPABILITY_IE->QosInfoField |= (((pQosMngr->desiredMaxSpLen) & MAX_SP_LENGTH_MASK) << MAX_SP_LENGTH_SHIFT);
1501
1502 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "dot11_QOS_CAPABILITY_IE->QosInfoField = 0x%x\n",dot11_QOS_CAPABILITY_IE->QosInfoField);
1503 }
1504
1505 *pLen = dot11_QOS_CAPABILITY_IE->hdr[1] + sizeof(dot11_eleHdr_t);
1506
1507 #ifdef XCC_MODULE_INCLUDED
1508 /* If required, add XCC info-elements to the association request packets */
1509 if (pQosMngr->performTSPECRenegotiation == TI_TRUE)
1510 {
1511 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_getQosCapabiltyInfeElement: performing TSPEC renegotiation\n");
1512
1513 status = XCCMngr_getXCCQosIElements(pQosMngr->hXCCMgr, (pQosIe+(*pLen)), &extraIeLen);
1514 }
1515 #endif
1516 *pLen += extraIeLen;
1517 }
1518 else
1519 {
1520 *pLen = 0;
1521 }
1522
1523 return status;
1524
1525 }
1526 /************************************************************************
1527 * qosMngr_assocReqBuild *
1528 ************************************************************************
1529 DESCRIPTION: The function is called in order to build the assocReq IE for
1530 the current site QOS protocol.
1531
1532 INPUT: hQosMngr - Qos Manager handle.
1533
1534 OUTPUT:
1535
1536 RETURN: TI_OK on success, TI_NOK otherwise
1537
1538 ************************************************************************/
1539
qosMngr_assocReqBuild(TI_HANDLE hQosMngr,TI_UINT8 * pQosIe,TI_UINT32 * pLen)1540 TI_STATUS qosMngr_assocReqBuild(TI_HANDLE hQosMngr, TI_UINT8 *pQosIe, TI_UINT32 *pLen)
1541 {
1542 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1543 TI_STATUS status;
1544 TI_UINT8 temp;
1545
1546
1547 if(pQosMngr == NULL)
1548 {
1549 *pLen = 0;
1550 return TI_OK;
1551 }
1552
1553 /* building assocReq frame */
1554 switch(pQosMngr->activeProtocol)
1555 {
1556 case QOS_WME:
1557 status = getWMEInfoElement(pQosMngr,pQosIe,&temp);
1558 if (status !=TI_OK)
1559 {
1560 *pLen = 0;
1561 }
1562 *pLen = temp;
1563 break;
1564
1565 case QOS_NONE:
1566 *pLen = 0;
1567 return TI_OK;
1568
1569 default:
1570 *pLen = 0;
1571 break;
1572 }
1573
1574 return TI_OK;
1575 }
1576
1577 /************************************************************************
1578 * getWMEInfoElement *
1579 ************************************************************************
1580 DESCRIPTION: building QOS_WME IE.
1581
1582 INPUT: hQosMngr - Qos Manager handle.
1583
1584 OUTPUT:
1585
1586 RETURN: TI_OK on success, TI_NOK otherwise
1587
1588 ************************************************************************/
1589
getWMEInfoElement(qosMngr_t * pQosMngr,TI_UINT8 * pWMEie,TI_UINT8 * pLen)1590 static TI_STATUS getWMEInfoElement(qosMngr_t *pQosMngr,TI_UINT8 *pWMEie,TI_UINT8 *pLen)
1591 {
1592 dot11_WME_IE_t *pDot11_WME_IE = (dot11_WME_IE_t *)pWMEie;
1593
1594 pDot11_WME_IE->hdr[0] = DOT11_WME_ELE_ID;
1595 pDot11_WME_IE->hdr[1] = DOT11_WME_ELE_LEN;
1596 pDot11_WME_IE->OUI[0] = 0x00;
1597 pDot11_WME_IE->OUI[1] = 0x50;
1598 pDot11_WME_IE->OUI[2] = 0xf2;
1599 pDot11_WME_IE->OUIType = dot11_WME_OUI_TYPE;
1600 pDot11_WME_IE->OUISubType = dot11_WME_OUI_SUB_TYPE_IE;
1601 pDot11_WME_IE->version = dot11_WME_VERSION;
1602 pDot11_WME_IE->ACInfoField = 0;
1603
1604 if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
1605 {
1606 if(pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1607 {
1608 pDot11_WME_IE->ACInfoField |= (1 << AC_VO_APSD_FLAGS_SHIFT);
1609 }
1610 if(pQosMngr->acParams[QOS_AC_VI].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1611 {
1612 pDot11_WME_IE->ACInfoField |= (1 << AC_VI_APSD_FLAGS_SHIFT);
1613 }
1614
1615 if(pQosMngr->acParams[QOS_AC_BK].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1616 {
1617 pDot11_WME_IE->ACInfoField |= (1 << AC_BK_APSD_FLAGS_SHIFT);
1618 }
1619
1620 if(pQosMngr->acParams[QOS_AC_BE].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
1621 {
1622 pDot11_WME_IE->ACInfoField |= (1 << AC_BE_APSD_FLAGS_SHIFT);
1623 }
1624
1625 pDot11_WME_IE->ACInfoField |= (((pQosMngr->desiredMaxSpLen) & MAX_SP_LENGTH_MASK) << MAX_SP_LENGTH_SHIFT);
1626 }
1627
1628 *pLen = pDot11_WME_IE->hdr[1] + sizeof(dot11_eleHdr_t);
1629
1630 return TI_OK;
1631
1632 }
1633
1634 /************************************************************************
1635 * qosMngr_checkTspecRenegResults *
1636 ************************************************************************
1637 DESCRIPTION: The function is called upon association response to check
1638 Tspec renegotiation results
1639
1640 INPUT: hQosMngr - Qos Manager handle.
1641 assocRsp - pointer to received IE parameters received
1642 in association response.
1643 OUTPUT:
1644
1645 RETURN: -
1646
1647 ************************************************************************/
qosMngr_checkTspecRenegResults(TI_HANDLE hQosMngr,assocRsp_t * assocRsp)1648 void qosMngr_checkTspecRenegResults(TI_HANDLE hQosMngr, assocRsp_t *assocRsp)
1649 {
1650 tspecInfo_t tspecInfo;
1651 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1652 #ifdef XCC_MODULE_INCLUDED
1653 TI_UINT32 acCount;
1654 #endif
1655
1656 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_checkTspecRenegResults: performTSPECRenegotiation = %d, tspecParams received= %x\n", pQosMngr->performTSPECRenegotiation, assocRsp->tspecVoiceParameters);
1657
1658 if (pQosMngr->performTSPECRenegotiation != TI_TRUE)
1659 {
1660 /* If no re-negotiation was requested, no parsing shall be done */
1661 #ifdef XCC_MODULE_INCLUDED
1662 measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, MAX_NUM_OF_AC);
1663 #endif
1664 return;
1665 }
1666
1667 if ( (assocRsp->tspecVoiceParameters == NULL) && (assocRsp->tspecSignalParameters == NULL) )
1668 {
1669 /* The renegotiation request was ignored - update QoS Manager database */
1670 qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_6,
1671 &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6],
1672 STATUS_TRAFFIC_ADM_REQUEST_REJECT);
1673
1674 if (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY)
1675 {
1676 qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_4,
1677 &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4],
1678 STATUS_TRAFFIC_ADM_REQUEST_REJECT);
1679 }
1680 #ifdef XCC_MODULE_INCLUDED
1681 measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, MAX_NUM_OF_AC);
1682 #endif
1683 return;
1684 }
1685
1686
1687 if (assocRsp->tspecVoiceParameters != NULL)
1688 {
1689 /* The renogitaion was performed - update QoS Manager database */
1690 pQosMngr->voiceTspecConfigured = TI_TRUE;
1691 trafficAdmCtrl_parseTspecIE(&tspecInfo, assocRsp->tspecVoiceParameters);
1692
1693 qosMngr_setAdmissionInfo(pQosMngr, tspecInfo.AC, &tspecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
1694 }
1695
1696 if (assocRsp->tspecSignalParameters != NULL)
1697 {
1698 /* Signal TSPEC was re-negotiated as well */
1699 pQosMngr->videoTspecConfigured = TI_TRUE;
1700 trafficAdmCtrl_parseTspecIE(&tspecInfo, assocRsp->tspecSignalParameters);
1701 qosMngr_setAdmissionInfo(pQosMngr, tspecInfo.AC, &tspecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
1702 }
1703 else if (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY)
1704 {
1705 /* Signal TSPEC was not re-negotiated although requested to - ERROR */
1706 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite: Signal TSPEC was not re-negotiated while voice was \n");
1707 qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_4,
1708 &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4],
1709 STATUS_TRAFFIC_ADM_REQUEST_REJECT);
1710 }
1711
1712 #ifdef XCC_MODULE_INCLUDED
1713 /* If XCC IEs are present for one or more ACs, update other modules with received parameters */
1714 for (acCount = 0; acCount < MAX_NUM_OF_AC; acCount++)
1715 {
1716 XCCMngr_setXCCQoSParams(pQosMngr->hXCCMgr, &assocRsp->XCCIEs[acCount], acCount);
1717 }
1718 #endif
1719 }
1720
1721
1722 /************************************************************************
1723 * qosMngr_setSite *
1724 ************************************************************************
1725 DESCRIPTION: The function is called upon association response to set site
1726 parameters.
1727
1728 INPUT: hQosMngr - Qos Manager handle.
1729 assocRsp - pointer to received IE parameters received
1730 in association response.
1731 OUTPUT:
1732
1733 RETURN: TI_OK on success, TI_NOK otherwise
1734
1735 ************************************************************************/
qosMngr_setSite(TI_HANDLE hQosMngr,assocRsp_t * assocRsp)1736 TI_STATUS qosMngr_setSite(TI_HANDLE hQosMngr, assocRsp_t *assocRsp)
1737 {
1738 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1739 TI_STATUS status;
1740
1741 if(hQosMngr == NULL)
1742 return TI_NOK;
1743
1744 /* checking active protocol */
1745 switch(pQosMngr->activeProtocol)
1746 {
1747 case QOS_WME:
1748 /* verify QOS protocol received in association response */
1749 status = verifyWmeIeParams(pQosMngr, (TI_UINT8 *)assocRsp->WMEParams);
1750 if(status != TI_OK)
1751 {
1752 pQosMngr->activeProtocol = QOS_NONE;
1753 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite: setting active protocol QOS_WME params with non QOS_WME IE params frame, setting active protocol back to NONE \n");
1754 return TI_NOK;
1755 }
1756
1757 status = setWmeSiteParams(pQosMngr, (TI_UINT8 *)assocRsp->WMEParams);
1758 if (status != TI_OK)
1759 {
1760 pQosMngr->activeProtocol = QOS_NONE;
1761 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Warning: qosMngr_setSite-> failed to set AC QOS_WME parameters!!! , setting active protocol back to NONE\n");
1762 return TI_NOK;
1763 }
1764 /* update siteMgr with recevied params */
1765 status = siteMgr_setWMEParamsSite(pQosMngr->hSiteMgr, assocRsp->WMEParams);
1766 if (status != TI_OK)
1767 {
1768 pQosMngr->activeProtocol = QOS_NONE;
1769 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite:failed to init QOS_WME parameters!!! , setting active protocol back to NONE\n\n");
1770 return TI_NOK;
1771 }
1772
1773 break;
1774
1775 case QOS_NONE:
1776
1777 /* Check if the packet burst is enable, if it is,
1778 should update the BE parames and the hal to the packet burst def */
1779 if (pQosMngr->qosPacketBurstEnable == TI_TRUE)
1780 {
1781 /* Update the acTrafficInitParams of BE to the packet burst def*/
1782 pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
1783 /* Update the acTrafficParams of BE to the packet burst def*/
1784 pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
1785 /* verify the parameters and update the hal */
1786 status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
1787 if (status != TI_OK)
1788 {
1789 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "qosMngr_setSite:failed to init NON_QOS parameters!!!\n\n");
1790 return TI_NOK;
1791 }
1792 }
1793
1794 break;
1795
1796 default:
1797 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "Warning: qosMngr_setSite NO active protocls To set \n");
1798 break;
1799 }
1800
1801 /* Check if TSPEC re-negotiation was performed, if so - look for results */
1802 qosMngr_checkTspecRenegResults(pQosMngr, assocRsp);
1803
1804 return TI_OK;
1805
1806 }
1807
1808 /************************************************************************
1809 * qosMngr_updateIEinfo *
1810 ************************************************************************
1811 DESCRIPTION: The function is called upon run-time update of AC parameters
1812
1813 INPUT: hQosMngr - Qos Manager handle.
1814 pQosIeParams - pointer to received IE parameters received
1815 in beacon or probe response.
1816 OUTPUT:
1817
1818 RETURN: TI_OK on success, TI_NOK otherwise
1819
1820 ************************************************************************/
1821
qosMngr_updateIEinfo(TI_HANDLE hQosMngr,TI_UINT8 * pQosIeParams,EQosProtocol qosSetProtocol)1822 void qosMngr_updateIEinfo(TI_HANDLE hQosMngr, TI_UINT8 *pQosIeParams, EQosProtocol qosSetProtocol)
1823 {
1824 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1825 TI_STATUS status;
1826 dot11_WME_PARAM_t *pWMEparams;
1827
1828
1829
1830 if(pQosMngr == NULL)
1831 return;
1832
1833 /* checking active protocol */
1834 switch(pQosMngr->activeProtocol)
1835 {
1836 case QOS_WME:
1837 if(qosSetProtocol != QOS_WME)
1838 return;
1839
1840 if(pQosIeParams == NULL)
1841 {
1842 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "Warning: updateIEinfo -> trying to update QOS_WME parameters with NULL site parameters!!!\n");
1843 return ;
1844 }
1845
1846 /* verify QOS protocol received in update IE */
1847 status = verifyWmeIeParams(pQosMngr,pQosIeParams);
1848 if(status != TI_OK)
1849 {
1850 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "Warning: updateIEinfo ->upadting active protocl QOS_WME params with non QOS_WME IE params frame !!!\n");
1851 return ;
1852 }
1853 pWMEparams = (dot11_WME_PARAM_t *)pQosIeParams;
1854
1855 /* update AC params */
1856 status = updateACParams(pQosMngr,&(pWMEparams->WME_ACParameteres));
1857 if(status != TI_OK)
1858 {
1859 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "updateIEinfo-> failed to update AC QOS_WME parameters!!!\n\n");
1860 return ;
1861 }
1862 break;
1863
1864
1865 default:
1866 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "updateIEinfo-> trying to update qos paramters without active protocol !!!");
1867 break;
1868 }
1869 }
1870
1871 /************************************************************************
1872 * qosMngr_buildTSPec *
1873 ************************************************************************/
qosMngr_buildTSPec(TI_HANDLE hQosMngr,TI_UINT32 user_priority,TI_UINT8 * pQosIe)1874 TI_UINT32 qosMngr_buildTSPec(TI_HANDLE hQosMngr, TI_UINT32 user_priority, TI_UINT8 *pQosIe)
1875 {
1876 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
1877 OS_802_11_QOS_TSPEC_PARAMS *pPreservedParams;
1878 tspecInfo_t *pCandidateParams;
1879 TI_UINT32 ieLen;
1880
1881 pPreservedParams = &pQosMngr->tspecRenegotiationParams[user_priority];
1882 pCandidateParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[user_priority];
1883
1884 if (pPreservedParams->uUserPriority != MAX_USER_PRIORITY)
1885 {
1886 qosMngr_storeTspecCandidateParams (pCandidateParams, pPreservedParams, user_priority);
1887 pCandidateParams->trafficAdmState = AC_WAIT_ADMISSION;
1888
1889 trafficAdmCtrl_buildTSPec(pQosMngr->pTrafficAdmCtrl, pCandidateParams, pQosIe, &ieLen);
1890 return ieLen;
1891 }
1892 else
1893 {
1894 return 0;
1895 }
1896 }
1897
1898 /************************************************************************
1899 * setWmeSiteParams *
1900 ************************************************************************
1901 DESCRIPTION: The function is called upon association response to set QOS_WME site
1902 parameters.
1903
1904 INPUT: hQosMngr - Qos Manager handle.
1905 pQosIeParams - pointer to received IE parameters received
1906 in association response.
1907 OUTPUT:
1908
1909 RETURN: TI_OK on success, TI_NOK otherwise
1910
1911 ************************************************************************/
1912
setWmeSiteParams(qosMngr_t * pQosMngr,TI_UINT8 * pQosIeParams)1913 static TI_STATUS setWmeSiteParams(qosMngr_t *pQosMngr, TI_UINT8 *pQosIeParams)
1914 {
1915 dot11_WME_PARAM_t *pWMEparams = (dot11_WME_PARAM_t *)pQosIeParams;
1916 TI_STATUS status;
1917 TI_UINT8 acID;
1918
1919 if (pQosIeParams == NULL)
1920 {
1921 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "setWmeSiteParams: pQosIeParams is NULL !");
1922 return TI_NOK;
1923 }
1924
1925 for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
1926 {
1927 /* configure Ack-Policy to TxCtrl. */
1928 txCtrlParams_setAcAckPolicy(pQosMngr->hTxCtrl, acID, pQosMngr->acParams[acID].wmeAcAckPolicy);
1929 }
1930
1931 /* update AC params */
1932 pWMEparams->WME_ACParameteres.ACBEParametersRecord.TXOPLimit =
1933 ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACBEParametersRecord.TXOPLimit);
1934 pWMEparams->WME_ACParameteres.ACBKParametersRecord.TXOPLimit =
1935 ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACBKParametersRecord.TXOPLimit);
1936 pWMEparams->WME_ACParameteres.ACVIParametersRecord.TXOPLimit =
1937 ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACVIParametersRecord.TXOPLimit);
1938 pWMEparams->WME_ACParameteres.ACVOParametersRecord.TXOPLimit =
1939 ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACVOParametersRecord.TXOPLimit);
1940
1941 status = updateACParams(pQosMngr,&(pWMEparams->WME_ACParameteres));
1942 if(status != TI_OK)
1943 return status;
1944
1945 /* update Tx header convert mode */
1946 txCtrlParams_setQosHeaderConverMode(pQosMngr->hTxCtrl, HDR_CONVERT_QOS);
1947
1948 return TI_OK;
1949 }
1950
1951
1952 /************************************************************************
1953 * updateACParams *
1954 ************************************************************************
1955 DESCRIPTION: the function is called upon QOS protocol updates paramters
1956 to TNET and TxCtrl object
1957
1958 INPUT: hQosMngr - Qos Manager handle.
1959
1960 OUTPUT:
1961
1962 RETURN: TI_OK on success, TI_NOK otherwise
1963
1964 ************************************************************************/
1965
updateACParams(qosMngr_t * pQosMngr,dot11_ACParameters_t * pAcParams)1966 static TI_STATUS updateACParams(qosMngr_t *pQosMngr,dot11_ACParameters_t *pAcParams)
1967 {
1968 TI_UINT8 acID,i;
1969 TI_STATUS status;
1970 dot11_QOS_AC_IE_ParametersRecord_t *pACParameteresRecord;
1971 ETrafficAdmState *pAcTrafficAdmState;
1972
1973
1974 /*
1975 * For QOS_WME: setting ac traffic params (edcf etc')
1976 * in this order BE, BK , VI, VO .
1977 */
1978
1979 pACParameteresRecord = (dot11_QOS_AC_IE_ParametersRecord_t *)pAcParams;
1980
1981 for(i = FIRST_AC_INDEX; i < MAX_NUM_OF_AC; i++, pACParameteresRecord++)
1982 {
1983 acID = (pACParameteresRecord->ACI_AIFSN & AC_PARAMS_ACI_MASK) >> 5;
1984
1985 pAcTrafficAdmState = &(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState);
1986
1987 /* edcf params */
1988
1989 pQosMngr->acParams[acID].acQosParams.ac = acID;
1990 pQosMngr->acParams[acID].acQosParams.aifsn = pACParameteresRecord->ACI_AIFSN & AC_PARAMS_AIFSN_MASK;
1991 pQosMngr->acParams[acID].acQosParams.txopLimit = pACParameteresRecord->TXOPLimit;
1992
1993 /* to use user setting ? */
1994 if(TI_TRUE ==pQosMngr->bCwFromUserEnable)
1995 {
1996 pQosMngr->acParams[acID].acQosParams.cwMin = pQosMngr->uDesireCwMin;
1997 pQosMngr->acParams[acID].acQosParams.cwMax = pQosMngr->uDesireCwMax;
1998 }
1999 else
2000 {
2001 pQosMngr->acParams[acID].acQosParams.cwMin = pACParameteresRecord->ECWmin_ECWmax & AC_PARAMS_CWMIN_MASK;
2002 pQosMngr->acParams[acID].acQosParams.cwMax = (pACParameteresRecord->ECWmin_ECWmax & AC_PARAMS_CWMAX_MASK) >> 4;
2003 }
2004
2005 status = verifyAndConfigQosParams(pQosMngr,&(pQosMngr->acParams[acID].acQosParams));
2006 if(status != TI_OK)
2007 return status;
2008
2009
2010 /* UPSD configuration */
2011 pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
2012 status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
2013 if(status != TI_OK)
2014 return status;
2015
2016
2017 /* update admission state */
2018 if(pACParameteresRecord->ACI_AIFSN & AC_PARAMS_ACM_MASK)
2019 {
2020 pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_REQUIRED;
2021 *pAcTrafficAdmState = AC_NOT_ADMITTED;
2022
2023 txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_REQUIRED, AC_NOT_ADMITTED);
2024 }
2025 else
2026 {
2027 pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_NOT_REQUIRED;
2028 *pAcTrafficAdmState = AC_ADMITTED;
2029
2030 txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_NOT_REQUIRED, AC_ADMITTED);
2031 }
2032
2033 /* If AC is admidtted and has enabled PS-Rx-Streamings, configure it to FW */
2034 /* Note: this may occur after roaming */
2035 if (*pAcTrafficAdmState == AC_ADMITTED)
2036 {
2037 TI_UINT32 uTid1 = WMEQosAcToTid[acID];
2038 TI_UINT32 uTid2 = WMEQosMateTid[uTid1];
2039 TPsRxStreaming *pTid1Params = &pQosMngr->aTidPsRxStreaming[uTid1];
2040 TPsRxStreaming *pTid2Params = &pQosMngr->aTidPsRxStreaming[uTid2];
2041
2042 if (pTid1Params->bEnabled)
2043 {
2044 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid1Params, NULL, NULL);
2045 }
2046 if (pTid2Params->bEnabled)
2047 {
2048 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid2Params, NULL, NULL);
2049 }
2050 }
2051 }
2052
2053 return TI_OK;
2054 }
2055
2056
2057
2058 /************************************************************************
2059 * verifyWmeIeParams *
2060 ************************************************************************
2061 DESCRIPTION: verify QOS_WME IE.
2062
2063 INPUT: hQosMngr - Qos Manager handle.
2064
2065 OUTPUT:
2066
2067 RETURN: TI_OK on success, TI_NOK otherwise
2068
2069 ************************************************************************/
2070
verifyWmeIeParams(qosMngr_t * pQosMngr,TI_UINT8 * pQosIeParams)2071 static TI_STATUS verifyWmeIeParams(qosMngr_t *pQosMngr,TI_UINT8 *pQosIeParams)
2072 {
2073 dot11_WME_IE_t WMEie;
2074 TI_UINT8 Len;
2075 dot11_WME_IE_t *pWMERecvIe = (dot11_WME_IE_t *)pQosIeParams;
2076
2077 if(pQosIeParams == NULL)
2078 {
2079 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, ": pQosIeParams is NULL!! \n");
2080 return TI_NOK;
2081 }
2082
2083 /* get QOS_WME IE */
2084 getWMEInfoElement(pQosMngr,(TI_UINT8 *)&WMEie,(TI_UINT8 *)&Len);
2085
2086 if((WMEie.hdr[0] != pWMERecvIe->hdr[0] ) ||
2087 (WMEie.OUI[0] != pWMERecvIe->OUI[0]) ||
2088 (WMEie.OUI[1] != pWMERecvIe->OUI[1]) ||
2089 (WMEie.OUI[2] != pWMERecvIe->OUI[2]) ||
2090 (WMEie.OUIType != pWMERecvIe->OUIType))
2091 {
2092 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, ": QosIeParams mismatch (ID or OUI)!! \n");
2093 return TI_NOK;
2094 }
2095
2096
2097 if(WMEie.version != pWMERecvIe->version)
2098 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_WARNING, ": Driver QOS_WME version: %d, Site QOS_WME version: %d\n", WMEie.version, pWMERecvIe->version);
2099
2100 return TI_OK;
2101 }
2102
2103
2104 /************************************************************************
2105 * qosMngr_SetPsRxStreaming *
2106 ************************************************************************
2107 DESCRIPTION: Verify and configure a TID PS-Rx-Streaming setting
2108
2109 INPUT: pQosMngr - Qos Manager handle.
2110 pNewParams - The new TID streaming parameters to configure
2111
2112 OUTPUT:
2113
2114 RETURN: TI_OK on success, relevant failures otherwise
2115
2116 ************************************************************************/
qosMngr_SetPsRxStreaming(qosMngr_t * pQosMngr,TPsRxStreaming * pNewParams)2117 static TI_STATUS qosMngr_SetPsRxStreaming (qosMngr_t *pQosMngr, TPsRxStreaming *pNewParams)
2118 {
2119 TI_UINT32 uCurrTid = pNewParams->uTid;
2120 TI_UINT32 uAcId = WMEQosTagToACTable[uCurrTid];
2121 TPsRxStreaming *pCurrTidParams = &pQosMngr->aTidPsRxStreaming[uCurrTid];
2122 TI_BOOL bTidPrevEnabled = pCurrTidParams->bEnabled;
2123
2124 /* Verify STA is connected to AP */
2125 if (pQosMngr->isConnected == TI_FALSE)
2126 {
2127 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: Not connected - Ignoring request !!!\n");
2128 return NOT_CONNECTED;
2129 }
2130
2131 /* Verify that the AP supports QOS_WME */
2132 if (pQosMngr->activeProtocol != QOS_WME)
2133 {
2134 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: Not connected to a QOS AP - Ignoring request !!!\n");
2135 return NO_QOS_AP;
2136 }
2137
2138 /* Check TID validity */
2139 if (uCurrTid > MAX_USER_PRIORITY)
2140 {
2141 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "TID = %d > 7 !!!\n", uCurrTid);
2142 return PARAM_VALUE_NOT_VALID;
2143 }
2144
2145 /* Verify that the AC is admitted */
2146 if (pQosMngr->resourceMgmtTable.currentTspecInfo[uAcId].trafficAdmState != AC_ADMITTED)
2147 {
2148 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: AC = %d is not admitted -> Ignoring request !!!\n", uAcId);
2149 return USER_PRIORITY_NOT_ADMITTED;
2150 }
2151
2152 /* Verify that a disabled TID is not beeing disabled again */
2153 if (!pNewParams->bEnabled && !pCurrTidParams->bEnabled)
2154 {
2155 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: TID %d is already disabled -> Ignoring request !!!\n", uCurrTid);
2156 return PARAM_VALUE_NOT_VALID;
2157 }
2158
2159 /* Verify that the max number of enabled TIDs is not exeeded */
2160 if (pNewParams->bEnabled &&
2161 !pCurrTidParams->bEnabled &&
2162 pQosMngr->uNumEnabledPsRxStreams == MAX_ENABLED_PS_RX_STREAMS)
2163 {
2164 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: Can't have more than %d TIDs enabled -> Ignoring request !!!\n", MAX_ENABLED_PS_RX_STREAMS);
2165 return PARAM_VALUE_NOT_VALID;
2166 }
2167
2168 /* Save the new streaming configuration of the TID */
2169 os_memoryCopy (pQosMngr->hOs, (void *)pCurrTidParams, (void *)pNewParams, sizeof(TPsRxStreaming));
2170
2171 /* Update the relevant AC which of its TIDs parameters to use (save pointer of desired TID) */
2172 if (pCurrTidParams->bEnabled)
2173 {
2174 if (!bTidPrevEnabled)
2175 {
2176 pQosMngr->uNumEnabledPsRxStreams++;
2177 }
2178 }
2179 else
2180 {
2181 pQosMngr->uNumEnabledPsRxStreams--;
2182 }
2183
2184 /* Send configuration update to the FW */
2185 return TWD_CfgPsRxStreaming (pQosMngr->hTWD, pCurrTidParams, NULL, NULL);
2186 }
2187
2188
2189 /************************************************************************
2190 * Admission Control Functions *
2191 ************************************************************************/
2192 /************************************************************************
2193 * qosMngr_requestAdmission *
2194 ************************************************************************
2195 DESCRIPTION: This function is API function for TSPEC request.
2196
2197 INPUT: hQosMngr - Qos Manager handle.
2198 addTspecParams - The Tspec Parameters
2199 OUTPUT:
2200
2201 RETURN: TI_OK on success, TI_NOK otherwise
2202
2203 ************************************************************************/
2204
qosMngr_requestAdmission(TI_HANDLE hQosMngr,OS_802_11_QOS_TSPEC_PARAMS * addTspecParams)2205 TI_STATUS qosMngr_requestAdmission(TI_HANDLE hQosMngr,
2206 OS_802_11_QOS_TSPEC_PARAMS *addTspecParams)
2207 {
2208
2209 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
2210 TI_STATUS status;
2211 TI_UINT8 acID;
2212
2213
2214 /* check if STA is already connected to AP */
2215 if(pQosMngr->isConnected == TI_FALSE)
2216 {
2217 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: Not connected - Ignoring request !!!\n");
2218 return NOT_CONNECTED;
2219 }
2220
2221 /* check if AP support QOS_WME */
2222 if(pQosMngr->activeProtocol != QOS_WME)
2223 {
2224 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: Not connected to a QOS AP - Ignoring request !!!\n");
2225 return NO_QOS_AP;
2226 }
2227
2228 /* check if Traffic Admission Control is enable */
2229 if(pQosMngr->trafficAdmCtrlEnable == TI_FALSE)
2230 {
2231 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: Admission-Control is disabled - Ignoring request !!!\n");
2232 return ADM_CTRL_DISABLE;
2233 }
2234
2235 /* check UP validity */
2236 if( addTspecParams->uUserPriority > MAX_USER_PRIORITY)
2237 {
2238 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "uUserPriority = %d > 7 !!!\n",addTspecParams->uUserPriority);
2239 return TI_NOK;
2240 }
2241
2242 /* find acID from the user priority */
2243 acID = WMEQosTagToACTable[addTspecParams->uUserPriority];
2244
2245 /* check if signaling is already in process for this AC */
2246 if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
2247 {
2248 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: AC = %d , signaling is in process -> Ignore Request !!!\n",acID);
2249 return TRAFIC_ADM_PENDING;
2250 }
2251
2252 /* check if AC is already admitted with other UP */
2253 if( (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_ADMITTED) &&
2254 (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority <= MAX_USER_PRIORITY) &&
2255 (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != addTspecParams->uUserPriority) )
2256 {
2257 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: AC = %d , another UP (%d) on same AC is already admited -> Ignoring request !!!\n", acID, pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority);
2258 return AC_ALREADY_IN_USE;
2259 }
2260
2261 /* check msdu size validity */
2262 if( addTspecParams->uNominalMSDUsize > MAX_DATA_BODY_LENGTH)
2263 {
2264 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "uNominalMSDUsize = %d > 2312, !!!\n",addTspecParams->uNominalMSDUsize);
2265 return TI_NOK;
2266 }
2267
2268 /* check PS mode validity */
2269 if( (addTspecParams->uAPSDFlag == PS_SCHEME_UPSD_TRIGGER) && (pQosMngr->currentPsMode != PS_SCHEME_UPSD_TRIGGER) )
2270 {
2271 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "The STA's current status does not support UPSD -> Ignoring TSPEC request that has UPSD on !!!\n");
2272 return TI_NOK;
2273 }
2274
2275 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_requestAdmission: UP = %d , acID = %d\n",addTspecParams->uUserPriority, acID);
2276
2277 /* set tspec parameters in candidateTspecInfo table */
2278 qosMngr_storeTspecCandidateParams (&(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID]),
2279 addTspecParams, (TI_UINT8)acID);
2280
2281 /* Perhaps this should be done only if the request was successfully sent */
2282 if (acID == QOS_AC_VO)
2283 {
2284 pQosMngr->voiceTspecConfigured = TI_TRUE;
2285 }
2286
2287 if (acID == QOS_AC_VI)
2288 {
2289 pQosMngr->videoTspecConfigured = TI_TRUE;
2290 }
2291
2292 /* call TrafficAdmCtrl API function for the signaling proccess */
2293 status = trafficAdmCtrl_startAdmRequest(pQosMngr->pTrafficAdmCtrl, &(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID]));
2294
2295 if(status == TI_OK)
2296 {
2297 /* request transmitted TI_OK */
2298 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_WAIT_ADMISSION;
2299 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_requestAdmission: UP = %d , request TI_OK !!!\n",addTspecParams->uUserPriority);
2300 }
2301 else
2302 {
2303 /* reaquest not transmitted TI_OK */
2304 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
2305 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "qosMngr_requestAdmission: UP = %d , request NOT TI_OK status=%d!!!\n",addTspecParams->uUserPriority, status);
2306 return TI_NOK;
2307 }
2308
2309 return status;
2310 }
2311
2312 /************************************************************************
2313 * qosMngr_deleteAdmission *
2314 ************************************************************************
2315 DESCRIPTION: This function is API fuunction for tspec delete.
2316
2317 INPUT: hQosMngr - Qos Manager handle.
2318 delAdmissionParams -
2319 OUTPUT:
2320
2321 RETURN: TI_OK on success, TI_NOK otherwise
2322
2323 ************************************************************************/
2324
qosMngr_deleteAdmission(TI_HANDLE hQosMngr,OS_802_11_QOS_DELETE_TSPEC_PARAMS * delAdmissionParams)2325 TI_STATUS qosMngr_deleteAdmission(TI_HANDLE hQosMngr, OS_802_11_QOS_DELETE_TSPEC_PARAMS *delAdmissionParams)
2326 {
2327
2328 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
2329 TI_UINT8 acID;
2330
2331 /* check UP validity */
2332 if( delAdmissionParams->uUserPriority > MAX_USER_PRIORITY )
2333 {
2334 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: userPriority > 7 -> Ignore !!!");
2335 return TI_NOK;
2336 }
2337
2338 /* check if STA is already connected to AP */
2339 if(pQosMngr->isConnected == TI_FALSE)
2340 {
2341 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: pQosMngr->connected == TI_FALSE -> Ignore !!!");
2342 return NOT_CONNECTED;
2343 }
2344
2345 /* check if AP support QOS_WME */
2346 if(pQosMngr->activeProtocol != QOS_WME)
2347 {
2348 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: activeProtocol != QOS_WME -> Ignore !!!");
2349 return NO_QOS_AP;
2350 }
2351
2352 /* find acID from the user priority */
2353 acID = WMEQosTagToACTable[delAdmissionParams->uUserPriority];
2354
2355 /* check if tspec is already addmited for this AC */
2356 if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState != AC_ADMITTED)
2357 {
2358 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: AC is not ADMITED -> Ignore !!!");
2359 return TI_NOK;
2360 }
2361
2362 /* check if AC is already admited with the same UP */
2363 if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != delAdmissionParams->uUserPriority)
2364 {
2365 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: user priority is invalid. -> Ignore !!!\n");
2366 return USER_PRIORITY_NOT_ADMITTED;
2367 }
2368
2369 /* check if signaling is already in procces for this AC */
2370 if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
2371 {
2372 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: AC is under negotiation -> Ignore !!!");
2373 return TRAFIC_ADM_PENDING;
2374 }
2375
2376
2377
2378 /* call TrafficAdmCtrl API function for the delete tspec */
2379 trafficAdmCtrl_sendDeltsFrame(pQosMngr->pTrafficAdmCtrl, &(pQosMngr->resourceMgmtTable.currentTspecInfo[acID]),
2380 (TI_UINT8)delAdmissionParams->uReasonCode );
2381
2382
2383 deleteTspecConfiguration(pQosMngr, acID);
2384
2385 return TI_OK;
2386
2387 }
2388 /************************************************************************
2389 * deleteTspecConfiguration *
2390 ************************************************************************
2391 DESCRIPTION: configure the driver and FW to default configuration after
2392 tspec deletion.
2393
2394 INPUT: hQosMngr - Qos Manager handle.
2395 acID - the AC of the Tspec to delete
2396 OUTPUT:
2397
2398 RETURN: TI_OK on success, TI_NOK otherwise
2399
2400 ************************************************************************/
2401
deleteTspecConfiguration(qosMngr_t * pQosMngr,TI_UINT8 acID)2402 static void deleteTspecConfiguration(qosMngr_t *pQosMngr, TI_UINT8 acID)
2403 {
2404 paramInfo_t param;
2405
2406 /* Zero Tspec parameters */
2407 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize = 0;
2408 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate = 0;
2409 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate = 0;
2410 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance = 0;
2411 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime = 0;
2412 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag = 0;
2413 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMinimumServiceInterval = 0;
2414 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMaximumServiceInterval = 0;
2415 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
2416
2417 /* update total medium time */
2418 pQosMngr->resourceMgmtTable.totalAllocatedMediumTime -= pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime;
2419
2420 /* disable TSRS for this ac */
2421 param.content.txDataQosParams.acID = acID;
2422 param.content.txDataQosParams.tsrsArrLen = 0;
2423 param.paramType = CTRL_DATA_TSRS_PARAM;
2424 ctrlData_setParam(pQosMngr->hCtrlData, ¶m);
2425
2426 /* stop TS metrix for this ac */
2427 #ifdef XCC_MODULE_INCLUDED
2428 measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, acID);
2429 #endif
2430
2431 /* update medium time and rate adaptation event only when init admission bit was 0 */
2432 if( pQosMngr->acParams[acID].apInitAdmissionState == ADMISSION_REQUIRED )
2433 {
2434 /* update currentTspecInfo parameters */
2435 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
2436
2437 /* set params to TX */
2438 txCtrlParams_setAdmissionCtrlParams(pQosMngr->hTxCtrl,
2439 acID,
2440 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime ,
2441 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate, TI_FALSE);
2442 }
2443 else
2444 {
2445 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
2446 }
2447
2448 /* After we have updated the TxCtrl with the new status of the UP, we can zero the userPriority field */
2449 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY;
2450
2451 /* set PS mode according to the PS mode from the association */
2452 /* restore the current Ps mode per AC to UPSD ONLY IF both the station and AP support UPSD */
2453 if ((pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER) && (pQosMngr->acParams[acID].desiredWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER))
2454 {
2455 pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
2456 }
2457 else
2458 {
2459 pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY;
2460 }
2461
2462 if(acID == QOS_AC_VO)
2463 {
2464 pQosMngr->voiceTspecConfigured = TI_FALSE;
2465 }
2466
2467 if (acID == QOS_AC_VI)
2468 {
2469 pQosMngr->videoTspecConfigured = TI_FALSE;
2470 }
2471
2472 /* UPSD_FW - open comment in UPSD FW integration */
2473
2474 /* UPSD configuration */
2475 pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
2476 verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
2477
2478 /* If the AC is not admitted, disable its TIDs' PS-Streamings if enabled */
2479 if (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_NOT_ADMITTED)
2480 {
2481 TI_UINT32 uTid1 = WMEQosAcToTid[acID];
2482 TI_UINT32 uTid2 = WMEQosMateTid[uTid1];
2483 TPsRxStreaming *pTid1Params = &pQosMngr->aTidPsRxStreaming[uTid1];
2484 TPsRxStreaming *pTid2Params = &pQosMngr->aTidPsRxStreaming[uTid2];
2485
2486 if (pTid1Params->bEnabled)
2487 {
2488 pTid1Params->bEnabled = TI_FALSE;
2489 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid1Params, NULL, NULL);
2490 pQosMngr->uNumEnabledPsRxStreams--;
2491 }
2492 if (pTid2Params->bEnabled)
2493 {
2494 pTid2Params->bEnabled = TI_FALSE;
2495 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid2Params, NULL, NULL);
2496 pQosMngr->uNumEnabledPsRxStreams--;
2497 }
2498 }
2499 }
2500
2501 /*-----------------------------------------------------------------------------
2502 Routine Name: qosMngr_sendUnexpectedTSPECResponse
2503 Routine Description: send event to user application, informing of unexpected TSPEC response
2504 which might imply loss of UPSD mode synch between AP and STA
2505 Arguments: pTspecInfo - contains unexpected TSPEC response information
2506 Return Value:
2507 -----------------------------------------------------------------------------*/
qosMngr_sendUnexpectedTSPECResponseEvent(TI_HANDLE hQosMngr,tspecInfo_t * pTspecInfo)2508 TI_STATUS qosMngr_sendUnexpectedTSPECResponseEvent(TI_HANDLE hQosMngr,
2509 tspecInfo_t *pTspecInfo)
2510 {
2511 OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
2512 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
2513
2514 /* set the event params */
2515 addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
2516 addtsReasonCode.uMinimumServiceInterval = pTspecInfo->uMinimumServiceInterval;
2517 addtsReasonCode.uMaximumServiceInterval = pTspecInfo->uMaximumServiceInterval;
2518 addtsReasonCode.uUserPriority = pTspecInfo->userPriority;
2519 addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
2520 addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
2521 addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
2522 addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
2523 addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
2524
2525 addtsReasonCode.uReasonCode = pTspecInfo->statusCode + TSPEC_RESPONSE_UNEXPECTED;
2526
2527 /* send event */
2528 EvHandlerSendEvent(pQosMngr->hEvHandler, IPC_EVENT_TSPEC_STATUS, (TI_UINT8*)(&addtsReasonCode), sizeof(OS_802_11_QOS_TSPEC_PARAMS));
2529
2530 return TI_OK;
2531 }
2532
2533 /************************************************************************
2534 * qosMngr_setAdmissionInfo *
2535 ************************************************************************
2536 DESCRIPTION: This function is API function.
2537 the trafficAdmCtrl object calls this function in
2538 order to update the QOSMngr on TSPEC request status
2539
2540 INPUT: hQosMngr - Qos Manager handle.
2541 pTspecInfo - The TSPEC Parameters
2542 trafficAdmRequestStatus - the status of the request
2543 OUTPUT:
2544
2545 RETURN: TI_OK on success, TI_NOK otherwise
2546
2547 ************************************************************************/
qosMngr_setAdmissionInfo(TI_HANDLE hQosMngr,TI_UINT8 acID,tspecInfo_t * pTspecInfo,trafficAdmRequestStatus_e trafficAdmRequestStatus)2548 TI_STATUS qosMngr_setAdmissionInfo(TI_HANDLE hQosMngr,
2549 TI_UINT8 acID,
2550 tspecInfo_t *pTspecInfo,
2551 trafficAdmRequestStatus_e trafficAdmRequestStatus)
2552 {
2553 TI_UINT32 actualMediumTime;
2554 OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
2555 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
2556 TSetTemplate templateStruct;
2557 QosNullDataTemplate_t QosNullDataTemplate;
2558
2559 /* Check if the updated AC is in WAIT state */
2560 if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState != AC_WAIT_ADMISSION)
2561 {
2562 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setAdmissionInfo: acID = %d, trafficAdmState != WAIT. IGNORE !!!\n", acID);
2563
2564 return TI_NOK;
2565 }
2566
2567 if (pQosMngr->TSPECNegotiationResultCallb != NULL)
2568 {
2569 pQosMngr->TSPECNegotiationResultCallb (pQosMngr->TSPECNegotiationResultModule, trafficAdmRequestStatus);
2570 pQosMngr->TSPECNegotiationResultCallb = NULL;
2571 pQosMngr->TSPECNegotiationResultModule = NULL;
2572 }
2573
2574 switch(trafficAdmRequestStatus)
2575 {
2576 case STATUS_TRAFFIC_ADM_REQUEST_ACCEPT:
2577 /* Received admission response with status accept */
2578
2579 TRACE3(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: admCtrl status = REQUEST_ACCEPT [ acID = %d, mediumTime = %d, minimumPHYRate = %d ]\n", acID, pTspecInfo->mediumTime, pTspecInfo->minimumPHYRate);
2580
2581 /* Set the event params */
2582 addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
2583 addtsReasonCode.uMinimumServiceInterval = pTspecInfo->uMinimumServiceInterval;
2584 addtsReasonCode.uMaximumServiceInterval = pTspecInfo->uMaximumServiceInterval;
2585 addtsReasonCode.uUserPriority = pTspecInfo->userPriority;
2586 addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
2587 addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
2588 addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
2589 addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
2590 addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
2591
2592 /* Free the candidate parameters */
2593 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
2594
2595 /* Validate tid matching */
2596 if (pTspecInfo->tid == pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].tid)
2597 {
2598 addtsReasonCode.uReasonCode = ADDTS_RESPONSE_ACCEPT;
2599
2600 /* Send event */
2601 EvHandlerSendEvent (pQosMngr->hEvHandler,
2602 IPC_EVENT_TSPEC_STATUS,
2603 (TI_UINT8*)&addtsReasonCode,
2604 sizeof(OS_802_11_QOS_TSPEC_PARAMS));
2605 }
2606 else
2607 {
2608 addtsReasonCode.uReasonCode = ADDTS_RESPONSE_AP_PARAM_INVALID;
2609
2610 /* Send event */
2611 EvHandlerSendEvent (pQosMngr->hEvHandler,
2612 IPC_EVENT_TSPEC_STATUS,
2613 (TI_UINT8*)&addtsReasonCode,
2614 sizeof(OS_802_11_QOS_TSPEC_PARAMS));
2615 return TI_OK;
2616 }
2617
2618 /* Update the current TSPEC parameters from the received TSPEC */
2619 os_memoryCopy (pQosMngr->hOs,
2620 &pQosMngr->resourceMgmtTable.currentTspecInfo[acID],
2621 pTspecInfo,
2622 sizeof(tspecInfo_t));
2623
2624 /* Set the TSPEC to admitted */
2625 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
2626
2627 /* Update total medium time */
2628 pQosMngr->resourceMgmtTable.totalAllocatedMediumTime += pTspecInfo->mediumTime;
2629
2630 /*
2631 * Set QOS Null-data template into the firmware.
2632 * When a new TSPEC with UPSD is "accepted" by the AP,
2633 * we set the user priority of it into the firmware.
2634 * Since this AC is already ADMITTED (we are processing the successful response),
2635 * it is TI_OK to set the qos null data template with this UP
2636 */
2637 if (addtsReasonCode.uAPSDFlag == PS_SCHEME_UPSD_TRIGGER &&
2638 pQosMngr->QosNullDataTemplateUserPriority == 0xFF)
2639 {
2640 /* Remember the user priority which we have set */
2641 pQosMngr->QosNullDataTemplateUserPriority = (TI_UINT8)addtsReasonCode.uUserPriority;
2642
2643 templateStruct.ptr = (TI_UINT8 *)&QosNullDataTemplate;
2644 templateStruct.type = QOS_NULL_DATA_TEMPLATE;
2645 templateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
2646 buildQosNullDataTemplate (pQosMngr->hSiteMgr, &templateStruct, pQosMngr->QosNullDataTemplateUserPriority);
2647 TWD_CmdTemplate (pQosMngr->hTWD, &templateStruct, NULL, NULL);
2648
2649 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: Setting QOS null data for UserPriority=%d (due to TSPEC ACCEPT response)\n", addtsReasonCode.uUserPriority);
2650 }
2651
2652 /* Set params to TX */
2653 /*------------------*/
2654
2655 /* Update medium time and rate adaptation event only when init admission bit was 0 */
2656 if (pQosMngr->acParams[acID].apInitAdmissionState == ADMISSION_REQUIRED)
2657 {
2658 /* mediumTime is in units of 32uSec and we work in mSec */
2659 actualMediumTime = (pTspecInfo->mediumTime * 32) / 1000;
2660
2661 /* Set TX params */
2662 txCtrlParams_setAdmissionCtrlParams(pQosMngr->hTxCtrl,
2663 acID,
2664 actualMediumTime,
2665 pTspecInfo->minimumPHYRate,
2666 TI_TRUE);
2667 }
2668
2669 {
2670 PSScheme_e psMode = pTspecInfo->UPSDFlag ? PS_SCHEME_UPSD_TRIGGER
2671 : PS_SCHEME_LEGACY;
2672
2673 if (pQosMngr->acParams[acID].currentWmeAcPsMode != psMode)
2674 {
2675 TI_STATUS status;
2676
2677 pQosMngr->acParams[acID].currentWmeAcPsMode = psMode;
2678
2679 /* UPSD_FW - open comment in UPSD FW integration */
2680 pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
2681 status = verifyAndConfigTrafficParams (pQosMngr, &pQosMngr->acParams[acID].QtrafficParams);
2682 if (status != TI_OK)
2683 return status;
2684 }
2685 }
2686 break;
2687
2688 case STATUS_TRAFFIC_ADM_REQUEST_REJECT:
2689 /* Received admission response with status reject */
2690
2691 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: admCtrl status = REQUEST_REJECT [ acID = %d ]\n", acID);
2692
2693 /* Validate tid matching */
2694 if (pTspecInfo->tid == pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].tid)
2695 {
2696 addtsReasonCode.uReasonCode = pTspecInfo->statusCode;
2697 }
2698 else
2699 {
2700 addtsReasonCode.uReasonCode = ADDTS_RESPONSE_AP_PARAM_INVALID;
2701 }
2702
2703 /* Free the candidate parameters */
2704 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
2705
2706 /* Send event to application */
2707 addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
2708 addtsReasonCode.uMinimumServiceInterval = pTspecInfo->uMinimumServiceInterval;
2709 addtsReasonCode.uMaximumServiceInterval = pTspecInfo->uMaximumServiceInterval;
2710 addtsReasonCode.uUserPriority = pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority;
2711 addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
2712 addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
2713 addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
2714 addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
2715 addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
2716
2717 EvHandlerSendEvent (pQosMngr->hEvHandler,
2718 IPC_EVENT_TSPEC_STATUS,
2719 (TI_UINT8*)&addtsReasonCode,
2720 sizeof(OS_802_11_QOS_TSPEC_PARAMS));
2721 break;
2722
2723 case STATUS_TRAFFIC_ADM_REQUEST_TIMEOUT:
2724 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: admCtrl status = REQUEST_TIMEOUT [ acID = %d ]\n", acID);
2725
2726 /* Free the candidate parameters */
2727 pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
2728
2729 /* Send event to application */
2730 addtsReasonCode.uUserPriority = pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority;
2731 addtsReasonCode.uReasonCode = ADDTS_RESPONSE_TIMEOUT;
2732 addtsReasonCode.uAPSDFlag = 0;
2733 addtsReasonCode.uMinimumServiceInterval = 0;
2734 addtsReasonCode.uMaximumServiceInterval = 0;
2735 addtsReasonCode.uNominalMSDUsize = 0;
2736 addtsReasonCode.uMeanDataRate = 0;
2737 addtsReasonCode.uMinimumPHYRate = 0;
2738 addtsReasonCode.uSurplusBandwidthAllowance = 0;
2739 addtsReasonCode.uMediumTime = 0;
2740
2741 EvHandlerSendEvent (pQosMngr->hEvHandler,
2742 IPC_EVENT_TSPEC_STATUS,
2743 (TI_UINT8*)&addtsReasonCode,
2744 sizeof(OS_802_11_QOS_TSPEC_PARAMS));
2745 break;
2746
2747 default:
2748 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setAdmissionInfo: receive state from admCtrl = unknown !!! \n");
2749 break;
2750 }
2751
2752 return TI_OK;
2753 }
2754
2755 /************************************************************************
2756 * QosMngr_receiveActionFrames *
2757 ************************************************************************
2758 DESCRIPTION:
2759
2760 RETURN: TI_OK on success, TI_NOK otherwise
2761
2762 ************************************************************************/
QosMngr_receiveActionFrames(TI_HANDLE hQosMngr,TI_UINT8 * pData,TI_UINT8 action,TI_UINT32 bodyLen)2763 TI_STATUS QosMngr_receiveActionFrames(TI_HANDLE hQosMngr, TI_UINT8* pData, TI_UINT8 action, TI_UINT32 bodyLen)
2764 {
2765 TI_UINT8 acID;
2766 tsInfo_t tsInfo;
2767 TI_UINT8 userPriority;
2768 OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
2769
2770
2771 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
2772
2773 /* check if STA is already connected to AP */
2774 if( (pQosMngr->isConnected == TI_FALSE) ||
2775 (pQosMngr->activeProtocol != QOS_WME) ||
2776 (pQosMngr->trafficAdmCtrlEnable == TI_FALSE) )
2777 {
2778 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "QosMngr_receiveActionFrames: Ignore !!!");
2779 return TI_NOK;
2780 }
2781
2782 /* check DELTS action code */
2783 if (action == DELTS_ACTION)
2784 {
2785 /*
2786 * parse the frame
2787 */
2788
2789 /* skip dialog-token (1 byte), status-code (1 byte) and dot11_WME_TSPEC_IE header (8 bytes). */
2790 pData += 10;
2791
2792 /* Get TS-Info from TSpec IE in DELTS, and get from it the user-priority. */
2793 tsInfo.tsInfoArr[0] = *pData;
2794 pData++;
2795 tsInfo.tsInfoArr[1] = *pData;
2796 pData++;
2797 tsInfo.tsInfoArr[2] = *pData;
2798
2799 userPriority = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT);
2800
2801 acID = WMEQosTagToACTable[userPriority];
2802
2803
2804 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "QosMngr_receiveActionFrames: DELTS [ acID = %d ] \n", acID);
2805
2806
2807 /* check if this AC is admitted with the correct userPriority */
2808 if( (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_ADMITTED) &&
2809 ( pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority == userPriority) )
2810 {
2811 deleteTspecConfiguration(pQosMngr, acID);
2812
2813 /* Send event to notify DEL_TS */
2814 addtsReasonCode.uAPSDFlag = 0;
2815 addtsReasonCode.uMinimumServiceInterval = 0;
2816 addtsReasonCode.uMaximumServiceInterval = 0;
2817 addtsReasonCode.uUserPriority = userPriority;
2818 addtsReasonCode.uReasonCode = TSPEC_DELETED_BY_AP;
2819 addtsReasonCode.uNominalMSDUsize = 0;
2820 addtsReasonCode.uMeanDataRate = 0;
2821 addtsReasonCode.uMinimumPHYRate = 0;
2822 addtsReasonCode.uSurplusBandwidthAllowance = 0;
2823 addtsReasonCode.uMediumTime = 0;
2824
2825 EvHandlerSendEvent(pQosMngr->hEvHandler, IPC_EVENT_TSPEC_STATUS, (TI_UINT8*)(&addtsReasonCode), sizeof(OS_802_11_QOS_TSPEC_PARAMS));
2826 }
2827 else
2828 {
2829 TRACE3(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "QosMngr_receiveActionFrames: DELTS [ acID = %d userPriority = %d currentUserPriority = %d] Current State in not ADMITED !! \n", acID, userPriority,pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority);
2830
2831 }
2832 }
2833 /* if action code is ADDTS call trafficAdmCtrl object API function */
2834 else if (action == ADDTS_RESPONSE_ACTION)
2835 {
2836 if (trafficAdmCtrl_recv(pQosMngr->pTrafficAdmCtrl, pData, action) == TI_OK)
2837 {
2838 #ifdef XCC_MODULE_INCLUDED
2839 /* Check if XCC IEs present, if so, parse them and update relevant modules;
2840 skip the TSPEC IE;
2841 do not forget 2 bytes of status and dialog code that must be skipped as well */
2842 XCCv4IEs_t XCCIE;
2843 TI_UINT32 readLen;
2844
2845 XCCIE.edcaLifetimeParameter = NULL;
2846 XCCIE.trafficStreamParameter = NULL;
2847 XCCIE.tsMetrixParameter = NULL;
2848
2849 userPriority = GET_USER_PRIORITY_FROM_WME_TSPEC_IE(pData+2);
2850 acID = WMEQosTagToACTable[userPriority];
2851
2852 /* The length is in the second byte of the IE header, after the token and status. */
2853 readLen = (TI_UINT32)(*(pData + 3));
2854
2855 /* 4 stands for 1 byte of token + 1 byte of status + 1 byte of EID + 1 byte of len */
2856 bodyLen = bodyLen - 4 - readLen;
2857 pData = pData + 4 + readLen;
2858
2859 while (bodyLen)
2860 {
2861 mlmeParser_readXCCOui(pData, bodyLen, &readLen, &XCCIE);
2862 bodyLen -= readLen;
2863 pData += readLen;
2864 }
2865
2866 XCCMngr_setXCCQoSParams(pQosMngr->hXCCMgr, &XCCIE, acID);
2867 #endif
2868 }
2869 }
2870 else
2871 {
2872 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "QosMngr_receiveActionFrames: Receive unknown action code = %d -> Ignore !! \n",action);
2873 }
2874
2875 return TI_OK;
2876 }
2877
2878 /************************************************************************
2879 * qosMngr_getCurrAcStatus *
2880 ************************************************************************
2881 DESCRIPTION: This function is API fuunction for getting tha AC status .
2882
2883 INPUT: hQosMngr - Qos Manager handle.
2884 pAcStatusParams
2885
2886 OUTPUT:
2887
2888 RETURN: TI_OK on success, TI_NOK otherwise
2889
2890 ************************************************************************/
qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr,OS_802_11_AC_UPSD_STATUS_PARAMS * pAcStatusParams)2891 static TI_STATUS qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr, OS_802_11_AC_UPSD_STATUS_PARAMS *pAcStatusParams)
2892 {
2893 qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
2894
2895 /* check AC validity */
2896 if( pAcStatusParams->uAC > MAX_NUM_OF_AC - 1 )
2897 {
2898 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getCurrAcStatus: acID > 3 -> Ignore !!!");
2899 return TI_NOK;
2900 }
2901
2902 /* check if sta is connected to AP */
2903 if(pQosMngr->isConnected == TI_FALSE)
2904 {
2905 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getCurrAcStatus: pQosMngr->connected == TI_FALSE -> Ignore !!!");
2906 return NOT_CONNECTED;
2907 }
2908
2909 /* check if AP support QOS_WME */
2910 if(pQosMngr->activeProtocol != QOS_WME)
2911 {
2912 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getCurrAcStatus: activeProtocol != QOS_WME -> Ignore !!!");
2913 return NO_QOS_AP;
2914 }
2915
2916 pAcStatusParams->uCurrentUAPSDStatus = pQosMngr->acParams[pAcStatusParams->uAC].currentWmeAcPsMode;
2917 pAcStatusParams->pCurrentAdmissionStatus = pQosMngr->resourceMgmtTable.currentTspecInfo[pAcStatusParams->uAC].trafficAdmState;
2918
2919 return TI_OK;
2920 }
2921
2922
2923
2924 /************************************************************************
2925 * setNonQosAdmissionState *
2926 ************************************************************************
2927 DESCRIPTION: This function resets the admission state variables as required
2928 for non-QoS mode and configures the Tx module.
2929
2930 INPUT: pQosMngr - Qos Manager pointer.
2931 acId - the AC to update.
2932
2933 OUTPUT:
2934
2935 RETURN:
2936
2937 ************************************************************************/
2938
setNonQosAdmissionState(qosMngr_t * pQosMngr,TI_UINT8 acID)2939 static void setNonQosAdmissionState(qosMngr_t *pQosMngr, TI_UINT8 acID)
2940 {
2941 if(acID == QOS_AC_BE)
2942 {
2943 pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_NOT_REQUIRED;
2944 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
2945
2946 txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_NOT_REQUIRED, AC_ADMITTED);
2947 }
2948 else
2949 {
2950 pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_REQUIRED;
2951 pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
2952
2953 txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_REQUIRED, AC_NOT_ADMITTED);
2954 }
2955 }
2956
qosMngr_storeTspecCandidateParams(tspecInfo_t * pCandidateParams,OS_802_11_QOS_TSPEC_PARAMS * pTSPECParams,TI_UINT8 ac)2957 static void qosMngr_storeTspecCandidateParams (tspecInfo_t *pCandidateParams, OS_802_11_QOS_TSPEC_PARAMS *pTSPECParams, TI_UINT8 ac)
2958 {
2959 pCandidateParams->AC = (EAcTrfcType)ac;
2960 pCandidateParams->tid = (TI_UINT8)pTSPECParams->uUserPriority;
2961 pCandidateParams->userPriority = (TI_UINT8)pTSPECParams->uUserPriority;
2962 pCandidateParams->meanDataRate = pTSPECParams->uMeanDataRate;
2963 pCandidateParams->nominalMsduSize = (TI_UINT16)pTSPECParams->uNominalMSDUsize;
2964 pCandidateParams->UPSDFlag = (TI_BOOL)pTSPECParams->uAPSDFlag;
2965 pCandidateParams->uMinimumServiceInterval = pTSPECParams->uMinimumServiceInterval;
2966 pCandidateParams->uMaximumServiceInterval = pTSPECParams->uMaximumServiceInterval;
2967 pCandidateParams->surplausBwAllowance = (TI_UINT16)pTSPECParams->uSurplusBandwidthAllowance;
2968 pCandidateParams->minimumPHYRate = pTSPECParams->uMinimumPHYRate;
2969 pCandidateParams->streamDirection = BI_DIRECTIONAL;
2970 pCandidateParams->mediumTime = 0;
2971 }
2972