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 /* */ 38 /* MODULE: admCtrlQos.c */ 39 /* PURPOSE: WSM/WME admission Control */ 40 /* */ 41 /***************************************************************************/ 42 43 #include "osApi.h" 44 45 #include "paramOut.h" 46 47 #include "utils.h" 48 #include "fsm.h" 49 #include "report.h" 50 51 #include "DataCtrl_Api.h" 52 53 #include "trafficAdmControl.h" 54 #include "qosMngr_API.h" 55 #include "TNETW_Driver_types.h" 56 #ifdef EXC_MODULE_INCLUDED 57 #include "excMngr.h" 58 #endif 59 /* Constants */ 60 61 /** number of states in the state machine */ 62 #define TRAFFIC_ADM_CTRL_SM_NUM_STATES 2 63 64 /** number of events in the state machine */ 65 #define TRAFFIC_ADM_CTRL_SM_NUM_EVENTS 5 66 67 extern int WMEQosTagToACTable[MAX_NUM_OF_802_1d_TAGS]; 68 69 PACKED_STRUCT( dot11_local_WME_TSPEC_IE_t, 70 71 UINT16 nominalMSDUSize; 72 UINT16 maximumMSDUSize; 73 UINT32 minimumServiceInterval; 74 UINT32 maximumServiceInterval; 75 UINT32 inactivityInterval; 76 UINT32 suspensionInterval; 77 UINT32 serviceStartTime; 78 UINT32 minimumDataRate; 79 UINT32 meanDataRate; 80 UINT32 peakDataRate; 81 UINT32 maximumBurstSize; 82 UINT32 delayBound; 83 UINT32 minimumPHYRate; 84 UINT16 surplusBandwidthAllowance; 85 UINT16 mediumTime; 86 ); 87 88 typedef struct 89 { 90 TI_HANDLE hTrafficAdmCtrl; 91 tspecInfo_t *pTSpecInfo; 92 UINT8 acID; 93 94 }fsmTSpecInfo_t; 95 96 97 /* Timer functions */ 98 void trafficAdmCtrl_timeoutAcBE(TI_HANDLE hTrafficAdmCtrl); 99 void trafficAdmCtrl_timeoutAcBK(TI_HANDLE hTrafficAdmCtrl); 100 void trafficAdmCtrl_timeoutAcVI(TI_HANDLE hTrafficAdmCtrl); 101 void trafficAdmCtrl_timeoutAcVO(TI_HANDLE hTrafficAdmCtrl); 102 103 104 /* SM Functions */ 105 TI_STATUS trafficAdmCtrl_smEvent(trafficAdmCtrl_t *pAdmCtrlQos, UINT8 event, void *pData); 106 107 TI_STATUS trafficAdmCtrl_smActionUnexpectedTspecResponse(fsmTSpecInfo_t *fsmTSpecInfo); /*unxcepted*/ 108 TI_STATUS trafficAdmCtrl_smActionUnexpected(fsmTSpecInfo_t *fsmTSpecInfo); /*unxcepted*/ 109 TI_STATUS trafficAdmCtrl_smActionNop(fsmTSpecInfo_t *fsmTSpecInfo); /*NOP*/ 110 TI_STATUS trafficAdmCtrl_smStart(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_START*/ 111 TI_STATUS trafficAdmCtrl_smWaitStop(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_STOP*/ 112 TI_STATUS trafficAdmCtrl_smWaitAccept(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_ACCEPT*/ 113 TI_STATUS trafficAdmCtrl_smWaitReject(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_REJECT*/ 114 TI_STATUS trafficAdmCtrl_smWaitTimeout(fsmTSpecInfo_t *fsmTSpecInfo); /*EVENT_TIMEOUT*/ 115 116 117 118 TI_STATUS trafficAdmCtrl_sendAdmissionReq(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo); 119 TI_STATUS trafficAdmCtrl_startTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID); 120 TI_STATUS trafficAdmCtrl_stopTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID); 121 122 123 TI_STATUS trafficAdmCtrl_buildFrameHeader(trafficAdmCtrl_t *hprafficAdmCtrl, mem_MSDU_T *pMsdu); 124 125 static TI_STATUS trafficAdmCtrl_tokenToAc (TI_HANDLE hTrafficAdmCtrl, UINT8 token, UINT8 *acID); 126 127 /******************************************************************************** 128 * trafficAdmCtrl_create * 129 ******************************************************************************** 130 DESCRIPTION: trafficAdmCtrl module creation function 131 132 INPUT: hOs - Handle to OS 133 134 135 OUTPUT: 136 137 RETURN: Handle to the trafficAdmCtrl module on success, NULL otherwise 138 139 ************************************************************************/ 140 141 TI_HANDLE trafficAdmCtrl_create(TI_HANDLE hOs) 142 { 143 trafficAdmCtrl_t *pTrafficAdmCtrl; 144 TI_STATUS status; 145 146 /* allocate admission control context memory */ 147 pTrafficAdmCtrl = (trafficAdmCtrl_t*)os_memoryAlloc(hOs, sizeof(trafficAdmCtrl_t)); 148 if (pTrafficAdmCtrl == NULL) 149 { 150 return NULL; 151 } 152 153 os_memoryZero(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 154 155 pTrafficAdmCtrl->hOs = hOs; 156 157 /* allocate memory for admCtrlQos state machine */ 158 status = fsm_Create(hOs, &pTrafficAdmCtrl->pTrafficAdmCtrlSm, TRAFFIC_ADM_CTRL_SM_NUM_STATES, TRAFFIC_ADM_CTRL_SM_NUM_EVENTS); 159 if (status != OK) 160 { 161 os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 162 return NULL; 163 } 164 165 /* allocate OS timer AC BE */ 166 pTrafficAdmCtrl->timer[QOS_AC_BE] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcBE, pTrafficAdmCtrl); 167 if (pTrafficAdmCtrl->timer[QOS_AC_BE] == NULL) 168 { 169 fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm); 170 os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 171 return NULL; 172 } 173 /* allocate OS timer AC BK */ 174 pTrafficAdmCtrl->timer[QOS_AC_BK] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcBK, pTrafficAdmCtrl); 175 if (pTrafficAdmCtrl->timer[QOS_AC_BK] == NULL) 176 { 177 fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm); 178 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]); 179 os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 180 return NULL; 181 } 182 /* allocate OS timer AC VI */ 183 pTrafficAdmCtrl->timer[QOS_AC_VI] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcVI, pTrafficAdmCtrl); 184 if (pTrafficAdmCtrl->timer[QOS_AC_VI] == NULL) 185 { 186 fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm); 187 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]); 188 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BK]); 189 os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 190 return NULL; 191 } 192 /* allocate OS timer AC VO */ 193 pTrafficAdmCtrl->timer[QOS_AC_VO] = os_timerCreate(hOs, trafficAdmCtrl_timeoutAcVO, pTrafficAdmCtrl); 194 if (pTrafficAdmCtrl->timer[QOS_AC_VO] == NULL) 195 { 196 fsm_Unload(hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm); 197 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]); 198 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BK]); 199 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_VI]); 200 os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 201 return NULL; 202 } 203 204 return pTrafficAdmCtrl; 205 } 206 /************************************************************************ 207 * trafficAdmCtrl_unload * 208 ************************************************************************ 209 DESCRIPTION: trafficAdmCtrl module destroy function, 210 - Free all memory alocated by the module 211 212 INPUT: hTrafficAdmCtrl - trafficAdmCtrl handle. 213 214 OUTPUT: 215 216 RETURN: OK on success, NOK otherwise 217 218 ************************************************************************/ 219 TI_STATUS trafficAdmCtrl_unload(TI_HANDLE hTrafficAdmCtrl) 220 { 221 TI_STATUS status; 222 trafficAdmCtrl_t *pTrafficAdmCtrl; 223 224 pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 225 226 status = fsm_Unload(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm); 227 if (status != OK) 228 { 229 /* report failure but don't stop... */ 230 WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 231 ("ADM_CTRL_SM: Error releasing FSM memory \n")); 232 } 233 234 /* free timers */ 235 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BE]); 236 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_BK]); 237 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_VI]); 238 os_timerDestroy(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[QOS_AC_VO]); 239 240 os_memoryFree(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t)); 241 242 return OK; 243 } 244 245 /************************************************************************ 246 * trafficAdmCtrl_config * 247 ************************************************************************ 248 DESCRIPTION: trafficAdmCtrl module configuration function, 249 performs the following: 250 - Reset & initiailzes local variables 251 - Init the handles to be used by the module 252 253 INPUT: hTrafficAdmCtrl - trafficAdmCtrl handle. 254 List of handles to be used by the module 255 pTrafficAdmCtrlInitParams - init parameters. 256 257 OUTPUT: 258 259 RETURN: OK on success, NOK otherwise 260 ************************************************************************/ 261 262 TI_STATUS trafficAdmCtrl_config(TI_HANDLE hTrafficAdmCtrl, 263 TI_HANDLE hTxData, 264 TI_HANDLE hReport, 265 TI_HANDLE hOs, 266 TI_HANDLE hQosMngr, 267 TI_HANDLE hCtrlData, 268 TI_HANDLE hMemMgr, 269 TI_HANDLE hExcMgr, 270 trafficAdmCtrlInitParams_t *pTrafficAdmCtrlInitParams) 271 { 272 trafficAdmCtrl_t *pTrafficAdmCtrl; 273 TI_STATUS status; 274 UINT8 idx; 275 276 fsm_actionCell_t trafficAdmCtrl_smMatrix[TRAFFIC_ADM_CTRL_SM_NUM_STATES][TRAFFIC_ADM_CTRL_SM_NUM_EVENTS] = 277 { 278 /* next state and actions for IDLE state */ 279 {{TRAFFIC_ADM_CTRL_SM_STATE_WAIT, (fsm_Action_t)trafficAdmCtrl_smStart}, /*EVENT_START*/ 280 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionNop}, /*EVENT_STOP*/ 281 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpectedTspecResponse}, /*EVENT_ACCEPT*/ 282 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpectedTspecResponse}, /*EVENT_REJECT*/ 283 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpected}, /*EVENT_TIMEOUT*/ 284 }, 285 /* next state and actions for WAIT state */ 286 {{TRAFFIC_ADM_CTRL_SM_STATE_WAIT, (fsm_Action_t)trafficAdmCtrl_smActionUnexpected}, /*EVENT_START*/ 287 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitStop}, /*EVENT_STOP*/ 288 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitAccept}, /*EVENT_ACCEPT*/ 289 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitReject}, /*EVENT_REJECT*/ 290 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitTimeout}, /*EVENT_TIMEOUT*/ 291 }, 292 }; 293 294 pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 295 296 pTrafficAdmCtrl->hTxData = hTxData; 297 pTrafficAdmCtrl->hReport = hReport; 298 pTrafficAdmCtrl->hOs = hOs; 299 pTrafficAdmCtrl->hQosMngr = hQosMngr; 300 pTrafficAdmCtrl->hCtrlData = hCtrlData; 301 pTrafficAdmCtrl->hMemMgr = hMemMgr; 302 pTrafficAdmCtrl->hExcMgr = hExcMgr; 303 304 305 /* configure state machine */ 306 status = fsm_Config(pTrafficAdmCtrl->pTrafficAdmCtrlSm, &trafficAdmCtrl_smMatrix[0][0], 307 TRAFFIC_ADM_CTRL_SM_NUM_STATES, TRAFFIC_ADM_CTRL_SM_NUM_EVENTS, NULL, hOs); 308 if (status != OK) 309 { 310 WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 311 ("TRAFFIC_ADM_CTRL_SM: fsm_Config - Error \n")); 312 313 return NOK; 314 } 315 316 pTrafficAdmCtrl->timeout = pTrafficAdmCtrlInitParams->trafficAdmCtrlResponseTimeout; 317 pTrafficAdmCtrl->useFixedMsduSize = pTrafficAdmCtrlInitParams->trafficAdmCtrlUseFixedMsduSize; 318 319 pTrafficAdmCtrl->dialogTokenCounter = INITIAL_DIALOG_TOKEN; 320 321 322 for (idx=0; idx<MAX_NUM_OF_AC; idx++) 323 pTrafficAdmCtrl->dialogToken[idx] = 0; 324 325 326 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 327 ("TRAFFIC ADM CTRL - configuration completed ..... \n")); 328 329 return OK; 330 } 331 332 /************************************************************************ 333 * FOR SM PRINTINGS * 334 ************************************************************************/ 335 336 #ifdef REPORT_LOG 337 338 static char *admCtrlQosSMStateDesc[TRAFFIC_ADM_CTRL_SM_NUM_STATES] = { 339 "TRAFFIC_ADM_CTRL_STATE_IDLE", 340 "TRAFFIC_ADM_CTRL_STATE_WAIT", 341 }; 342 343 /* State machine inputs */ 344 static char *admCtrlQosSMEventDesc[TRAFFIC_ADM_CTRL_SM_NUM_EVENTS] = { 345 "TRAFFIC_ADM_CTRL_EVENT_START", 346 "TRAFFIC_ADM_CTRL_EVENT_STOP", 347 "TRAFFIC_ADM_CTRL_EVENT_ACCEPT", 348 "TRAFFIC_ADM_CTRL_EVENT_REJECT", 349 "TRAFFIC_ADM_CTRL_EVENT_TIMEOUT", 350 }; 351 352 #endif 353 354 /************************************************************************ 355 * trafficAdmCtrl_smEvent * 356 ************************************************************************ 357 DESCRIPTION: trafficAdmCtrl SM general function 358 359 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 360 event - the event to the SM. 361 pData - handle to passing parameter 362 OUTPUT: 363 364 RETURN: OK on success, NOK otherwise 365 ************************************************************************/ 366 367 TI_STATUS trafficAdmCtrl_smEvent(trafficAdmCtrl_t *pTrafficAdmCtrl, UINT8 event, void *pData) 368 { 369 TI_STATUS status; 370 UINT8 nextState; 371 fsmTSpecInfo_t *fsmTSpecInfo = (fsmTSpecInfo_t*)pData; 372 UINT8 acID = fsmTSpecInfo->acID; 373 374 status = fsm_GetNextState(pTrafficAdmCtrl->pTrafficAdmCtrlSm, pTrafficAdmCtrl->currentState[acID], event, &nextState); 375 if (status != OK) 376 { 377 WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 378 ("ADM_CTRL: ERROR - failed getting next state \n")); 379 380 return(NOK); 381 } 382 383 WLAN_REPORT_SM(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 384 ("ADM_CTRL acID = %d: <%s, %s> --> %s\n",acID, 385 admCtrlQosSMStateDesc[pTrafficAdmCtrl->currentState[acID] ], 386 admCtrlQosSMEventDesc[event], 387 admCtrlQosSMStateDesc[nextState])); 388 389 status = fsm_Event(pTrafficAdmCtrl->pTrafficAdmCtrlSm, &pTrafficAdmCtrl->currentState[acID], event, pData); 390 391 return(status); 392 } 393 394 395 /************************************************************************ 396 * state machine functions * 397 ************************************************************************/ 398 /************************************************************************ 399 * trafficAdmCtrl_smStart * 400 ************************************************************************ 401 DESCRIPTION: the action function when event start ocuured on idle state 402 performs the following: 403 - send admision requestReset 404 - start timer for the response. 405 406 INPUT: fsmTSpecInfo - parameters for the request 407 408 OUTPUT: 409 410 RETURN: OK on success, NOK otherwise 411 ************************************************************************/ 412 413 TI_STATUS trafficAdmCtrl_smStart(fsmTSpecInfo_t *fsmTSpecInfo) 414 { 415 TI_STATUS status; 416 trafficAdmCtrl_t *pTrafficAdmCtrl; 417 tspecInfo_t *pTSpecInfo; 418 419 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 420 pTSpecInfo = fsmTSpecInfo->pTSpecInfo; 421 422 /* send adm request frame */ 423 status = trafficAdmCtrl_sendAdmissionReq(pTrafficAdmCtrl, pTSpecInfo); 424 if(status != OK) 425 return status; 426 427 /* init timer */ 428 trafficAdmCtrl_startTimer(pTrafficAdmCtrl, pTSpecInfo->AC); 429 430 return OK; 431 } 432 /************************************************************************ 433 * trafficAdmCtrl_smWaitStop * 434 ************************************************************************ 435 DESCRIPTION: the action function when event stop ocuured on wait state 436 performs the following: 437 - stop timer. 438 439 INPUT: fsmTSpecInfo - parameters of the request 440 441 OUTPUT: 442 443 RETURN: OK on success, NOK otherwise 444 ************************************************************************/ 445 446 TI_STATUS trafficAdmCtrl_smWaitStop(fsmTSpecInfo_t *fsmTSpecInfo) 447 { 448 trafficAdmCtrl_t *pTrafficAdmCtrl; 449 tspecInfo_t *pTSpecInfo; 450 451 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 452 pTSpecInfo = fsmTSpecInfo->pTSpecInfo; 453 454 /* stop timer */ 455 trafficAdmCtrl_stopTimer(pTrafficAdmCtrl,fsmTSpecInfo->pTSpecInfo->AC); 456 457 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 458 ("TRAFFIC ADM CTRL - AC = %d, Stoped ..... \n", pTSpecInfo->AC)); 459 460 461 return OK; 462 } 463 /************************************************************************ 464 * trafficAdmCtrl_smWaitAccept * 465 ************************************************************************ 466 DESCRIPTION: the action function when event accept ocuured on wait state 467 performs the following: 468 - update the Qos Mngr of the status and the parameters 469 470 INPUT: fsmTSpecInfo - parameters of the response 471 472 OUTPUT: 473 474 RETURN: OK on success, NOK otherwise 475 ************************************************************************/ 476 477 TI_STATUS trafficAdmCtrl_smWaitAccept(fsmTSpecInfo_t *fsmTSpecInfo) 478 { 479 trafficAdmCtrl_t *pTrafficAdmCtrl; 480 tspecInfo_t *pTSpecInfo; 481 482 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 483 pTSpecInfo = fsmTSpecInfo->pTSpecInfo; 484 485 /* update the QosMngr */ 486 qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, pTSpecInfo->AC, pTSpecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT); 487 488 return OK; 489 } 490 /************************************************************************ 491 * trafficAdmCtrl_smWaitReject * 492 ************************************************************************ 493 DESCRIPTION: the action function when event reject ocuured on wait state 494 performs the following: 495 - update the Qos Mngr of the status and the parameters 496 497 INPUT: fsmTSpecInfo - parameters of the response 498 499 OUTPUT: 500 501 RETURN: OK on success, NOK otherwise 502 ************************************************************************/ 503 TI_STATUS trafficAdmCtrl_smWaitReject(fsmTSpecInfo_t *fsmTSpecInfo) 504 { 505 trafficAdmCtrl_t *pTrafficAdmCtrl; 506 tspecInfo_t *pTSpecInfo; 507 508 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 509 pTSpecInfo = fsmTSpecInfo->pTSpecInfo; 510 511 /* update the QosMngr */ 512 qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, pTSpecInfo->AC, pTSpecInfo, STATUS_TRAFFIC_ADM_REQUEST_REJECT); 513 514 return OK; 515 } 516 /************************************************************************ 517 * trafficAdmCtrl_smWaitTimeout * 518 ************************************************************************ 519 DESCRIPTION: the action function when event timeout ocuured on wait state 520 performs the following: 521 - update the Qos Mngr of the status and the parameters 522 523 INPUT: fsmTSpecInfo - parameters of the request 524 525 OUTPUT: 526 527 RETURN: OK on success, NOK otherwise 528 ************************************************************************/ 529 530 TI_STATUS trafficAdmCtrl_smWaitTimeout(fsmTSpecInfo_t *fsmTSpecInfo) 531 { 532 trafficAdmCtrl_t *pTrafficAdmCtrl; 533 534 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 535 536 /* update the QosMngr */ 537 qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, fsmTSpecInfo->acID, NULL, STATUS_TRAFFIC_ADM_REQUEST_TIMEOUT); 538 539 return OK; 540 } 541 /************************************************************************ 542 * trafficAdmCtrl_smActionUnexpected * 543 ************************************************************************ 544 DESCRIPTION: 545 INPUT: fsmTSpecInfo - tspec parameters 546 547 OUTPUT: 548 549 RETURN: OK on success, NOK otherwise 550 ************************************************************************/ 551 552 TI_STATUS trafficAdmCtrl_smActionUnexpected(fsmTSpecInfo_t *fsmTSpecInfo) 553 { 554 trafficAdmCtrl_t *pTrafficAdmCtrl; 555 556 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 557 558 WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 559 ("TRAFFIC ADM CTRL - AC = %d, ActionUnexpected ..... \n", fsmTSpecInfo->acID)); 560 561 return OK; 562 } 563 564 /************************************************************************ 565 * trafficAdmCtrl_smActionUnexpectedTspecResponse * 566 ************************************************************************ 567 DESCRIPTION: 568 INPUT: fsmTSpecInfo - tspec parameters 569 OUTPUT: 570 RETURN: OK on success, NOK otherwise 571 ************************************************************************/ 572 573 TI_STATUS trafficAdmCtrl_smActionUnexpectedTspecResponse(fsmTSpecInfo_t *fsmTSpecInfo) 574 { 575 trafficAdmCtrl_t *pTrafficAdmCtrl; 576 tspecInfo_t *pTSpecInfo; 577 578 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 579 pTSpecInfo = fsmTSpecInfo->pTSpecInfo; 580 581 /* Send event to user application - how come TSPEC response arrives without request ? */ 582 qosMngr_sendUnexpectedTSPECResponseEvent (pTrafficAdmCtrl->hQosMngr,pTSpecInfo); 583 584 WLAN_REPORT_WARNING(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 585 ("TRAFFIC ADM CTRL - AC = %d, ActionUnexpected ..... \n", fsmTSpecInfo->acID)); 586 587 return OK; 588 } 589 590 591 /************************************************************************ 592 * trafficAdmCtrl_smActionNop * 593 ************************************************************************ 594 DESCRIPTION: 595 INPUT: fsmTSpecInfo - tspec parameters 596 597 OUTPUT: 598 599 RETURN: OK on success, NOK otherwise 600 ************************************************************************/ 601 602 TI_STATUS trafficAdmCtrl_smActionNop(fsmTSpecInfo_t *fsmTSpecInfo) 603 { 604 trafficAdmCtrl_t *pTrafficAdmCtrl; 605 tspecInfo_t *pTSpecInfo; 606 607 pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl); 608 pTSpecInfo = fsmTSpecInfo->pTSpecInfo; 609 610 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 611 ("TRAFFIC ADM CTRL - AC = %d, Action NOP..... \n", pTSpecInfo->AC)); 612 613 return OK; 614 } 615 /************************************************************************ 616 * API FUNCTIONS * 617 ************************************************************************ 618 ************************************************************************/ 619 620 /************************************************************************ 621 * trafficAdmCtrl_startAdmRequest * 622 ************************************************************************ 623 DESCRIPTION: start TSPEC signaling 624 625 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 626 pTSpecInfo - the TSPEC parameters 627 628 OUTPUT: 629 630 RETURN: OK on success, NOK otherwise 631 632 ************************************************************************/ 633 634 TI_STATUS trafficAdmCtrl_startAdmRequest(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo) 635 { 636 TI_STATUS status; 637 fsmTSpecInfo_t fsmTSpecInfo; 638 639 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 640 641 if (pTrafficAdmCtrl == NULL) 642 return NOK; 643 644 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 645 fsmTSpecInfo.pTSpecInfo = pTSpecInfo; 646 fsmTSpecInfo.acID = pTSpecInfo->AC; 647 648 /* send event START to SM */ 649 status = trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_START, &fsmTSpecInfo); 650 651 return status; 652 653 } 654 /************************************************************************ 655 * trafficAdmCtrl_stopAdmRequest * 656 ************************************************************************ 657 DESCRIPTION: stop specific tspec signaling 658 659 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 660 acID - the AC of the tspec to stop 661 662 OUTPUT: 663 664 RETURN: OK on success, NOK otherwise 665 666 ************************************************************************/ 667 668 TI_STATUS trafficAdmCtrl_stopAdmRequest(TI_HANDLE hTrafficAdmCtrl, UINT8 acID) 669 { 670 TI_STATUS status; 671 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 672 673 tspecInfo_t pTSpecInfo; 674 fsmTSpecInfo_t fsmTSpecInfo; 675 676 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 677 fsmTSpecInfo.pTSpecInfo = &pTSpecInfo; 678 679 fsmTSpecInfo.pTSpecInfo->AC = (acTrfcType_e)acID; 680 fsmTSpecInfo.acID = acID; 681 682 /* send event STOP to SM */ 683 status = trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_STOP, &fsmTSpecInfo); 684 685 return status; 686 687 } 688 /************************************************************************ 689 * trafficAdmCtrl_stop * 690 ************************************************************************ 691 DESCRIPTION: stop all tspecs and reset SM 692 called on disconnect 693 694 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 695 696 OUTPUT: 697 698 RETURN: OK on success, NOK otherwise 699 700 ************************************************************************/ 701 TI_STATUS trafficAdmCtrl_stop(TI_HANDLE hTrafficAdmCtrl) 702 { 703 UINT8 acID; 704 UINT8 idx; 705 706 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 707 708 tspecInfo_t pTSpecInfo; 709 fsmTSpecInfo_t fsmTSpecInfo; 710 711 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 712 fsmTSpecInfo.pTSpecInfo = &pTSpecInfo; 713 714 /* clean all AC SM */ 715 for (acID = 0 ; acID < MAX_NUM_OF_AC ; acID++) 716 { 717 fsmTSpecInfo.pTSpecInfo->AC = (acTrfcType_e)acID; 718 fsmTSpecInfo.acID = acID; 719 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_STOP, &fsmTSpecInfo); 720 } 721 722 pTrafficAdmCtrl->dialogTokenCounter = INITIAL_DIALOG_TOKEN; 723 724 for (idx=0; idx<MAX_NUM_OF_AC; idx++) 725 pTrafficAdmCtrl->dialogToken[idx] = 0; 726 727 return OK; 728 } 729 730 /************************************************************************ 731 * trafficAdmCtrl_recv * 732 ************************************************************************ 733 DESCRIPTION: 734 735 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 736 737 OUTPUT: 738 739 RETURN: OK on success, NOK otherwise 740 741 ************************************************************************/ 742 743 TI_STATUS trafficAdmCtrl_recv(TI_HANDLE hTrafficAdmCtrl, UINT8* pData, UINT8 action) 744 { 745 TI_STATUS status = OK; 746 UINT8 statusCode; 747 UINT8 dialogToken; 748 UINT8 tacID; 749 tspecInfo_t tspecInfo; 750 fsmTSpecInfo_t fsmTSpecInfo; 751 752 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 753 754 if (action == ADDTS_RESPONSE_ACTION) 755 { 756 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 757 ("action = 1 - ADDTS RESPONSE ACTION........!! \n")); 758 759 /* parsing the dialog token */ 760 dialogToken = *pData; 761 pData++; 762 763 /* in WME status code is 1 byte, in WSM is 2 bytes */ 764 statusCode = *pData; 765 pData++; 766 767 tspecInfo.statusCode = statusCode; 768 769 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 770 ("dialogToken = %d , statusCode = %d \n",dialogToken, statusCode)); 771 772 trafficAdmCtrl_parseTspecIE(pTrafficAdmCtrl, &tspecInfo, (dot11_WME_TSPEC_IE_t *)pData); 773 774 if (trafficAdmCtrl_tokenToAc (pTrafficAdmCtrl, dialogToken, &tacID) == NOK) 775 { 776 WLAN_REPORT_WARNING(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 777 ("dialog token Not found, dialogToken = %d , \n",dialogToken)); 778 779 qosMngr_sendUnexpectedTSPECResponseEvent(pTrafficAdmCtrl->hQosMngr, &tspecInfo); 780 781 return NOK; 782 } 783 784 /* validate dialog token matching */ 785 if(pTrafficAdmCtrl->dialogToken[tspecInfo.AC] != dialogToken) 786 { 787 WLAN_REPORT_WARNING(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 788 ("dialog token mismatch, dialogToken = %d , acID = %d \n",dialogToken, tspecInfo.AC)); 789 790 qosMngr_sendUnexpectedTSPECResponseEvent(pTrafficAdmCtrl->hQosMngr, &tspecInfo); 791 792 return NOK; 793 } 794 795 /* Stop the relevant Timer */ 796 trafficAdmCtrl_stopTimer(pTrafficAdmCtrl, tspecInfo.AC); 797 798 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 799 fsmTSpecInfo.pTSpecInfo = &tspecInfo; 800 801 fsmTSpecInfo.acID = tspecInfo.AC; 802 803 if(statusCode != ADDTS_STATUS_CODE_SUCCESS) 804 { 805 /* admission reject */ 806 /********************/ 807 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 808 ("***** admCtrlQos_recv: admission reject [ statusCode = %d ]\n",statusCode)); 809 810 811 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 812 ("ADDTS Response (reject) userPriority = %d , \n", tspecInfo.userPriority)); 813 814 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_REJECT, &fsmTSpecInfo); 815 816 } 817 else 818 { 819 /* admission accept */ 820 /********************/ 821 822 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 823 ("***** admCtrlQos_recv: admission accept [ statusCode = %d ]\n",statusCode)); 824 825 826 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 827 ("ADDTS Response (accepted) userPriority = %d , \n", tspecInfo.userPriority)); 828 829 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 830 ("mediumTime = %d , surplusBandwidthAllowance = %d \n", ((dot11_WME_TSPEC_IE_t*)pData)->mediumTime, ((dot11_WME_TSPEC_IE_t*)pData)->surplusBandwidthAllowance)); 831 832 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_ACCEPT, &fsmTSpecInfo); 833 } 834 } 835 else 836 { 837 status = NOK; 838 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 839 ("trafficAdmCtrl_recv: unknown action code = %d , \n",action)); 840 841 } 842 return status; 843 } 844 /************************************************************************ 845 * trafficAdmCtrl_recv * 846 ************************************************************************ 847 DESCRIPTION: 848 849 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 850 851 OUTPUT: 852 853 RETURN: OK on success, NOK otherwise 854 855 ************************************************************************/ 856 857 858 859 TI_STATUS trafficAdmCtrl_sendDeltsFrame(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo, UINT8 reasonCode) 860 { 861 TI_STATUS status = OK; 862 mem_MSDU_T *pMsdu; 863 char *pDataBuf; 864 UINT32 totalLen = 0; 865 tsInfo_t tsInfo; 866 UINT32 tspecLen; 867 868 869 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 870 871 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 872 ("admCtrlQos_sendDeltsFrame: Enter....!! \n")); 873 874 /* GET NEW MSDU !!! */ 875 status = wlan_memMngrAllocMSDU(pTrafficAdmCtrl->hMemMgr, &pMsdu, 2000 +TX_TOTAL_OFFSET_BEFORE_DATA, ADM_CTRL_QOS_MODULE); 876 if (status != OK) 877 { 878 return NOK; 879 } 880 881 /* 882 * Set data offset before header builder, because it assumes it's already set 883 */ 884 memMgr_BufOffset(pMsdu->firstBDPtr) = TX_TOTAL_OFFSET_BEFORE_DATA; 885 886 status = trafficAdmCtrl_buildFrameHeader(pTrafficAdmCtrl, pMsdu); 887 if (status != OK) 888 { 889 wlan_memMngrFreeMSDU(pTrafficAdmCtrl->hMemMgr, pMsdu->handle); 890 return NOK; 891 } 892 pDataBuf = (memMgr_BufData(pMsdu->firstBDPtr) + memMgr_BufOffset(pMsdu->firstBDPtr) + WLAN_HDR_LEN ); 893 894 895 *pDataBuf = WME_CATAGORY_QOS; /* CATEGORY_QOS in WME = 17*/ 896 pDataBuf++ ; 897 totalLen++; 898 899 *pDataBuf = DELTS_ACTION; /* DELTS ACTION */ 900 pDataBuf++ ; 901 totalLen++; 902 903 /* according to WMM Specification v1.1, section 2.2.10, dialog token = 0 in DELTS */ 904 *pDataBuf = 0; /* DIALOG_TOKEN */ 905 906 pDataBuf++ ; 907 totalLen++; 908 909 /* according to WMM Specification v1.1, section 2.2.10, status = 0 in DELTS */ 910 *pDataBuf = 0; /* STATUS CODE = REASON CODE */ 911 pDataBuf++ ; 912 totalLen++; 913 914 915 /* 916 * WMM specification v1.1 specifie that DELTS must include at least 917 * a full TSPEC IE. The format used by TI is following 802.11e format 918 * which does not include TSPEC IE but only TS info field 919 */ 920 trafficAdmCtrl_buildTSPec(pTrafficAdmCtrl, pTSpecInfo, pDataBuf, &tspecLen); 921 totalLen += tspecLen; 922 923 tsInfo.tsInfoArr[0] = 0; 924 tsInfo.tsInfoArr[1] = 0; 925 tsInfo.tsInfoArr[2] = 0; 926 927 /* Build tsInfo */ 928 tsInfo.tsInfoArr[0] |= ( (pTSpecInfo->userPriority) << TSID_SHIFT); 929 930 tsInfo.tsInfoArr[0] |= (BI_DIRECTIONAL << DIRECTION_SHIFT); /* bidirectional */ 931 tsInfo.tsInfoArr[0] |= (TS_INFO_0_ACCESS_POLICY_EDCA << ACCESS_POLICY_SHIFT); /* EDCA */ 932 933 tsInfo.tsInfoArr[1] |= (0 << AGGREGATION_SHIFT); 934 935 tsInfo.tsInfoArr[1] |= (pTSpecInfo->UPSDFlag << APSD_SHIFT); 936 937 tsInfo.tsInfoArr[1] |= (pTSpecInfo->userPriority << USER_PRIORITY_SHIFT); 938 tsInfo.tsInfoArr[1] |= (NORMAL_ACKNOWLEDGEMENT << TSINFO_ACK_POLICY_SHIFT); 939 940 tsInfo.tsInfoArr[2] |= (NO_SCHEDULE << SCHEDULE_SHIFT); 941 942 #if 0 /* Need to send TSPEC IE in DELTS or only the tsinfo*/ 943 944 /* only tsinfo*/ 945 946 947 *pDataBuf = tsInfo.tsInfoArr[0]; 948 pDataBuf++; 949 totalLen++; 950 951 *pDataBuf = tsInfo.tsInfoArr[1]; 952 pDataBuf++; 953 totalLen++; 954 955 *pDataBuf = tsInfo.tsInfoArr[2]; 956 pDataBuf++; 957 totalLen++; 958 959 #else 960 961 /* send TSpec IE in DELTS*/ 962 963 { 964 dot11_WME_TSPEC_IE_t* dot11_WME_TSPEC_IE = (dot11_WME_TSPEC_IE_t*)pDataBuf; 965 966 967 dot11_WME_TSPEC_IE->tHdr.hdr.eleId = WME_TSPEC_IE_ID; 968 dot11_WME_TSPEC_IE->tHdr.hdr.eleLen = WME_TSPEC_IE_TSINFO_LEN; 969 970 dot11_WME_TSPEC_IE->tHdr.OUI[0] = 0x00; 971 dot11_WME_TSPEC_IE->tHdr.OUI[1] = 0x50; 972 dot11_WME_TSPEC_IE->tHdr.OUI[2] = 0xf2; 973 dot11_WME_TSPEC_IE->tHdr.oui_type = WME_TSPEC_IE_OUI_TYPE; 974 dot11_WME_TSPEC_IE->tHdr.oui_subtype = WME_TSPEC_IE_OUI_SUB_TYPE; 975 dot11_WME_TSPEC_IE->tHdr.version = WME_TSPEC_IE_VERSION; 976 977 dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0] = tsInfo.tsInfoArr[0]; 978 dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1] = tsInfo.tsInfoArr[1]; 979 dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2] = tsInfo.tsInfoArr[2]; 980 981 totalLen+=sizeof(dot11_WME_TSPEC_IE_hdr_t); 982 983 } 984 985 #endif 986 987 988 /*date MSDU parameters */ 989 pMsdu->headerLen = WLAN_HDR_LEN; 990 pMsdu->dataLen += totalLen; 991 pMsdu->firstBDPtr->length = pMsdu->dataLen+TX_TOTAL_OFFSET_BEFORE_DATA; 992 993 994 995 /* send the packet to the TX */ 996 pMsdu->qosTag = 0; 997 pMsdu->txFlags |= (TX_DATA_MGMT_MSDU); 998 status = txData_txSendMsdu(pTrafficAdmCtrl->hTxData, pMsdu); 999 1000 1001 1002 return OK; 1003 } 1004 1005 1006 /************************************************************************ 1007 * INTERNAL FUNCTIONS * 1008 ************************************************************************/ 1009 /************************************************************************ 1010 * trafficAdmCtrl_startTimer * 1011 ************************************************************************ 1012 DESCRIPTION: start a specific ac timer 1013 1014 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 1015 acID - the AC of the timer 1016 1017 OUTPUT: 1018 1019 RETURN: OK on success, NOK otherwise 1020 1021 ************************************************************************/ 1022 1023 TI_STATUS trafficAdmCtrl_startTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID) 1024 { 1025 if (pTrafficAdmCtrl == NULL) 1026 return NOK; 1027 1028 os_timerStart(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[acID], pTrafficAdmCtrl->timeout, FALSE); 1029 1030 return OK; 1031 } 1032 /************************************************************************ 1033 * trafficAdmCtrl_stopTimer * 1034 ************************************************************************ 1035 DESCRIPTION: stop a specific ac timer 1036 1037 INPUT: pTrafficAdmCtrl - trafficAdmCtr handle. 1038 acID - the AC of the timer 1039 1040 OUTPUT: 1041 1042 RETURN: OK on success, NOK otherwise 1043 1044 ************************************************************************/ 1045 1046 TI_STATUS trafficAdmCtrl_stopTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, UINT8 acID) 1047 { 1048 if (pTrafficAdmCtrl == NULL) 1049 return NOK; 1050 1051 os_timerStop(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->timer[acID]); 1052 1053 return OK; 1054 } 1055 1056 /************************************************************************ 1057 * AC timers functionc * 1058 ************************************************************************/ 1059 1060 /* QOS_AC_BE */ 1061 /*********/ 1062 void trafficAdmCtrl_timeoutAcBE(TI_HANDLE hTrafficAdmCtrl) 1063 { 1064 fsmTSpecInfo_t fsmTSpecInfo; 1065 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 1066 1067 1068 /* FSM Tspec Info Structure */ 1069 fsmTSpecInfo.acID = QOS_AC_BE; 1070 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 1071 fsmTSpecInfo.pTSpecInfo = NULL; 1072 1073 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo); 1074 } 1075 1076 /* QOS_AC_BK */ 1077 /*********/ 1078 void trafficAdmCtrl_timeoutAcBK(TI_HANDLE hTrafficAdmCtrl) 1079 { 1080 fsmTSpecInfo_t fsmTSpecInfo; 1081 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 1082 1083 1084 /* FSM Tspec Info Structure */ 1085 fsmTSpecInfo.acID = QOS_AC_BK; 1086 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 1087 fsmTSpecInfo.pTSpecInfo = NULL; 1088 1089 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo); 1090 1091 } 1092 /* QOS_AC_VI */ 1093 /*********/ 1094 void trafficAdmCtrl_timeoutAcVI(TI_HANDLE hTrafficAdmCtrl) 1095 { 1096 fsmTSpecInfo_t fsmTSpecInfo; 1097 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 1098 1099 1100 /* FSM Tspec Info Structure */ 1101 fsmTSpecInfo.acID = QOS_AC_VI; 1102 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 1103 fsmTSpecInfo.pTSpecInfo = NULL; 1104 1105 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo); 1106 1107 } 1108 /* QOS_AC_VO */ 1109 /*********/ 1110 void trafficAdmCtrl_timeoutAcVO(TI_HANDLE hTrafficAdmCtrl) 1111 { 1112 fsmTSpecInfo_t fsmTSpecInfo; 1113 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 1114 1115 1116 /* FSM Tspec Info Structure */ 1117 fsmTSpecInfo.acID = QOS_AC_VO; 1118 fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl; 1119 fsmTSpecInfo.pTSpecInfo = NULL; 1120 1121 trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo); 1122 1123 } 1124 1125 1126 static TI_STATUS trafficAdmCtrl_tokenToAc (TI_HANDLE hTrafficAdmCtrl, UINT8 token, UINT8 *acID) 1127 { 1128 UINT8 idx; 1129 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 1130 1131 for (idx=0; idx<MAX_NUM_OF_AC; idx++) 1132 { 1133 if (pTrafficAdmCtrl->dialogToken[idx] == token) 1134 { 1135 *acID = idx; 1136 return (OK); 1137 } 1138 } 1139 1140 return (NOK); 1141 1142 } 1143 1144 1145 1146 /************************************************************************ 1147 * trafficAdmCtrl_buildFrameHeader * 1148 ************************************************************************ 1149 DESCRIPTION: build frame header 1150 1151 INPUT: 1152 1153 OUTPUT: 1154 1155 RETURN: OK on success, NOK otherwise 1156 ************************************************************************/ 1157 1158 TI_STATUS trafficAdmCtrl_buildFrameHeader(trafficAdmCtrl_t *pTrafficAdmCtrl, mem_MSDU_T *pMsdu) 1159 { 1160 TI_STATUS status = OK; 1161 paramInfo_t daParam, saParam; 1162 dot11_mgmtHeader_t *pdot11Header; 1163 bssType_e currBssType; 1164 macAddress_t currBssId; 1165 1166 pdot11Header = (dot11_mgmtHeader_t*)(memMgr_BufData(pMsdu->firstBDPtr)+ memMgr_BufOffset(pMsdu->firstBDPtr)); 1167 1168 /* Get the Destination MAC address */ 1169 daParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM; 1170 status = ctrlData_getParam(pTrafficAdmCtrl->hCtrlData, &daParam); 1171 if (status != OK) 1172 { 1173 return NOK; 1174 } 1175 1176 /* Get the Source MAC address */ 1177 saParam.paramType = CTRL_DATA_MAC_ADDRESS; 1178 status = ctrlData_getParam(pTrafficAdmCtrl->hCtrlData, &saParam); 1179 if (status != OK) 1180 { 1181 return NOK; 1182 } 1183 1184 /* receive BssId and Bss Type from control module */ 1185 ctrlData_getCurrBssTypeAndCurrBssId(pTrafficAdmCtrl->hCtrlData, &currBssId, &currBssType); 1186 if (currBssType != BSS_INFRASTRUCTURE) 1187 { 1188 /* report failure but don't stop... */ 1189 WLAN_REPORT_ERROR(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 1190 ("trafficAdmCtrl_buildFrameHeader: Error !! currBssType = BSS_INFRASTRUCTURE \n")); 1191 1192 return NOK; 1193 } 1194 /* infrastructure BSS */ 1195 1196 /* copy BSSID */ 1197 MAC_COPY(pTrafficAdmCtrl->hOs,(&pdot11Header->BSSID),(&currBssId)); 1198 /* copy source mac address */ 1199 MAC_COPY(pTrafficAdmCtrl->hOs,(&pdot11Header->SA),(&saParam.content.ctrlDataCurrentBSSID)); 1200 /* copy destination mac address */ 1201 MAC_COPY(pTrafficAdmCtrl->hOs,(&pdot11Header->DA),(&daParam.content.ctrlDataCurrentBSSID)); 1202 1203 /* set frame ctrl to mgmt action frame an to DS */ 1204 pdot11Header->fc = DOT11_FC_ACTION; 1205 1206 /* Update MSDU parameters */ 1207 pMsdu->headerLen = WLAN_HDR_LEN; 1208 pMsdu->dataLen = WLAN_HDR_LEN; 1209 pMsdu->firstBDPtr->length = WLAN_HDR_LEN; 1210 1211 return OK; 1212 } 1213 1214 /************************************************************************ 1215 * trafficAdmCtrl_sendAdmissionReq * 1216 ************************************************************************ 1217 DESCRIPTION: send admision request frame 1218 1219 INPUT: hTrafficAdmCtrl - Qos Manager handle. 1220 pTSpecInfo - tspec parameters 1221 1222 OUTPUT: 1223 1224 RETURN: OK on success, NOK otherwise 1225 ************************************************************************/ 1226 1227 TI_STATUS trafficAdmCtrl_sendAdmissionReq(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo) 1228 { 1229 TI_STATUS status = OK; 1230 mem_MSDU_T *pMsdu; 1231 char *pDataBuf; 1232 UINT32 len; 1233 UINT32 totalLen = 0; 1234 1235 trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl; 1236 1237 WLAN_REPORT_INFORMATION(pTrafficAdmCtrl->hReport, TRAFFIC_ADM_CTRL_MODULE_LOG, 1238 ("admCtrlQos_smAdmissionReq: Enter....!! \n")); 1239 1240 /* GET NEW MSDU !!! */ 1241 status = wlan_memMngrAllocMSDU(pTrafficAdmCtrl->hMemMgr, &pMsdu, 2000 + TX_TOTAL_OFFSET_BEFORE_DATA, ADM_CTRL_QOS_MODULE); 1242 if (status != OK) 1243 { 1244 return NOK; 1245 } 1246 1247 /* 1248 * Set data offset before header builder, because it assumes it's already set 1249 */ 1250 memMgr_BufOffset(pMsdu->firstBDPtr) = TX_TOTAL_OFFSET_BEFORE_DATA; 1251 1252 status = trafficAdmCtrl_buildFrameHeader(pTrafficAdmCtrl, pMsdu); 1253 if (status != OK) 1254 { 1255 wlan_memMngrFreeMSDU(pTrafficAdmCtrl->hMemMgr, pMsdu->handle); 1256 return NOK; 1257 } 1258 1259 pDataBuf = (memMgr_BufData(pMsdu->firstBDPtr) + memMgr_BufOffset(pMsdu->firstBDPtr) + WLAN_HDR_LEN); 1260 1261 *pDataBuf = WME_CATAGORY_QOS; /* CATEGORY_QOS WME = 17*/ 1262 pDataBuf++ ; 1263 totalLen++; 1264 1265 *pDataBuf = ADDTS_REQUEST_ACTION; /* ADDTS request ACTION */ 1266 pDataBuf++ ; 1267 totalLen++; 1268 1269 /* storing the dialog token for response validation */ 1270 pTrafficAdmCtrl->dialogToken[pTSpecInfo->AC] = pTrafficAdmCtrl->dialogTokenCounter++; /* DIALOG_TOKEN */ 1271 *pDataBuf = pTrafficAdmCtrl->dialogToken[pTSpecInfo->AC]; 1272 pDataBuf++ ; 1273 totalLen++; 1274 1275 /* in WME there is a staus code in ADDTS Request ??*/ 1276 *pDataBuf = ADDTS_STATUS_CODE_SUCCESS; /* STATUS CODE */ 1277 pDataBuf++ ; 1278 totalLen++; 1279 1280 trafficAdmCtrl_buildTSPec(pTrafficAdmCtrl, pTSpecInfo, (UINT8 *)pDataBuf, (UINT32*)&len); 1281 pDataBuf+=len; 1282 totalLen+=len; 1283 #ifdef EXC_MODULE_INCLUDED 1284 excMngr_buildExcTS_IEs(pTrafficAdmCtrl->hExcMgr, (UINT8 *)pDataBuf, (UINT32*)&len, pTSpecInfo->userPriority); 1285 pDataBuf+=len; 1286 totalLen+=len; 1287 #endif 1288 /* Update MSDU parameters */ 1289 pMsdu->headerLen = WLAN_HDR_LEN; 1290 pMsdu->dataLen += totalLen; 1291 pMsdu->firstBDPtr->length = pMsdu->dataLen + TX_TOTAL_OFFSET_BEFORE_DATA; 1292 1293 /* send the packet to the TX */ 1294 pMsdu->qosTag = 0; 1295 pMsdu->txFlags |= (TX_DATA_MGMT_MSDU); 1296 1297 status = txData_txSendMsdu(pTrafficAdmCtrl->hTxData, pMsdu); 1298 1299 return OK; 1300 } 1301 1302 1303 /************************************************************************ 1304 * trafficAdmCtrl_buildTSPec * 1305 ************************************************************************ 1306 DESCRIPTION: build a tspec according to the tspec parameters 1307 1308 INPUT: hTrafficAdmCtrl - Qos Manager handle. 1309 pTSpecInfo - tspec parameters 1310 1311 OUTPUT: len - the tspec frame len 1312 1313 RETURN: OK on success, NOK otherwise 1314 ************************************************************************/ 1315 1316 void trafficAdmCtrl_buildTSPec(trafficAdmCtrl_t *pTrafficAdmCtrl, 1317 tspecInfo_t *pTSpecInfo, 1318 UINT8 *pDataBuff, 1319 UINT32 *len) 1320 { 1321 tsInfo_t tsInfo; 1322 dot11_WME_TSPEC_IE_t* dot11_WME_TSPEC_IE = (dot11_WME_TSPEC_IE_t*)pDataBuff; 1323 dot11_local_WME_TSPEC_IE_t myLocal; 1324 1325 dot11_WME_TSPEC_IE->tHdr.hdr.eleId = WME_TSPEC_IE_ID; 1326 dot11_WME_TSPEC_IE->tHdr.hdr.eleLen = WME_TSPEC_IE_LEN; 1327 1328 dot11_WME_TSPEC_IE->tHdr.OUI[0] = 0x00; 1329 dot11_WME_TSPEC_IE->tHdr.OUI[1] = 0x50; 1330 dot11_WME_TSPEC_IE->tHdr.OUI[2] = 0xf2; 1331 dot11_WME_TSPEC_IE->tHdr.oui_type = WME_TSPEC_IE_OUI_TYPE; 1332 dot11_WME_TSPEC_IE->tHdr.oui_subtype = WME_TSPEC_IE_OUI_SUB_TYPE; 1333 dot11_WME_TSPEC_IE->tHdr.version = WME_TSPEC_IE_VERSION; 1334 1335 1336 tsInfo.tsInfoArr[0] = 0; 1337 tsInfo.tsInfoArr[1] = 0; 1338 tsInfo.tsInfoArr[2] = 0; 1339 1340 tsInfo.tsInfoArr[0] |= ( (pTSpecInfo->userPriority) << TSID_SHIFT); 1341 tsInfo.tsInfoArr[0] |= (pTSpecInfo->streamDirection << DIRECTION_SHIFT); /* bidirectional */ 1342 1343 tsInfo.tsInfoArr[0] |= (TS_INFO_0_ACCESS_POLICY_EDCA << ACCESS_POLICY_SHIFT); /* EDCA */ 1344 1345 tsInfo.tsInfoArr[1] |= (0 << AGGREGATION_SHIFT); 1346 1347 tsInfo.tsInfoArr[1] |= (pTSpecInfo->UPSDFlag << APSD_SHIFT); 1348 1349 tsInfo.tsInfoArr[1] |= (pTSpecInfo->userPriority << USER_PRIORITY_SHIFT); 1350 tsInfo.tsInfoArr[1] |= (NORMAL_ACKNOWLEDGEMENT << TSINFO_ACK_POLICY_SHIFT); 1351 1352 tsInfo.tsInfoArr[2] |= (NO_SCHEDULE << SCHEDULE_SHIFT); 1353 1354 dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0] = tsInfo.tsInfoArr[0]; 1355 dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1] = tsInfo.tsInfoArr[1]; 1356 dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2] = tsInfo.tsInfoArr[2]; 1357 1358 1359 myLocal.nominalMSDUSize = pTSpecInfo->nominalMsduSize; 1360 myLocal.maximumMSDUSize = (pTSpecInfo->nominalMsduSize & 0x7fff); 1361 1362 1363 myLocal.minimumServiceInterval = 0; 1364 myLocal.maximumServiceInterval = 0; 1365 myLocal.inactivityInterval = 0; 1366 myLocal.suspensionInterval = 0xFFFFFFFF; /*disable*/ 1367 myLocal.serviceStartTime = 0; 1368 myLocal.minimumDataRate = pTSpecInfo->meanDataRate; 1369 myLocal.meanDataRate = pTSpecInfo->meanDataRate; 1370 myLocal.peakDataRate = pTSpecInfo->meanDataRate; 1371 myLocal.maximumBurstSize = 0; 1372 myLocal.delayBound = 0; 1373 myLocal.minimumPHYRate = pTSpecInfo->minimumPHYRate; 1374 myLocal.surplusBandwidthAllowance = pTSpecInfo->surplausBwAllowance; 1375 myLocal.mediumTime = 0; 1376 1377 os_memoryCopy (pTrafficAdmCtrl->hOs,(void *)&dot11_WME_TSPEC_IE->nominalMSDUSize,(void *)&myLocal.nominalMSDUSize,sizeof(dot11_WME_TSPEC_IE_t)); 1378 1379 *len = sizeof(dot11_WME_TSPEC_IE_t); 1380 } 1381 1382 1383 1384 /************************************************************************ 1385 * trafficAdmCtrl_parseTspecIE * 1386 ************************************************************************ 1387 DESCRIPTION: parses a tspec IE according to the tspec parameters 1388 1389 INPUT: hTrafficAdmCtrl - Qos Manager handle. 1390 pTSpecInfo - tspec parameters 1391 1392 OUTPUT: len - the tspec frame len 1393 1394 RETURN: OK on success, NOK otherwise 1395 ************************************************************************/ 1396 1397 void trafficAdmCtrl_parseTspecIE(trafficAdmCtrl_t *pTrafficAdmCtrl, 1398 tspecInfo_t *pTSpecInfo, 1399 dot11_WME_TSPEC_IE_t *dot11_WME_TSPEC_IE) 1400 { 1401 tsInfo_t tsInfo; 1402 UINT8 userPriority; 1403 UINT8 acID; 1404 UINT8 tid; 1405 UINT8 direction; 1406 UINT8 APSDbit; 1407 1408 tsInfo.tsInfoArr[0] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[0]; 1409 tsInfo.tsInfoArr[1] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[1]; 1410 tsInfo.tsInfoArr[2] = dot11_WME_TSPEC_IE->tHdr.tsInfoField.tsInfoArr[2]; 1411 1412 userPriority = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT); 1413 1414 acID = WMEQosTagToACTable[userPriority]; 1415 1416 tid = (((tsInfo.tsInfoArr[0]) & TS_INFO_0_TSID_MASK) >> TSID_SHIFT); 1417 APSDbit = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_APSD_MASK) >> APSD_SHIFT); 1418 direction = (((tsInfo.tsInfoArr[0]) & TS_INFO_0_DIRECTION_MASK) >> DIRECTION_SHIFT); 1419 1420 pTSpecInfo->AC = (acTrfcType_e)acID; 1421 pTSpecInfo->userPriority = userPriority; 1422 pTSpecInfo->nominalMsduSize = dot11_WME_TSPEC_IE->nominalMSDUSize; 1423 pTSpecInfo->meanDataRate = dot11_WME_TSPEC_IE->meanDataRate; 1424 1425 /* The surplus is transmitted in the 3 MSB of UINT16 */ 1426 pTSpecInfo->surplausBwAllowance = dot11_WME_TSPEC_IE->surplusBandwidthAllowance; 1427 1428 pTSpecInfo->minimumPHYRate = dot11_WME_TSPEC_IE->minimumPHYRate; 1429 pTSpecInfo->mediumTime = dot11_WME_TSPEC_IE->mediumTime; 1430 pTSpecInfo->UPSDFlag = APSDbit; 1431 pTSpecInfo->streamDirection = (streamDirection_e)direction; 1432 pTSpecInfo->tid = tid; 1433 } 1434 1435 1436 /************************************************************************* 1437 * * 1438 * DEBUG FUNCTIONS * 1439 * * 1440 *************************************************************************/ 1441 void trafficAdmCtrl_print(trafficAdmCtrl_t *pTrafficAdmCtr) 1442 { 1443 UINT32 acID; 1444 1445 WLAN_OS_REPORT((" traffic Adm Ctrl \n")); 1446 WLAN_OS_REPORT(("-----------------------------------\n\n")); 1447 WLAN_OS_REPORT(("timeout = %d\n",pTrafficAdmCtr->timeout)); 1448 WLAN_OS_REPORT(("dialogTokenCounter = %d\n",pTrafficAdmCtr->dialogTokenCounter)); 1449 1450 for (acID = 0 ; acID < MAX_NUM_OF_AC ; acID++) 1451 { 1452 WLAN_OS_REPORT((" AC = %d \n",acID)); 1453 WLAN_OS_REPORT(("----------------------\n")); 1454 WLAN_OS_REPORT(("currentState = %s \n",admCtrlQosSMStateDesc[pTrafficAdmCtr->currentState[acID] ])); 1455 WLAN_OS_REPORT(("dialogToken = %d \n",pTrafficAdmCtr->dialogToken[acID])); 1456 } 1457 } 1458 1459