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