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