PageRenderTime 89ms CodeModel.GetById 41ms RepoModel.GetById 1ms app.codeStats 1ms

/drivers/net/wireless/tiwlan1251/common/src/Management/QOS/qosMngr.c

https://bitbucket.org/cyanogenmod/cm-kernel
C | 3167 lines | 1820 code | 559 blank | 788 comment | 359 complexity | f9c69b539fa06e4fa3e07914d3e5c3c6 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1. /****************************************************************************
  2. **+-----------------------------------------------------------------------+**
  3. **| |**
  4. **| Copyright(c) 1998 - 2008 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. ****************************************************************************/
  35. /** \file qosMngr.c
  36. * \brief QOS module interface
  37. *
  38. * \see qosMngr.h
  39. */
  40. /****************************************************************************************************/
  41. /* */
  42. /* MODULE: qosMGr.c */
  43. /* PURPOSE: QOS module interface. */
  44. /* This module handles the QOS manager configuration. */
  45. /* */
  46. /****************************************************************************************************/
  47. #include "report.h"
  48. #include "osApi.h"
  49. #include "paramOut.h"
  50. #include "paramIn.h"
  51. #include "utils.h"
  52. #include "siteMgrApi.h"
  53. #include "public_infoele.h"
  54. #include "whalCtrl_api.h"
  55. #include "qosMngr.h"
  56. #include "qosMngr_API.h"
  57. #include "qosMngr_QueueMapping.h"
  58. #include "smeSmApi.h"
  59. #include "EvHandler.h"
  60. #ifdef EXC_MODULE_INCLUDED
  61. #include "excMngr.h"
  62. #include "excTSMngr.h"
  63. #endif
  64. static int NonQosTagToACTable[MAX_NUM_OF_802_1d_TAGS] = { NonQosTag0ToAC, NonQosTag1ToAC, NonQosTag2ToAC, NonQosTag3ToAC, NonQosTag4ToAC, NonQosTag5ToAC, NonQosTag6ToAC, NonQosTag7ToAC };
  65. /* This structure is now shared between the qosMngr and TxData to allow PS_POLL voice delivery mode for NON_QOS AP */
  66. int WMEQosTagToACTable[MAX_NUM_OF_802_1d_TAGS] = { WMEQosTag0ToAC, WMEQosTag1ToAC, WMEQosTag2ToAC, WMEQosTag3ToAC, WMEQosTag4ToAC, WMEQosTag5ToAC, WMEQosTag6ToAC, WMEQosTag7ToAC };
  67. /* This array is now shared between qosMngr and TxData */
  68. UINT8 wmeAcToUpIndex[MAX_NUM_OF_AC] = {0,1,4,6};
  69. /* Used to indicate no user priority is assigned for AC */
  70. #define INACTIVE_USER_PRIORITY 0xFF
  71. /********************************************************************************/
  72. /* Internal functions prototypes. */
  73. /********************************************************************************/
  74. static void release_module(qosMngr_t *pQosMngr, UINT32 initVec);
  75. static TI_STATUS verifyAndConfigTrafficParams(qosMngr_t *pQosMngr, queueTrafficParams_t *pQtrafficParams);
  76. static TI_STATUS verifyAndConfigQosParams(qosMngr_t *pQosMngr,acQosParams_t *pAcQosParams);
  77. static TI_STATUS getWMEInfoElement(qosMngr_t *pQosMngr,UINT8 *pWMEie,UINT8 *pLen);
  78. static TI_STATUS verifyWmeIeParams(qosMngr_t *pQosMngr,UINT8 *pQosIeParams);
  79. static TI_STATUS updateACParams(qosMngr_t *pQosMngr,ACParameters_t *pAcParams);
  80. static void updateTagToAcTable(qosMngr_t *pQosMngr,acTrfcType_e *pProtocolTagToACTable);
  81. static TI_STATUS setWmeSiteParams(qosMngr_t *pQosMngr, UINT8 *pQosIeParams);
  82. void qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr);
  83. static TI_STATUS qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr, OS_802_11_AC_UPSD_STATUS_PARAMS *pAcStatusParams);
  84. static void deleteTspecConfiguration(qosMngr_t *pQosMngr, UINT8 acID);
  85. static void setNonQosAdmissionState(qosMngr_t *pQosMngr, UINT8 acID);
  86. static void qosMngr_storeTspecCandidateParams (tspecInfo_t *pCandidateParams, OS_802_11_QOS_TSPEC_PARAMS *pTSPECParams, UINT8 ac);
  87. /********************************************************************************
  88. * qosMngr_create *
  89. ********************************************************************************
  90. DESCRIPTION: QOS module creation function, called by the config mgr in creation phase.
  91. performs the following:
  92. - Allocate the QOS MNGR handle.
  93. INPUT: hOs - Handle to OS
  94. OUTPUT:
  95. RETURN: Handle to the QOS MNGR module on success, NULL otherwise
  96. ************************************************************************/
  97. TI_HANDLE qosMngr_create(TI_HANDLE hOs)
  98. {
  99. qosMngr_t *pQosMngr = NULL;
  100. UINT32 initVec = 0;
  101. if(!hOs)
  102. return NULL;
  103. /* allocating the WME object */
  104. pQosMngr = os_memoryAlloc(hOs,sizeof(qosMngr_t));
  105. if (pQosMngr == NULL)
  106. return NULL;
  107. initVec |= (1 << QOS_MNGR_INIT_BIT_LOCAL_VECTOR);
  108. /* create admission control object */
  109. pQosMngr->pTrafficAdmCtrl = trafficAdmCtrl_create(hOs);
  110. if (pQosMngr->pTrafficAdmCtrl == NULL)
  111. {
  112. qosMngr_destroy(pQosMngr);
  113. return NULL;
  114. }
  115. initVec |= (1 << QOS_MNGR_INIT_BIT_ADM_CTRL);
  116. return(pQosMngr);
  117. }
  118. /************************************************************************
  119. * qosMngr_destroy *
  120. ************************************************************************
  121. DESCRIPTION: QOS MNGR module destroy function, called by the config mgr in
  122. the destroy phase
  123. performs the following:
  124. - Free all memory alocated by the module
  125. INPUT: hQosMngr - QOS Manager handle.
  126. OUTPUT:
  127. RETURN: OK on success, NOK otherwise
  128. ************************************************************************/
  129. TI_STATUS qosMngr_destroy(TI_HANDLE hQosMngr)
  130. {
  131. UINT32 initVec;
  132. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  133. if (pQosMngr == NULL)
  134. return OK;
  135. initVec = 0xFFFF;
  136. release_module(pQosMngr, initVec);
  137. return OK;
  138. }
  139. /***********************************************************************
  140. * release_module
  141. ***********************************************************************
  142. DESCRIPTION: Called by the destroy function or by the create function (on failure)
  143. Go over the vector, for each bit that is set, release the corresponding module.
  144. INPUT: pQosMngr - QOS Mngr pointer.
  145. initVec - Vector that contains a bit set for each module thah had been initiualized
  146. OUTPUT:
  147. RETURN: OK on success, NOK otherwise
  148. ************************************************************************/
  149. static void release_module(qosMngr_t *pQosMngr, UINT32 initVec)
  150. {
  151. if (initVec & (1 << QOS_MNGR_INIT_BIT_ADM_CTRL))
  152. trafficAdmCtrl_unload(pQosMngr->pTrafficAdmCtrl);
  153. if (initVec & (1 << QOS_MNGR_INIT_BIT_LOCAL_VECTOR))
  154. utils_nullMemoryFree(pQosMngr->hOs, pQosMngr, sizeof(qosMngr_t));
  155. initVec = 0;
  156. }
  157. /************************************************************************
  158. * qosMngr_config *
  159. ************************************************************************
  160. DESCRIPTION: QOS Manager module configuration function, called by the config
  161. mgr in configuration phase
  162. performs the following:
  163. - Reset & initiailzes local variables
  164. - Init the handles to be used by the module
  165. INPUT: hQosMngr - Qos Manager handle.
  166. List of handles to be used by the module
  167. pQosMngrInitParams - Init table of the module.
  168. OUTPUT:
  169. RETURN: OK on success, NOK otherwise
  170. ************************************************************************/
  171. TI_STATUS qosMngr_config(TI_HANDLE hQosMngr,
  172. TI_HANDLE hHalCtrl,
  173. TI_HANDLE hSiteMgr,
  174. TI_HANDLE hReport,
  175. TI_HANDLE hOs,
  176. TI_HANDLE hTxData,
  177. TI_HANDLE hMeasurementMngr,
  178. TI_HANDLE hSmeSm,
  179. TI_HANDLE hMemMgr,
  180. TI_HANDLE hCtrlData,
  181. TI_HANDLE hEvHandler,
  182. TI_HANDLE hExcMgr,
  183. QosMngrInitParams_t *pQosMngrInitParams)
  184. {
  185. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  186. paramInfo_t param;
  187. UINT8 acID;
  188. TI_STATUS status;
  189. /* init handles */
  190. pQosMngr->hOs = hOs;
  191. pQosMngr->hReport = hReport;
  192. pQosMngr->hSiteMgr = hSiteMgr;
  193. pQosMngr->hHalCtrl = hHalCtrl;
  194. pQosMngr->hTxData = hTxData;
  195. pQosMngr->hMeasurementMngr = hMeasurementMngr;
  196. pQosMngr->hSmeSm = hSmeSm;
  197. pQosMngr->hMemMgr = hMemMgr;
  198. pQosMngr->hCtrlData = hCtrlData;
  199. pQosMngr->hEvHandler = hEvHandler;
  200. pQosMngr->hExcMgr = hExcMgr;
  201. pQosMngr->isConnected = FALSE;
  202. /* init params */
  203. pQosMngr->WMEEnable = pQosMngrInitParams->wmeEnable;
  204. pQosMngr->trafficAdmCtrlEnable = pQosMngrInitParams->trafficAdmCtrlEnable;
  205. pQosMngr->tagZeroConverHeader = pQosMngrInitParams->qosTagZeroConverHeader;
  206. pQosMngr->qosPacketBurstEnable = pQosMngrInitParams->PacketBurstEnable;
  207. pQosMngr->qosPacketBurstTxOpLimit = pQosMngrInitParams->PacketBurstTxOpLimit;
  208. pQosMngr->desiredPsMode = pQosMngrInitParams->desiredPsMode;
  209. pQosMngr->activeProtocol = NONE_QOS;
  210. pQosMngr->WMESiteSupport = FALSE;
  211. pQosMngr->desiredMaxSpLen = pQosMngrInitParams->desiredMaxSpLen;
  212. pQosMngr->desiredVoiceDeliveryProtocol = PS_SCHEME_LEGACY_PSPOLL;
  213. pQosMngr->voiceTspecConfigured = FALSE;
  214. pQosMngr->videoTspecConfigured = FALSE;
  215. pQosMngr->performTSPECRenegotiation = FALSE;
  216. pQosMngr->TSPECNegotiationResultCallb = NULL;
  217. pQosMngr->TSPECNegotiationResultModule = NULL;
  218. /* No template has been set for UPSD */
  219. pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
  220. /* configure admission control parameters */
  221. qosMngr_resetAdmCtrlParameters(pQosMngr);
  222. status = trafficAdmCtrl_config(pQosMngr->pTrafficAdmCtrl,
  223. pQosMngr->hTxData,
  224. pQosMngr->hReport,
  225. pQosMngr->hOs,
  226. pQosMngr,
  227. pQosMngr->hCtrlData,
  228. pQosMngr->hMemMgr,
  229. pQosMngr->hExcMgr,
  230. &pQosMngrInitParams->trafficAdmCtrlInitParams);
  231. if(status != OK)
  232. return NOK;
  233. /*
  234. * configure per AC traffic parameters
  235. */
  236. for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
  237. {
  238. /*
  239. * setting ac traffic params for TrafficCategoryCfg (TNET configuration
  240. * The parameters can be changed in run-time, so they are saved in "init params"
  241. * for 'disconnecting' .
  242. * the parameters being set in setSite; "select" phase.
  243. */
  244. pQosMngr->acParams[acID].QtrafficParams.queueID = acID;
  245. pQosMngr->acParams[acID].QtrafficParams.channelType = CHANNEL_TYPE_EDCF;
  246. pQosMngr->acParams[acID].QtrafficParams.tsid = acID;
  247. pQosMngr->acParams[acID].QtrafficParams.dot11EDCATableMSDULifeTime = 0;
  248. pQosMngr->acParams[acID].QtrafficParams.psScheme = PS_SCHEME_LEGACY;
  249. pQosMngr->acParams[acID].QtrafficParams.ackPolicy = pQosMngrInitParams->acAckPolicy[acID];
  250. pQosMngr->acParams[acID].QtrafficParams.APSDConf[0] = 0;
  251. pQosMngr->acParams[acID].QtrafficParams.APSDConf[1] = 0;
  252. /*
  253. * Update the qTrafficInitParams as well
  254. */
  255. os_memoryCopy(hOs,&(pQosMngr->acParams[acID].QTrafficInitParams),&(pQosMngr->acParams[acID].QtrafficParams),sizeof(queueTrafficParams_t));
  256. /* will be config only after select */
  257. verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
  258. /*
  259. * setting ac QoS params for acQosParams (TNET configuration)
  260. * The parameters can be changed in run-time, so they are saved in "init params"
  261. * for 'disconnecting'.
  262. * the parameters being set in setSite; "select" phase.
  263. */
  264. pQosMngr->acParams[acID].acQosParams.ac = acID;
  265. pQosMngr->acParams[acID].acQosParams.aifsn = AIFS_DEF;
  266. pQosMngr->acParams[acID].acQosParams.cwMax = CW_MAX_DEF;
  267. pQosMngr->acParams[acID].acQosParams.cwMin = CW_MIN_MAX;
  268. pQosMngr->acParams[acID].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
  269. pQosMngr->acParams[acID].msduLifeTimeParam = pQosMngrInitParams->MsduLifeTime[acID];
  270. /* The protocol is NONE_QOS. If Packet Burst is Enable, */
  271. /* then, the BE queue is configured to the TxOP Limit of Packet burst */
  272. /* (that is, 3 ms) and the txopContinuation is set to qosPacketBurstEnable */
  273. /* The protocol is NONE_QOS. If Packet Burst is Enable, */
  274. /* then, the BE queue is configured to the TxOP Limit of Packet burst */
  275. /* (that is, 3 ms) and the txopContinuation is set to qosPacketBurstEnable */
  276. if (acID == QOS_AC_BE)
  277. {
  278. if (pQosMngr->qosPacketBurstEnable==TRUE)
  279. {
  280. pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
  281. }
  282. else
  283. {
  284. pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
  285. }
  286. }
  287. /*
  288. * Update the acQosInitParams as well
  289. */
  290. os_memoryCopy(hOs,&(pQosMngr->acParams[acID].acQosInitParams),&(pQosMngr->acParams[acID].acQosParams),sizeof(acQosParams_t));
  291. /* will be config only after select */
  292. verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[acID].acQosParams));
  293. /*
  294. * setting ps mode per ac for protocol specific configuration.
  295. */
  296. /* validity check - allow to set the desired Ps mode per-AC to UPSD ONLY IF the station supports UPSD */
  297. if ((pQosMngrInitParams->desiredPsMode == PS_SCHEME_UPSD_TRIGGER) && (pQosMngrInitParams->desiredWmeAcPsMode[acID] == PS_SCHEME_UPSD_TRIGGER))
  298. {
  299. pQosMngr->acParams[acID].desiredWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
  300. }
  301. else
  302. {
  303. pQosMngr->acParams[acID].desiredWmeAcPsMode = PS_SCHEME_LEGACY_PSPOLL;
  304. }
  305. pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY_PSPOLL; /* default configuration is legacy PS for all queues */
  306. /*
  307. * configure TxData per AC params
  308. */
  309. param.content.txDataQosParams.acID = acID;
  310. param.content.txDataQosParams.acTrfcCtrl.PsMode = PS_SCHEME_LEGACY;
  311. param.content.txDataQosParams.acTrfcCtrl.QueueIndex = acID;
  312. param.content.txDataQosParams.acTrfcCtrl.TxQueueSize = pQosMngrInitParams->TxQueueSize[acID];
  313. param.content.txDataQosParams.acTrfcCtrl.QueueOvFlowPolicy = pQosMngrInitParams->QueueOvFlowPolicy[acID];
  314. param.content.txDataQosParams.acTrfcCtrl.MsduLifeTime = pQosMngrInitParams->MsduLifeTime[acID];
  315. param.content.txDataQosParams.acTrfcCtrl.ackPolicy = ACK_POLICY_LEGACY; /* working with Non - Qos method */
  316. param.paramType = TX_DATA_PS_MODE_PARAM;
  317. txData_setParam(pQosMngr->hTxData,&param);
  318. param.paramType = TX_DATA_CONFIG_TX_QUEUE_SIZE;
  319. txData_setParam(pQosMngr->hTxData,&param);
  320. param.paramType = TX_DATA_CONFIG_TX_QUEUE_OVFLOW_POLICY;
  321. txData_setParam(pQosMngr->hTxData,&param);
  322. param.paramType = TX_DATA_CONFIG_AC_MSDU_LIFE_TIME;
  323. txData_setParam(pQosMngr->hTxData,&param);
  324. param.paramType = TX_DATA_CONFIG_AC_ACK_POLICY;
  325. txData_setParam(pQosMngr->hTxData,&param);
  326. /* setting wme Ack Policy */
  327. pQosMngr->acParams[acID].wmeAcAckPolicy = pQosMngrInitParams->acAckPolicy[acID];
  328. /* Set admission state per AC for non-QoS and update the Tx module. */
  329. setNonQosAdmissionState(pQosMngr, acID);
  330. }
  331. pQosMngr->headerConvetMode = LEGACY_CONVERT;
  332. param.content.txDataQosParams.qosParams.headerConverMode = LEGACY_CONVERT;
  333. /* Update the Tx tag to AC tables for legacy mode. */
  334. updateTagToAcTable(pQosMngr, (acTrfcType_e *)NonQosTagToACTable);
  335. param.paramType = TX_DATA_CONVERT_HEADER_MODE;
  336. txData_setParam(pQosMngr->hTxData,&param);
  337. param.paramType = TX_DATA_CONVERT_TAG_ZERO_HEADER_MODE;
  338. param.content.txDataQosParams.qosParams.convertTagZeroFrames = pQosMngrInitParams->qosTagZeroConverHeader;
  339. txData_setParam(pQosMngr->hTxData,&param);
  340. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  341. ("qosMngr_config : QoS configuration complete!"));
  342. return OK;
  343. }
  344. /************************************************************************
  345. * qosMngr_resetAdmCtrlParameters *
  346. ************************************************************************
  347. DESCRIPTION: reset the admCtrl parameters
  348. INPUT: hQosMngr - Qos Manager handle.
  349. OUTPUT:
  350. RETURN:
  351. ************************************************************************/
  352. void qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr)
  353. {
  354. UINT8 acID;
  355. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  356. /* reset admission control parameters */
  357. for(acID = FIRST_AC_INDEX ; acID < MAX_NUM_OF_AC ; acID++)
  358. {
  359. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].AC = (acTrfcType_e)acID;
  360. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY; /* Setting invalid user Priority to prevent GET_TSPEC or DELETE */
  361. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize = 0;
  362. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate = 0;
  363. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate = 0;
  364. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance = 0;
  365. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime = 0;
  366. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag = 0;
  367. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
  368. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  369. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].AC = (acTrfcType_e)acID;
  370. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY; /* Setting invalid user Priority to prevent GET_TSPEC or DELETE */
  371. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].nominalMsduSize = 0;
  372. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].minimumPHYRate = 0;
  373. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].meanDataRate = 0;
  374. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].surplausBwAllowance = 0;
  375. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].mediumTime = 0;
  376. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].UPSDFlag = 0;
  377. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
  378. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  379. pQosMngr->resourceMgmtTable.totalAllocatedMediumTime = 0;
  380. }
  381. }
  382. /************************************************************************
  383. * qosMngr_disconnect *
  384. ************************************************************************
  385. DESCRIPTION: the function is called upon driver disconnecting to reset all
  386. QOS parameters to init values.
  387. INPUT: hQosMngr - Qos Manager handle.
  388. OUTPUT:
  389. RETURN: OK on success, NOK otherwise
  390. ************************************************************************/
  391. TI_STATUS qosMngr_disconnect(TI_HANDLE hQosMngr)
  392. {
  393. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  394. paramInfo_t param;
  395. UINT8 acID;
  396. TI_STATUS status;
  397. if(hQosMngr == NULL)
  398. return OK;
  399. pQosMngr->activeProtocol = NONE_QOS;
  400. pQosMngr->WMESiteSupport = FALSE;
  401. /* clear admission control params */
  402. qosMngr_resetAdmCtrlParameters(pQosMngr);
  403. trafficAdmCtrl_stop(pQosMngr->pTrafficAdmCtrl);
  404. for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
  405. {
  406. /* disable event in rate adaptation */
  407. ctrlData_setTspecsRateEvent(pQosMngr->hCtrlData, acID, FALSE);
  408. /* Disable medium time events in TX */
  409. txData_setAdmisionCtrlParams(pQosMngr->hTxData, acID, 0 , 0, FALSE);
  410. /* The protocol after disconnect is NONE_QOS. If Packet Burst is Enabled, the BE queue InitParams
  411. is configured to the TxOP Limit of Packet burst (that is, 3 ms) and the
  412. txopContinuation is set to qosPacketBurstEnable. */
  413. if (acID == QOS_AC_BE)
  414. {
  415. if (pQosMngr->qosPacketBurstEnable==TRUE)
  416. {
  417. pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
  418. }
  419. else
  420. {
  421. pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
  422. }
  423. }
  424. /* Copy init traffic params (non-QoS defaults) to current traffic params, and config to HAL and TNET. */
  425. os_memoryCopy(pQosMngr->hOs,&(pQosMngr->acParams[acID].acQosParams),&(pQosMngr->acParams[acID].acQosInitParams),sizeof(acQosParams_t));
  426. /*
  427. * Update the qTrafficInitParams as well
  428. */
  429. os_memoryCopy(pQosMngr->hOs,&(pQosMngr->acParams[acID].QtrafficParams),&(pQosMngr->acParams[acID].QTrafficInitParams),sizeof(queueTrafficParams_t));
  430. pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY_PSPOLL; /* default configuration is legacy PS for all queues */
  431. /*
  432. * setting TxData params, only PS , Txoplimit and Admission State and AC status
  433. * can be changed and reset to defaults.
  434. */
  435. param.content.txDataQosParams.acID = acID;
  436. param.content.txDataQosParams.acTrfcCtrl.PsMode = PS_SCHEME_LEGACY;
  437. param.content.txDataQosParams.acTrfcCtrl.ackPolicy = ACK_POLICY_LEGACY; /* working with Non - Qos method */
  438. param.content.txDataQosParams.acTrfcCtrl.MsduLifeTime = pQosMngr->acParams[acID].msduLifeTimeParam;
  439. param.paramType = TX_DATA_CONFIG_AC_MSDU_LIFE_TIME;
  440. txData_setParam(pQosMngr->hTxData, &param);
  441. param.paramType = TX_DATA_PS_MODE_PARAM;
  442. txData_setParam(pQosMngr->hTxData,&param);
  443. param.paramType = TX_DATA_CONFIG_AC_ACK_POLICY;
  444. txData_setParam(pQosMngr->hTxData,&param);
  445. /* Set admission state per AC for non-QoS and update the Tx module. */
  446. setNonQosAdmissionState(pQosMngr, acID);
  447. }
  448. /*
  449. * configure only BE AC
  450. * NOTE : this is done after "disconnect" or Init phase so those are defaults BE params
  451. */
  452. /*
  453. * configureQueue
  454. */
  455. status = verifyAndConfigTrafficParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].QtrafficParams));
  456. if (status != OK)
  457. {
  458. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  459. ("qosMngr_setSite:failed to init NON_QOS Queue Traffic parameters!!!\n\n"));
  460. return status;
  461. }
  462. /*
  463. * configureAC
  464. */
  465. status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
  466. if (status != OK)
  467. {
  468. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  469. ("qosMngr_setSite:failed to init NON_QOS AC QoS parameters!!!\n\n"));
  470. return status;
  471. }
  472. /*
  473. * reset TxData globals parameters: header converting to legacy and Tag to Ac table without
  474. * QOS
  475. */
  476. pQosMngr->headerConvetMode = LEGACY_CONVERT;
  477. param.content.txDataQosParams.qosParams.headerConverMode = LEGACY_CONVERT;
  478. /* Update the Tx and HAL tag to AC tables for legacy mode. */
  479. updateTagToAcTable(pQosMngr, (acTrfcType_e *)NonQosTagToACTable);
  480. param.paramType = TX_DATA_CONVERT_HEADER_MODE;
  481. txData_setParam(pQosMngr->hTxData,&param);
  482. /* Update our internal state */
  483. pQosMngr->isConnected = FALSE;
  484. /* Mark that no Qos Null template is currently set into firmware */
  485. pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
  486. pQosMngr->voiceTspecConfigured = FALSE;
  487. pQosMngr->videoTspecConfigured = FALSE;
  488. /* Mark that no Qos Null template is currently set into firmware */
  489. pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
  490. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  491. ("qosMngr_disconnect : QoS disconnect complete!"));
  492. #ifdef EXC_MODULE_INCLUDED
  493. measurementMgr_stopTsMetrics(pQosMngr->hMeasurementMngr);
  494. #endif
  495. return OK;
  496. }
  497. /************************************************************************
  498. * qosMngr_connect *
  499. ************************************************************************
  500. DESCRIPTION: the function is called upon driver connection to inform all
  501. the other modules about the voice mode
  502. INPUT: hQosMngr - Qos Manager handle.
  503. OUTPUT:
  504. RETURN: OK on success, NOK otherwise
  505. ************************************************************************/
  506. TI_STATUS qosMngr_connect(TI_HANDLE hQosMngr)
  507. {
  508. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  509. psPollTemplate_t psPollTemplate;
  510. whalCtrl_setTemplate_t templateStruct;
  511. QosNullDataTemplate_t QosNullDataTemplate;
  512. UINT8 acID,UPSDCnt=0;
  513. if (pQosMngr->isConnected == TRUE)
  514. {
  515. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_connect : Already connected !!!\n"));
  516. return OK;
  517. }
  518. /* Send PsPoll template to HAL */
  519. templateStruct.pTemplate = (UINT8 *)&psPollTemplate;
  520. templateStruct.templateType = PS_POLL_TEMPLATE;
  521. buildPsPollTemplate(pQosMngr->hSiteMgr, &templateStruct);
  522. whalCtrl_SetTemplate(pQosMngr->hHalCtrl, &templateStruct);
  523. /* Update our internal state */
  524. pQosMngr->isConnected = TRUE;
  525. /* Set Qos-Null Data template into firmware */
  526. for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
  527. {
  528. /* Set QOS Null data template into the firmware (only if at least one AC is configured as UPSD )*/
  529. if (pQosMngr->acParams[acID].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  530. {
  531. UPSDCnt++;
  532. if ( pQosMngr->acParams[acID].apInitAdmissionState != ADMISSION_REQUIRED )
  533. {
  534. pQosMngr->QosNullDataTemplateUserPriority = wmeAcToUpIndex[acID];
  535. templateStruct.pTemplate = (UINT8 *)&QosNullDataTemplate;
  536. templateStruct.templateType = QOS_NULL_DATA_TEMPLATE;
  537. buildQosNullDataTemplate(pQosMngr->hSiteMgr, &templateStruct,pQosMngr->QosNullDataTemplateUserPriority);
  538. whalCtrl_SetTemplate(pQosMngr->hHalCtrl, &templateStruct);
  539. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  540. ("setWmeSiteParams: Setting QOS Null data for UserPriority %d (belongs to AC %d)\n",wmeAcToUpIndex[acID],acID));
  541. break; /* Only need to set ONE template, so after setting it, we can exit the loop */
  542. }
  543. }
  544. }
  545. /* 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*/
  546. if ((pQosMngr->QosNullDataTemplateUserPriority == 0xFF) && (UPSDCnt == MAX_NUM_OF_AC))
  547. {
  548. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_connect : QOS Null Data template not set since all ACs require admission !!!\n"));
  549. }
  550. return OK;
  551. }
  552. /************************************************************************
  553. * qosMngr_evalSite *
  554. ************************************************************************
  555. DESCRIPTION: Evaluate the site for the selction algorithm
  556. In case the station is configure to work in UPSD mode
  557. prefer a site that support UPSD and return 1.
  558. All other case return 0.
  559. INPUT: siteAPSDSupport - the UPSD capabilit of the site
  560. OUTPUT:
  561. RETURN: 1 - evaluation is good...
  562. 0 - evaluation can be better....
  563. ************************************************************************/
  564. UINT8 qosMngr_evalSite(TI_HANDLE hQosMngr, BOOL siteAPSDSupport)
  565. {
  566. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  567. if (pQosMngr->desiredPsMode == PS_SCHEME_UPSD_TRIGGER && siteAPSDSupport)
  568. {
  569. return 1;
  570. }
  571. return 0;
  572. }
  573. /************************************************************************
  574. * qosMngr_getParamsPatial *
  575. ************************************************************************
  576. DESCRIPTION: The function is an API for external modules to qet qos parameters
  577. INPUT: hQosMngr - Qos Manager handle.
  578. pParamInfo - qos parameters information.
  579. OUTPUT:
  580. RETURN: OK on success, NOK otherwise
  581. ************************************************************************/
  582. TI_STATUS qosMngr_getParamsPatial(TI_HANDLE hQosMngr,paramInfoPartial_t *pParamInfo)
  583. {
  584. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  585. if(pQosMngr == NULL)
  586. return NOK;
  587. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_getParams: %x\n", pParamInfo->paramType));
  588. switch(pParamInfo->paramType)
  589. {
  590. case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
  591. /* Check if voice call present. If so, store current TSPEC configuration */
  592. pParamInfo->content.TspecConfigure.voiceTspecConfigure = (UINT8)pQosMngr->voiceTspecConfigured;
  593. pParamInfo->content.TspecConfigure.videoTspecConfigure = (UINT8)pQosMngr->videoTspecConfigured;
  594. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_getParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->voiceTspecConfigured));
  595. if (pQosMngr->voiceTspecConfigured == TRUE)
  596. {
  597. OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
  598. tspecInfo_t *pConfiguredParams;
  599. /* Store voice TSPEC params - must be configured */
  600. pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6];
  601. pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6];
  602. pTspecParams->uUserPriority = pConfiguredParams->userPriority;
  603. pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
  604. pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
  605. pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
  606. pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
  607. pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
  608. pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
  609. }
  610. else
  611. {
  612. pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6].uUserPriority = MAX_USER_PRIORITY;
  613. }
  614. if (pQosMngr->videoTspecConfigured == TRUE)
  615. {
  616. OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
  617. tspecInfo_t *pConfiguredParams;
  618. /* Store signalling TSPEC params if configured in user priority 4 */
  619. pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4];
  620. pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4];
  621. pTspecParams->uUserPriority = pConfiguredParams->userPriority;
  622. pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
  623. pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
  624. pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
  625. pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
  626. pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
  627. pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
  628. }
  629. else
  630. {
  631. pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority = MAX_USER_PRIORITY;
  632. }
  633. break;
  634. default:
  635. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  636. ("qosMngr_getParamsExtend Error: unknown paramType 0x%x!\n",pParamInfo->paramType));
  637. return (PARAM_NOT_SUPPORTED);
  638. }
  639. return OK;
  640. }
  641. /************************************************************************
  642. * qosMngr_getACparams *
  643. ************************************************************************
  644. DESCRIPTION: The function is an API for external modules to qet qos parameters
  645. INPUT: hQosMngr - Qos Manager handle.
  646. pParamInfo - qos parameters information.
  647. OUTPUT:
  648. RETURN: OK on success, NOK otherwise
  649. ************************************************************************/
  650. TI_STATUS qosMngr_getParams(TI_HANDLE hQosMngr,paramInfo_t *pParamInfo)
  651. {
  652. acTrfcType_e acID;
  653. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  654. if(pQosMngr == NULL)
  655. return NOK;
  656. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_getParams: %x\n", pParamInfo->paramType));
  657. switch(pParamInfo->paramType)
  658. {
  659. case QOS_PACKET_BURST_ENABLE:
  660. pParamInfo->content.qosPacketBurstEnb = pQosMngr->qosPacketBurstEnable;
  661. break;
  662. case QOS_MNGR_CURRENT_PS_MODE:
  663. pParamInfo->content.currentPsMode = pQosMngr->currentPsMode;
  664. break;
  665. case QOS_MNGR_ACTIVE_PROTOCOL:
  666. pParamInfo->content.qosSiteProtocol = pQosMngr->activeProtocol;
  667. break;
  668. case QOS_MNGR_GET_DESIRED_PS_MODE:
  669. pParamInfo->content.qosDesiredPsMode.uDesiredPsMode = pQosMngr->desiredPsMode;
  670. for(acID = FIRST_AC_INDEX; acID < MAX_NUM_OF_AC ; acID++ )
  671. pParamInfo->content.qosDesiredPsMode.uDesiredWmeAcPsMode[acID] = pQosMngr->acParams[acID].desiredWmeAcPsMode;
  672. break;
  673. case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
  674. /* Check if voice call present. If so, store current TSPEC configuration */
  675. pParamInfo->content.TspecConfigure.voiceTspecConfigure = (UINT8)pQosMngr->voiceTspecConfigured;
  676. pParamInfo->content.TspecConfigure.videoTspecConfigure = (UINT8)pQosMngr->videoTspecConfigured;
  677. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_getParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->voiceTspecConfigured));
  678. if (pQosMngr->voiceTspecConfigured == TRUE)
  679. {
  680. OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
  681. tspecInfo_t *pConfiguredParams;
  682. /* Store voice TSPEC params - must be configured */
  683. pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6];
  684. pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6];
  685. pTspecParams->uUserPriority = pConfiguredParams->userPriority;
  686. pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
  687. pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
  688. pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
  689. pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
  690. pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
  691. pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
  692. }
  693. else
  694. {
  695. pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6].uUserPriority = MAX_USER_PRIORITY;
  696. }
  697. if (pQosMngr->videoTspecConfigured == TRUE)
  698. {
  699. OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
  700. tspecInfo_t *pConfiguredParams;
  701. /* Store signalling TSPEC params if configured in user priority 4 */
  702. pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4];
  703. pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4];
  704. pTspecParams->uUserPriority = pConfiguredParams->userPriority;
  705. pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
  706. pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
  707. pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
  708. pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
  709. pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
  710. pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
  711. }
  712. else
  713. {
  714. pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority = MAX_USER_PRIORITY;
  715. }
  716. break;
  717. default:
  718. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  719. ("qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType));
  720. return (PARAM_NOT_SUPPORTED);
  721. /* break; - unreachable */
  722. }
  723. return OK;
  724. }
  725. /************************************************************************
  726. * qosMngr_setParams *
  727. ************************************************************************
  728. DESCRIPTION: The function is an API for external modules to set qos parameters
  729. INPUT: hQosMngr - Qos Manager handle.
  730. pParamInfo - qos parameters information.
  731. OUTPUT:
  732. RETURN: OK on success, NOK otherwise
  733. ************************************************************************/
  734. TI_STATUS qosMngr_setParams(TI_HANDLE hQosMngr,paramInfo_t *pParamInfo)
  735. {
  736. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  737. paramInfo_t param;
  738. whalParamInfo_t whalParam;
  739. acTrfcType_e acID;
  740. TI_STATUS status;
  741. if(pQosMngr == NULL)
  742. return NOK;
  743. if(pParamInfo == NULL)
  744. {
  745. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  746. ("qosMngr_setParams :Error trying to set NULL params!\n"));
  747. return NOK;
  748. }
  749. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_setParams: %x\n", pParamInfo->paramType));
  750. switch(pParamInfo->paramType)
  751. {
  752. case QOS_PACKET_BURST_ENABLE:
  753. if (pParamInfo->content.qosPacketBurstEnb > QOS_PACKET_BURST_ENABLE_MAX)
  754. return (PARAM_VALUE_NOT_VALID);
  755. /* No change */
  756. if (pParamInfo->content.qosPacketBurstEnb == pQosMngr->qosPacketBurstEnable)
  757. return OK;
  758. /* Update the qosPacketBurstEnable parameter */
  759. pQosMngr->qosPacketBurstEnable = pParamInfo->content.qosPacketBurstEnb;
  760. /* Packet burst enable changed from F to T */
  761. if (pParamInfo->content.qosPacketBurstEnb == TRUE)
  762. {
  763. /* Update the acTrafficInitParams of BE to the packet burst def*/
  764. pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
  765. /* Update the acTrafficParams of BE and the hal to the packet burst def*/
  766. if (pQosMngr->activeProtocol == NONE_QOS)
  767. {
  768. pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
  769. /* verify the parameters and update the hal */
  770. status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
  771. if(status != OK)
  772. return status;
  773. }
  774. }
  775. /* Packet burst enable changed from T to F*/
  776. else
  777. {
  778. /* Update the acTrafficInitParams of BE to the AC def*/
  779. pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
  780. /* Update the acTrafficParams of BE and the hal to the AC def*/
  781. if (pQosMngr->activeProtocol == NONE_QOS)
  782. {
  783. pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
  784. /* verify the parameters and update the hal */
  785. status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
  786. if(status != OK)
  787. return status;
  788. }
  789. }
  790. break;
  791. case QOS_MNGR_SET_SITE_PROTOCOL:
  792. if(pParamInfo->content.qosSiteProtocol == WME)
  793. pQosMngr->WMESiteSupport = TRUE;
  794. else
  795. pQosMngr->WMESiteSupport = FALSE;
  796. break;
  797. case QOS_MNGR_SET_OS_PARAMS:
  798. if((acTrfcType_e)pParamInfo->content.qosOsParams.acID > QOS_HIGHEST_AC_INDEX)
  799. {
  800. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  801. ("qosMngr_setParams :Error trying to set invalid acId: %d param",pParamInfo->content.qosOsParams.acID));
  802. return (PARAM_VALUE_NOT_VALID);
  803. }
  804. if((pParamInfo->content.qosOsParams.VoiceDeliveryProtocol != TRUE) && (pParamInfo->content.qosOsParams.VoiceDeliveryProtocol != FALSE))
  805. {
  806. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  807. ("qosMngr_setParams :Error trying to set invalid VoiceDeliveryProtocol: %d param",pParamInfo->content.qosOsParams.VoiceDeliveryProtocol));
  808. return (PARAM_VALUE_NOT_VALID);
  809. }
  810. if((pParamInfo->content.qosOsParams.VoiceDeliveryProtocol == TRUE) && ((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol == PS_SCHEME_UPSD_TRIGGER))
  811. {
  812. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  813. ("qosMngr_setParams Error: trying to set invalid VoiceDeliveryProtocol == PS_POLL and PSDeliveryProtocol = UPSD\n"));
  814. return (PARAM_VALUE_NOT_VALID);
  815. }
  816. if((pParamInfo->content.qosOsParams.VoiceDeliveryProtocol == TRUE) && ((acTrfcType_e)pParamInfo->content.qosOsParams.acID != QOS_AC_VO))
  817. {
  818. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  819. ("qosMngr_setParams Error: trying to set invalid VoiceDeliveryProtocol == PS_POLL and AC != VOICE \n"));
  820. return (PARAM_VALUE_NOT_VALID);
  821. }
  822. if(((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol != PS_SCHEME_LEGACY_PSPOLL) && ((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol != PS_SCHEME_UPSD_TRIGGER))
  823. {
  824. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  825. ("qosMngr_setParams :Error trying to set invalid PSDeliveryProtocol: %d param\n",pParamInfo->content.qosOsParams.PSDeliveryProtocol));
  826. return (PARAM_VALUE_NOT_VALID);
  827. }
  828. /* config tidConf */
  829. acID = (acTrfcType_e)pParamInfo->content.qosOsParams.acID;
  830. /* Convert TRUE/FALSE setting (from Utility Adapter) to PS_POLL or PS_NONE settings */
  831. if (pParamInfo->content.qosOsParams.VoiceDeliveryProtocol == FALSE)
  832. {
  833. pParamInfo->content.qosOsParams.VoiceDeliveryProtocol = PS_SCHEME_LEGACY;
  834. }
  835. if (pParamInfo->content.qosOsParams.VoiceDeliveryProtocol == TRUE)
  836. {
  837. pParamInfo->content.qosOsParams.VoiceDeliveryProtocol = PS_SCHEME_LEGACY_PSPOLL;
  838. }
  839. if( (pParamInfo->content.qosOsParams.PSDeliveryProtocol != pQosMngr->acParams[acID].desiredWmeAcPsMode) &&
  840. (pQosMngr->isConnected == TRUE) )
  841. {
  842. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  843. ("qosMngr_setParams :Error trying to set new PS protocol while connected"));
  844. return (PARAM_VALUE_NOT_VALID);
  845. }
  846. /* UPSD_FW open in upsd integration */
  847. /* set the current PS mode. In not connected state it is always Legacy since the currentPsMode only
  848. update after connection */
  849. pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
  850. pQosMngr->acParams[acID].msduLifeTimeParam = pParamInfo->content.qosOsParams.MaxLifeTime;
  851. status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
  852. if(status != OK)
  853. return status;
  854. /* set txData Voice Delivery Protocol mode */
  855. if(acID == QOS_AC_VO)
  856. pQosMngr->desiredVoiceDeliveryProtocol = pParamInfo->content.qosOsParams.VoiceDeliveryProtocol;
  857. param.content.txDataQosParams.acID = acID;
  858. param.content.txDataQosParams.acTrfcCtrl.PsMode = pParamInfo->content.qosOsParams.VoiceDeliveryProtocol;
  859. param.paramType = TX_DATA_PS_MODE_PARAM;
  860. txData_setParam(pQosMngr->hTxData,&param);
  861. param.content.txDataQosParams.acTrfcCtrl.MsduLifeTime = pParamInfo->content.qosOsParams.MaxLifeTime;
  862. param.paramType = TX_DATA_CONFIG_AC_MSDU_LIFE_TIME;
  863. txData_setParam(pQosMngr->hTxData,&param);
  864. /* synch psPoll mode with qosMngr */
  865. /* Update the PsMode parameter */
  866. pQosMngr->acParams[acID].desiredWmeAcPsMode = pParamInfo->content.qosOsParams.PSDeliveryProtocol;
  867. break;
  868. case QOS_MNGR_CURRENT_PS_MODE:
  869. if( (pQosMngr->activeProtocol == WME) && (pQosMngr->desiredPsMode == PS_SCHEME_UPSD_TRIGGER) && (pParamInfo->content.currentPsMode == PS_SCHEME_UPSD_TRIGGER) )
  870. pQosMngr->currentPsMode = PS_SCHEME_UPSD_TRIGGER;
  871. else
  872. pQosMngr->currentPsMode = PS_SCHEME_LEGACY_PSPOLL;
  873. break;
  874. case QOS_MNGR_ADD_TSPEC_REQUEST:
  875. pQosMngr->TSPECNegotiationResultCallb = NULL;
  876. pQosMngr->TSPECNegotiationResultModule = NULL;
  877. return (qosMngr_requestAdmission(hQosMngr, &pParamInfo->content.qosAddTspecRequest));
  878. /* break; - unreachable */
  879. case QOS_MNGR_RESEND_TSPEC_REQUEST:
  880. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  881. ("qosMngr_setParams: QOS_MNGR_RESEND_TSPEC_REQUEST\n"));
  882. pQosMngr->TSPECNegotiationResultCallb = (qosMngrCallb_t)pParamInfo->content.qosRenegotiateTspecRequest.callback;
  883. pQosMngr->TSPECNegotiationResultModule = pParamInfo->content.qosRenegotiateTspecRequest.handler;
  884. status = qosMngr_requestAdmission(hQosMngr, &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6]);
  885. if ((status == OK) && (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY))
  886. {
  887. status = qosMngr_requestAdmission(hQosMngr, &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4]);
  888. }
  889. return (status);
  890. /* break; - unreachable */
  891. case QOS_MNGR_DEL_TSPEC_REQUEST:
  892. return (qosMngr_deleteAdmission(hQosMngr, &pParamInfo->content.qosDelTspecRequest));
  893. /* break; - unreachable */
  894. case QOS_MNGR_AC_STATUS:
  895. return (qosMngr_getCurrAcStatus (hQosMngr,&pParamInfo->content.qosCurrentAcStatus));
  896. /* break; - unreachable */
  897. case QOS_MNGR_AP_QOS_PARAMETERS: /* API GetAPQosParameters */
  898. acID = (acTrfcType_e) pParamInfo->content.qosApQosParams.uAC;
  899. if(acID > QOS_HIGHEST_AC_INDEX)
  900. {
  901. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  902. ("qosMngr_setParams :Error trying to set invalid acId: %d param\n",pParamInfo->content.qosApQosParams.uAC));
  903. return (PARAM_VALUE_NOT_VALID);
  904. }
  905. if(pQosMngr->isConnected == FALSE)
  906. {
  907. return NOT_CONNECTED;
  908. }
  909. if(pQosMngr->activeProtocol == NONE_QOS)
  910. {
  911. return NO_QOS_AP;
  912. }
  913. pParamInfo->content.qosApQosParams.uAssocAdmissionCtrlFlag = pQosMngr->acParams[acID].apInitAdmissionState; /* admission flag */
  914. pParamInfo->content.qosApQosParams.uAIFS = pQosMngr->acParams[acID].acQosParams.aifsn;
  915. pParamInfo->content.qosApQosParams.uCwMin = (1 << pQosMngr->acParams[acID].acQosParams.cwMin)-1;
  916. pParamInfo->content.qosApQosParams.uCwMax = (1 << pQosMngr->acParams[acID].acQosParams.cwMax)-1;
  917. pParamInfo->content.qosApQosParams.uTXOPLimit = pQosMngr->acParams[acID].acQosParams.txopLimit << 5;
  918. break;
  919. case QOS_MNGR_OS_TSPEC_PARAMS:
  920. if( pParamInfo->content.qosTspecParameters.uUserPriority > MAX_USER_PRIORITY )
  921. {
  922. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  923. ("qosMngr_getTspecParams: userPriority > 7 -> Ignore !!!\n"));
  924. return NOK;
  925. }
  926. if(pQosMngr->isConnected == FALSE)
  927. {
  928. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  929. ("qosMngr_getTspecParams: Not connected - Ignoring request !!!\n"));
  930. return NOT_CONNECTED;
  931. }
  932. if(pQosMngr->activeProtocol == NONE_QOS)
  933. {
  934. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  935. ("qosMngr_getTspecParams: Not connected to QOS AP - Ignoring reqeust !!!\n"));
  936. return NO_QOS_AP;
  937. }
  938. acID = (acTrfcType_e)WMEQosTagToACTable[pParamInfo->content.qosTspecParameters.uUserPriority];
  939. /* check if signaling is already in process*/
  940. if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
  941. {
  942. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: AC = %d , TSPEC Signaling is in progress -> Ignoring request !!!\n",acID));
  943. return TRAFIC_ADM_PENDING;
  944. }
  945. /* check if UP is admitted or not */
  946. if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != pParamInfo->content.qosTspecParameters.uUserPriority)
  947. {
  948. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  949. ("qosMngr_getTspecParams: user priority is not admitted. -> Ignore !!!\n"));
  950. return USER_PRIORITY_NOT_ADMITTED;
  951. }
  952. pParamInfo->content.qosTspecParameters.uMeanDataRate = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate;
  953. pParamInfo->content.qosTspecParameters.uNominalMSDUsize = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize;
  954. pParamInfo->content.qosTspecParameters.uAPSDFlag = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag;
  955. pParamInfo->content.qosTspecParameters.uMinimumPHYRate = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate;
  956. pParamInfo->content.qosTspecParameters.uSurplusBandwidthAllowance = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance;
  957. pParamInfo->content.qosTspecParameters.uMediumTime = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime;
  958. break;
  959. case QOS_SET_RATE_THRESHOLD:
  960. ctrlData_setTspecsRateThresholds(pQosMngr->hCtrlData,
  961. (UINT8)pParamInfo->content.QOSRateThreshold.uAC,
  962. (UINT8)pParamInfo->content.QOSRateThreshold.uHighThreshold,
  963. (UINT8)pParamInfo->content.QOSRateThreshold.uLowThreshold);
  964. /* If currently connected to a QOS AP , need to enable the TSPEc event upon the setting of the thresholds */
  965. if(pQosMngr->activeProtocol == WME)
  966. {
  967. ctrlData_setTspecsRateEvent(pQosMngr->hCtrlData, (UINT8)pParamInfo->content.QOSRateThreshold.uAC, TRUE);
  968. }
  969. break;
  970. case QOS_GET_RATE_THRESHOLD:
  971. /* SET operation is performed, but actually this is only for AC parameter transfer from Utility Adapter to driver, since copy
  972. of user supplied block of data (and vice versa) is only performed in SetParam calls, the driver can also modify the supplied
  973. structure and thus return it to user mode */
  974. ctrlData_getTspecsRateThresholds(pQosMngr->hCtrlData,
  975. (UINT8)pParamInfo->content.QOSRateThreshold.uAC,
  976. (UINT32*)&pParamInfo->content.QOSRateThreshold.uHighThreshold,
  977. (UINT32*)&pParamInfo->content.QOSRateThreshold.uLowThreshold);
  978. break;
  979. case QOS_SET_RX_TIME_OUT:
  980. if (pParamInfo->content.rxTimeOut.UPSD == 0)
  981. {
  982. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  983. ("%s :Error trying to set invalid zero timeout for UPSD \n",__FUNCTION__));
  984. return PARAM_VALUE_NOT_VALID;
  985. }
  986. pQosMngr->rxTimeOut.psPoll = (UINT16)pParamInfo->content.rxTimeOut.psPoll;
  987. pQosMngr->rxTimeOut.UPSD = (UINT16)pParamInfo->content.rxTimeOut.UPSD;
  988. /* set RxTimeOut to FW */
  989. whalParam.paramType = HAL_CTRL_RX_TIME_OUT_PARAM;
  990. whalParam.content.halCtrlRxTimeOut = pQosMngr->rxTimeOut;
  991. whalCtrl_SetParam(pQosMngr->hHalCtrl,&whalParam);
  992. break;
  993. case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
  994. if( pParamInfo->content.TspecConfigure.voiceTspecConfigure || pParamInfo->content.TspecConfigure.videoTspecConfigure)
  995. pQosMngr->performTSPECRenegotiation = TRUE;
  996. else
  997. pQosMngr->performTSPECRenegotiation = FALSE;
  998. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  999. ("qosMngr_setParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->performTSPECRenegotiation));
  1000. break;
  1001. default:
  1002. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1003. ("qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType));
  1004. return (PARAM_NOT_SUPPORTED);
  1005. /* break; - unreachable */
  1006. }
  1007. return OK;
  1008. }
  1009. TI_STATUS qosMngr_setParamsPartial(TI_HANDLE hQosMngr,paramInfoPartial_t *pParamInfo)
  1010. {
  1011. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1012. if(pQosMngr == NULL)
  1013. return NOK;
  1014. if(pParamInfo == NULL)
  1015. {
  1016. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1017. ("qosMngr_setParams :Error trying to set NULL params!\n"));
  1018. return NOK;
  1019. }
  1020. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG, ("qosMngr_setParams: %x\n", pParamInfo->paramType));
  1021. switch(pParamInfo->paramType)
  1022. {
  1023. case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
  1024. if( pParamInfo->content.TspecConfigure.voiceTspecConfigure || pParamInfo->content.TspecConfigure.videoTspecConfigure)
  1025. pQosMngr->performTSPECRenegotiation = TRUE;
  1026. else
  1027. pQosMngr->performTSPECRenegotiation = FALSE;
  1028. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1029. ("qosMngr_setParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->performTSPECRenegotiation));
  1030. break;
  1031. default:
  1032. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1033. ("qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType));
  1034. return (PARAM_NOT_SUPPORTED);
  1035. }
  1036. return OK;
  1037. }
  1038. /************************************************************************
  1039. * verifyAndConfigTrafficParams *
  1040. ************************************************************************
  1041. DESCRIPTION: The function verifies the parameters set by qosMngr to
  1042. the queue traffic params in whalCtrl to be configured to TNET.
  1043. INPUT: hQosMngr - Qos Manager handle.
  1044. pAcTrafficParams - pointer to ac parameters.
  1045. OUTPUT:
  1046. RETURN: OK on success, NOK otherwise
  1047. ************************************************************************/
  1048. static TI_STATUS verifyAndConfigTrafficParams(qosMngr_t *pQosMngr, queueTrafficParams_t *pQtrafficParams)
  1049. {
  1050. whalParamInfo_t whalParam;
  1051. queueTrafficParams_t queueTrafficParams;
  1052. if(pQtrafficParams->queueID > MAX_NUM_OF_TX_QUEUES - 1)
  1053. {
  1054. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1055. ("verifyAndConfigTrafficParams :Error trying to set invalid queueID: %d param",pQtrafficParams->queueID));
  1056. return (PARAM_VALUE_NOT_VALID);
  1057. }
  1058. if(pQtrafficParams->channelType > MAX_CHANNEL_TYPE)
  1059. {
  1060. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1061. ("verifyAndConfigTrafficParams :Error trying to set invalid channelType: %d param",pQtrafficParams->channelType));
  1062. return (PARAM_VALUE_NOT_VALID);
  1063. }
  1064. /* TBD */
  1065. if(pQtrafficParams->tsid > AC_PARAMS_MAX_TSID)
  1066. {
  1067. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1068. ("verifyAndConfigTrafficParams :Error trying to set invalid tsid: %d param",pQtrafficParams->tsid));
  1069. return (PARAM_VALUE_NOT_VALID);
  1070. }
  1071. if(pQtrafficParams->psScheme > MAX_PS_SCHEME)
  1072. {
  1073. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1074. ("verifyAndConfigTrafficParams :Error trying to set invalid psScheme: %d param",pQtrafficParams->psScheme));
  1075. return (PARAM_VALUE_NOT_VALID);
  1076. }
  1077. /* TBD */
  1078. #if 0
  1079. if(pQtrafficParams->APSDConf > MAX_APSD_CONF)
  1080. {
  1081. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1082. ("verifyAndConfigTrafficParams :Error trying to set invalid APSDConf: %d param",pQtrafficParams->APSDConf));
  1083. return (PARAM_VALUE_NOT_VALID);
  1084. }
  1085. #endif
  1086. if(pQtrafficParams->ackPolicy > MAX_ACK_POLICY)
  1087. {
  1088. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1089. ("verifyAndConfigTrafficParams :Error trying to set invalid ackPolicy: %d param",pQtrafficParams->ackPolicy));
  1090. return (PARAM_VALUE_NOT_VALID);
  1091. }
  1092. /*
  1093. * Convert the QOS PS-scheme enum into the WHAL enum.
  1094. * NOTE: need to copy for not to change the QoS configuration
  1095. */
  1096. queueTrafficParams = *pQtrafficParams;
  1097. switch (queueTrafficParams.psScheme)
  1098. {
  1099. case PS_SCHEME_LEGACY:
  1100. queueTrafficParams.psScheme = PS_SCHEME_LEGACY;
  1101. break;
  1102. case PS_SCHEME_UPSD_TRIGGER:
  1103. queueTrafficParams.psScheme = PS_SCHEME_UPSD_TRIGGER;
  1104. break;
  1105. case PS_SCHEME_LEGACY_PSPOLL:
  1106. queueTrafficParams.psScheme = PS_SCHEME_LEGACY;
  1107. break;
  1108. case PS_SCHEME_SAPSD:
  1109. queueTrafficParams.psScheme = PS_SCHEME_SAPSD;
  1110. break;
  1111. }
  1112. whalParam.paramType = HAL_CTRL_QUEUES_PARAMS;
  1113. /* set parameters */
  1114. whalParam.content.pQueueTrafficParams = &queueTrafficParams;
  1115. return(whalCtrl_SetParam(pQosMngr->hHalCtrl, &whalParam));
  1116. }
  1117. /************************************************************************
  1118. * verifyAndConfigQosParams *
  1119. ************************************************************************
  1120. DESCRIPTION: The function verifies the parameters set by qosMngr to
  1121. the AC Qos params in whalCtrl to be configured to TNET.
  1122. INPUT: hQosMngr - Qos Manager handle.
  1123. pAcTrafficParams - pointer to ac parameters.
  1124. OUTPUT:
  1125. RETURN: OK on success, NOK otherwise
  1126. ************************************************************************/
  1127. static TI_STATUS verifyAndConfigQosParams(qosMngr_t *pQosMngr,acQosParams_t *pAcQosParams)
  1128. {
  1129. whalParamInfo_t whalParam;
  1130. acQosParams_t acQosParams;
  1131. if(pAcQosParams->ac > MAX_NUM_OF_AC - 1 )
  1132. {
  1133. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1134. ("verifyAndConfigQosParams :Error trying to set invalid ac : %d param",pAcQosParams->ac));
  1135. return (PARAM_VALUE_NOT_VALID);
  1136. }
  1137. /* verification is unnecessary due to limited range of pAcQosParams->aifsn data type (UINT8)
  1138. if(pAcQosParams->aifsn > QOS_AIFS_MAX )
  1139. {
  1140. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1141. ("verifyAndConfigQosParams :Error trying to set invalid aifsn : %d param",pAcQosParams->aifsn));
  1142. return (PARAM_VALUE_NOT_VALID);
  1143. }
  1144. */
  1145. if(pAcQosParams->cwMax > QOS_CWMAX_MAX )
  1146. {
  1147. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1148. ("verifyAndConfigQosParams :Error trying to set invalid cwMax : %d param",pAcQosParams->cwMax));
  1149. return (PARAM_VALUE_NOT_VALID);
  1150. }
  1151. if(pAcQosParams->cwMin > QOS_CWMIN_MAX )
  1152. {
  1153. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1154. ("verifyAndConfigQosParams :Error trying to set invalid cwMax : %d param",pAcQosParams->cwMax));
  1155. return (PARAM_VALUE_NOT_VALID);
  1156. }
  1157. if(pAcQosParams->txopLimit > QOS_TX_OP_LIMIT_MAX )
  1158. {
  1159. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1160. ("verifyAndConfigQosParams :Error trying to set invalid txopLimit : %d param",pAcQosParams->txopLimit));
  1161. return (PARAM_VALUE_NOT_VALID);
  1162. }
  1163. whalParam.paramType = HAL_CTRL_AC_PARAMS;
  1164. acQosParams.ac = pAcQosParams->ac;
  1165. acQosParams.aifsn = pAcQosParams->aifsn;
  1166. /* convert to TNET units */
  1167. acQosParams.cwMax = (1 << pAcQosParams->cwMax) - 1; /* CwMax = 2^CwMax - 1*/
  1168. acQosParams.cwMin = (1 << pAcQosParams->cwMin) - 1; /* CwMin = 2^CwMin - 1*/
  1169. acQosParams.txopLimit = pAcQosParams->txopLimit << 5; /* in us */
  1170. /* set parameters */
  1171. whalParam.content.configureCmdCBParams.CB_buf = (UINT8*)&acQosParams;
  1172. whalParam.content.configureCmdCBParams.CB_Func = NULL;
  1173. whalParam.content.configureCmdCBParams.CB_handle = NULL;
  1174. return whalCtrl_SetParam(pQosMngr->hHalCtrl, &whalParam);
  1175. }
  1176. /************************************************************************
  1177. * qosMngr_selectActiveProtocol *
  1178. ************************************************************************
  1179. DESCRIPTION: The function is called in order to set the active protocol in
  1180. the qosMngr according to site capabilities and desired mode.
  1181. called from SystemConfig.
  1182. INPUT:
  1183. OUTPUT:
  1184. RETURN: OK on success, NOK otherwise
  1185. ************************************************************************/
  1186. TI_STATUS qosMngr_selectActiveProtocol(TI_HANDLE hQosMngr)
  1187. {
  1188. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1189. /* decide qos protocol */
  1190. /* NOTE: if both exc qnd wme supported wme is chosen */
  1191. if(pQosMngr->WMESiteSupport && pQosMngr->WMEEnable)
  1192. {
  1193. pQosMngr->activeProtocol = WME;
  1194. }
  1195. else
  1196. {
  1197. pQosMngr->activeProtocol = NONE_QOS;
  1198. }
  1199. WLAN_REPORT_DEBUG_TX(pQosMngr->hReport,
  1200. (" qosMngr_selectActiveProtocol() : pQosMngr->activeProtocol %d\n",pQosMngr->activeProtocol));
  1201. return OK;
  1202. }
  1203. /************************************************************************
  1204. * qosMngr_setAcPsDeliveryMode *
  1205. ************************************************************************
  1206. DESCRIPTION: The function is called in order to set the upsd/ps_poll according
  1207. to the desired and current upsd mode (per AC as well).
  1208. called from systemConfig.
  1209. INPUT:
  1210. OUTPUT:
  1211. RETURN: OK on success, NOK otherwise
  1212. ************************************************************************/
  1213. TI_STATUS qosMngr_setAcPsDeliveryMode(TI_HANDLE hQosMngr)
  1214. {
  1215. UINT8 acID;
  1216. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1217. /* in case the current PS mode is not UPSD - the IE is empty */
  1218. if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
  1219. {
  1220. for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
  1221. {
  1222. if(pQosMngr->acParams[acID].desiredWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1223. {
  1224. pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
  1225. }
  1226. }
  1227. }
  1228. else {
  1229. paramInfo_t param;
  1230. // Setting params for PS Poll mode
  1231. // This was done to enable voice delivery protocol when the AP doesn't
  1232. // support UASPD.
  1233. // Note these values have been taken from the default value table in
  1234. // TiCtrl.c -- see TiUAPSDConfig()
  1235. os_memoryZero( pQosMngr->hOs, &param, sizeof(paramInfo_t) );
  1236. param.paramType = QOS_MNGR_SET_OS_PARAMS;
  1237. // Setting AC Best Effort settings
  1238. param.content.qosOsParams.acID = QOS_AC_BE;
  1239. param.content.qosOsParams.MaxLifeTime = 512;
  1240. param.content.qosOsParams.VoiceDeliveryProtocol = FALSE;
  1241. param.content.qosOsParams.PSDeliveryProtocol = PS_SCHEME_LEGACY_PSPOLL;
  1242. qosMngr_setParams( pQosMngr, &param );
  1243. // Setting AC Background settings
  1244. param.content.qosOsParams.acID = QOS_AC_BK;
  1245. param.content.qosOsParams.MaxLifeTime = 100;
  1246. param.content.qosOsParams.VoiceDeliveryProtocol = FALSE;
  1247. param.content.qosOsParams.PSDeliveryProtocol = PS_SCHEME_LEGACY_PSPOLL;
  1248. qosMngr_setParams( pQosMngr, &param );
  1249. // Setting AC Video settings
  1250. param.content.qosOsParams.acID = QOS_AC_VI;
  1251. param.content.qosOsParams.MaxLifeTime = 100;
  1252. param.content.qosOsParams.VoiceDeliveryProtocol = FALSE;
  1253. param.content.qosOsParams.PSDeliveryProtocol = PS_SCHEME_LEGACY_PSPOLL;
  1254. qosMngr_setParams( pQosMngr, &param );
  1255. // Setting AC Voice settings
  1256. param.content.qosOsParams.acID = QOS_AC_VO;
  1257. param.content.qosOsParams.MaxLifeTime = 60;
  1258. param.content.qosOsParams.VoiceDeliveryProtocol = TRUE;
  1259. param.content.qosOsParams.PSDeliveryProtocol = PS_SCHEME_LEGACY_PSPOLL;
  1260. qosMngr_setParams( pQosMngr, &param );
  1261. }
  1262. return OK;
  1263. }
  1264. /************************************************************************
  1265. * qosMngr_getQosCapabiltyInfeElement *
  1266. ************************************************************************
  1267. DESCRIPTION: The function is called in order to build the Qos Capability
  1268. IE for the associatiomn request.
  1269. INPUT:
  1270. OUTPUT:
  1271. RETURN: OK on success, NOK otherwise
  1272. ************************************************************************/
  1273. TI_STATUS qosMngr_getQosCapabiltyInfeElement(TI_HANDLE hQosMngr, UINT8 *pQosIe, UINT8 *pLen)
  1274. {
  1275. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1276. dot11_QOS_CAPABILITY_IE_t *dot11_QOS_CAPABILITY_IE = (dot11_QOS_CAPABILITY_IE_t *)pQosIe;
  1277. TI_STATUS status = OK;
  1278. UINT8 extraIeLen = 0;
  1279. if(pQosMngr->activeProtocol == WME)
  1280. {
  1281. dot11_QOS_CAPABILITY_IE->hdr.eleId = DOT11_QOS_CAPABILITY_ELE_ID;
  1282. dot11_QOS_CAPABILITY_IE->hdr.eleLen = DOT11_QOS_CAPABILITY_ELE_LEN;
  1283. /* The default configuration of QoS info Field is legacy PS for all ACs */
  1284. dot11_QOS_CAPABILITY_IE->QosInfoField = 0;
  1285. /* in case the current PS mode is not UPSD - the IE is empty */
  1286. if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
  1287. {
  1288. if(pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1289. {
  1290. dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_VO_APSD_FLAGS_SHIFT);
  1291. }
  1292. if(pQosMngr->acParams[QOS_AC_VI].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1293. {
  1294. dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_VI_APSD_FLAGS_SHIFT);
  1295. }
  1296. if(pQosMngr->acParams[QOS_AC_BK].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1297. {
  1298. dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_BK_APSD_FLAGS_SHIFT);
  1299. }
  1300. if(pQosMngr->acParams[QOS_AC_BE].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1301. {
  1302. dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_BE_APSD_FLAGS_SHIFT);
  1303. }
  1304. dot11_QOS_CAPABILITY_IE->QosInfoField |= (((pQosMngr->desiredMaxSpLen) & MAX_SP_LENGTH_MASK) << MAX_SP_LENGTH_SHIFT);
  1305. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1306. ("dot11_QOS_CAPABILITY_IE->QosInfoField = 0x%x\n",dot11_QOS_CAPABILITY_IE->QosInfoField));
  1307. }
  1308. *pLen = dot11_QOS_CAPABILITY_IE->hdr.eleLen + sizeof(dot11_eleHdr_t);
  1309. #ifdef EXC_MODULE_INCLUDED
  1310. /* If required, add exc info-elements to the association request packets */
  1311. if (pQosMngr->performTSPECRenegotiation == TRUE)
  1312. {
  1313. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1314. ("qosMngr_getQosCapabiltyInfeElement: performing TSPEC renegotiation\n"));
  1315. status = excMngr_getEXCQosIElements(pQosMngr->hExcMgr, (pQosIe+(*pLen)), &extraIeLen);
  1316. }
  1317. #endif
  1318. *pLen += extraIeLen;
  1319. }
  1320. else
  1321. {
  1322. *pLen = 0;
  1323. }
  1324. return status;
  1325. }
  1326. /************************************************************************
  1327. * qosMngr_assocReqBuild *
  1328. ************************************************************************
  1329. DESCRIPTION: The function is called in order to build the assocReq IE for
  1330. the current site QOS protocol.
  1331. INPUT: hQosMngr - Qos Manager handle.
  1332. OUTPUT:
  1333. RETURN: OK on success, NOK otherwise
  1334. ************************************************************************/
  1335. TI_STATUS qosMngr_assocReqBuild(TI_HANDLE hQosMngr, UINT8 *pQosIe, UINT8 *pLen)
  1336. {
  1337. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1338. TI_STATUS status;
  1339. if(pQosMngr == NULL)
  1340. {
  1341. *pLen = 0;
  1342. return OK;
  1343. }
  1344. /* building assocReq frame */
  1345. switch(pQosMngr->activeProtocol)
  1346. {
  1347. case WME:
  1348. status = getWMEInfoElement(pQosMngr,pQosIe,pLen);
  1349. if (status !=OK)
  1350. {
  1351. *pLen = 0;
  1352. }
  1353. break;
  1354. case NONE_QOS:
  1355. *pLen = 0;
  1356. return OK;
  1357. /* break; - unreachable */
  1358. default:
  1359. *pLen = 0;
  1360. break;
  1361. }
  1362. return OK;
  1363. }
  1364. /************************************************************************
  1365. * getWMEInfoElement *
  1366. ************************************************************************
  1367. DESCRIPTION: building WME IE.
  1368. INPUT: hQosMngr - Qos Manager handle.
  1369. OUTPUT:
  1370. RETURN: OK on success, NOK otherwise
  1371. ************************************************************************/
  1372. static TI_STATUS getWMEInfoElement(qosMngr_t *pQosMngr,UINT8 *pWMEie,UINT8 *pLen)
  1373. {
  1374. dot11_WME_IE_t *pDot11_WME_IE = (dot11_WME_IE_t *)pWMEie;
  1375. pDot11_WME_IE->hdr.eleId = DOT11_WME_ELE_ID;
  1376. pDot11_WME_IE->hdr.eleLen = DOT11_WME_ELE_LEN;
  1377. pDot11_WME_IE->OUI[0] = 0x00;
  1378. pDot11_WME_IE->OUI[1] = 0x50;
  1379. pDot11_WME_IE->OUI[2] = 0xf2;
  1380. pDot11_WME_IE->OUIType = dot11_WME_OUI_TYPE;
  1381. pDot11_WME_IE->OUISubType = dot11_WME_OUI_SUB_TYPE_IE;
  1382. pDot11_WME_IE->version = dot11_WME_VERSION;
  1383. pDot11_WME_IE->ACInfoField = 0;
  1384. if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
  1385. {
  1386. if(pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1387. {
  1388. pDot11_WME_IE->ACInfoField |= (1 << AC_VO_APSD_FLAGS_SHIFT);
  1389. }
  1390. if(pQosMngr->acParams[QOS_AC_VI].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1391. {
  1392. pDot11_WME_IE->ACInfoField |= (1 << AC_VI_APSD_FLAGS_SHIFT);
  1393. }
  1394. if(pQosMngr->acParams[QOS_AC_BK].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1395. {
  1396. pDot11_WME_IE->ACInfoField |= (1 << AC_BK_APSD_FLAGS_SHIFT);
  1397. }
  1398. if(pQosMngr->acParams[QOS_AC_BE].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
  1399. {
  1400. pDot11_WME_IE->ACInfoField |= (1 << AC_BE_APSD_FLAGS_SHIFT);
  1401. }
  1402. pDot11_WME_IE->ACInfoField |= (((pQosMngr->desiredMaxSpLen) & MAX_SP_LENGTH_MASK) << MAX_SP_LENGTH_SHIFT);
  1403. }
  1404. *pLen = pDot11_WME_IE->hdr.eleLen + sizeof(dot11_eleHdr_t);
  1405. return OK;
  1406. }
  1407. /************************************************************************
  1408. * qosMngr_checkTspecRenegResults *
  1409. ************************************************************************
  1410. DESCRIPTION: The function is called upon association response to check
  1411. Tspec renegotiation results
  1412. INPUT: hQosMngr - Qos Manager handle.
  1413. assocRsp - pointer to received IE parameters received
  1414. in association response.
  1415. OUTPUT:
  1416. RETURN: -
  1417. ************************************************************************/
  1418. void qosMngr_checkTspecRenegResults(TI_HANDLE hQosMngr, assocRsp_t *assocRsp)
  1419. {
  1420. tspecInfo_t tspecInfo;
  1421. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1422. #ifdef EXC_MODULE_INCLUDED
  1423. UINT32 acCount;
  1424. #endif
  1425. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1426. ("qosMngr_checkTspecRenegResults: performTSPECRenegotiation = %d, tspecParams received= %x\n",
  1427. pQosMngr->performTSPECRenegotiation, assocRsp->tspecVoiceParameters));
  1428. if (pQosMngr->performTSPECRenegotiation != TRUE)
  1429. {
  1430. /* If no re-negotiation was requested, no parsing shall be done */
  1431. #ifdef EXC_MODULE_INCLUDED
  1432. measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, MAX_NUM_OF_AC);
  1433. #endif
  1434. return;
  1435. }
  1436. if (assocRsp->tspecVoiceParameters == NULL && assocRsp->tspecSignalParameters == NULL)
  1437. {
  1438. /* The renegotiation request was ignored - update QoS Manager database */
  1439. qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_6,
  1440. &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6],
  1441. STATUS_TRAFFIC_ADM_REQUEST_REJECT);
  1442. if (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY)
  1443. {
  1444. qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_4,
  1445. &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4],
  1446. STATUS_TRAFFIC_ADM_REQUEST_REJECT);
  1447. }
  1448. #ifdef EXC_MODULE_INCLUDED
  1449. measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, MAX_NUM_OF_AC);
  1450. #endif
  1451. return;
  1452. }
  1453. if (assocRsp->tspecVoiceParameters != NULL)
  1454. {
  1455. /* The renogitaion was performed - update QoS Manager database */
  1456. pQosMngr->voiceTspecConfigured = TRUE;
  1457. trafficAdmCtrl_parseTspecIE(pQosMngr->pTrafficAdmCtrl, &tspecInfo, assocRsp->tspecVoiceParameters);
  1458. qosMngr_setAdmissionInfo(pQosMngr, tspecInfo.AC, &tspecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
  1459. }
  1460. if (assocRsp->tspecSignalParameters != NULL)
  1461. {
  1462. /* Signal TSPEC was re-negotiated as well */
  1463. pQosMngr->videoTspecConfigured = TRUE;
  1464. trafficAdmCtrl_parseTspecIE(pQosMngr->pTrafficAdmCtrl, &tspecInfo, assocRsp->tspecSignalParameters);
  1465. qosMngr_setAdmissionInfo(pQosMngr, tspecInfo.AC, &tspecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
  1466. }
  1467. else if (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY)
  1468. {
  1469. /* Signal TSPEC was not re-negotiated although requested to - ERROR */
  1470. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1471. ("qosMngr_setSite: Signal TSPEC was not re-negotiated while voice was \n"));
  1472. qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_4,
  1473. &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4],
  1474. STATUS_TRAFFIC_ADM_REQUEST_REJECT);
  1475. }
  1476. #ifdef EXC_MODULE_INCLUDED
  1477. /* If EXC IEs are present for one or more ACs, update other modules with received parameters */
  1478. for (acCount = 0; acCount < MAX_NUM_OF_AC; acCount++)
  1479. {
  1480. excMngr_setEXCQoSParams(pQosMngr->hExcMgr, &assocRsp->excIEs[acCount], acCount);
  1481. }
  1482. #endif
  1483. }
  1484. /************************************************************************
  1485. * qosMngr_setSite *
  1486. ************************************************************************
  1487. DESCRIPTION: The function is called upon association response to set site
  1488. parameters.
  1489. INPUT: hQosMngr - Qos Manager handle.
  1490. assocRsp - pointer to received IE parameters received
  1491. in association response.
  1492. OUTPUT:
  1493. RETURN: OK on success, NOK otherwise
  1494. ************************************************************************/
  1495. TI_STATUS qosMngr_setSite(TI_HANDLE hQosMngr, assocRsp_t *assocRsp)
  1496. {
  1497. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1498. TI_STATUS status;
  1499. paramInfo_t param;
  1500. if(hQosMngr == NULL)
  1501. return NOK;
  1502. /* checking active protocol */
  1503. switch(pQosMngr->activeProtocol)
  1504. {
  1505. case WME:
  1506. /* verify QOS protocol received in association response */
  1507. status = verifyWmeIeParams(pQosMngr, (UINT8 *)assocRsp->WMEParams);
  1508. if(status != OK)
  1509. {
  1510. pQosMngr->activeProtocol = NONE_QOS;
  1511. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1512. ("qosMngr_setSite: setting active protocol WME params with non WME IE params frame, setting active protocol back to NONE \n"));
  1513. return NOK;
  1514. }
  1515. status = setWmeSiteParams(pQosMngr, (UINT8 *)assocRsp->WMEParams);
  1516. if (status != OK)
  1517. {
  1518. pQosMngr->activeProtocol = NONE_QOS;
  1519. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1520. ("Warning: qosMngr_setSite-> failed to set AC WME parameters!!! , setting active protocol back to NONE\n"));
  1521. return NOK;
  1522. }
  1523. /* update siteMgr with recevied params */
  1524. status = siteMgr_setWMEParamsSite(pQosMngr->hSiteMgr, assocRsp->WMEParams);
  1525. if (status != OK)
  1526. {
  1527. pQosMngr->activeProtocol = NONE_QOS;
  1528. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1529. ("qosMngr_setSite:failed to init WME parameters!!! , setting active protocol back to NONE\n\n"));
  1530. return NOK;
  1531. }
  1532. break;
  1533. case NONE_QOS:
  1534. /* Check if the packet burst is enable, if it is,
  1535. should update the BE parames and the hal to the packet burst def */
  1536. if (pQosMngr->qosPacketBurstEnable == TRUE)
  1537. {
  1538. /* Update the acTrafficInitParams of BE to the packet burst def*/
  1539. pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
  1540. /* Update the acTrafficParams of BE to the packet burst def*/
  1541. pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
  1542. /* verify the parameters and update the hal */
  1543. status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
  1544. if (status != OK)
  1545. {
  1546. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1547. ("qosMngr_setSite:failed to init NON_QOS parameters!!!\n\n"));
  1548. return NOK;
  1549. }
  1550. }
  1551. /* By setting the PS_MODE of QOS_AC_VO to desiredVoiceDeliveryProtocol, we enable sending PS_POLL packets by the txData module
  1552. Even though all user priorities are mapped to QOS_AC_BE, when txData checks if Ps_Poll is needed for AC_VO */
  1553. param.content.txDataQosParams.acID = QOS_AC_VO;
  1554. param.content.txDataQosParams.acTrfcCtrl.PsMode = pQosMngr->desiredVoiceDeliveryProtocol;
  1555. param.paramType = TX_DATA_PS_MODE_PARAM;
  1556. txData_setParam(pQosMngr->hTxData,&param);
  1557. break;
  1558. default:
  1559. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1560. ("Warning: qosMngr_setSite NO active protocls To set \n"));
  1561. break;
  1562. }
  1563. /* Check if TSPEC re-negotiation was performed, if so - look for results */
  1564. qosMngr_checkTspecRenegResults(pQosMngr, assocRsp);
  1565. return OK;
  1566. }
  1567. /************************************************************************
  1568. * qosMngr_updateIEinfo *
  1569. ************************************************************************
  1570. DESCRIPTION: The function is called upon run-time update of AC parameters
  1571. INPUT: hQosMngr - Qos Manager handle.
  1572. pQosIeParams - pointer to received IE parameters received
  1573. in beacon or probe response.
  1574. OUTPUT:
  1575. RETURN: OK on success, NOK otherwise
  1576. ************************************************************************/
  1577. void qosMngr_updateIEinfo(TI_HANDLE hQosMngr, UINT8 *pQosIeParams,qosProtocols_e qosSetProtocol)
  1578. {
  1579. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1580. TI_STATUS status;
  1581. dot11_WME_PARAM_t *pWMEparams;
  1582. if(pQosMngr == NULL)
  1583. return;
  1584. /* checking active protocol */
  1585. switch(pQosMngr->activeProtocol)
  1586. {
  1587. case WME:
  1588. if(qosSetProtocol != WME)
  1589. return;
  1590. if(pQosIeParams == NULL)
  1591. {
  1592. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("Warning: updateIEinfo -> trying to update WME parameters with NULL site parameters!!!\n"));
  1593. return ;
  1594. }
  1595. /* verify QOS protocol received in update IE */
  1596. status = verifyWmeIeParams(pQosMngr,pQosIeParams);
  1597. if(status != OK)
  1598. {
  1599. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("Warning: updateIEinfo ->upadting active protocl WME params with non WME IE params frame !!!\n"));
  1600. return ;
  1601. }
  1602. pWMEparams = (dot11_WME_PARAM_t *)pQosIeParams;
  1603. /* update AC params */
  1604. status = updateACParams(pQosMngr,&(pWMEparams->WME_ACParameteres));
  1605. if(status != OK)
  1606. {
  1607. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("updateIEinfo-> failed to update AC WME parameters!!!\n\n"));
  1608. return ;
  1609. }
  1610. break;
  1611. default:
  1612. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("updateIEinfo-> trying to update qos paramters without active protocol !!!"));
  1613. break;
  1614. }
  1615. }
  1616. /************************************************************************
  1617. * qosMngr_buildTSPec *
  1618. ************************************************************************/
  1619. UINT32 qosMngr_buildTSPec(TI_HANDLE hQosMngr, UINT32 user_priority, UINT8 *pQosIe)
  1620. {
  1621. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1622. OS_802_11_QOS_TSPEC_PARAMS *pPreservedParams;
  1623. tspecInfo_t *pCandidateParams;
  1624. UINT32 ieLen;
  1625. pPreservedParams = &pQosMngr->tspecRenegotiationParams[user_priority];
  1626. pCandidateParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[user_priority];
  1627. if (pPreservedParams->uUserPriority != MAX_USER_PRIORITY)
  1628. {
  1629. qosMngr_storeTspecCandidateParams (pCandidateParams, pPreservedParams, user_priority);
  1630. pCandidateParams->trafficAdmState = AC_WAIT_ADMISSION;
  1631. trafficAdmCtrl_buildTSPec(pQosMngr->pTrafficAdmCtrl, pCandidateParams, pQosIe, &ieLen);
  1632. return ieLen;
  1633. }
  1634. else
  1635. {
  1636. return 0;
  1637. }
  1638. }
  1639. /************************************************************************
  1640. * setWmeSiteParams *
  1641. ************************************************************************
  1642. DESCRIPTION: The function is called upon association response to set WME site
  1643. parameters.
  1644. INPUT: hQosMngr - Qos Manager handle.
  1645. pQosIeParams - pointer to received IE parameters received
  1646. in association response.
  1647. OUTPUT:
  1648. RETURN: OK on success, NOK otherwise
  1649. ************************************************************************/
  1650. static TI_STATUS setWmeSiteParams(qosMngr_t *pQosMngr, UINT8 *pQosIeParams)
  1651. {
  1652. dot11_WME_PARAM_t *pWMEparams = (dot11_WME_PARAM_t *)pQosIeParams;
  1653. TI_STATUS status;
  1654. paramInfo_t param;
  1655. UINT8 acID;
  1656. if (pQosIeParams == NULL)
  1657. {
  1658. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1659. ("setWmeSiteParams: pQosIeParams is NULL !"));
  1660. return NOK;
  1661. }
  1662. for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
  1663. {
  1664. /* configure queue */
  1665. status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
  1666. if(status != OK)
  1667. return status;
  1668. /* Enable event in rate adaptation */
  1669. ctrlData_setTspecsRateEvent(pQosMngr->hCtrlData, acID, TRUE);
  1670. /* ac powerSave protocol mode */
  1671. param.content.txDataQosParams.acID = acID;
  1672. param.content.txDataQosParams.acTrfcCtrl.PsMode = pQosMngr->acParams[acID].currentWmeAcPsMode;
  1673. param.content.txDataQosParams.acTrfcCtrl.ackPolicy = pQosMngr->acParams[acID].wmeAcAckPolicy; /* working with Non - Qos method */
  1674. /* In case QOS_AC_VO is not configured for UPSD, set it according to the desired voice delivery protocol, which can be either PS_POLL or PS_NONE */
  1675. if ((acID == QOS_AC_VO) && (pQosMngr->acParams[acID].currentWmeAcPsMode != PS_SCHEME_UPSD_TRIGGER))
  1676. {
  1677. param.content.txDataQosParams.acTrfcCtrl.PsMode = pQosMngr->desiredVoiceDeliveryProtocol;
  1678. }
  1679. param.paramType = TX_DATA_PS_MODE_PARAM;
  1680. txData_setParam(pQosMngr->hTxData,&param);
  1681. param.paramType = TX_DATA_CONFIG_AC_ACK_POLICY;
  1682. txData_setParam(pQosMngr->hTxData,&param);
  1683. }
  1684. /* update AC params */
  1685. status = updateACParams(pQosMngr,&(pWMEparams->WME_ACParameteres));
  1686. if(status != OK)
  1687. return status;
  1688. /* update per protocol params */
  1689. /* update header convert mode */
  1690. pQosMngr->headerConvetMode = QOS_CONVERT;
  1691. param.content.txDataQosParams.qosParams.headerConverMode = QOS_CONVERT;
  1692. param.paramType = TX_DATA_CONVERT_HEADER_MODE;
  1693. txData_setParam(pQosMngr->hTxData,&param);
  1694. return OK;
  1695. }
  1696. /************************************************************************
  1697. * updateACParams *
  1698. ************************************************************************
  1699. DESCRIPTION: the function is called upon QOS protocol updates paramters
  1700. to TNET and TxData object
  1701. INPUT: hQosMngr - Qos Manager handle.
  1702. OUTPUT:
  1703. RETURN: OK on success, NOK otherwise
  1704. ************************************************************************/
  1705. static TI_STATUS updateACParams(qosMngr_t *pQosMngr,ACParameters_t *pAcParams)
  1706. {
  1707. UINT8 acID,i;
  1708. TI_STATUS status;
  1709. QOS_AC_IE_ParametersRecord_t *pACParameteresRecord;
  1710. paramInfo_t param;
  1711. /*
  1712. * For WME: setting ac traffic params (edcf etc')
  1713. * in this order BE, BK , VI, VO .
  1714. */
  1715. pACParameteresRecord = (QOS_AC_IE_ParametersRecord_t *)pAcParams;
  1716. for(i = FIRST_AC_INDEX; i < MAX_NUM_OF_AC; i++, pACParameteresRecord++)
  1717. {
  1718. /* getting ac from ACI */
  1719. acID = (pACParameteresRecord->ACI_AIFSN & AC_PARAMS_ACI_MASK) >> 5;
  1720. /* edcf params */
  1721. pQosMngr->acParams[acID].acQosParams.ac = acID;
  1722. pQosMngr->acParams[acID].acQosParams.aifsn = pACParameteresRecord->ACI_AIFSN & AC_PARAMS_AIFSN_MASK;
  1723. pQosMngr->acParams[acID].acQosParams.cwMin = pACParameteresRecord->ECWmin_ECWmax & AC_PARAMS_CWMIN_MASK;
  1724. pQosMngr->acParams[acID].acQosParams.cwMax = (pACParameteresRecord->ECWmin_ECWmax & AC_PARAMS_CWMAX_MASK) >> 4;
  1725. pQosMngr->acParams[acID].acQosParams.txopLimit = pACParameteresRecord->TXOPLimit;
  1726. status = verifyAndConfigQosParams(pQosMngr,&(pQosMngr->acParams[acID].acQosParams));
  1727. if(status != OK)
  1728. return status;
  1729. /* UPSD configuration */
  1730. pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
  1731. status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
  1732. if(status != OK)
  1733. return status;
  1734. /* update admission state */
  1735. if(pACParameteresRecord->ACI_AIFSN & AC_PARAMS_ACM_MASK)
  1736. {
  1737. pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_REQUIRED;
  1738. param.content.txDataQosParams.qosParams.admissionRequired = ADMISSION_REQUIRED;
  1739. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  1740. param.content.txDataQosParams.qosParams.admissionState = AC_NOT_ADMITTED;
  1741. }
  1742. else
  1743. {
  1744. pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_NOT_REQUIRED;
  1745. param.content.txDataQosParams.qosParams.admissionRequired = ADMISSION_NOT_REQUIRED;
  1746. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
  1747. param.content.txDataQosParams.qosParams.admissionState = AC_ADMITTED;
  1748. }
  1749. param.content.txDataQosParams.acID = acID;
  1750. param.paramType = TX_DATA_AC_ADMISSION_STATE;
  1751. txData_setParam(pQosMngr->hTxData,&param);
  1752. }
  1753. /* Update the Tx and HAL tag to AC tables for WME mode. */
  1754. updateTagToAcTable(pQosMngr, (acTrfcType_e *)WMEQosTagToACTable);
  1755. return OK;
  1756. }
  1757. /************************************************************************
  1758. * updateTagToAcTable *
  1759. ************************************************************************
  1760. DESCRIPTION: the function updates tag to AC index according to the delivered
  1761. protocol tag to AC table (WME or legacy).
  1762. INPUT: hQosMngr - Qos Manager handle.
  1763. pProtocolTagToACTable - protocol tag to AC table.
  1764. OUTPUT:
  1765. RETURN: OK on success, NOK otherwise
  1766. ************************************************************************/
  1767. void updateTagToAcTable(qosMngr_t *pQosMngr,acTrfcType_e *pProtocolTagToACTable)
  1768. {
  1769. paramInfo_t param;
  1770. /*
  1771. * Update the Tx and HAL Tag to AC tables.
  1772. */
  1773. os_memoryCopy(pQosMngr->hOs,(param.content.txDataQosParams.qosParams.tag_ToAcClsfrTable),
  1774. pProtocolTagToACTable, sizeof(acTrfcType_e) * MAX_NUM_OF_802_1d_TAGS);
  1775. param.paramType = TX_DATA_TAG_TO_AC_CLASSIFIER_TABLE;
  1776. txData_setParam(pQosMngr->hTxData,&param);
  1777. }
  1778. /************************************************************************
  1779. * verifyWmeIeParams *
  1780. ************************************************************************
  1781. DESCRIPTION: verify WME IE.
  1782. INPUT: hQosMngr - Qos Manager handle.
  1783. OUTPUT:
  1784. RETURN: OK on success, NOK otherwise
  1785. ************************************************************************/
  1786. static TI_STATUS verifyWmeIeParams(qosMngr_t *pQosMngr,UINT8 *pQosIeParams)
  1787. {
  1788. dot11_WME_IE_t WMEie;
  1789. UINT8 Len;
  1790. dot11_WME_IE_t *pWMERecvIe = (dot11_WME_IE_t *)pQosIeParams;
  1791. if(pQosIeParams == NULL)
  1792. {
  1793. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("verifyWmeIeParams: FAILED"));
  1794. return NOK;
  1795. }
  1796. /* get WME IE */
  1797. getWMEInfoElement(pQosMngr,(UINT8 *)&WMEie,(UINT8 *)&Len);
  1798. if((WMEie.hdr.eleId != pWMERecvIe->hdr.eleId ) ||
  1799. (WMEie.OUI[0] != pWMERecvIe->OUI[0]) ||
  1800. (WMEie.OUI[1] != pWMERecvIe->OUI[1]) ||
  1801. (WMEie.OUI[2] != pWMERecvIe->OUI[2]) ||
  1802. (WMEie.OUIType != pWMERecvIe->OUIType))
  1803. {
  1804. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("verifyWmeIeParams: FAILED"));
  1805. return NOK;
  1806. }
  1807. if(WMEie.version != pWMERecvIe->version)
  1808. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("WARNING: verifyWmeIeParams: Driver WME version: %d, Site WME version: %d",WMEie.version,pWMERecvIe->version));
  1809. /* compare assocRsp IE to WME IE (without acInfo field */
  1810. return OK;
  1811. }
  1812. /************************************************************************
  1813. * Admission Control Functions *
  1814. ************************************************************************/
  1815. /************************************************************************
  1816. * qosMngr_requestAdmission *
  1817. ************************************************************************
  1818. DESCRIPTION: This function is API function for TSPEC request.
  1819. INPUT: hQosMngr - Qos Manager handle.
  1820. addTspecParams - The Tspec Parameters
  1821. OUTPUT:
  1822. RETURN: OK on success, NOK otherwise
  1823. ************************************************************************/
  1824. TI_STATUS qosMngr_requestAdmission(TI_HANDLE hQosMngr,
  1825. OS_802_11_QOS_TSPEC_PARAMS *addTspecParams)
  1826. {
  1827. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1828. TI_STATUS status;
  1829. UINT8 acID;
  1830. /* check if STA is already connected to AP */
  1831. if(pQosMngr->isConnected == FALSE)
  1832. {
  1833. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: Not connected - Ignoring request !!!\n"));
  1834. return NOT_CONNECTED;
  1835. }
  1836. /* check if AP support WME */
  1837. if(pQosMngr->activeProtocol != WME)
  1838. {
  1839. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: Not connected to a QOS AP - Ignoring request !!!\n"));
  1840. return NO_QOS_AP;
  1841. }
  1842. /* check if Traffic Admission Control is enable */
  1843. if(pQosMngr->trafficAdmCtrlEnable == FALSE)
  1844. {
  1845. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: Admission-Control is disabled - Ignoring request !!!\n"));
  1846. return ADM_CTRL_DISABLE;
  1847. }
  1848. /* check UP validity */
  1849. if( addTspecParams->uUserPriority > MAX_USER_PRIORITY)
  1850. {
  1851. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("uUserPriority = %d > 7 !!!\n",addTspecParams->uUserPriority));
  1852. return NOK;
  1853. }
  1854. /* find acID from the user priority */
  1855. acID = WMEQosTagToACTable[addTspecParams->uUserPriority];
  1856. /* check if signaling is already in process for this AC */
  1857. if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
  1858. {
  1859. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: AC = %d , signaling is in process -> Ignore Request !!!\n",acID));
  1860. return TRAFIC_ADM_PENDING;
  1861. }
  1862. /* check if AC is already admitted with other UP */
  1863. if( (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_ADMITTED) &&
  1864. (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority <= MAX_USER_PRIORITY) &&
  1865. (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != addTspecParams->uUserPriority) )
  1866. {
  1867. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1868. ("qosMngr_requestAdmission: AC = %d , another UP (%d) on same AC is already admited -> Ignoring request !!!\n",
  1869. acID, pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority));
  1870. return AC_ALREADY_IN_USE;
  1871. }
  1872. /* check msdu size validity */
  1873. if( (addTspecParams->uNominalMSDUsize & !FIX_MSDU_SIZE) > MAX_DATA_BODY_LENGTH)
  1874. {
  1875. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("uNominalMSDUsize = %d > 2312, !!!\n",addTspecParams->uNominalMSDUsize));
  1876. return NOK;
  1877. }
  1878. /* check PS mode validity */
  1879. if( (addTspecParams->uAPSDFlag == PS_SCHEME_UPSD_TRIGGER) && (pQosMngr->currentPsMode != PS_SCHEME_UPSD_TRIGGER) )
  1880. {
  1881. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1882. ("The STA's current status does not support UPSD -> Ignoring TSPEC request that has UPSD on !!!\n"));
  1883. return NOK;
  1884. }
  1885. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: UP = %d , acID = %d\n",addTspecParams->uUserPriority, acID));
  1886. /* The following code was removed since TX module is updated on UPSD/PS-POLL configuration of AC, and therefore will NOT
  1887. send PS-POLLs when QOS_AC_VO is configured for UPSD */
  1888. #if 0
  1889. /* check PS mode validity for the voice queue*/
  1890. /* Do not allow CHANGING QOS_AC_VO currentPsMode to UPSD while the desiredVoiceDeliveryProtocol is enabled */
  1891. if( (acID == QOS_AC_VO) &&
  1892. ((addTspecParams->uAPSDFlag == UPSD) && (pQosMngr->acParams[acID].currentWmeAcPsMode != UPSD)) &&
  1893. (pQosMngr->desiredVoiceDeliveryProtocol == PS_POLL) )
  1894. {
  1895. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1896. ("The STA's current QOS_AC_VO configured to VoiceDeliveryProtocol,\n This configuration can not be in parallel with UPSD.\n In order to change the AC_VO to UPSD, user must first disable the VoiceDeliveryProtocol!!!\n"));
  1897. return NOK;
  1898. }
  1899. #endif
  1900. /* set tspec parameters in candidateTspecInfo table */
  1901. qosMngr_storeTspecCandidateParams (&(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID]),
  1902. addTspecParams, (UINT8)acID);
  1903. /* Perhaps this should be done only if the request was successfully sent */
  1904. if (acID == QOS_AC_VO)
  1905. {
  1906. pQosMngr->voiceTspecConfigured = TRUE;
  1907. }
  1908. if (acID == QOS_AC_VI)
  1909. {
  1910. pQosMngr->videoTspecConfigured = TRUE;
  1911. }
  1912. /* call TrafficAdmCtrl API function for the signaling proccess */
  1913. status = trafficAdmCtrl_startAdmRequest(pQosMngr->pTrafficAdmCtrl, &(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID]));
  1914. if(status == OK)
  1915. {
  1916. /* request transmitted OK */
  1917. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_WAIT_ADMISSION;
  1918. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: UP = %d , request OK !!!\n",addTspecParams->uUserPriority));
  1919. }
  1920. else
  1921. {
  1922. /* reaquest not transmitted OK */
  1923. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  1924. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("qosMngr_requestAdmission: UP = %d , request NOT OK status=%d!!!\n",addTspecParams->uUserPriority, status));
  1925. return NOK;
  1926. }
  1927. return status;
  1928. }
  1929. /************************************************************************
  1930. * qosMngr_deleteAdmission *
  1931. ************************************************************************
  1932. DESCRIPTION: This function is API fuunction for tspec delete.
  1933. INPUT: hQosMngr - Qos Manager handle.
  1934. delAdmissionParams -
  1935. OUTPUT:
  1936. RETURN: OK on success, NOK otherwise
  1937. ************************************************************************/
  1938. TI_STATUS qosMngr_deleteAdmission(TI_HANDLE hQosMngr, OS_802_11_QOS_DELETE_TSPEC_PARAMS *delAdmissionParams)
  1939. {
  1940. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  1941. UINT8 acID;
  1942. /* check UP validity */
  1943. if( delAdmissionParams->uUserPriority > MAX_USER_PRIORITY )
  1944. {
  1945. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1946. ("qosMngr_deleteAdmission: userPriority > 7 -> Ignore !!!"));
  1947. return NOK;
  1948. }
  1949. /* check if STA is already connected to AP */
  1950. if(pQosMngr->isConnected == FALSE)
  1951. {
  1952. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1953. ("qosMngr_deleteAdmission: pQosMngr->connected == FALSE -> Ignore !!!"));
  1954. return NOT_CONNECTED;
  1955. }
  1956. /* check if AP support WME */
  1957. if(pQosMngr->activeProtocol != WME)
  1958. {
  1959. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1960. ("qosMngr_deleteAdmission: activeProtocol != WME -> Ignore !!!"));
  1961. return NO_QOS_AP;
  1962. }
  1963. /* find acID from the user priority */
  1964. acID = WMEQosTagToACTable[delAdmissionParams->uUserPriority];
  1965. /* check if tspec is already addmited for this AC */
  1966. if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState != AC_ADMITTED)
  1967. {
  1968. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1969. ("qosMngr_deleteAdmission: AC is not ADMITED -> Ignore !!!"));
  1970. return NOK;
  1971. }
  1972. /* check if AC is already admited with the same UP */
  1973. if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != delAdmissionParams->uUserPriority)
  1974. {
  1975. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1976. ("qosMngr_deleteAdmission: user priority is invalid. -> Ignore !!!\n"));
  1977. return USER_PRIORITY_NOT_ADMITTED;
  1978. }
  1979. /* check if signaling is already in procces for this AC */
  1980. if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
  1981. {
  1982. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  1983. ("qosMngr_deleteAdmission: AC is under negotiation -> Ignore !!!"));
  1984. return TRAFIC_ADM_PENDING;
  1985. }
  1986. /* call TrafficAdmCtrl API function for the delete tspec */
  1987. trafficAdmCtrl_sendDeltsFrame(pQosMngr->pTrafficAdmCtrl, &(pQosMngr->resourceMgmtTable.currentTspecInfo[acID]),
  1988. (UINT8)delAdmissionParams->uReasonCode );
  1989. deleteTspecConfiguration(pQosMngr, acID);
  1990. return OK;
  1991. }
  1992. /************************************************************************
  1993. * deleteTspecConfiguration *
  1994. ************************************************************************
  1995. DESCRIPTION: configure the driver and FW to default configuration after
  1996. tspec deletion.
  1997. INPUT: hQosMngr - Qos Manager handle.
  1998. acID - the AC of the Tspec to delete
  1999. OUTPUT:
  2000. RETURN: OK on success, NOK otherwise
  2001. ************************************************************************/
  2002. static void deleteTspecConfiguration(qosMngr_t *pQosMngr, UINT8 acID)
  2003. {
  2004. paramInfo_t param;
  2005. /* Zero Tspec parameters */
  2006. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize = 0;
  2007. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate = 0;
  2008. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate = 0;
  2009. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance = 0;
  2010. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime = 0;
  2011. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag = 0;
  2012. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
  2013. /* update total medium time */
  2014. pQosMngr->resourceMgmtTable.totalAllocatedMediumTime -= pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime;
  2015. /* set params to TX */
  2016. /*------------------*/
  2017. /* disable TSRS for this ac */
  2018. param.content.txDataQosParams.acID = acID;
  2019. param.content.txDataQosParams.tsrsArrLen = 0;
  2020. param.paramType = CTRL_DATA_TSRS_PARAM;
  2021. ctrlData_setParam(pQosMngr->hCtrlData, &param);
  2022. /* restore default MSDU lifetime value */
  2023. param.content.txDataQosParams.acID = acID;
  2024. param.content.txDataQosParams.acTrfcCtrl.MsduLifeTime = pQosMngr->acParams[acID].msduLifeTimeParam;
  2025. param.paramType = TX_DATA_CONFIG_AC_MSDU_LIFE_TIME;
  2026. txData_setParam(pQosMngr->hTxData, &param);
  2027. /* stop TS metrix for this ac */
  2028. #ifdef EXC_MODULE_INCLUDED
  2029. measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, acID);
  2030. #endif
  2031. /* update medium time and rate adaptation event only when init admission bit was 0 */
  2032. if( pQosMngr->acParams[acID].apInitAdmissionState == ADMISSION_REQUIRED )
  2033. {
  2034. /* update currentTspecInfo parameters */
  2035. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  2036. /* set params to TX */
  2037. txData_setAdmisionCtrlParams(pQosMngr->hTxData,
  2038. acID,
  2039. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime ,
  2040. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate, FALSE);
  2041. }
  2042. else
  2043. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
  2044. /* After we have updated the TxData with the new status of the UP, we can zero the userPriority field */
  2045. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY;
  2046. /* set PS mode according to the PS mode from the association */
  2047. /* restore the current Ps mode per AC to UPSD ONLY IF both the station and AP support UPSD */
  2048. if ((pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER) && (pQosMngr->acParams[acID].desiredWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER))
  2049. {
  2050. pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
  2051. }
  2052. else
  2053. {
  2054. pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY_PSPOLL;
  2055. }
  2056. if(acID == QOS_AC_VO)
  2057. {
  2058. /* update TX with "new" PS Voice Delivery mode */
  2059. txData_setPsVoiceDeliveryMode(pQosMngr->hTxData,pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode);
  2060. pQosMngr->voiceTspecConfigured = FALSE;
  2061. }
  2062. if (acID == QOS_AC_VI)
  2063. {
  2064. pQosMngr->videoTspecConfigured = FALSE;
  2065. }
  2066. /* UPSD_FW - open comment in UPSD FW integration */
  2067. /* UPSD configuration */
  2068. pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
  2069. verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
  2070. }
  2071. /*-----------------------------------------------------------------------------
  2072. Routine Name: qosMngr_sendUnexpectedTSPECResponse
  2073. Routine Description: send event to user application, informing of unexpected TSPEC response
  2074. which might imply loss of UPSD mode synch between AP and STA
  2075. Arguments: pTspecInfo - contains unexpected TSPEC response information
  2076. Return Value:
  2077. -----------------------------------------------------------------------------*/
  2078. TI_STATUS qosMngr_sendUnexpectedTSPECResponseEvent(TI_HANDLE hQosMngr,
  2079. tspecInfo_t *pTspecInfo)
  2080. {
  2081. OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
  2082. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  2083. /* set the event params */
  2084. addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
  2085. addtsReasonCode.uUserPriority = pTspecInfo->userPriority;
  2086. addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
  2087. addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
  2088. addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
  2089. addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
  2090. addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
  2091. addtsReasonCode.uReasonCode = pTspecInfo->statusCode + TSPEC_RESPONSE_UNEXPECTED;
  2092. /* send event */
  2093. EvHandlerSendEvent(pQosMngr->hEvHandler, IPC_EVENT_TSPEC_STATUS, (UINT8*)(&addtsReasonCode), sizeof(OS_802_11_QOS_TSPEC_PARAMS));
  2094. return OK;
  2095. }
  2096. /************************************************************************
  2097. * qosMngr_setAdmissionInfo *
  2098. ************************************************************************
  2099. DESCRIPTION: This function is API function.
  2100. the trafficAdmCtrl object calls this function in
  2101. order to update the QOSMngr on TSPEC request status
  2102. INPUT: hQosMngr - Qos Manager handle.
  2103. pTspecInfo - The TSPEC Parameters
  2104. trafficAdmRequestStatus - the status of the request
  2105. OUTPUT:
  2106. RETURN: OK on success, NOK otherwise
  2107. ************************************************************************/
  2108. TI_STATUS qosMngr_setAdmissionInfo(TI_HANDLE hQosMngr,
  2109. UINT8 acID,
  2110. tspecInfo_t *pTspecInfo,
  2111. trafficAdmRequestStatus_e trafficAdmRequestStatus)
  2112. {
  2113. UINT32 actualMediumTime;
  2114. OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
  2115. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  2116. whalCtrl_setTemplate_t templateStruct;
  2117. QosNullDataTemplate_t QosNullDataTemplate;
  2118. /* Check if the updated AC is in WAIT state */
  2119. if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState != AC_WAIT_ADMISSION)
  2120. {
  2121. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2122. ("qosMngr_setAdmissionInfo: acID = %d, trafficAdmState != WAIT. IGNORE !!!\n", acID));
  2123. return NOK;
  2124. }
  2125. if (pQosMngr->TSPECNegotiationResultCallb != NULL)
  2126. {
  2127. pQosMngr->TSPECNegotiationResultCallb (pQosMngr->TSPECNegotiationResultModule, trafficAdmRequestStatus);
  2128. pQosMngr->TSPECNegotiationResultCallb = NULL;
  2129. pQosMngr->TSPECNegotiationResultModule = NULL;
  2130. }
  2131. switch(trafficAdmRequestStatus)
  2132. {
  2133. case STATUS_TRAFFIC_ADM_REQUEST_ACCEPT:
  2134. /* Received admission response with status accept */
  2135. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2136. ("qosMngr_setAdmissionInfo: admCtrl status = REQUEST_ACCEPT [ acID = %d, mediumTime = %d, minimumPHYRate = %d ]\n",
  2137. acID, pTspecInfo->mediumTime, pTspecInfo->minimumPHYRate));
  2138. /* Set the event params */
  2139. addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
  2140. addtsReasonCode.uUserPriority = pTspecInfo->userPriority;
  2141. addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
  2142. addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
  2143. addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
  2144. addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
  2145. addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
  2146. /* Free the candidate parameters */
  2147. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  2148. /* Validate tid matching */
  2149. if (pTspecInfo->tid == pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].tid)
  2150. {
  2151. addtsReasonCode.uReasonCode = ADDTS_RESPONSE_ACCEPT;
  2152. /* Send event */
  2153. EvHandlerSendEvent (pQosMngr->hEvHandler,
  2154. IPC_EVENT_TSPEC_STATUS,
  2155. (UINT8*)&addtsReasonCode,
  2156. sizeof(OS_802_11_QOS_TSPEC_PARAMS));
  2157. }
  2158. else
  2159. {
  2160. addtsReasonCode.uReasonCode = ADDTS_RESPONSE_AP_PARAM_INVALID;
  2161. /* Send event */
  2162. EvHandlerSendEvent (pQosMngr->hEvHandler,
  2163. IPC_EVENT_TSPEC_STATUS,
  2164. (UINT8*)&addtsReasonCode,
  2165. sizeof(OS_802_11_QOS_TSPEC_PARAMS));
  2166. return OK;
  2167. }
  2168. /* Update the current TSPEC parameters from the received TSPEC */
  2169. os_memoryCopy (pQosMngr->hOs,
  2170. &pQosMngr->resourceMgmtTable.currentTspecInfo[acID],
  2171. pTspecInfo,
  2172. sizeof(tspecInfo_t));
  2173. /* Set the TSPEC to admitted */
  2174. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
  2175. /* Update total medium time */
  2176. pQosMngr->resourceMgmtTable.totalAllocatedMediumTime += pTspecInfo->mediumTime;
  2177. /*
  2178. * Set QOS Null-data template into the firmware.
  2179. * When a new TSPEC with UPSD is "accepted" by the AP,
  2180. * we set the user priority of it into the firmware.
  2181. * Since this AC is already ADMITTED (we are processing the successful response),
  2182. * it is OK to set the qos null data template with this UP
  2183. */
  2184. if (addtsReasonCode.uAPSDFlag == PS_SCHEME_UPSD_TRIGGER &&
  2185. pQosMngr->QosNullDataTemplateUserPriority == 0xFF)
  2186. {
  2187. /* Remember the user priority which we have set */
  2188. pQosMngr->QosNullDataTemplateUserPriority = (UINT8)addtsReasonCode.uUserPriority;
  2189. templateStruct.pTemplate = (UINT8 *)&QosNullDataTemplate;
  2190. templateStruct.templateType = QOS_NULL_DATA_TEMPLATE;
  2191. buildQosNullDataTemplate (pQosMngr->hSiteMgr, &templateStruct, pQosMngr->QosNullDataTemplateUserPriority);
  2192. whalCtrl_SetTemplate (pQosMngr->hHalCtrl, &templateStruct);
  2193. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2194. ("qosMngr_setAdmissionInfo: Setting QOS null data for UserPriority=%d (due to TSPEC ACCEPT response)\n",
  2195. addtsReasonCode.uUserPriority));
  2196. }
  2197. /* Set params to TX */
  2198. /*------------------*/
  2199. /* Update medium time and rate adaptation event only when init admission bit was 0 */
  2200. if (pQosMngr->acParams[acID].apInitAdmissionState == ADMISSION_REQUIRED)
  2201. {
  2202. /* mediumTime is in units of 32uSec and we work in mSec */
  2203. actualMediumTime = (pTspecInfo->mediumTime * 32) / 1000;
  2204. /* Set TX params */
  2205. txData_setAdmisionCtrlParams (pQosMngr->hTxData,
  2206. acID,
  2207. actualMediumTime,
  2208. pTspecInfo->minimumPHYRate,
  2209. TRUE);
  2210. }
  2211. {
  2212. PSScheme_e psMode = pTspecInfo->UPSDFlag ? PS_SCHEME_UPSD_TRIGGER
  2213. : PS_SCHEME_LEGACY_PSPOLL;
  2214. if (pQosMngr->acParams[acID].currentWmeAcPsMode != psMode)
  2215. {
  2216. TI_STATUS status;
  2217. pQosMngr->acParams[acID].currentWmeAcPsMode = psMode;
  2218. /* UPSD_FW - open comment in UPSD FW integration */
  2219. pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
  2220. status = verifyAndConfigTrafficParams (pQosMngr, &pQosMngr->acParams[acID].QtrafficParams);
  2221. if (status != OK)
  2222. return status;
  2223. if (acID == QOS_AC_VO)
  2224. {
  2225. /* Update TX with "new" PS Voice Delivery mode */
  2226. txData_setPsVoiceDeliveryMode (pQosMngr->hTxData, pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode);
  2227. }
  2228. }
  2229. }
  2230. break;
  2231. case STATUS_TRAFFIC_ADM_REQUEST_REJECT:
  2232. /* Received admission response with status reject */
  2233. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2234. ("qosMngr_setAdmissionInfo: admCtrl status = REQUEST_REJECT [ acID = %d ]\n", acID));
  2235. /* Validate tid matching */
  2236. if (pTspecInfo->tid == pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].tid)
  2237. {
  2238. addtsReasonCode.uReasonCode = pTspecInfo->statusCode;
  2239. }
  2240. else
  2241. {
  2242. addtsReasonCode.uReasonCode = ADDTS_RESPONSE_AP_PARAM_INVALID;
  2243. }
  2244. // put the candidateTspec back to a previously accepted TSPEC if
  2245. // one exist. This will prevent TI from sending same rejected
  2246. // TSPEC when roaming to another AP that has the same configuration
  2247. // as our current AP (under which case our the new AP will likely reject
  2248. // the TSPEC as well and we will not be able to roam
  2249. os_memoryCopy (pQosMngr->hOs,
  2250. &pQosMngr->resourceMgmtTable.candidateTspecInfo[acID],
  2251. &pQosMngr->resourceMgmtTable.currentTspecInfo[acID],
  2252. sizeof(tspecInfo_t));
  2253. if( pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority == INACTIVE_USER_PRIORITY ) {
  2254. if( acID == QOS_AC_VO ) pQosMngr->voiceTspecConfigured = FALSE;
  2255. else if( acID == QOS_AC_VI ) pQosMngr->voiceTspecConfigured = FALSE;
  2256. }
  2257. /* Send event to application */
  2258. addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
  2259. addtsReasonCode.uUserPriority = pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority;
  2260. addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
  2261. addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
  2262. addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
  2263. addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
  2264. addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
  2265. EvHandlerSendEvent (pQosMngr->hEvHandler,
  2266. IPC_EVENT_TSPEC_STATUS,
  2267. (UINT8*)&addtsReasonCode,
  2268. sizeof(OS_802_11_QOS_TSPEC_PARAMS));
  2269. break;
  2270. case STATUS_TRAFFIC_ADM_REQUEST_TIMEOUT:
  2271. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2272. ("qosMngr_setAdmissionInfo: admCtrl status = REQUEST_TIMEOUT [ acID = %d ]\n", acID));
  2273. /* Free the candidate parameters */
  2274. pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  2275. /* Send event to application */
  2276. addtsReasonCode.uUserPriority = pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority;
  2277. addtsReasonCode.uReasonCode = ADDTS_RESPONSE_TIMEOUT;
  2278. addtsReasonCode.uAPSDFlag = 0;
  2279. addtsReasonCode.uNominalMSDUsize = 0;
  2280. addtsReasonCode.uMeanDataRate = 0;
  2281. addtsReasonCode.uMinimumPHYRate = 0;
  2282. addtsReasonCode.uSurplusBandwidthAllowance = 0;
  2283. addtsReasonCode.uMediumTime = 0;
  2284. EvHandlerSendEvent (pQosMngr->hEvHandler,
  2285. IPC_EVENT_TSPEC_STATUS,
  2286. (UINT8*)&addtsReasonCode,
  2287. sizeof(OS_802_11_QOS_TSPEC_PARAMS));
  2288. break;
  2289. default:
  2290. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2291. ("qosMngr_setAdmissionInfo: receive state from admCtrl = unknown !!! \n"));
  2292. break;
  2293. }
  2294. return OK;
  2295. }
  2296. /************************************************************************
  2297. * QosMngr_receiveActionFrames *
  2298. ************************************************************************
  2299. DESCRIPTION:
  2300. RETURN: OK on success, NOK otherwise
  2301. ************************************************************************/
  2302. TI_STATUS QosMngr_receiveActionFrames(TI_HANDLE hQosMngr, UINT8* pData, UINT8 action, UINT32 bodyLen)
  2303. {
  2304. UINT8 acID;
  2305. tsInfo_t tsInfo;
  2306. UINT8 userPriority;
  2307. dot11_WME_TSPEC_IE_t* dot11_WME_TSPEC_IE;
  2308. OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
  2309. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  2310. /* check if STA is already connected to AP */
  2311. if( (pQosMngr->isConnected == FALSE) ||
  2312. (pQosMngr->activeProtocol != WME) ||
  2313. (pQosMngr->trafficAdmCtrlEnable == FALSE) )
  2314. {
  2315. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,("QosMngr_receiveActionFrames: Ignore !!!"));
  2316. return NOK;
  2317. }
  2318. /* check DELTS action code */
  2319. if (action == DELTS_ACTION)
  2320. {
  2321. /* parse the frame */
  2322. pData++; /* DIALOG TOKEN */
  2323. pData++; /* STATUS CODE */
  2324. #if 0 /* Need to send TSPEC IE in DELTS or only the tsinfo ??*/
  2325. /* only tsinfo */
  2326. tsInfo.tsInfoArr[0] = *pData;
  2327. pData++;
  2328. tsInfo.tsInfoArr[1] = *pData;
  2329. pData++;
  2330. tsInfo.tsInfoArr[2] = *pData;
  2331. pData++;
  2332. #else
  2333. /* TSpec IE in DELTS*/
  2334. dot11_WME_TSPEC_IE = (dot11_WME_TSPEC_IE_t*)pData;
  2335. tsInfo.tsInfoArr[0] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0];
  2336. pData++;
  2337. bodyLen--;
  2338. tsInfo.tsInfoArr[1] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1];
  2339. pData++;
  2340. bodyLen--;
  2341. tsInfo.tsInfoArr[2] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2];
  2342. #endif
  2343. userPriority = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT);
  2344. acID = WMEQosTagToACTable[userPriority];
  2345. WLAN_REPORT_INFORMATION(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2346. ("QosMngr_receiveActionFrames: DELTS [ acID = %d ] \n", acID));
  2347. /* check if this AC is admitted with the correct userPriority */
  2348. if( (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_ADMITTED) &&
  2349. ( pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority == userPriority) )
  2350. {
  2351. deleteTspecConfiguration(pQosMngr, acID);
  2352. /* Send event to notify DEL_TS */
  2353. addtsReasonCode.uAPSDFlag = 0;
  2354. addtsReasonCode.uUserPriority = userPriority;
  2355. addtsReasonCode.uReasonCode = TSPEC_DELETED_BY_AP;
  2356. addtsReasonCode.uNominalMSDUsize = 0;
  2357. addtsReasonCode.uMeanDataRate = 0;
  2358. addtsReasonCode.uMinimumPHYRate = 0;
  2359. addtsReasonCode.uSurplusBandwidthAllowance = 0;
  2360. addtsReasonCode.uMediumTime = 0;
  2361. EvHandlerSendEvent(pQosMngr->hEvHandler, IPC_EVENT_TSPEC_STATUS, (UINT8*)(&addtsReasonCode), sizeof(OS_802_11_QOS_TSPEC_PARAMS));
  2362. }
  2363. else
  2364. {
  2365. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2366. ("QosMngr_receiveActionFrames: DELTS [ acID = %d userPriority = %d currentUserPriority = %d] Current State in not ADMITED !! \n", acID, userPriority,pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority));
  2367. }
  2368. }
  2369. /* if action code is ADDTS call trafficAdmCtrl object API function */
  2370. else if (action == ADDTS_RESPONSE_ACTION)
  2371. {
  2372. if (trafficAdmCtrl_recv(pQosMngr->pTrafficAdmCtrl, pData, action) == OK)
  2373. {
  2374. #ifdef EXC_MODULE_INCLUDED
  2375. /* Check if EXC IEs present, if so, parse them and update relevant modules;
  2376. skip the TSPEC IE;
  2377. do not forget 2 bytes of status and dialog code that must be skipped as well */
  2378. EXCv4IEs_t excIE;
  2379. UINT32 readLen;
  2380. excIE.edcaLifetimeParameter = NULL;
  2381. excIE.trafficStreamParameter = NULL;
  2382. excIE.tsMetrixParameter = NULL;
  2383. userPriority = ((((dot11_WME_TSPEC_IE_t *)(pData+2))->tHdr.tsInfoField.tsInfoArr[1] & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT);
  2384. acID = WMEQosTagToACTable[userPriority];
  2385. readLen = ((dot11_eleHdr_t *)(pData+2))->eleLen;
  2386. /* 4 stands for 1 byte of token+1 byte of status+1 byte of EID+1 byte of len */
  2387. bodyLen = bodyLen - 4 - readLen;
  2388. pData = pData + 4 + readLen;
  2389. while (bodyLen)
  2390. {
  2391. mlmeParser_readExcOui(pData, bodyLen, &readLen, &excIE);
  2392. bodyLen -= readLen;
  2393. pData += readLen;
  2394. }
  2395. excMngr_setEXCQoSParams(pQosMngr->hExcMgr, &excIE, acID);
  2396. #endif
  2397. }
  2398. }
  2399. else
  2400. {
  2401. WLAN_REPORT_WARNING(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2402. ("QosMngr_receiveActionFrames: Receive unknown action code = %d -> Ignore !! \n",action));
  2403. }
  2404. return OK;
  2405. }
  2406. /************************************************************************
  2407. * qosMngr_getCurrAcStatus *
  2408. ************************************************************************
  2409. DESCRIPTION: This function is API fuunction for getting tha AC status .
  2410. INPUT: hQosMngr - Qos Manager handle.
  2411. pAcStatusParams
  2412. OUTPUT:
  2413. RETURN: OK on success, NOK otherwise
  2414. ************************************************************************/
  2415. static TI_STATUS qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr, OS_802_11_AC_UPSD_STATUS_PARAMS *pAcStatusParams)
  2416. {
  2417. qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
  2418. /* check AC validity */
  2419. if( pAcStatusParams->uAC > MAX_NUM_OF_AC )
  2420. {
  2421. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2422. ("qosMngr_getCurrAcStatus: acID > 3 -> Ignore !!!"));
  2423. return NOK;
  2424. }
  2425. /* check if sta is connected to AP */
  2426. if(pQosMngr->isConnected == FALSE)
  2427. {
  2428. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2429. ("qosMngr_getCurrAcStatus: pQosMngr->connected == FALSE -> Ignore !!!"));
  2430. return NOT_CONNECTED;
  2431. }
  2432. /* check if AP support WME */
  2433. if(pQosMngr->activeProtocol != WME)
  2434. {
  2435. WLAN_REPORT_ERROR(pQosMngr->hReport, QOS_MANAGER_MODULE_LOG,
  2436. ("qosMngr_getCurrAcStatus: activeProtocol != WME -> Ignore !!!"));
  2437. return NO_QOS_AP;
  2438. }
  2439. pAcStatusParams->uCurrentUAPSDStatus = pQosMngr->acParams[pAcStatusParams->uAC].currentWmeAcPsMode;
  2440. pAcStatusParams->pCurrentAdmissionStatus = pQosMngr->resourceMgmtTable.currentTspecInfo[pAcStatusParams->uAC].trafficAdmState;
  2441. return OK;
  2442. }
  2443. /************************************************************************
  2444. * setNonQosAdmissionState *
  2445. ************************************************************************
  2446. DESCRIPTION: This function resets the admission state variables as required
  2447. for non-QoS mode and configures the Tx module.
  2448. INPUT: pQosMngr - Qos Manager pointer.
  2449. acId - the AC to update.
  2450. OUTPUT:
  2451. RETURN:
  2452. ************************************************************************/
  2453. static void setNonQosAdmissionState(qosMngr_t *pQosMngr, UINT8 acID)
  2454. {
  2455. paramInfo_t param;
  2456. if(acID == QOS_AC_BE)
  2457. {
  2458. pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_NOT_REQUIRED;
  2459. param.content.txDataQosParams.qosParams.admissionRequired = ADMISSION_NOT_REQUIRED;
  2460. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
  2461. param.content.txDataQosParams.qosParams.admissionState = AC_ADMITTED;
  2462. }
  2463. else
  2464. {
  2465. pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_REQUIRED;
  2466. param.content.txDataQosParams.qosParams.admissionRequired = ADMISSION_REQUIRED;
  2467. pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
  2468. param.content.txDataQosParams.qosParams.admissionState = AC_NOT_ADMITTED;
  2469. }
  2470. param.content.txDataQosParams.acID = acID;
  2471. param.paramType = TX_DATA_AC_ADMISSION_STATE;
  2472. txData_setParam(pQosMngr->hTxData,&param);
  2473. }
  2474. static void qosMngr_storeTspecCandidateParams (tspecInfo_t *pCandidateParams, OS_802_11_QOS_TSPEC_PARAMS *pTSPECParams, UINT8 ac)
  2475. {
  2476. pCandidateParams->AC = (acTrfcType_e)ac;
  2477. pCandidateParams->tid = (UINT8)pTSPECParams->uUserPriority;
  2478. pCandidateParams->userPriority = (UINT8)pTSPECParams->uUserPriority;
  2479. pCandidateParams->meanDataRate = pTSPECParams->uMeanDataRate;
  2480. pCandidateParams->nominalMsduSize = (UINT16)pTSPECParams->uNominalMSDUsize;
  2481. pCandidateParams->UPSDFlag = (BOOL)pTSPECParams->uAPSDFlag;
  2482. pCandidateParams->surplausBwAllowance = (UINT16)pTSPECParams->uSurplusBandwidthAllowance;
  2483. pCandidateParams->minimumPHYRate = pTSPECParams->uMinimumPHYRate;
  2484. pCandidateParams->streamDirection = BI_DIRECTIONAL;
  2485. pCandidateParams->mediumTime = 0;
  2486. }