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