PageRenderTime 48ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://bitbucket.org/cyanogenmod/cm-kernel
C | 1458 lines | 732 code | 299 blank | 427 comment | 55 complexity | 2e3c0a0e7de7b56a9df335f2778b5f4d MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  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. /***************************************************************************/
  36. /* */
  37. /* MODULE: admCtrlQos.c */
  38. /* PURPOSE: WSM/WME admission Control */
  39. /* */
  40. /***************************************************************************/
  41. #include "osApi.h"
  42. #include "paramOut.h"
  43. #include "utils.h"
  44. #include "fsm.h"
  45. #include "report.h"
  46. #include "DataCtrl_Api.h"
  47. #include "trafficAdmControl.h"
  48. #include "qosMngr_API.h"
  49. #include "TNETW_Driver_types.h"
  50. #ifdef EXC_MODULE_INCLUDED
  51. #include "excMngr.h"
  52. #endif
  53. /* Constants */
  54. /** number of states in the state machine */
  55. #define TRAFFIC_ADM_CTRL_SM_NUM_STATES 2
  56. /** number of events in the state machine */
  57. #define TRAFFIC_ADM_CTRL_SM_NUM_EVENTS 5
  58. extern int WMEQosTagToACTable[MAX_NUM_OF_802_1d_TAGS];
  59. PACKED_STRUCT( dot11_local_WME_TSPEC_IE_t,
  60. UINT16 nominalMSDUSize;
  61. UINT16 maximumMSDUSize;
  62. UINT32 minimumServiceInterval;
  63. UINT32 maximumServiceInterval;
  64. UINT32 inactivityInterval;
  65. UINT32 suspensionInterval;
  66. UINT32 serviceStartTime;
  67. UINT32 minimumDataRate;
  68. UINT32 meanDataRate;
  69. UINT32 peakDataRate;
  70. UINT32 maximumBurstSize;
  71. UINT32 delayBound;
  72. UINT32 minimumPHYRate;
  73. UINT16 surplusBandwidthAllowance;
  74. UINT16 mediumTime;
  75. );
  76. typedef struct
  77. {
  78. TI_HANDLE hTrafficAdmCtrl;
  79. tspecInfo_t *pTSpecInfo;
  80. UINT8 acID;
  81. }fsmTSpecInfo_t;
  82. /* Timer functions */
  83. void trafficAdmCtrl_timeoutAcBE(TI_HANDLE hTrafficAdmCtrl);
  84. void trafficAdmCtrl_timeoutAcBK(TI_HANDLE hTrafficAdmCtrl);
  85. void trafficAdmCtrl_timeoutAcVI(TI_HANDLE hTrafficAdmCtrl);
  86. void trafficAdmCtrl_timeoutAcVO(TI_HANDLE hTrafficAdmCtrl);
  87. /* SM Functions */
  88. TI_STATUS trafficAdmCtrl_smEvent(trafficAdmCtrl_t *pAdmCtrlQos, UINT8 event, void *pData);
  89. TI_STATUS trafficAdmCtrl_smActionUnexpectedTspecResponse(fsmTSpecInfo_t *fsmTSpecInfo); /*unxcepted*/
  90. TI_STATUS trafficAdmCtrl_smActionUnexpected(fsmTSpecInfo_t *fsmTSpecInfo); /*unxcepted*/
  91. TI_STATUS trafficAdmCtrl_smActionNop(fsmTSpecInfo_t *fsmTSpecInfo); /*NOP*/
  92. TI_STATUS trafficAdmCtrl_smStart(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_START*/
  93. TI_STATUS trafficAdmCtrl_smWaitStop(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_STOP*/
  94. TI_STATUS trafficAdmCtrl_smWaitAccept(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_ACCEPT*/
  95. TI_STATUS trafficAdmCtrl_smWaitReject(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_REJECT*/
  96. TI_STATUS trafficAdmCtrl_smWaitTimeout(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_TIMEOUT*/
  97. TI_STATUS trafficAdmCtrl_sendAdmissionReq(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo);
  98. TI_STATUS trafficAdmCtrl_startTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID);
  99. TI_STATUS trafficAdmCtrl_stopTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID);
  100. TI_STATUS trafficAdmCtrl_buildFrameHeader(trafficAdmCtrl_t *hprafficAdmCtrl, mem_MSDU_T *pMsdu);
  101. static TI_STATUS trafficAdmCtrl_tokenToAc (TI_HANDLE hTrafficAdmCtrl, UINT8 token, UINT8 *acID);
  102. /********************************************************************************
  103. * trafficAdmCtrl_create *
  104. ********************************************************************************
  105. DESCRIPTION: trafficAdmCtrl module creation function
  106. INPUT: hOs - Handle to OS
  107. OUTPUT:
  108. RETURN: Handle to the trafficAdmCtrl module on success, NULL otherwise
  109. ************************************************************************/
  110. TI_HANDLE trafficAdmCtrl_create(TI_HANDLE hOs)
  111. {
  112. trafficAdmCtrl_t *pTrafficAdmCtrl;
  113. TI_STATUS status;
  114. /* allocate admission control context memory */
  115. pTrafficAdmCtrl = (trafficAdmCtrl_t*)os_memoryAlloc(hOs, sizeof(trafficAdmCtrl_t));
  116. if (pTrafficAdmCtrl == NULL)
  117. {
  118. return NULL;
  119. }
  120. os_memoryZero(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  121. pTrafficAdmCtrl->hOs = hOs;
  122. /* allocate memory for admCtrlQos state machine */
  123. status = fsm_Create(hOs, &pTrafficAdmCtrl->pTrafficAdmCtrlSm, TRAFFIC_ADM_CTRL_SM_NUM_STATES, TRAFFIC_ADM_CTRL_SM_NUM_EVENTS);
  124. if (status != OK)
  125. {
  126. os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  127. return NULL;
  128. }
  129. /* allocate OS timer AC BE */
  130. pTrafficAdmCtrl->timer[QOS_AC_BE] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcBE, pTrafficAdmCtrl);
  131. if (pTrafficAdmCtrl->timer[QOS_AC_BE] == NULL)
  132. {
  133. fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm);
  134. os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  135. return NULL;
  136. }
  137. /* allocate OS timer AC BK */
  138. pTrafficAdmCtrl->timer[QOS_AC_BK] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcBK, pTrafficAdmCtrl);
  139. if (pTrafficAdmCtrl->timer[QOS_AC_BK] == NULL)
  140. {
  141. fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm);
  142. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]);
  143. os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  144. return NULL;
  145. }
  146. /* allocate OS timer AC VI */
  147. pTrafficAdmCtrl->timer[QOS_AC_VI] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcVI, pTrafficAdmCtrl);
  148. if (pTrafficAdmCtrl->timer[QOS_AC_VI] == NULL)
  149. {
  150. fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm);
  151. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]);
  152. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BK]);
  153. os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  154. return NULL;
  155. }
  156. /* allocate OS timer AC VO */
  157. pTrafficAdmCtrl->timer[QOS_AC_VO] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcVO, pTrafficAdmCtrl);
  158. if (pTrafficAdmCtrl->timer[QOS_AC_VO] == NULL)
  159. {
  160. fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm);
  161. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]);
  162. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BK]);
  163. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_VI]);
  164. os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  165. return NULL;
  166. }
  167. return pTrafficAdmCtrl;
  168. }
  169. /************************************************************************
  170. * trafficAdmCtrl_unload *
  171. ************************************************************************
  172. DESCRIPTION: trafficAdmCtrl module destroy function,
  173. - Free all memory alocated by the module
  174. INPUT: hTrafficAdmCtrl - trafficAdmCtrl handle.
  175. OUTPUT:
  176. RETURN: OK on success, NOK otherwise
  177. ************************************************************************/
  178. TI_STATUS trafficAdmCtrl_unload(TI_HANDLE hTrafficAdmCtrl)
  179. {
  180. TI_STATUS status;
  181. trafficAdmCtrl_t *pTrafficAdmCtrl;
  182. pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  183. status = fsm_Unload(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm);
  184. if (status != OK)
  185. {
  186. /* report failure but don't stop... */
  187. WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  188. ("ADM_CTRL_SM: Error releasing FSM memory \n"));
  189. }
  190. /* free timers */
  191. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]);
  192. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BK]);
  193. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_VI]);
  194. os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_VO]);
  195. os_memoryFree(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
  196. return OK;
  197. }
  198. /************************************************************************
  199. * trafficAdmCtrl_config *
  200. ************************************************************************
  201. DESCRIPTION: trafficAdmCtrl module configuration function,
  202. performs the following:
  203. - Reset & initiailzes local variables
  204. - Init the handles to be used by the module
  205. INPUT: hTrafficAdmCtrl - trafficAdmCtrl handle.
  206. List of handles to be used by the module
  207. pTrafficAdmCtrlInitParams - init parameters.
  208. OUTPUT:
  209. RETURN: OK on success, NOK otherwise
  210. ************************************************************************/
  211. TI_STATUS trafficAdmCtrl_config(TI_HANDLE hTrafficAdmCtrl,
  212. TI_HANDLE hTxData,
  213. TI_HANDLE hReport,
  214. TI_HANDLE hOs,
  215. TI_HANDLE hQosMngr,
  216. TI_HANDLE hCtrlData,
  217. TI_HANDLE hMemMgr,
  218. TI_HANDLE hExcMgr,
  219. trafficAdmCtrlInitParams_t *pTrafficAdmCtrlInitParams)
  220. {
  221. trafficAdmCtrl_t *pTrafficAdmCtrl;
  222. TI_STATUS status;
  223. UINT8 idx;
  224. fsm_actionCell_t trafficAdmCtrl_smMatrix[TRAFFIC_ADM_CTRL_SM_NUM_STATES][TRAFFIC_ADM_CTRL_SM_NUM_EVENTS] =
  225. {
  226. /* next state and actions for IDLE state */
  227. {{TRAFFIC_ADM_CTRL_SM_STATE_WAIT, (fsm_Action_t)trafficAdmCtrl_smStart}, /*EVENT_START*/
  228. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionNop}, /*EVENT_STOP*/
  229. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpectedTspecResponse}, /*EVENT_ACCEPT*/
  230. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpectedTspecResponse}, /*EVENT_REJECT*/
  231. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpected}, /*EVENT_TIMEOUT*/
  232. },
  233. /* next state and actions for WAIT state */
  234. {{TRAFFIC_ADM_CTRL_SM_STATE_WAIT, (fsm_Action_t)trafficAdmCtrl_smActionUnexpected}, /*EVENT_START*/
  235. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitStop}, /*EVENT_STOP*/
  236. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitAccept}, /*EVENT_ACCEPT*/
  237. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitReject}, /*EVENT_REJECT*/
  238. {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitTimeout}, /*EVENT_TIMEOUT*/
  239. },
  240. };
  241. pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  242. pTrafficAdmCtrl->hTxData = hTxData;
  243. pTrafficAdmCtrl->hReport = hReport;
  244. pTrafficAdmCtrl->hOs = hOs;
  245. pTrafficAdmCtrl->hQosMngr = hQosMngr;
  246. pTrafficAdmCtrl->hCtrlData = hCtrlData;
  247. pTrafficAdmCtrl->hMemMgr = hMemMgr;
  248. pTrafficAdmCtrl->hExcMgr = hExcMgr;
  249. /* configure state machine */
  250. status = fsm_Config(pTrafficAdmCtrl->pTrafficAdmCtrlSm, &trafficAdmCtrl_smMatrix[0][0],
  251. TRAFFIC_ADM_CTRL_SM_NUM_STATES, TRAFFIC_ADM_CTRL_SM_NUM_EVENTS, NULL, hOs);
  252. if (status != OK)
  253. {
  254. WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  255. ("TRAFFIC_ADM_CTRL_SM: fsm_Config - Error \n"));
  256. return NOK;
  257. }
  258. pTrafficAdmCtrl->timeout = pTrafficAdmCtrlInitParams->trafficAdmCtrlResponseTimeout;
  259. pTrafficAdmCtrl->useFixedMsduSize = pTrafficAdmCtrlInitParams->trafficAdmCtrlUseFixedMsduSize;
  260. pTrafficAdmCtrl->dialogTokenCounter = INITIAL_DIALOG_TOKEN;
  261. for (idx=0; idx<MAX_NUM_OF_AC; idx++)
  262. pTrafficAdmCtrl->dialogToken[idx] = 0;
  263. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  264. ("TRAFFIC ADM CTRL - configuration completed ..... \n"));
  265. return OK;
  266. }
  267. /************************************************************************
  268. * FOR SM PRINTINGS *
  269. ************************************************************************/
  270. #ifdef REPORT_LOG
  271. static char *admCtrlQosSMStateDesc[TRAFFIC_ADM_CTRL_SM_NUM_STATES] = {
  272. "TRAFFIC_ADM_CTRL_STATE_IDLE",
  273. "TRAFFIC_ADM_CTRL_STATE_WAIT",
  274. };
  275. /* State machine inputs */
  276. static char *admCtrlQosSMEventDesc[TRAFFIC_ADM_CTRL_SM_NUM_EVENTS] = {
  277. "TRAFFIC_ADM_CTRL_EVENT_START",
  278. "TRAFFIC_ADM_CTRL_EVENT_STOP",
  279. "TRAFFIC_ADM_CTRL_EVENT_ACCEPT",
  280. "TRAFFIC_ADM_CTRL_EVENT_REJECT",
  281. "TRAFFIC_ADM_CTRL_EVENT_TIMEOUT",
  282. };
  283. #endif
  284. /************************************************************************
  285. * trafficAdmCtrl_smEvent *
  286. ************************************************************************
  287. DESCRIPTION: trafficAdmCtrl SM general function
  288. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  289. event - the event to the SM.
  290. pData - handle to passing parameter
  291. OUTPUT:
  292. RETURN: OK on success, NOK otherwise
  293. ************************************************************************/
  294. TI_STATUS trafficAdmCtrl_smEvent(trafficAdmCtrl_t *pTrafficAdmCtrl, UINT8 event, void *pData)
  295. {
  296. TI_STATUS status;
  297. UINT8 nextState;
  298. fsmTSpecInfo_t *fsmTSpecInfo = (fsmTSpecInfo_t*)pData;
  299. UINT8 acID = fsmTSpecInfo->acID;
  300. status = fsm_GetNextState(pTrafficAdmCtrl->pTrafficAdmCtrlSm, pTrafficAdmCtrl->currentState[acID], event, &nextState);
  301. if (status != OK)
  302. {
  303. WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  304. ("ADM_CTRL: ERROR - failed getting next state \n"));
  305. return(NOK);
  306. }
  307. WLAN_REPORT_SM(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  308. ("ADM_CTRL acID = %d: <%s, %s> --> %s\n",acID,
  309. admCtrlQosSMStateDesc[pTrafficAdmCtrl->currentState[acID] ],
  310. admCtrlQosSMEventDesc[event],
  311. admCtrlQosSMStateDesc[nextState]));
  312. status = fsm_Event(pTrafficAdmCtrl->pTrafficAdmCtrlSm, &pTrafficAdmCtrl->currentState[acID], event, pData);
  313. return(status);
  314. }
  315. /************************************************************************
  316. * state machine functions *
  317. ************************************************************************/
  318. /************************************************************************
  319. * trafficAdmCtrl_smStart *
  320. ************************************************************************
  321. DESCRIPTION: the action function when event start ocuured on idle state
  322. performs the following:
  323. - send admision requestReset
  324. - start timer for the response.
  325. INPUT: fsmTSpecInfo - parameters for the request
  326. OUTPUT:
  327. RETURN: OK on success, NOK otherwise
  328. ************************************************************************/
  329. TI_STATUS trafficAdmCtrl_smStart(fsmTSpecInfo_t *fsmTSpecInfo)
  330. {
  331. TI_STATUS status;
  332. trafficAdmCtrl_t *pTrafficAdmCtrl;
  333. tspecInfo_t *pTSpecInfo;
  334. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  335. pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
  336. /* send adm request frame */
  337. status = trafficAdmCtrl_sendAdmissionReq(pTrafficAdmCtrl, pTSpecInfo);
  338. if(status != OK)
  339. return status;
  340. /* init timer */
  341. trafficAdmCtrl_startTimer(pTrafficAdmCtrl, pTSpecInfo->AC);
  342. return OK;
  343. }
  344. /************************************************************************
  345. * trafficAdmCtrl_smWaitStop *
  346. ************************************************************************
  347. DESCRIPTION: the action function when event stop ocuured on wait state
  348. performs the following:
  349. - stop timer.
  350. INPUT: fsmTSpecInfo - parameters of the request
  351. OUTPUT:
  352. RETURN: OK on success, NOK otherwise
  353. ************************************************************************/
  354. TI_STATUS trafficAdmCtrl_smWaitStop(fsmTSpecInfo_t *fsmTSpecInfo)
  355. {
  356. trafficAdmCtrl_t *pTrafficAdmCtrl;
  357. tspecInfo_t *pTSpecInfo;
  358. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  359. pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
  360. /* stop timer */
  361. trafficAdmCtrl_stopTimer(pTrafficAdmCtrl,fsmTSpecInfo->pTSpecInfo->AC);
  362. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  363. ("TRAFFIC ADM CTRL - AC = %d, Stoped ..... \n", pTSpecInfo->AC));
  364. return OK;
  365. }
  366. /************************************************************************
  367. * trafficAdmCtrl_smWaitAccept *
  368. ************************************************************************
  369. DESCRIPTION: the action function when event accept ocuured on wait state
  370. performs the following:
  371. - update the Qos Mngr of the status and the parameters
  372. INPUT: fsmTSpecInfo - parameters of the response
  373. OUTPUT:
  374. RETURN: OK on success, NOK otherwise
  375. ************************************************************************/
  376. TI_STATUS trafficAdmCtrl_smWaitAccept(fsmTSpecInfo_t *fsmTSpecInfo)
  377. {
  378. trafficAdmCtrl_t *pTrafficAdmCtrl;
  379. tspecInfo_t *pTSpecInfo;
  380. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  381. pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
  382. /* update the QosMngr */
  383. qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, pTSpecInfo->AC, pTSpecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
  384. return OK;
  385. }
  386. /************************************************************************
  387. * trafficAdmCtrl_smWaitReject *
  388. ************************************************************************
  389. DESCRIPTION: the action function when event reject ocuured on wait state
  390. performs the following:
  391. - update the Qos Mngr of the status and the parameters
  392. INPUT: fsmTSpecInfo - parameters of the response
  393. OUTPUT:
  394. RETURN: OK on success, NOK otherwise
  395. ************************************************************************/
  396. TI_STATUS trafficAdmCtrl_smWaitReject(fsmTSpecInfo_t *fsmTSpecInfo)
  397. {
  398. trafficAdmCtrl_t *pTrafficAdmCtrl;
  399. tspecInfo_t *pTSpecInfo;
  400. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  401. pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
  402. /* update the QosMngr */
  403. qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, pTSpecInfo->AC, pTSpecInfo, STATUS_TRAFFIC_ADM_REQUEST_REJECT);
  404. return OK;
  405. }
  406. /************************************************************************
  407. * trafficAdmCtrl_smWaitTimeout *
  408. ************************************************************************
  409. DESCRIPTION: the action function when event timeout ocuured on wait state
  410. performs the following:
  411. - update the Qos Mngr of the status and the parameters
  412. INPUT: fsmTSpecInfo - parameters of the request
  413. OUTPUT:
  414. RETURN: OK on success, NOK otherwise
  415. ************************************************************************/
  416. TI_STATUS trafficAdmCtrl_smWaitTimeout(fsmTSpecInfo_t *fsmTSpecInfo)
  417. {
  418. trafficAdmCtrl_t *pTrafficAdmCtrl;
  419. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  420. /* update the QosMngr */
  421. qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, fsmTSpecInfo->acID, NULL, STATUS_TRAFFIC_ADM_REQUEST_TIMEOUT);
  422. return OK;
  423. }
  424. /************************************************************************
  425. * trafficAdmCtrl_smActionUnexpected *
  426. ************************************************************************
  427. DESCRIPTION:
  428. INPUT: fsmTSpecInfo - tspec parameters
  429. OUTPUT:
  430. RETURN: OK on success, NOK otherwise
  431. ************************************************************************/
  432. TI_STATUS trafficAdmCtrl_smActionUnexpected(fsmTSpecInfo_t *fsmTSpecInfo)
  433. {
  434. trafficAdmCtrl_t *pTrafficAdmCtrl;
  435. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  436. WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  437. ("TRAFFIC ADM CTRL - AC = %d, ActionUnexpected ..... \n", fsmTSpecInfo->acID));
  438. return OK;
  439. }
  440. /************************************************************************
  441. * trafficAdmCtrl_smActionUnexpectedTspecResponse *
  442. ************************************************************************
  443. DESCRIPTION:
  444. INPUT: fsmTSpecInfo - tspec parameters
  445. OUTPUT:
  446. RETURN: OK on success, NOK otherwise
  447. ************************************************************************/
  448. TI_STATUS trafficAdmCtrl_smActionUnexpectedTspecResponse(fsmTSpecInfo_t *fsmTSpecInfo)
  449. {
  450. trafficAdmCtrl_t *pTrafficAdmCtrl;
  451. tspecInfo_t *pTSpecInfo;
  452. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  453. pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
  454. /* Send event to user application - how come TSPEC response arrives without request ? */
  455. qosMngr_sendUnexpectedTSPECResponseEvent (pTrafficAdmCtrl->hQosMngr,pTSpecInfo);
  456. WLAN_REPORT_WARNING(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  457. ("TRAFFIC ADM CTRL - AC = %d, ActionUnexpected ..... \n", fsmTSpecInfo->acID));
  458. return OK;
  459. }
  460. /************************************************************************
  461. * trafficAdmCtrl_smActionNop *
  462. ************************************************************************
  463. DESCRIPTION:
  464. INPUT: fsmTSpecInfo - tspec parameters
  465. OUTPUT:
  466. RETURN: OK on success, NOK otherwise
  467. ************************************************************************/
  468. TI_STATUS trafficAdmCtrl_smActionNop(fsmTSpecInfo_t *fsmTSpecInfo)
  469. {
  470. trafficAdmCtrl_t *pTrafficAdmCtrl;
  471. tspecInfo_t *pTSpecInfo;
  472. pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
  473. pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
  474. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  475. ("TRAFFIC ADM CTRL - AC = %d, Action NOP..... \n", pTSpecInfo->AC));
  476. return OK;
  477. }
  478. /************************************************************************
  479. * API FUNCTIONS *
  480. ************************************************************************
  481. ************************************************************************/
  482. /************************************************************************
  483. * trafficAdmCtrl_startAdmRequest *
  484. ************************************************************************
  485. DESCRIPTION: start TSPEC signaling
  486. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  487. pTSpecInfo - the TSPEC parameters
  488. OUTPUT:
  489. RETURN: OK on success, NOK otherwise
  490. ************************************************************************/
  491. TI_STATUS trafficAdmCtrl_startAdmRequest(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo)
  492. {
  493. TI_STATUS status;
  494. fsmTSpecInfo_t fsmTSpecInfo;
  495. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  496. if (pTrafficAdmCtrl == NULL)
  497. return NOK;
  498. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  499. fsmTSpecInfo.pTSpecInfo = pTSpecInfo;
  500. fsmTSpecInfo.acID = pTSpecInfo->AC;
  501. /* send event START to SM */
  502. status = trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_START, &fsmTSpecInfo);
  503. return status;
  504. }
  505. /************************************************************************
  506. * trafficAdmCtrl_stopAdmRequest *
  507. ************************************************************************
  508. DESCRIPTION: stop specific tspec signaling
  509. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  510. acID - the AC of the tspec to stop
  511. OUTPUT:
  512. RETURN: OK on success, NOK otherwise
  513. ************************************************************************/
  514. TI_STATUS trafficAdmCtrl_stopAdmRequest(TI_HANDLE hTrafficAdmCtrl, UINT8 acID)
  515. {
  516. TI_STATUS status;
  517. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  518. tspecInfo_t pTSpecInfo;
  519. fsmTSpecInfo_t fsmTSpecInfo;
  520. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  521. fsmTSpecInfo.pTSpecInfo = &pTSpecInfo;
  522. fsmTSpecInfo.pTSpecInfo->AC = (acTrfcType_e)acID;
  523. fsmTSpecInfo.acID = acID;
  524. /* send event STOP to SM */
  525. status = trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_STOP, &fsmTSpecInfo);
  526. return status;
  527. }
  528. /************************************************************************
  529. * trafficAdmCtrl_stop *
  530. ************************************************************************
  531. DESCRIPTION: stop all tspecs and reset SM
  532. called on disconnect
  533. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  534. OUTPUT:
  535. RETURN: OK on success, NOK otherwise
  536. ************************************************************************/
  537. TI_STATUS trafficAdmCtrl_stop(TI_HANDLE hTrafficAdmCtrl)
  538. {
  539. UINT8 acID;
  540. UINT8 idx;
  541. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  542. tspecInfo_t pTSpecInfo;
  543. fsmTSpecInfo_t fsmTSpecInfo;
  544. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  545. fsmTSpecInfo.pTSpecInfo = &pTSpecInfo;
  546. /* clean all AC SM */
  547. for (acID = 0 ; acID < MAX_NUM_OF_AC ; acID++)
  548. {
  549. fsmTSpecInfo.pTSpecInfo->AC = (acTrfcType_e)acID;
  550. fsmTSpecInfo.acID = acID;
  551. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_STOP, &fsmTSpecInfo);
  552. }
  553. pTrafficAdmCtrl->dialogTokenCounter = INITIAL_DIALOG_TOKEN;
  554. for (idx=0; idx<MAX_NUM_OF_AC; idx++)
  555. pTrafficAdmCtrl->dialogToken[idx] = 0;
  556. return OK;
  557. }
  558. /************************************************************************
  559. * trafficAdmCtrl_recv *
  560. ************************************************************************
  561. DESCRIPTION:
  562. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  563. OUTPUT:
  564. RETURN: OK on success, NOK otherwise
  565. ************************************************************************/
  566. TI_STATUS trafficAdmCtrl_recv(TI_HANDLE hTrafficAdmCtrl, UINT8* pData, UINT8 action)
  567. {
  568. TI_STATUS status = OK;
  569. UINT8 statusCode;
  570. UINT8 dialogToken;
  571. UINT8 tacID;
  572. tspecInfo_t tspecInfo;
  573. fsmTSpecInfo_t fsmTSpecInfo;
  574. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  575. if (action == ADDTS_RESPONSE_ACTION)
  576. {
  577. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  578. ("action = 1 - ADDTS RESPONSE ACTION........!! \n"));
  579. /* parsing the dialog token */
  580. dialogToken = *pData;
  581. pData++;
  582. /* in WME status code is 1 byte, in WSM is 2 bytes */
  583. statusCode = *pData;
  584. pData++;
  585. tspecInfo.statusCode = statusCode;
  586. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  587. ("dialogToken = %d , statusCode = %d \n",dialogToken, statusCode));
  588. trafficAdmCtrl_parseTspecIE(pTrafficAdmCtrl, &tspecInfo, (dot11_WME_TSPEC_IE_t *)pData);
  589. if (trafficAdmCtrl_tokenToAc (pTrafficAdmCtrl, dialogToken, &tacID) == NOK)
  590. {
  591. WLAN_REPORT_WARNING(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  592. ("dialog token Not found, dialogToken = %d , \n",dialogToken));
  593. qosMngr_sendUnexpectedTSPECResponseEvent(pTrafficAdmCtrl->hQosMngr, &tspecInfo);
  594. return NOK;
  595. }
  596. /* validate dialog token matching */
  597. if(pTrafficAdmCtrl->dialogToken[tspecInfo.AC] != dialogToken)
  598. {
  599. WLAN_REPORT_WARNING(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  600. ("dialog token mismatch, dialogToken = %d , acID = %d \n",dialogToken, tspecInfo.AC));
  601. qosMngr_sendUnexpectedTSPECResponseEvent(pTrafficAdmCtrl->hQosMngr, &tspecInfo);
  602. return NOK;
  603. }
  604. /* Stop the relevant Timer */
  605. trafficAdmCtrl_stopTimer(pTrafficAdmCtrl, tspecInfo.AC);
  606. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  607. fsmTSpecInfo.pTSpecInfo = &tspecInfo;
  608. fsmTSpecInfo.acID = tspecInfo.AC;
  609. if(statusCode != ADDTS_STATUS_CODE_SUCCESS)
  610. {
  611. /* admission reject */
  612. /********************/
  613. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  614. ("***** admCtrlQos_recv: admission reject [ statusCode = %d ]\n",statusCode));
  615. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  616. ("ADDTS Response (reject) userPriority = %d , \n", tspecInfo.userPriority));
  617. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_REJECT, &fsmTSpecInfo);
  618. }
  619. else
  620. {
  621. /* admission accept */
  622. /********************/
  623. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  624. ("***** admCtrlQos_recv: admission accept [ statusCode = %d ]\n",statusCode));
  625. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  626. ("ADDTS Response (accepted) userPriority = %d , \n", tspecInfo.userPriority));
  627. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  628. ("mediumTime = %d , surplusBandwidthAllowance = %d \n", ((dot11_WME_TSPEC_IE_t*)pData)->mediumTime, ((dot11_WME_TSPEC_IE_t*)pData)->surplusBandwidthAllowance));
  629. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_ACCEPT, &fsmTSpecInfo);
  630. }
  631. }
  632. else
  633. {
  634. status = NOK;
  635. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  636. ("trafficAdmCtrl_recv: unknown action code = %d , \n",action));
  637. }
  638. return status;
  639. }
  640. /************************************************************************
  641. * trafficAdmCtrl_recv *
  642. ************************************************************************
  643. DESCRIPTION:
  644. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  645. OUTPUT:
  646. RETURN: OK on success, NOK otherwise
  647. ************************************************************************/
  648. TI_STATUS trafficAdmCtrl_sendDeltsFrame(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo, UINT8 reasonCode)
  649. {
  650. TI_STATUS status = OK;
  651. mem_MSDU_T *pMsdu;
  652. char *pDataBuf;
  653. UINT32 totalLen = 0;
  654. tsInfo_t tsInfo;
  655. UINT32 tspecLen;
  656. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  657. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  658. ("admCtrlQos_sendDeltsFrame: Enter....!! \n"));
  659. /* GET NEW MSDU !!! */
  660. status = wlan_memMngrAllocMSDU(pTrafficAdmCtrl->hMemMgr, &pMsdu, 2000 +TX_TOTAL_OFFSET_BEFORE_DATA, ADM_CTRL_QOS_MODULE);
  661. if (status != OK)
  662. {
  663. return NOK;
  664. }
  665. /*
  666. * Set data offset before header builder, because it assumes it's already set
  667. */
  668. memMgr_BufOffset(pMsdu->firstBDPtr) = TX_TOTAL_OFFSET_BEFORE_DATA;
  669. status = trafficAdmCtrl_buildFrameHeader(pTrafficAdmCtrl, pMsdu);
  670. if (status != OK)
  671. {
  672. wlan_memMngrFreeMSDU(pTrafficAdmCtrl->hMemMgr, pMsdu->handle);
  673. return NOK;
  674. }
  675. pDataBuf = (memMgr_BufData(pMsdu->firstBDPtr) + memMgr_BufOffset(pMsdu->firstBDPtr) + WLAN_HDR_LEN );
  676. *pDataBuf = WME_CATAGORY_QOS; /* CATEGORY_QOS in WME = 17*/
  677. pDataBuf++ ;
  678. totalLen++;
  679. *pDataBuf = DELTS_ACTION; /* DELTS ACTION */
  680. pDataBuf++ ;
  681. totalLen++;
  682. /* according to WMM Specification v1.1, section 2.2.10, dialog token = 0 in DELTS */
  683. *pDataBuf = 0; /* DIALOG_TOKEN */
  684. pDataBuf++ ;
  685. totalLen++;
  686. /* according to WMM Specification v1.1, section 2.2.10, status = 0 in DELTS */
  687. *pDataBuf = 0; /* STATUS CODE = REASON CODE */
  688. pDataBuf++ ;
  689. totalLen++;
  690. /*
  691. * WMM specification v1.1 specifie that DELTS must include at least
  692. * a full TSPEC IE. The format used by TI is following 802.11e format
  693. * which does not include TSPEC IE but only TS info field
  694. */
  695. trafficAdmCtrl_buildTSPec(pTrafficAdmCtrl, pTSpecInfo, pDataBuf, &tspecLen);
  696. totalLen += tspecLen;
  697. tsInfo.tsInfoArr[0] = 0;
  698. tsInfo.tsInfoArr[1] = 0;
  699. tsInfo.tsInfoArr[2] = 0;
  700. /* Build tsInfo */
  701. tsInfo.tsInfoArr[0] |= ( (pTSpecInfo->userPriority) << TSID_SHIFT);
  702. tsInfo.tsInfoArr[0] |= (BI_DIRECTIONAL << DIRECTION_SHIFT); /* bidirectional */
  703. tsInfo.tsInfoArr[0] |= (TS_INFO_0_ACCESS_POLICY_EDCA << ACCESS_POLICY_SHIFT); /* EDCA */
  704. tsInfo.tsInfoArr[1] |= (0 << AGGREGATION_SHIFT);
  705. tsInfo.tsInfoArr[1] |= (pTSpecInfo->UPSDFlag << APSD_SHIFT);
  706. tsInfo.tsInfoArr[1] |= (pTSpecInfo->userPriority << USER_PRIORITY_SHIFT);
  707. tsInfo.tsInfoArr[1] |= (NORMAL_ACKNOWLEDGEMENT << TSINFO_ACK_POLICY_SHIFT);
  708. tsInfo.tsInfoArr[2] |= (NO_SCHEDULE << SCHEDULE_SHIFT);
  709. #if 0 /* Need to send TSPEC IE in DELTS or only the tsinfo*/
  710. /* only tsinfo*/
  711. *pDataBuf = tsInfo.tsInfoArr[0];
  712. pDataBuf++;
  713. totalLen++;
  714. *pDataBuf = tsInfo.tsInfoArr[1];
  715. pDataBuf++;
  716. totalLen++;
  717. *pDataBuf = tsInfo.tsInfoArr[2];
  718. pDataBuf++;
  719. totalLen++;
  720. #else
  721. /* send TSpec IE in DELTS*/
  722. {
  723. dot11_WME_TSPEC_IE_t* dot11_WME_TSPEC_IE = (dot11_WME_TSPEC_IE_t*)pDataBuf;
  724. dot11_WME_TSPEC_IE->tHdr.hdr.eleId = WME_TSPEC_IE_ID;
  725. dot11_WME_TSPEC_IE->tHdr.hdr.eleLen = WME_TSPEC_IE_TSINFO_LEN;
  726. dot11_WME_TSPEC_IE->tHdr.OUI[0] = 0x00;
  727. dot11_WME_TSPEC_IE->tHdr.OUI[1] = 0x50;
  728. dot11_WME_TSPEC_IE->tHdr.OUI[2] = 0xf2;
  729. dot11_WME_TSPEC_IE->tHdr.oui_type = WME_TSPEC_IE_OUI_TYPE;
  730. dot11_WME_TSPEC_IE->tHdr.oui_subtype = WME_TSPEC_IE_OUI_SUB_TYPE;
  731. dot11_WME_TSPEC_IE->tHdr.version = WME_TSPEC_IE_VERSION;
  732. dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0] = tsInfo.tsInfoArr[0];
  733. dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1] = tsInfo.tsInfoArr[1];
  734. dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2] = tsInfo.tsInfoArr[2];
  735. totalLen+=sizeof(dot11_WME_TSPEC_IE_hdr_t);
  736. }
  737. #endif
  738. /*date MSDU parameters */
  739. pMsdu->headerLen = WLAN_HDR_LEN;
  740. pMsdu->dataLen += totalLen;
  741. pMsdu->firstBDPtr->length = pMsdu->dataLen+TX_TOTAL_OFFSET_BEFORE_DATA;
  742. /* send the packet to the TX */
  743. pMsdu->qosTag = 0;
  744. pMsdu->txFlags |= (TX_DATA_MGMT_MSDU);
  745. status = txData_txSendMsdu(pTrafficAdmCtrl->hTxData, pMsdu);
  746. return OK;
  747. }
  748. /************************************************************************
  749. * INTERNAL FUNCTIONS *
  750. ************************************************************************/
  751. /************************************************************************
  752. * trafficAdmCtrl_startTimer *
  753. ************************************************************************
  754. DESCRIPTION: start a specific ac timer
  755. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  756. acID - the AC of the timer
  757. OUTPUT:
  758. RETURN: OK on success, NOK otherwise
  759. ************************************************************************/
  760. TI_STATUS trafficAdmCtrl_startTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID)
  761. {
  762. if (pTrafficAdmCtrl == NULL)
  763. return NOK;
  764. os_timerStart(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[acID], pTrafficAdmCtrl->timeout, FALSE);
  765. return OK;
  766. }
  767. /************************************************************************
  768. * trafficAdmCtrl_stopTimer *
  769. ************************************************************************
  770. DESCRIPTION: stop a specific ac timer
  771. INPUT: pTrafficAdmCtrl - trafficAdmCtr handle.
  772. acID - the AC of the timer
  773. OUTPUT:
  774. RETURN: OK on success, NOK otherwise
  775. ************************************************************************/
  776. TI_STATUS trafficAdmCtrl_stopTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID)
  777. {
  778. if (pTrafficAdmCtrl == NULL)
  779. return NOK;
  780. os_timerStop(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[acID]);
  781. return OK;
  782. }
  783. /************************************************************************
  784. * AC timers functionc *
  785. ************************************************************************/
  786. /* QOS_AC_BE */
  787. /*********/
  788. void trafficAdmCtrl_timeoutAcBE(TI_HANDLE hTrafficAdmCtrl)
  789. {
  790. fsmTSpecInfo_t fsmTSpecInfo;
  791. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  792. /* FSM Tspec Info Structure */
  793. fsmTSpecInfo.acID = QOS_AC_BE;
  794. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  795. fsmTSpecInfo.pTSpecInfo = NULL;
  796. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
  797. }
  798. /* QOS_AC_BK */
  799. /*********/
  800. void trafficAdmCtrl_timeoutAcBK(TI_HANDLE hTrafficAdmCtrl)
  801. {
  802. fsmTSpecInfo_t fsmTSpecInfo;
  803. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  804. /* FSM Tspec Info Structure */
  805. fsmTSpecInfo.acID = QOS_AC_BK;
  806. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  807. fsmTSpecInfo.pTSpecInfo = NULL;
  808. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
  809. }
  810. /* QOS_AC_VI */
  811. /*********/
  812. void trafficAdmCtrl_timeoutAcVI(TI_HANDLE hTrafficAdmCtrl)
  813. {
  814. fsmTSpecInfo_t fsmTSpecInfo;
  815. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  816. /* FSM Tspec Info Structure */
  817. fsmTSpecInfo.acID = QOS_AC_VI;
  818. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  819. fsmTSpecInfo.pTSpecInfo = NULL;
  820. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
  821. }
  822. /* QOS_AC_VO */
  823. /*********/
  824. void trafficAdmCtrl_timeoutAcVO(TI_HANDLE hTrafficAdmCtrl)
  825. {
  826. fsmTSpecInfo_t fsmTSpecInfo;
  827. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  828. /* FSM Tspec Info Structure */
  829. fsmTSpecInfo.acID = QOS_AC_VO;
  830. fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
  831. fsmTSpecInfo.pTSpecInfo = NULL;
  832. trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
  833. }
  834. static TI_STATUS trafficAdmCtrl_tokenToAc (TI_HANDLE hTrafficAdmCtrl, UINT8 token, UINT8 *acID)
  835. {
  836. UINT8 idx;
  837. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  838. for (idx=0; idx<MAX_NUM_OF_AC; idx++)
  839. {
  840. if (pTrafficAdmCtrl->dialogToken[idx] == token)
  841. {
  842. *acID = idx;
  843. return (OK);
  844. }
  845. }
  846. return (NOK);
  847. }
  848. /************************************************************************
  849. * trafficAdmCtrl_buildFrameHeader *
  850. ************************************************************************
  851. DESCRIPTION: build frame header
  852. INPUT:
  853. OUTPUT:
  854. RETURN: OK on success, NOK otherwise
  855. ************************************************************************/
  856. TI_STATUS trafficAdmCtrl_buildFrameHeader(trafficAdmCtrl_t *pTrafficAdmCtrl, mem_MSDU_T *pMsdu)
  857. {
  858. TI_STATUS status = OK;
  859. paramInfo_t daParam, saParam;
  860. dot11_mgmtHeader_t *pdot11Header;
  861. bssType_e currBssType;
  862. macAddress_t currBssId;
  863. pdot11Header = (dot11_mgmtHeader_t*)(memMgr_BufData(pMsdu->firstBDPtr)+ memMgr_BufOffset(pMsdu->firstBDPtr));
  864. /* Get the Destination MAC address */
  865. daParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
  866. status = ctrlData_getParam(pTrafficAdmCtrl->hCtrlData, &daParam);
  867. if (status != OK)
  868. {
  869. return NOK;
  870. }
  871. /* Get the Source MAC address */
  872. saParam.paramType = CTRL_DATA_MAC_ADDRESS;
  873. status = ctrlData_getParam(pTrafficAdmCtrl->hCtrlData, &saParam);
  874. if (status != OK)
  875. {
  876. return NOK;
  877. }
  878. /* receive BssId and Bss Type from control module */
  879. ctrlData_getCurrBssTypeAndCurrBssId(pTrafficAdmCtrl->hCtrlData, &currBssId, &currBssType);
  880. if (currBssType != BSS_INFRASTRUCTURE)
  881. {
  882. /* report failure but don't stop... */
  883. WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  884. ("trafficAdmCtrl_buildFrameHeader: Error !! currBssType = BSS_INFRASTRUCTURE \n"));
  885. return NOK;
  886. }
  887. /* infrastructure BSS */
  888. /* copy BSSID */
  889. MAC_COPY(pTrafficAdmCtrl->hOs,(&pdot11Header->BSSID),(&currBssId));
  890. /* copy source mac address */
  891. MAC_COPY(pTrafficAdmCtrl->hOs,(&pdot11Header->SA),(&saParam.content.ctrlDataCurrentBSSID));
  892. /* copy destination mac address */
  893. MAC_COPY(pTrafficAdmCtrl->hOs,(&pdot11Header->DA),(&daParam.content.ctrlDataCurrentBSSID));
  894. /* set frame ctrl to mgmt action frame an to DS */
  895. pdot11Header->fc = DOT11_FC_ACTION;
  896. /* Update MSDU parameters */
  897. pMsdu->headerLen = WLAN_HDR_LEN;
  898. pMsdu->dataLen = WLAN_HDR_LEN;
  899. pMsdu->firstBDPtr->length = WLAN_HDR_LEN;
  900. return OK;
  901. }
  902. /************************************************************************
  903. * trafficAdmCtrl_sendAdmissionReq *
  904. ************************************************************************
  905. DESCRIPTION: send admision request frame
  906. INPUT: hTrafficAdmCtrl - Qos Manager handle.
  907. pTSpecInfo - tspec parameters
  908. OUTPUT:
  909. RETURN: OK on success, NOK otherwise
  910. ************************************************************************/
  911. TI_STATUS trafficAdmCtrl_sendAdmissionReq(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo)
  912. {
  913. TI_STATUS status = OK;
  914. mem_MSDU_T *pMsdu;
  915. char *pDataBuf;
  916. UINT32 len;
  917. UINT32 totalLen = 0;
  918. trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
  919. WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG,
  920. ("admCtrlQos_smAdmissionReq: Enter....!! \n"));
  921. /* GET NEW MSDU !!! */
  922. status = wlan_memMngrAllocMSDU(pTrafficAdmCtrl->hMemMgr, &pMsdu, 2000 + TX_TOTAL_OFFSET_BEFORE_DATA, ADM_CTRL_QOS_MODULE);
  923. if (status != OK)
  924. {
  925. return NOK;
  926. }
  927. /*
  928. * Set data offset before header builder, because it assumes it's already set
  929. */
  930. memMgr_BufOffset(pMsdu->firstBDPtr) = TX_TOTAL_OFFSET_BEFORE_DATA;
  931. status = trafficAdmCtrl_buildFrameHeader(pTrafficAdmCtrl, pMsdu);
  932. if (status != OK)
  933. {
  934. wlan_memMngrFreeMSDU(pTrafficAdmCtrl->hMemMgr, pMsdu->handle);
  935. return NOK;
  936. }
  937. pDataBuf = (memMgr_BufData(pMsdu->firstBDPtr) + memMgr_BufOffset(pMsdu->firstBDPtr) + WLAN_HDR_LEN);
  938. *pDataBuf = WME_CATAGORY_QOS; /* CATEGORY_QOS WME = 17*/
  939. pDataBuf++ ;
  940. totalLen++;
  941. *pDataBuf = ADDTS_REQUEST_ACTION; /* ADDTS request ACTION */
  942. pDataBuf++ ;
  943. totalLen++;
  944. /* storing the dialog token for response validation */
  945. pTrafficAdmCtrl->dialogToken[pTSpecInfo->AC] = pTrafficAdmCtrl->dialogTokenCounter++; /* DIALOG_TOKEN */
  946. *pDataBuf = pTrafficAdmCtrl->dialogToken[pTSpecInfo->AC];
  947. pDataBuf++ ;
  948. totalLen++;
  949. /* in WME there is a staus code in ADDTS Request ??*/
  950. *pDataBuf = ADDTS_STATUS_CODE_SUCCESS; /* STATUS CODE */
  951. pDataBuf++ ;
  952. totalLen++;
  953. trafficAdmCtrl_buildTSPec(pTrafficAdmCtrl, pTSpecInfo, (UINT8 *)pDataBuf, (UINT32*)&len);
  954. pDataBuf+=len;
  955. totalLen+=len;
  956. #ifdef EXC_MODULE_INCLUDED
  957. excMngr_buildExcTS_IEs(pTrafficAdmCtrl->hExcMgr, (UINT8 *)pDataBuf, (UINT32*)&len, pTSpecInfo->userPriority);
  958. pDataBuf+=len;
  959. totalLen+=len;
  960. #endif
  961. /* Update MSDU parameters */
  962. pMsdu->headerLen = WLAN_HDR_LEN;
  963. pMsdu->dataLen += totalLen;
  964. pMsdu->firstBDPtr->length = pMsdu->dataLen + TX_TOTAL_OFFSET_BEFORE_DATA;
  965. /* send the packet to the TX */
  966. pMsdu->qosTag = 0;
  967. pMsdu->txFlags |= (TX_DATA_MGMT_MSDU);
  968. status = txData_txSendMsdu(pTrafficAdmCtrl->hTxData, pMsdu);
  969. return OK;
  970. }
  971. /************************************************************************
  972. * trafficAdmCtrl_buildTSPec *
  973. ************************************************************************
  974. DESCRIPTION: build a tspec according to the tspec parameters
  975. INPUT: hTrafficAdmCtrl - Qos Manager handle.
  976. pTSpecInfo - tspec parameters
  977. OUTPUT: len - the tspec frame len
  978. RETURN: OK on success, NOK otherwise
  979. ************************************************************************/
  980. void trafficAdmCtrl_buildTSPec(trafficAdmCtrl_t *pTrafficAdmCtrl,
  981. tspecInfo_t *pTSpecInfo,
  982. UINT8 *pDataBuff,
  983. UINT32 *len)
  984. {
  985. tsInfo_t tsInfo;
  986. dot11_WME_TSPEC_IE_t* dot11_WME_TSPEC_IE = (dot11_WME_TSPEC_IE_t*)pDataBuff;
  987. dot11_local_WME_TSPEC_IE_t myLocal;
  988. dot11_WME_TSPEC_IE->tHdr.hdr.eleId = WME_TSPEC_IE_ID;
  989. dot11_WME_TSPEC_IE->tHdr.hdr.eleLen = WME_TSPEC_IE_LEN;
  990. dot11_WME_TSPEC_IE->tHdr.OUI[0] = 0x00;
  991. dot11_WME_TSPEC_IE->tHdr.OUI[1] = 0x50;
  992. dot11_WME_TSPEC_IE->tHdr.OUI[2] = 0xf2;
  993. dot11_WME_TSPEC_IE->tHdr.oui_type = WME_TSPEC_IE_OUI_TYPE;
  994. dot11_WME_TSPEC_IE->tHdr.oui_subtype = WME_TSPEC_IE_OUI_SUB_TYPE;
  995. dot11_WME_TSPEC_IE->tHdr.version = WME_TSPEC_IE_VERSION;
  996. tsInfo.tsInfoArr[0] = 0;
  997. tsInfo.tsInfoArr[1] = 0;
  998. tsInfo.tsInfoArr[2] = 0;
  999. tsInfo.tsInfoArr[0] |= ( (pTSpecInfo->userPriority) << TSID_SHIFT);
  1000. tsInfo.tsInfoArr[0] |= (pTSpecInfo->streamDirection << DIRECTION_SHIFT); /* bidirectional */
  1001. tsInfo.tsInfoArr[0] |= (TS_INFO_0_ACCESS_POLICY_EDCA << ACCESS_POLICY_SHIFT); /* EDCA */
  1002. tsInfo.tsInfoArr[1] |= (0 << AGGREGATION_SHIFT);
  1003. tsInfo.tsInfoArr[1] |= (pTSpecInfo->UPSDFlag << APSD_SHIFT);
  1004. tsInfo.tsInfoArr[1] |= (pTSpecInfo->userPriority << USER_PRIORITY_SHIFT);
  1005. tsInfo.tsInfoArr[1] |= (NORMAL_ACKNOWLEDGEMENT << TSINFO_ACK_POLICY_SHIFT);
  1006. tsInfo.tsInfoArr[2] |= (NO_SCHEDULE << SCHEDULE_SHIFT);
  1007. dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0] = tsInfo.tsInfoArr[0];
  1008. dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1] = tsInfo.tsInfoArr[1];
  1009. dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2] = tsInfo.tsInfoArr[2];
  1010. myLocal.nominalMSDUSize = pTSpecInfo->nominalMsduSize;
  1011. myLocal.maximumMSDUSize = (pTSpecInfo->nominalMsduSize & 0x7fff);
  1012. myLocal.minimumServiceInterval = 0;
  1013. myLocal.maximumServiceInterval = 0;
  1014. myLocal.inactivityInterval = 0;
  1015. myLocal.suspensionInterval = 0xFFFFFFFF; /*disable*/
  1016. myLocal.serviceStartTime = 0;
  1017. myLocal.minimumDataRate = pTSpecInfo->meanDataRate;
  1018. myLocal.meanDataRate = pTSpecInfo->meanDataRate;
  1019. myLocal.peakDataRate = pTSpecInfo->meanDataRate;
  1020. myLocal.maximumBurstSize = 0;
  1021. myLocal.delayBound = 0;
  1022. myLocal.minimumPHYRate = pTSpecInfo->minimumPHYRate;
  1023. myLocal.surplusBandwidthAllowance = pTSpecInfo->surplausBwAllowance;
  1024. myLocal.mediumTime = 0;
  1025. os_memoryCopy (pTrafficAdmCtrl->hOs,(void *)&dot11_WME_TSPEC_IE->nominalMSDUSize,(void *)&myLocal.nominalMSDUSize,sizeof(dot11_WME_TSPEC_IE_t));
  1026. *len = sizeof(dot11_WME_TSPEC_IE_t);
  1027. }
  1028. /************************************************************************
  1029. * trafficAdmCtrl_parseTspecIE *
  1030. ************************************************************************
  1031. DESCRIPTION: parses a tspec IE according to the tspec parameters
  1032. INPUT: hTrafficAdmCtrl - Qos Manager handle.
  1033. pTSpecInfo - tspec parameters
  1034. OUTPUT: len - the tspec frame len
  1035. RETURN: OK on success, NOK otherwise
  1036. ************************************************************************/
  1037. void trafficAdmCtrl_parseTspecIE(trafficAdmCtrl_t *pTrafficAdmCtrl,
  1038. tspecInfo_t *pTSpecInfo,
  1039. dot11_WME_TSPEC_IE_t *dot11_WME_TSPEC_IE)
  1040. {
  1041. tsInfo_t tsInfo;
  1042. UINT8 userPriority;
  1043. UINT8 acID;
  1044. UINT8 tid;
  1045. UINT8 direction;
  1046. UINT8 APSDbit;
  1047. tsInfo.tsInfoArr[0] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0];
  1048. tsInfo.tsInfoArr[1] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1];
  1049. tsInfo.tsInfoArr[2] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2];
  1050. userPriority = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT);
  1051. acID = WMEQosTagToACTable[userPriority];
  1052. tid = (((tsInfo.tsInfoArr[0]) & TS_INFO_0_TSID_MASK) >> TS

Large files files are truncated, but you can click here to view the full file