Home | History | Annotate | Download | only in Sta_Management
      1 /*
      2  * trafficAdmControl.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 
     35 /***************************************************************************/
     36 /*																		   */
     37 /*	  MODULE:	admCtrlQos.c											   */
     38 /*    PURPOSE:	WSM/WME admission Control							       */
     39 /*																	 	   */
     40 /***************************************************************************/
     41 
     42 #define __FILE_ID__  FILE_ID_89
     43 #include "osApi.h"
     44 
     45 #include "paramOut.h"
     46 
     47 #include "timer.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 "TWDriver.h"
     56 #ifdef XCC_MODULE_INCLUDED
     57 #include "XCCMngr.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 typedef struct
     70 {
     71 	TI_HANDLE hTrafficAdmCtrl;
     72 	tspecInfo_t *pTSpecInfo;
     73 	TI_UINT8		acID;
     74 
     75 }fsmTSpecInfo_t;
     76 
     77 
     78 /* Timer functions */
     79 void trafficAdmCtrl_timeoutAcBE(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured);
     80 void trafficAdmCtrl_timeoutAcBK(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured);
     81 void trafficAdmCtrl_timeoutAcVI(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured);
     82 void trafficAdmCtrl_timeoutAcVO(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured);
     83 
     84 
     85 /* SM Functions */
     86 TI_STATUS trafficAdmCtrl_smEvent(trafficAdmCtrl_t *pAdmCtrlQos, TI_UINT8 event, void *pData);
     87 
     88 TI_STATUS trafficAdmCtrl_smActionUnexpectedTspecResponse(fsmTSpecInfo_t *fsmTSpecInfo);	/*unxcepted*/
     89 TI_STATUS trafficAdmCtrl_smActionUnexpected(fsmTSpecInfo_t *fsmTSpecInfo);	/*unxcepted*/
     90 TI_STATUS trafficAdmCtrl_smActionNop(fsmTSpecInfo_t *fsmTSpecInfo);			/*NOP*/
     91 TI_STATUS trafficAdmCtrl_smStart(fsmTSpecInfo_t *fsmTSpecInfo);				/*EVENT_START*/
     92 TI_STATUS trafficAdmCtrl_smWaitStop(fsmTSpecInfo_t *fsmTSpecInfo);			/*EVENT_STOP*/
     93 TI_STATUS trafficAdmCtrl_smWaitAccept(fsmTSpecInfo_t *fsmTSpecInfo);		/*EVENT_ACCEPT*/
     94 TI_STATUS trafficAdmCtrl_smWaitReject(fsmTSpecInfo_t *fsmTSpecInfo);		/*EVENT_REJECT*/
     95 TI_STATUS trafficAdmCtrl_smWaitTimeout(fsmTSpecInfo_t *fsmTSpecInfo);		/*EVENT_TIMEOUT*/
     96 
     97 
     98 
     99 TI_STATUS trafficAdmCtrl_sendAdmissionReq(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo);
    100 TI_STATUS trafficAdmCtrl_startTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, TI_UINT8 acID);
    101 TI_STATUS trafficAdmCtrl_stopTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, TI_UINT8 acID);
    102 
    103 
    104 TI_STATUS trafficAdmCtrl_buildFrameHeader(trafficAdmCtrl_t *pTrafficAdmCtrl, TTxCtrlBlk *pPktCtrlBlk);
    105 
    106 static TI_STATUS trafficAdmCtrl_tokenToAc (TI_HANDLE hTrafficAdmCtrl, TI_UINT8 token, TI_UINT8 *acID);
    107 
    108 /********************************************************************************
    109  *							trafficAdmCtrl_create								*
    110  ********************************************************************************
    111 DESCRIPTION: trafficAdmCtrl module creation function
    112 
    113   INPUT:      hOs -			Handle to OS
    114 
    115 
    116 OUTPUT:
    117 
    118 RETURN:     Handle to the trafficAdmCtrl module on success, NULL otherwise
    119 
    120 ************************************************************************/
    121 
    122 TI_HANDLE trafficAdmCtrl_create(TI_HANDLE hOs)
    123 {
    124 	trafficAdmCtrl_t 		*pTrafficAdmCtrl;
    125 	TI_STATUS			status;
    126 
    127 	/* allocate admission control context memory */
    128 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)os_memoryAlloc(hOs, sizeof(trafficAdmCtrl_t));
    129 	if (pTrafficAdmCtrl == NULL)
    130 	{
    131 		return NULL;
    132 	}
    133 
    134 	os_memoryZero(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
    135 
    136 	pTrafficAdmCtrl->hOs = hOs;
    137 
    138 	/* allocate memory for admCtrlQos state machine */
    139 	status = fsm_Create(hOs, &pTrafficAdmCtrl->pTrafficAdmCtrlSm, TRAFFIC_ADM_CTRL_SM_NUM_STATES, TRAFFIC_ADM_CTRL_SM_NUM_EVENTS);
    140 	if (status != TI_OK)
    141 	{
    142 		os_memoryFree(hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
    143 		return NULL;
    144 	}
    145 
    146 	return pTrafficAdmCtrl;
    147 }
    148 /************************************************************************
    149  *                        trafficAdmCtrl_unload						    *
    150  ************************************************************************
    151 DESCRIPTION: trafficAdmCtrl module destroy function,
    152 				-	Free all memory alocated by the module
    153 
    154 INPUT:      hTrafficAdmCtrl	-	trafficAdmCtrl handle.
    155 
    156 OUTPUT:
    157 
    158 RETURN:     TI_OK on success, TI_NOK otherwise
    159 
    160 ************************************************************************/
    161 TI_STATUS trafficAdmCtrl_unload(TI_HANDLE hTrafficAdmCtrl)
    162 {
    163 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    164 	TI_UINT32         uAcId;
    165 
    166     if (pTrafficAdmCtrl->pTrafficAdmCtrlSm)
    167 	{
    168         fsm_Unload (pTrafficAdmCtrl->hOs, pTrafficAdmCtrl->pTrafficAdmCtrlSm);
    169 	}
    170 
    171 	/* free timers */
    172 	for (uAcId = 0; uAcId < MAX_NUM_OF_AC; uAcId++)
    173     {
    174         if (pTrafficAdmCtrl->hAdmCtrlTimer[uAcId])
    175         {
    176             tmr_DestroyTimer (pTrafficAdmCtrl->hAdmCtrlTimer[uAcId]);
    177         }
    178     }
    179 
    180 	os_memoryFree(pTrafficAdmCtrl->hOs, pTrafficAdmCtrl, sizeof(trafficAdmCtrl_t));
    181 
    182 	return TI_OK;
    183 }
    184 
    185 /************************************************************************
    186  *                        trafficAdmCtrl_config							*
    187  ************************************************************************
    188 DESCRIPTION: trafficAdmCtrl module configuration function,
    189 				performs the following:
    190 				-	Reset & initiailzes local variables
    191 				-	Init the handles to be used by the module
    192 
    193 INPUT:      hTrafficAdmCtrl	         -	trafficAdmCtrl handle.
    194 		    List of handles to be used by the module
    195 			pTrafficAdmCtrlInitParams	-	init parameters.
    196 
    197 OUTPUT:
    198 
    199 RETURN:     TI_OK on success, TI_NOK otherwise
    200 ************************************************************************/
    201 TI_STATUS trafficAdmCtrl_config (TI_HANDLE hTrafficAdmCtrl,
    202     						     TI_HANDLE hTxMgmtQ,
    203     						     TI_HANDLE hReport,
    204     						     TI_HANDLE hOs,
    205     						     TI_HANDLE hQosMngr,
    206     						     TI_HANDLE hCtrlData,
    207     						     TI_HANDLE hXCCMgr,
    208     						     TI_HANDLE hTimer,
    209     						     TI_HANDLE hTWD,
    210                                  TI_HANDLE hTxCtrl,
    211     						     trafficAdmCtrlInitParams_t *pTrafficAdmCtrlInitParams)
    212 {
    213 	trafficAdmCtrl_t	*pTrafficAdmCtrl;
    214 	TI_STATUS			status;
    215 	TI_UINT32      		uAcId;
    216 
    217 	fsm_actionCell_t	trafficAdmCtrl_smMatrix[TRAFFIC_ADM_CTRL_SM_NUM_STATES][TRAFFIC_ADM_CTRL_SM_NUM_EVENTS] =
    218 	{
    219 		/* next state and actions for IDLE state */
    220 		{{TRAFFIC_ADM_CTRL_SM_STATE_WAIT, (fsm_Action_t)trafficAdmCtrl_smStart},			/*EVENT_START*/
    221 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionNop},		/*EVENT_STOP*/
    222 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpectedTspecResponse}, /*EVENT_ACCEPT*/
    223 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpectedTspecResponse}, /*EVENT_REJECT*/
    224 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smActionUnexpected}, /*EVENT_TIMEOUT*/
    225 		},
    226 		/* next state and actions for WAIT state */
    227 		{{TRAFFIC_ADM_CTRL_SM_STATE_WAIT, (fsm_Action_t)trafficAdmCtrl_smActionUnexpected},	/*EVENT_START*/
    228 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitStop},			/*EVENT_STOP*/
    229 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitAccept},		/*EVENT_ACCEPT*/
    230 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitReject},		/*EVENT_REJECT*/
    231 		 {TRAFFIC_ADM_CTRL_SM_STATE_IDLE, (fsm_Action_t)trafficAdmCtrl_smWaitTimeout},		/*EVENT_TIMEOUT*/
    232 		},
    233 	};
    234 
    235 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    236 
    237 	pTrafficAdmCtrl->hTxMgmtQ = hTxMgmtQ;
    238 	pTrafficAdmCtrl->hReport	= hReport;
    239 	pTrafficAdmCtrl->hOs		= hOs;
    240 	pTrafficAdmCtrl->hQosMngr	= hQosMngr;
    241 	pTrafficAdmCtrl->hCtrlData	= hCtrlData;
    242 	pTrafficAdmCtrl->hXCCMgr	= hXCCMgr;
    243 	pTrafficAdmCtrl->hTimer	    = hTimer;
    244 	pTrafficAdmCtrl->hTWD	    = hTWD;
    245 	pTrafficAdmCtrl->hTxCtrl	= hTxCtrl;
    246 
    247 	for (uAcId = 0; uAcId < MAX_NUM_OF_AC; uAcId++)
    248     {
    249 		pTrafficAdmCtrl->dialogToken[uAcId] = 0;
    250 
    251         /* Create per AC timers */
    252         pTrafficAdmCtrl->hAdmCtrlTimer[uAcId] = tmr_CreateTimer (pTrafficAdmCtrl->hTimer);
    253         if (pTrafficAdmCtrl->hAdmCtrlTimer[uAcId] == NULL)
    254         {
    255             TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR, "trafficAdmCtrl_config(): Failed to create hAssocSmTimer!\n");
    256             return TI_NOK;
    257         }
    258     }
    259 
    260     /* configure state machine */
    261 	status = fsm_Config(pTrafficAdmCtrl->pTrafficAdmCtrlSm, &trafficAdmCtrl_smMatrix[0][0],
    262 						TRAFFIC_ADM_CTRL_SM_NUM_STATES, TRAFFIC_ADM_CTRL_SM_NUM_EVENTS, NULL, hOs);
    263 	if (status != TI_OK)
    264 	{
    265 TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR, "TRAFFIC_ADM_CTRL_SM: fsm_Config - Error  \n");
    266 
    267 		return TI_NOK;
    268 	}
    269 
    270 	pTrafficAdmCtrl->timeout =  pTrafficAdmCtrlInitParams->trafficAdmCtrlResponseTimeout;
    271     pTrafficAdmCtrl->useFixedMsduSize = pTrafficAdmCtrlInitParams->trafficAdmCtrlUseFixedMsduSize;
    272 
    273 	pTrafficAdmCtrl->dialogTokenCounter = INITIAL_DIALOG_TOKEN;
    274 
    275 
    276 TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "TRAFFIC ADM CTRL -  configuration completed ..... \n");
    277 
    278 	return TI_OK;
    279 }
    280 
    281 
    282 /************************************************************************
    283  *                        trafficAdmCtrl_smEvent						*
    284  ************************************************************************
    285 DESCRIPTION: trafficAdmCtrl SM general function
    286 
    287 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    288 			event				-	the event to the SM.
    289 			pData				-	handle to passing parameter
    290 OUTPUT:
    291 
    292 RETURN:     TI_OK on success, TI_NOK otherwise
    293 ************************************************************************/
    294 
    295 TI_STATUS trafficAdmCtrl_smEvent(trafficAdmCtrl_t *pTrafficAdmCtrl, TI_UINT8 event, void *pData)
    296 {
    297 	TI_STATUS 		status;
    298 	TI_UINT8			nextState;
    299 	fsmTSpecInfo_t	*fsmTSpecInfo = (fsmTSpecInfo_t*)pData;
    300 	TI_UINT8			acID = fsmTSpecInfo->acID;
    301 
    302 	status = fsm_GetNextState(pTrafficAdmCtrl->pTrafficAdmCtrlSm, pTrafficAdmCtrl->currentState[acID], event, &nextState);
    303 	if (status != TI_OK)
    304 	{
    305 TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR, "ADM_CTRL: ERROR - failed getting next state \n");
    306 
    307 		return(TI_NOK);
    308 	}
    309 
    310 	TRACE3(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "trafficAdmCtrl_smEvent: <currentState = %d, event = %d> --> nextState = %d\n", pTrafficAdmCtrl->currentState[acID], event, nextState);
    311 
    312 	status = fsm_Event(pTrafficAdmCtrl->pTrafficAdmCtrlSm, &pTrafficAdmCtrl->currentState[acID], event, pData);
    313 
    314 	return(status);
    315 }
    316 
    317 
    318 /************************************************************************
    319 *							state machine functions						*
    320 ************************************************************************/
    321 /************************************************************************
    322  *                        trafficAdmCtrl_smStart						*
    323  ************************************************************************
    324 DESCRIPTION: the action function when event start ocuured on idle state
    325 				performs the following:
    326 				-	send admision requestReset
    327 				-	start timer for the response.
    328 
    329 INPUT:      fsmTSpecInfo - parameters for the request
    330 
    331 OUTPUT:
    332 
    333 RETURN:     TI_OK on success, TI_NOK otherwise
    334 ************************************************************************/
    335 
    336 TI_STATUS trafficAdmCtrl_smStart(fsmTSpecInfo_t *fsmTSpecInfo)
    337 {
    338 	TI_STATUS				status;
    339 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    340 	tspecInfo_t				*pTSpecInfo;
    341 
    342 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    343 	pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
    344 
    345 	/* send adm request frame */
    346 	status = trafficAdmCtrl_sendAdmissionReq(pTrafficAdmCtrl, pTSpecInfo);
    347 	if(status != TI_OK)
    348 		return status;
    349 
    350 	/* init timer */
    351 	trafficAdmCtrl_startTimer(pTrafficAdmCtrl, pTSpecInfo->AC);
    352 
    353 	return TI_OK;
    354 }
    355 /************************************************************************
    356  *                        trafficAdmCtrl_smWaitStop						*
    357  ************************************************************************
    358 DESCRIPTION: the action function when event stop ocuured on wait state
    359 				performs the following:
    360 				-	stop timer.
    361 
    362 INPUT:      fsmTSpecInfo - parameters of the request
    363 
    364 OUTPUT:
    365 
    366 RETURN:     TI_OK on success, TI_NOK otherwise
    367 ************************************************************************/
    368 
    369 TI_STATUS trafficAdmCtrl_smWaitStop(fsmTSpecInfo_t *fsmTSpecInfo)
    370 {
    371 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    372 	tspecInfo_t				*pTSpecInfo;
    373 
    374 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    375 	pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
    376 
    377 	/* stop timer */
    378 	trafficAdmCtrl_stopTimer(pTrafficAdmCtrl,fsmTSpecInfo->pTSpecInfo->AC);
    379 
    380 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "TRAFFIC ADM CTRL -  AC = %d,    Stoped ..... \n", pTSpecInfo->AC);
    381 
    382 
    383 	return TI_OK;
    384 }
    385 /************************************************************************
    386  *                        trafficAdmCtrl_smWaitAccept					*
    387  ************************************************************************
    388 DESCRIPTION: the action function when event accept ocuured on wait state
    389 				performs the following:
    390 				-	update the Qos Mngr of the status and the parameters
    391 
    392 INPUT:      fsmTSpecInfo - parameters of the response
    393 
    394 OUTPUT:
    395 
    396 RETURN:     TI_OK on success, TI_NOK otherwise
    397 ************************************************************************/
    398 
    399 TI_STATUS trafficAdmCtrl_smWaitAccept(fsmTSpecInfo_t *fsmTSpecInfo)
    400 {
    401 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    402 	tspecInfo_t				*pTSpecInfo;
    403 
    404 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    405 	pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
    406 
    407 	/* update the QosMngr */
    408 	qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, pTSpecInfo->AC, pTSpecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
    409 
    410 	return TI_OK;
    411 }
    412 /************************************************************************
    413  *                        trafficAdmCtrl_smWaitReject					*
    414  ************************************************************************
    415 DESCRIPTION: the action function when event reject ocuured on wait state
    416 				performs the following:
    417 				-	update the Qos Mngr of the status and the parameters
    418 
    419 INPUT:      fsmTSpecInfo - parameters of the response
    420 
    421 OUTPUT:
    422 
    423 RETURN:     TI_OK on success, TI_NOK otherwise
    424 ************************************************************************/
    425 TI_STATUS trafficAdmCtrl_smWaitReject(fsmTSpecInfo_t *fsmTSpecInfo)
    426 {
    427 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    428 	tspecInfo_t				*pTSpecInfo;
    429 
    430 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    431 	pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
    432 
    433 	/* update the QosMngr */
    434 	qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, pTSpecInfo->AC, pTSpecInfo,	STATUS_TRAFFIC_ADM_REQUEST_REJECT);
    435 
    436 	return TI_OK;
    437 }
    438 /************************************************************************
    439  *                        trafficAdmCtrl_smWaitTimeout					*
    440  ************************************************************************
    441 DESCRIPTION: the action function when event timeout ocuured on wait state
    442 				performs the following:
    443 				-	update the Qos Mngr of the status and the parameters
    444 
    445 INPUT:      fsmTSpecInfo - parameters of the request
    446 
    447 OUTPUT:
    448 
    449 RETURN:     TI_OK on success, TI_NOK otherwise
    450 ************************************************************************/
    451 
    452 TI_STATUS trafficAdmCtrl_smWaitTimeout(fsmTSpecInfo_t *fsmTSpecInfo)
    453 {
    454 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    455 
    456 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    457 
    458 	/* update the QosMngr */
    459 	qosMngr_setAdmissionInfo(pTrafficAdmCtrl->hQosMngr, fsmTSpecInfo->acID, NULL, STATUS_TRAFFIC_ADM_REQUEST_TIMEOUT);
    460 
    461 	return TI_OK;
    462 }
    463 /************************************************************************
    464  *               trafficAdmCtrl_smActionUnexpected						*
    465  ************************************************************************
    466 DESCRIPTION:
    467 INPUT:      fsmTSpecInfo - tspec parameters
    468 
    469 OUTPUT:
    470 
    471 RETURN:     TI_OK on success, TI_NOK otherwise
    472 ************************************************************************/
    473 
    474 TI_STATUS trafficAdmCtrl_smActionUnexpected(fsmTSpecInfo_t *fsmTSpecInfo)
    475 {
    476 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    477 
    478 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    479 
    480 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR, "TRAFFIC ADM CTRL -  AC = %d,    ActionUnexpected ..... \n", fsmTSpecInfo->acID);
    481 
    482 	return TI_OK;
    483 }
    484 
    485 /************************************************************************
    486  *               trafficAdmCtrl_smActionUnexpectedTspecResponse			*
    487  ************************************************************************
    488 DESCRIPTION:
    489 INPUT:      fsmTSpecInfo - tspec parameters
    490 OUTPUT:
    491 RETURN:     TI_OK on success, TI_NOK otherwise
    492 ************************************************************************/
    493 
    494 TI_STATUS trafficAdmCtrl_smActionUnexpectedTspecResponse(fsmTSpecInfo_t *fsmTSpecInfo)
    495 {
    496 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    497 	tspecInfo_t				*pTSpecInfo;
    498 
    499 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    500 	pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
    501 
    502 	/* Send event to user application - how come TSPEC response arrives without request ? */
    503 	qosMngr_sendUnexpectedTSPECResponseEvent (pTrafficAdmCtrl->hQosMngr,pTSpecInfo);
    504 
    505 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_WARNING, "TRAFFIC ADM CTRL -  AC = %d,    ActionUnexpected ..... \n", fsmTSpecInfo->acID);
    506 
    507 	return TI_OK;
    508 }
    509 
    510 
    511 /************************************************************************
    512  *                        trafficAdmCtrl_smActionNop					*
    513  ************************************************************************
    514 DESCRIPTION:
    515 INPUT:      fsmTSpecInfo - tspec parameters
    516 
    517 OUTPUT:
    518 
    519 RETURN:     TI_OK on success, TI_NOK otherwise
    520 ************************************************************************/
    521 
    522 TI_STATUS trafficAdmCtrl_smActionNop(fsmTSpecInfo_t *fsmTSpecInfo)
    523 {
    524 	trafficAdmCtrl_t		*pTrafficAdmCtrl;
    525 	tspecInfo_t				*pTSpecInfo;
    526 
    527 	pTrafficAdmCtrl = (trafficAdmCtrl_t*)(fsmTSpecInfo->hTrafficAdmCtrl);
    528 	pTSpecInfo = fsmTSpecInfo->pTSpecInfo;
    529 
    530 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "TRAFFIC ADM CTRL -  AC = %d,    Action NOP..... \n", pTSpecInfo->AC);
    531 
    532 	return TI_OK;
    533 }
    534 /************************************************************************
    535  *							API FUNCTIONS						        *
    536  ************************************************************************
    537  ************************************************************************/
    538 
    539 /************************************************************************
    540  *                    trafficAdmCtrl_startAdmRequest                    *
    541  ************************************************************************
    542 DESCRIPTION: start TSPEC signaling
    543 
    544 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    545 			pTSpecInfo			-	the TSPEC parameters
    546 
    547 OUTPUT:
    548 
    549 RETURN:     TI_OK on success, TI_NOK otherwise
    550 
    551 ************************************************************************/
    552 
    553 TI_STATUS trafficAdmCtrl_startAdmRequest(TI_HANDLE	hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo)
    554 {
    555 	TI_STATUS			status;
    556 	fsmTSpecInfo_t		fsmTSpecInfo;
    557 
    558 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    559 
    560 	if (pTrafficAdmCtrl == NULL)
    561 		return TI_NOK;
    562 
    563 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    564 	fsmTSpecInfo.pTSpecInfo = pTSpecInfo;
    565 	fsmTSpecInfo.acID = pTSpecInfo->AC;
    566 
    567 	/* send event START to SM */
    568 	status = trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_START, &fsmTSpecInfo);
    569 
    570 	return status;
    571 
    572 }
    573 /************************************************************************
    574  *                    trafficAdmCtrl_stopAdmRequest                     *
    575  ************************************************************************
    576 DESCRIPTION: stop specific tspec signaling
    577 
    578 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    579 			acID				-	the AC of the tspec to stop
    580 
    581 OUTPUT:
    582 
    583 RETURN:     TI_OK on success, TI_NOK otherwise
    584 
    585 ************************************************************************/
    586 
    587 TI_STATUS trafficAdmCtrl_stopAdmRequest(TI_HANDLE hTrafficAdmCtrl, TI_UINT8 acID)
    588 {
    589 	TI_STATUS			status;
    590 	trafficAdmCtrl_t	*pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    591 
    592 	tspecInfo_t			pTSpecInfo;
    593 	fsmTSpecInfo_t		fsmTSpecInfo;
    594 
    595 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    596 	fsmTSpecInfo.pTSpecInfo = &pTSpecInfo;
    597 
    598 	fsmTSpecInfo.pTSpecInfo->AC = (EAcTrfcType)acID;
    599 	fsmTSpecInfo.acID = acID;
    600 
    601 	/* send event STOP to SM */
    602 	status = trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_STOP, &fsmTSpecInfo);
    603 
    604 	return status;
    605 
    606 }
    607 /************************************************************************
    608  *                    trafficAdmCtrl_stop			                     *
    609  ************************************************************************
    610 DESCRIPTION: stop all tspecs and reset SM
    611 			called on disconnect
    612 
    613 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    614 
    615 OUTPUT:
    616 
    617 RETURN:     TI_OK on success, TI_NOK otherwise
    618 
    619 ************************************************************************/
    620 TI_STATUS trafficAdmCtrl_stop(TI_HANDLE	hTrafficAdmCtrl)
    621 {
    622 	TI_UINT32  uAcId;
    623 
    624 	trafficAdmCtrl_t	*pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    625 
    626 	tspecInfo_t			pTSpecInfo;
    627 	fsmTSpecInfo_t		fsmTSpecInfo;
    628 
    629 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    630 	fsmTSpecInfo.pTSpecInfo = &pTSpecInfo;
    631 
    632 	/* clean all AC SM  */
    633 	for (uAcId = 0; uAcId < MAX_NUM_OF_AC; uAcId++)
    634 	{
    635 		fsmTSpecInfo.pTSpecInfo->AC = (EAcTrfcType)uAcId;
    636 		fsmTSpecInfo.acID = uAcId;
    637 		trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_STOP, &fsmTSpecInfo);
    638 
    639         pTrafficAdmCtrl->dialogToken[uAcId] = 0;
    640 	}
    641 
    642 	pTrafficAdmCtrl->dialogTokenCounter = INITIAL_DIALOG_TOKEN;
    643 
    644 	return TI_OK;
    645 }
    646 
    647 /************************************************************************
    648  *                    trafficAdmCtrl_recv			                     *
    649  ************************************************************************
    650 DESCRIPTION:
    651 
    652 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    653 
    654 OUTPUT:
    655 
    656 RETURN:     TI_OK on success, TI_NOK otherwise
    657 
    658 ************************************************************************/
    659 
    660 TI_STATUS trafficAdmCtrl_recv(TI_HANDLE hTrafficAdmCtrl, TI_UINT8* pData, TI_UINT8 action)
    661 {
    662 	TI_STATUS 			status = TI_OK;
    663 	TI_UINT8				statusCode;
    664 	TI_UINT8				dialogToken;
    665 	TI_UINT8				tacID;
    666 	tspecInfo_t			tspecInfo;
    667 	fsmTSpecInfo_t		fsmTSpecInfo;
    668 
    669 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    670 
    671 	if (action == ADDTS_RESPONSE_ACTION)
    672 	{
    673 TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "action = 1 - ADDTS RESPONSE ACTION........!! \n");
    674 
    675 		/* parsing the dialog token */
    676 		dialogToken = *pData;
    677 		pData++;
    678 
    679 		/* in WME status code is 1 byte, in WSM is 2 bytes */
    680 		statusCode = *pData;
    681 		pData++;
    682 
    683 		tspecInfo.statusCode = statusCode;
    684 
    685 TRACE2(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "dialogToken = %d ,  statusCode = %d \n",dialogToken, statusCode);
    686 
    687 		trafficAdmCtrl_parseTspecIE(&tspecInfo, pData);
    688 
    689 		if (trafficAdmCtrl_tokenToAc (pTrafficAdmCtrl, dialogToken, &tacID) == TI_NOK)
    690 		{
    691 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_WARNING, "dialog token Not found,  dialogToken = %d , \n",dialogToken);
    692 
    693 			qosMngr_sendUnexpectedTSPECResponseEvent(pTrafficAdmCtrl->hQosMngr, &tspecInfo);
    694 
    695 			return TI_NOK;
    696 		}
    697 
    698 		/* validate dialog token matching */
    699 		if(pTrafficAdmCtrl->dialogToken[tspecInfo.AC] != dialogToken)
    700 		{
    701 TRACE2(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_WARNING, "dialog token mismatch,  dialogToken = %d ,  acID = %d \n",dialogToken, tspecInfo.AC);
    702 
    703 			qosMngr_sendUnexpectedTSPECResponseEvent(pTrafficAdmCtrl->hQosMngr, &tspecInfo);
    704 
    705 			return TI_NOK;
    706 		}
    707 
    708 		/* Stop the relevant Timer */
    709 		trafficAdmCtrl_stopTimer(pTrafficAdmCtrl, tspecInfo.AC);
    710 
    711 		fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    712 		fsmTSpecInfo.pTSpecInfo = &tspecInfo;
    713 
    714 		fsmTSpecInfo.acID = tspecInfo.AC;
    715 
    716 		if(statusCode != ADDTS_STATUS_CODE_SUCCESS)
    717 		{
    718 			/* admission reject */
    719 			/********************/
    720 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "***** admCtrlQos_recv: admission reject [ statusCode = %d ]\n",statusCode);
    721 
    722 
    723 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "ADDTS Response (reject) userPriority = %d , \n", tspecInfo.userPriority);
    724 
    725 			trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_REJECT, &fsmTSpecInfo);
    726 
    727 		}
    728 		else
    729 		{
    730 			/* admission accept */
    731 			/********************/
    732 
    733 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "***** admCtrlQos_recv: admission accept [ statusCode = %d ]\n",statusCode);
    734 
    735 
    736 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "ADDTS Response (accepted) userPriority = %d ,  \n", tspecInfo.userPriority);
    737 
    738 TRACE2(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "mediumTime = %d ,  surplusBandwidthAllowance = %d \n", tspecInfo.mediumTime, tspecInfo.surplausBwAllowance);
    739 
    740 			trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_ACCEPT, &fsmTSpecInfo);
    741 		}
    742 	}
    743 	else
    744 	{
    745 		status = TI_NOK;
    746 TRACE1(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "trafficAdmCtrl_recv: unknown action code = %d ,  \n",action);
    747 
    748 	}
    749 	return status;
    750 }
    751 
    752 
    753 /************************************************************************
    754  *                    trafficAdmCtrl_sendDeltsFrame                     *
    755  ************************************************************************
    756 DESCRIPTION:
    757 
    758 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    759 
    760 OUTPUT:
    761 
    762 RETURN:     TI_OK on success, TI_NOK otherwise
    763 
    764 ************************************************************************/
    765 TI_STATUS trafficAdmCtrl_sendDeltsFrame(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo, TI_UINT8 reasonCode)
    766 {
    767 	TI_STATUS           status = TI_OK;
    768     TTxCtrlBlk          *pPktCtrlBlk;
    769     TI_UINT8            *pPktBuffer;
    770 	TI_UINT32           totalLen = 0;
    771 	tsInfo_t            tsInfo;
    772 	trafficAdmCtrl_t    *pTrafficAdmCtrl = (trafficAdmCtrl_t *)hTrafficAdmCtrl;
    773 
    774 
    775     TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrlQos_sendDeltsFrame: Enter....!! \n");
    776 
    777 	/* Allocate a TxCtrlBlk and data buffer (large enough for the max packet) */
    778     pPktCtrlBlk = TWD_txCtrlBlk_Alloc (pTrafficAdmCtrl->hTWD);
    779     pPktBuffer  = txCtrl_AllocPacketBuffer (pTrafficAdmCtrl->hTxCtrl, pPktCtrlBlk, 2000);
    780     if (pPktBuffer == NULL)
    781     {
    782         TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR , ": No memory\n");
    783         TWD_txCtrlBlk_Free (pTrafficAdmCtrl->hTWD, pPktCtrlBlk);
    784         return TI_NOK;
    785     }
    786 
    787 	status = trafficAdmCtrl_buildFrameHeader (pTrafficAdmCtrl, pPktCtrlBlk);
    788 	if (status != TI_OK)
    789 	{
    790         TWD_txCtrlBlk_Free (pTrafficAdmCtrl->hTWD, pPktCtrlBlk);
    791 		return TI_NOK;
    792 	}
    793 
    794 	*(pPktBuffer + totalLen) = WME_CATAGORY_QOS;    /* CATEGORY_QOS in WME = 17*/
    795 	totalLen++;
    796 	*(pPktBuffer + totalLen) = DELTS_ACTION;        /* DELTS ACTION */
    797 	totalLen++;
    798 	*(pPktBuffer + totalLen) = 0;		/* DIALOG_TOKEN is 0 in DELTS */
    799 	totalLen++;
    800 	*(pPktBuffer + totalLen) = 0;		/* STATUS CODE is 0 in DELTS */
    801 	totalLen++;
    802 
    803 	/*
    804 	 * Build tsInfo fields
    805 	 */
    806 
    807 	tsInfo.tsInfoArr[0] = 0;
    808 	tsInfo.tsInfoArr[1] = 0;
    809 	tsInfo.tsInfoArr[2] = 0;
    810 
    811     tsInfo.tsInfoArr[0] |= ( (pTSpecInfo->userPriority) << TSID_SHIFT);
    812 
    813 	tsInfo.tsInfoArr[0] |= (BI_DIRECTIONAL << DIRECTION_SHIFT);		/* bidirectional */
    814 	tsInfo.tsInfoArr[0] |= (TS_INFO_0_ACCESS_POLICY_EDCA << ACCESS_POLICY_SHIFT);	/* EDCA */
    815 
    816 	tsInfo.tsInfoArr[1] |= (0 << AGGREGATION_SHIFT);
    817 
    818 	tsInfo.tsInfoArr[1] |= (pTSpecInfo->UPSDFlag << APSD_SHIFT);
    819 
    820 	tsInfo.tsInfoArr[1] |= (pTSpecInfo->userPriority << USER_PRIORITY_SHIFT);
    821 	tsInfo.tsInfoArr[1] |= (NORMAL_ACKNOWLEDGEMENT << TSINFO_ACK_POLICY_SHIFT);
    822 
    823 	tsInfo.tsInfoArr[2] |= (NO_SCHEDULE << SCHEDULE_SHIFT);
    824 
    825 	/*
    826 	 * Build TSpec IE for DELTS
    827 	 */
    828 
    829     *(pPktBuffer + totalLen    ) = WME_TSPEC_IE_ID;
    830 	*(pPktBuffer + totalLen + 1) = WME_TSPEC_IE_TSINFO_LEN;
    831 
    832 	*(pPktBuffer + totalLen + 2) = 0x00;
    833 	*(pPktBuffer + totalLen + 3) = 0x50;
    834 	*(pPktBuffer + totalLen + 4) = 0xf2;
    835 	*(pPktBuffer + totalLen + 5) = WME_TSPEC_IE_OUI_TYPE;
    836 	*(pPktBuffer + totalLen + 6) = WME_TSPEC_IE_OUI_SUB_TYPE;
    837 	*(pPktBuffer + totalLen + 7) = WME_TSPEC_IE_VERSION;
    838 
    839 	*(pPktBuffer + totalLen + 8) = tsInfo.tsInfoArr[0];
    840 	*(pPktBuffer + totalLen + 9) = tsInfo.tsInfoArr[1];
    841 	*(pPktBuffer + totalLen +10) = tsInfo.tsInfoArr[2];
    842 
    843 	totalLen += WME_TSPEC_IE_TSINFO_LEN + 2;
    844 
    845     /* Update packet parameters (start-time, pkt-type and BDL) */
    846     pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs (pTrafficAdmCtrl->hOs);
    847     pPktCtrlBlk->tTxPktParams.uPktType   = TX_PKT_TYPE_MGMT;
    848     BUILD_TX_TWO_BUF_PKT_BDL (pPktCtrlBlk, pPktCtrlBlk->aPktHdr, WLAN_HDR_LEN, pPktBuffer, totalLen)
    849 
    850 	/* Enqueue packet in the mgmt-queues and run the scheduler. */
    851 	status = txMgmtQ_Xmit (pTrafficAdmCtrl->hTxMgmtQ, pPktCtrlBlk, TI_FALSE);
    852 
    853 	return TI_OK;
    854 }
    855 
    856 
    857 /************************************************************************
    858  *							INTERNAL FUNCTIONS					        *
    859  ************************************************************************/
    860 /************************************************************************
    861  *                    trafficAdmCtrl_startTimer		                    *
    862  ************************************************************************
    863 DESCRIPTION: start a specific ac timer
    864 
    865 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    866 			acID				-	the AC of the timer
    867 
    868 OUTPUT:
    869 
    870 RETURN:     TI_OK on success, TI_NOK otherwise
    871 
    872 ************************************************************************/
    873 
    874 TI_STATUS trafficAdmCtrl_startTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, TI_UINT8 acID)
    875 {
    876     TTimerCbFunc fTimerExpiryFunc = NULL;
    877 
    878     if (pTrafficAdmCtrl == NULL)
    879     {
    880 		return TI_NOK;
    881     }
    882 
    883     switch (acID)
    884     {
    885         case QOS_AC_BE:  fTimerExpiryFunc = trafficAdmCtrl_timeoutAcBE;   break;
    886         case QOS_AC_BK:  fTimerExpiryFunc = trafficAdmCtrl_timeoutAcBK;   break;
    887         case QOS_AC_VI:  fTimerExpiryFunc = trafficAdmCtrl_timeoutAcVI;   break;
    888         case QOS_AC_VO:  fTimerExpiryFunc = trafficAdmCtrl_timeoutAcVO;   break;
    889     }
    890 
    891     tmr_StartTimer (pTrafficAdmCtrl->hAdmCtrlTimer[acID],
    892                     fTimerExpiryFunc,
    893                     (TI_HANDLE)pTrafficAdmCtrl,
    894                     pTrafficAdmCtrl->timeout,
    895                     TI_FALSE);
    896 
    897 	return TI_OK;
    898 }
    899 /************************************************************************
    900  *                    trafficAdmCtrl_stopTimer		                    *
    901  ************************************************************************
    902 DESCRIPTION: stop a specific ac timer
    903 
    904 INPUT:      pTrafficAdmCtrl	    -	trafficAdmCtr handle.
    905 			acID				-	the AC of the timer
    906 
    907 OUTPUT:
    908 
    909 RETURN:     TI_OK on success, TI_NOK otherwise
    910 
    911 ************************************************************************/
    912 
    913 TI_STATUS trafficAdmCtrl_stopTimer(trafficAdmCtrl_t* pTrafficAdmCtrl, TI_UINT8 acID)
    914 {
    915 	if (pTrafficAdmCtrl == NULL)
    916 		return TI_NOK;
    917 
    918 	tmr_StopTimer (pTrafficAdmCtrl->hAdmCtrlTimer[acID]);
    919 
    920 	return TI_OK;
    921 }
    922 
    923 /************************************************************************
    924  *						  AC timers functionc		                    *
    925  ************************************************************************/
    926 
    927 /* QOS_AC_BE */
    928 /*********/
    929 void trafficAdmCtrl_timeoutAcBE (TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured)
    930 {
    931 	fsmTSpecInfo_t	fsmTSpecInfo;
    932 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    933 
    934 
    935 	/* FSM Tspec Info Structure */
    936 	fsmTSpecInfo.acID = QOS_AC_BE;
    937 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    938 	fsmTSpecInfo.pTSpecInfo = NULL;
    939 
    940 	trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
    941 }
    942 
    943 /* QOS_AC_BK */
    944 /*********/
    945 void trafficAdmCtrl_timeoutAcBK(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured)
    946 {
    947 	fsmTSpecInfo_t	fsmTSpecInfo;
    948 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    949 
    950 
    951 	/* FSM Tspec Info Structure */
    952 	fsmTSpecInfo.acID = QOS_AC_BK;
    953 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    954 	fsmTSpecInfo.pTSpecInfo = NULL;
    955 
    956 	trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
    957 
    958 }
    959 /* QOS_AC_VI */
    960 /*********/
    961 void trafficAdmCtrl_timeoutAcVI(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured)
    962 {
    963 	fsmTSpecInfo_t	fsmTSpecInfo;
    964 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    965 
    966 
    967 	/* FSM Tspec Info Structure */
    968 	fsmTSpecInfo.acID = QOS_AC_VI;
    969 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    970 	fsmTSpecInfo.pTSpecInfo = NULL;
    971 
    972 	trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
    973 
    974 }
    975 /* QOS_AC_VO */
    976 /*********/
    977 void trafficAdmCtrl_timeoutAcVO(TI_HANDLE hTrafficAdmCtrl, TI_BOOL bTwdInitOccured)
    978 {
    979 	fsmTSpecInfo_t	fsmTSpecInfo;
    980 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    981 
    982 
    983 	/* FSM Tspec Info Structure */
    984 	fsmTSpecInfo.acID = QOS_AC_VO;
    985 	fsmTSpecInfo.hTrafficAdmCtrl = hTrafficAdmCtrl;
    986 	fsmTSpecInfo.pTSpecInfo = NULL;
    987 
    988 	trafficAdmCtrl_smEvent(pTrafficAdmCtrl, TRAFFIC_ADM_CTRL_SM_EVENT_TIMEOUT, &fsmTSpecInfo);
    989 
    990 }
    991 
    992 
    993 static TI_STATUS trafficAdmCtrl_tokenToAc (TI_HANDLE hTrafficAdmCtrl, TI_UINT8 token, TI_UINT8 *acID)
    994 {
    995 	TI_UINT8 idx;
    996 	trafficAdmCtrl_t *pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
    997 
    998 	for (idx=0; idx<MAX_NUM_OF_AC; idx++)
    999 	{
   1000 		if (pTrafficAdmCtrl->dialogToken[idx] == token)
   1001 		{
   1002 			*acID = idx;
   1003 			return (TI_OK);
   1004 		}
   1005 	}
   1006 
   1007 	return (TI_NOK);
   1008 
   1009 }
   1010 
   1011 
   1012 
   1013 /************************************************************************
   1014  *              trafficAdmCtrl_buildFrameHeader							*
   1015  ************************************************************************
   1016 DESCRIPTION: build frame header
   1017 
   1018 INPUT:
   1019 
   1020 OUTPUT:
   1021 
   1022 RETURN:     TI_OK on success, TI_NOK otherwise
   1023 ************************************************************************/
   1024 TI_STATUS trafficAdmCtrl_buildFrameHeader(trafficAdmCtrl_t *pTrafficAdmCtrl, TTxCtrlBlk *pPktCtrlBlk)
   1025 {
   1026    	TI_STATUS			status;
   1027 	TMacAddr		    daBssid, saBssid;
   1028 	dot11_mgmtHeader_t *pdot11Header;
   1029 	ScanBssType_e		currBssType;
   1030 	TMacAddr    		currBssId;
   1031 
   1032 	pdot11Header = (dot11_mgmtHeader_t *)(pPktCtrlBlk->aPktHdr);
   1033 
   1034     /* Get the Destination MAC address */
   1035 	status = ctrlData_getParamBssid(pTrafficAdmCtrl->hCtrlData, CTRL_DATA_CURRENT_BSSID_PARAM, daBssid);
   1036 	if (status != TI_OK)
   1037 	{
   1038 		return TI_NOK;
   1039 	}
   1040 
   1041     /* Get the Source MAC address */
   1042 	status = ctrlData_getParamBssid(pTrafficAdmCtrl->hCtrlData, CTRL_DATA_MAC_ADDRESS, saBssid);
   1043 	if (status != TI_OK)
   1044 	{
   1045 		return TI_NOK;
   1046 	}
   1047 
   1048 	/* receive BssId and Bss Type from control module */
   1049 	ctrlData_getCurrBssTypeAndCurrBssId(pTrafficAdmCtrl->hCtrlData, &currBssId, &currBssType);
   1050 	if (currBssType != BSS_INFRASTRUCTURE)
   1051     {
   1052  		/* report failure but don't stop... */
   1053 TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR, "trafficAdmCtrl_buildFrameHeader: Error !! currBssType = BSS_INFRASTRUCTURE \n");
   1054 
   1055 		return TI_NOK;
   1056     }
   1057 	/* infrastructure BSS */
   1058 
   1059 	/* copy BSSID */
   1060 	MAC_COPY (pdot11Header->BSSID, currBssId);
   1061 	/* copy source mac address */
   1062 	MAC_COPY (pdot11Header->SA, saBssid);
   1063 	/* copy destination mac address */
   1064 	MAC_COPY (pdot11Header->DA, daBssid);
   1065 
   1066 	/* set frame ctrl to mgmt action frame an to DS */
   1067 	pdot11Header->fc = ENDIAN_HANDLE_WORD(DOT11_FC_ACTION | DOT11_FC_TO_DS);
   1068 
   1069 	return TI_OK;
   1070 }
   1071 
   1072 /************************************************************************
   1073  *                  trafficAdmCtrl_sendAdmissionReq						*
   1074  ************************************************************************
   1075 DESCRIPTION: send admision request frame
   1076 
   1077 INPUT:      hTrafficAdmCtrl	         -	Qos Manager handle.
   1078 		    pTSpecInfo				 -  tspec parameters
   1079 
   1080 OUTPUT:
   1081 
   1082 RETURN:     TI_OK on success, TI_NOK otherwise
   1083 ************************************************************************/
   1084 
   1085 TI_STATUS trafficAdmCtrl_sendAdmissionReq(TI_HANDLE hTrafficAdmCtrl, tspecInfo_t *pTSpecInfo)
   1086 {
   1087 	TI_STATUS			status = TI_OK;
   1088     TTxCtrlBlk          *pPktCtrlBlk;
   1089     TI_UINT8            *pPktBuffer;
   1090 	TI_UINT32			len;
   1091 	TI_UINT32			totalLen = 0;
   1092 	trafficAdmCtrl_t	*pTrafficAdmCtrl = (trafficAdmCtrl_t*)hTrafficAdmCtrl;
   1093 
   1094 
   1095 TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_INFORMATION, "admCtrlQos_smAdmissionReq: Enter....!! \n");
   1096 
   1097 	/* Allocate a TxCtrlBlk and data buffer (large enough for the max packet) */
   1098     pPktCtrlBlk = TWD_txCtrlBlk_Alloc (pTrafficAdmCtrl->hTWD);
   1099     pPktBuffer  = txCtrl_AllocPacketBuffer (pTrafficAdmCtrl->hTxCtrl, pPktCtrlBlk, 2000);
   1100     if (pPktBuffer == NULL)
   1101     {
   1102         TRACE0(pTrafficAdmCtrl->hReport, REPORT_SEVERITY_ERROR , ": No memory\n");
   1103         TWD_txCtrlBlk_Free (pTrafficAdmCtrl->hTWD, pPktCtrlBlk);
   1104         return TI_NOK;
   1105     }
   1106 
   1107 	status = trafficAdmCtrl_buildFrameHeader (pTrafficAdmCtrl, pPktCtrlBlk);
   1108 	if (status != TI_OK)
   1109 	{
   1110         TWD_txCtrlBlk_Free (pTrafficAdmCtrl->hTWD, pPktCtrlBlk);
   1111 		return TI_NOK;
   1112 	}
   1113 
   1114 	*(pPktBuffer + totalLen) = WME_CATAGORY_QOS;			/* CATEGORY_QOS WME = 17*/
   1115 	totalLen++;
   1116 	*(pPktBuffer + totalLen) = ADDTS_REQUEST_ACTION;		/* ADDTS request ACTION */
   1117 	totalLen++;
   1118 
   1119 	/* storing the dialog token for response validation */
   1120 	pTrafficAdmCtrl->dialogToken[pTSpecInfo->AC] = pTrafficAdmCtrl->dialogTokenCounter++;	/* DIALOG_TOKEN */
   1121 	*(pPktBuffer + totalLen) = pTrafficAdmCtrl->dialogToken[pTSpecInfo->AC];
   1122 	totalLen++;
   1123 
   1124 	*(pPktBuffer + totalLen) = 0;	 /* STATUS CODE is 0 for ADDTS */
   1125 	totalLen++;
   1126 
   1127 	trafficAdmCtrl_buildTSPec (pTrafficAdmCtrl, pTSpecInfo, pPktBuffer + totalLen, (TI_UINT32*)&len);
   1128 	totalLen += len;
   1129 
   1130     /* Update packet parameters (start-time, length, pkt-type) */
   1131     pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs (pTrafficAdmCtrl->hOs);
   1132     pPktCtrlBlk->tTxPktParams.uPktType   = TX_PKT_TYPE_MGMT;
   1133     BUILD_TX_TWO_BUF_PKT_BDL (pPktCtrlBlk, pPktCtrlBlk->aPktHdr, WLAN_HDR_LEN, pPktBuffer, totalLen)
   1134 
   1135 	/* Enqueue packet in the mgmt-queues and run the scheduler. */
   1136 	status = txMgmtQ_Xmit (pTrafficAdmCtrl->hTxMgmtQ, pPktCtrlBlk, TI_FALSE);
   1137 
   1138 	return TI_OK;
   1139 }
   1140 /************************************************************************
   1141  *                        trafficAdmCtrl_buildTSPec							*
   1142  ************************************************************************
   1143 DESCRIPTION: build a tspec according to the tspec parameters
   1144 
   1145 INPUT:      hTrafficAdmCtrl	     -	Qos Manager handle.
   1146 		    pTSpecInfo			 -  tspec parameters
   1147 
   1148 OUTPUT:		pPktBuffer             - the Tspec IE to send
   1149 			len					 - the tspec frame len
   1150 
   1151 RETURN:     TI_OK on success, TI_NOK otherwise
   1152 ************************************************************************/
   1153 
   1154 void trafficAdmCtrl_buildTSPec(trafficAdmCtrl_t	*pTrafficAdmCtrl,
   1155 							   tspecInfo_t		*pTSpecInfo,
   1156 							   TI_UINT8			*pDataBuf,
   1157 							   TI_UINT32		*len)
   1158 {
   1159 	tsInfo_t			tsInfo;
   1160 	TI_UINT16		nominalMSDUSize;
   1161 	TI_UINT32		suspensionInterval = 0;   /* disable */
   1162 
   1163 
   1164 	os_memoryZero(pTrafficAdmCtrl->hOs, (void *)pDataBuf, WME_TSPEC_IE_LEN + 2);
   1165 
   1166 	*pDataBuf =			WME_TSPEC_IE_ID;
   1167 	*(pDataBuf + 1) =	WME_TSPEC_IE_LEN;
   1168 
   1169 	*(pDataBuf + 2) =	0x00;
   1170 	*(pDataBuf + 3) =	0x50;
   1171 	*(pDataBuf + 4) =	0xf2;
   1172 	*(pDataBuf + 5) =	WME_TSPEC_IE_OUI_TYPE;
   1173 	*(pDataBuf + 6) =	WME_TSPEC_IE_OUI_SUB_TYPE;
   1174 	*(pDataBuf + 7) =	WME_TSPEC_IE_VERSION;
   1175 
   1176 	/*
   1177 	 * Build tsInfo fields
   1178 	 */
   1179 
   1180 	tsInfo.tsInfoArr[0] = 0;
   1181 	tsInfo.tsInfoArr[1] = 0;
   1182 	tsInfo.tsInfoArr[2] = 0;
   1183 
   1184 	tsInfo.tsInfoArr[0] |=		( (pTSpecInfo->userPriority) << TSID_SHIFT);
   1185 	tsInfo.tsInfoArr[0] |=		(pTSpecInfo->streamDirection << DIRECTION_SHIFT);		/* bidirectional */
   1186 
   1187 	tsInfo.tsInfoArr[0] |=		(TS_INFO_0_ACCESS_POLICY_EDCA << ACCESS_POLICY_SHIFT);	/* EDCA */
   1188 
   1189 	tsInfo.tsInfoArr[1] |=		(0 << AGGREGATION_SHIFT);
   1190 
   1191 	tsInfo.tsInfoArr[1] |=		(pTSpecInfo->UPSDFlag << APSD_SHIFT);
   1192 
   1193 	tsInfo.tsInfoArr[1] |=		(pTSpecInfo->userPriority << USER_PRIORITY_SHIFT);
   1194 	tsInfo.tsInfoArr[1] |=		(NORMAL_ACKNOWLEDGEMENT << TSINFO_ACK_POLICY_SHIFT);
   1195 
   1196 	tsInfo.tsInfoArr[2] |=		(NO_SCHEDULE << SCHEDULE_SHIFT);
   1197 
   1198 	*(pDataBuf + 8) =	tsInfo.tsInfoArr[0];
   1199 	*(pDataBuf + 9) =	tsInfo.tsInfoArr[1];
   1200 	*(pDataBuf +10) =	tsInfo.tsInfoArr[2];
   1201 
   1202 	pDataBuf += 11;  /* Progress the data pointer to the next IE parameters. */
   1203 
   1204 	/*
   1205 	 * Set all remained parameters
   1206 	 */
   1207 
   1208     nominalMSDUSize = pTSpecInfo->nominalMsduSize;
   1209     if (pTrafficAdmCtrl->useFixedMsduSize)
   1210 		nominalMSDUSize |= FIX_MSDU_SIZE;
   1211 
   1212 	COPY_WLAN_WORD(pDataBuf,      &nominalMSDUSize);			/* Nominal-MSDU-size. */
   1213 	COPY_WLAN_WORD(pDataBuf +  2, &nominalMSDUSize);			/* Maximum-MSDU-size. */
   1214 	COPY_WLAN_LONG(pDataBuf +  4, &pTSpecInfo->uMinimumServiceInterval); /* Minimum service interval */
   1215 	COPY_WLAN_LONG(pDataBuf +  8, &pTSpecInfo->uMaximumServiceInterval); /* Maximum service interval */
   1216 	COPY_WLAN_LONG(pDataBuf + 16, &suspensionInterval);
   1217 	COPY_WLAN_LONG(pDataBuf + 24, &pTSpecInfo->meanDataRate);	/* Minimum-data-rate. */
   1218 	COPY_WLAN_LONG(pDataBuf + 28, &pTSpecInfo->meanDataRate);	/* Mean-data-rate. */
   1219 	COPY_WLAN_LONG(pDataBuf + 32, &pTSpecInfo->meanDataRate);	/* Peak-data-rate. */
   1220 	COPY_WLAN_LONG(pDataBuf + 44, &pTSpecInfo->minimumPHYRate);
   1221 	COPY_WLAN_WORD(pDataBuf + 48, &pTSpecInfo->surplausBwAllowance);
   1222 
   1223 	*len = WME_TSPEC_IE_LEN + 2;
   1224 }
   1225 
   1226 
   1227 
   1228 /************************************************************************
   1229  *                        trafficAdmCtrl_parseTspecIE					*
   1230  ************************************************************************
   1231 DESCRIPTION: parses a tspec IE according to the tspec parameters
   1232 
   1233 INPUT:      pData			-  tspec IE from received frame
   1234 
   1235 OUTPUT:		pTSpecInfo		-  parsed tspec parameters
   1236 
   1237 RETURN:     None
   1238 ************************************************************************/
   1239 void trafficAdmCtrl_parseTspecIE(tspecInfo_t *pTSpecInfo, TI_UINT8 *pData)
   1240 {
   1241 	tsInfo_t			tsInfo;
   1242 	TI_UINT8				userPriority;
   1243 	TI_UINT8				acID;
   1244 	TI_UINT8				tid;
   1245 	TI_UINT8				direction;
   1246 	TI_UINT8				APSDbit;
   1247 
   1248 	pData += 8;  /* Skip the WME_TSPEC_IE header */
   1249 
   1250 	/* Get the TS-Info (3 bytes) and parse its fields */
   1251 	tsInfo.tsInfoArr[0] = *pData;
   1252 	tsInfo.tsInfoArr[1] = *(pData + 1);
   1253 	tsInfo.tsInfoArr[2] = *(pData + 2);
   1254 	pData += 3;
   1255 
   1256 	userPriority = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT);
   1257 
   1258 	acID = WMEQosTagToACTable[userPriority];
   1259 
   1260 	tid = 	(((tsInfo.tsInfoArr[0]) & TS_INFO_0_TSID_MASK) >> TSID_SHIFT);
   1261 	APSDbit = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_APSD_MASK) >> APSD_SHIFT);
   1262 	direction = (((tsInfo.tsInfoArr[0]) & TS_INFO_0_DIRECTION_MASK) >> DIRECTION_SHIFT);
   1263 
   1264 
   1265 	pTSpecInfo->AC = (EAcTrfcType)acID;
   1266 	pTSpecInfo->userPriority = userPriority;
   1267 	pTSpecInfo->UPSDFlag = APSDbit;
   1268 	pTSpecInfo->streamDirection = (EStreamDirection)direction;
   1269 	pTSpecInfo->tid = tid;
   1270 
   1271 	/* Get the other Tspec IE parameters (handle WLAN fram endianess if required) */
   1272 	COPY_WLAN_WORD(&pTSpecInfo->nominalMsduSize, pData);
   1273 	COPY_WLAN_LONG(&pTSpecInfo->uMinimumServiceInterval, pData + 4);
   1274 	COPY_WLAN_LONG(&pTSpecInfo->uMaximumServiceInterval, pData + 8);
   1275 	COPY_WLAN_LONG(&pTSpecInfo->meanDataRate, pData + 28);
   1276 	COPY_WLAN_LONG(&pTSpecInfo->minimumPHYRate, pData + 44);
   1277 	COPY_WLAN_WORD(&pTSpecInfo->surplausBwAllowance, pData + 48);
   1278 	pTSpecInfo->surplausBwAllowance >>= SURPLUS_BANDWIDTH_ALLOW;  /* Surplus is in 3 MSBits of TI_UINT16 */
   1279 	COPY_WLAN_WORD(&pTSpecInfo->mediumTime, pData + 50);
   1280 }
   1281 
   1282 
   1283 
   1284 /*************************************************************************
   1285  *																		 *
   1286  *							DEBUG FUNCTIONS								 *
   1287  *																		 *
   1288  *************************************************************************/
   1289 void trafficAdmCtrl_print(trafficAdmCtrl_t *pTrafficAdmCtr)
   1290 {
   1291 	TI_UINT32 acID;
   1292 
   1293 	WLAN_OS_REPORT(("     traffic Adm Ctrl  \n"));
   1294 	WLAN_OS_REPORT(("-----------------------------------\n\n"));
   1295 	WLAN_OS_REPORT(("timeout                   = %d\n",pTrafficAdmCtr->timeout));
   1296 	WLAN_OS_REPORT(("dialogTokenCounter        = %d\n",pTrafficAdmCtr->dialogTokenCounter));
   1297 
   1298 	for (acID = 0 ; acID < MAX_NUM_OF_AC ; acID++)
   1299 	{
   1300 			WLAN_OS_REPORT(("     AC = %d  \n",acID));
   1301 			WLAN_OS_REPORT(("----------------------\n"));
   1302 			WLAN_OS_REPORT(("currentState   = %d \n",pTrafficAdmCtr->currentState[acID]));
   1303 			WLAN_OS_REPORT(("dialogToken    = %d \n",pTrafficAdmCtr->dialogToken[acID]));
   1304 	}
   1305 }
   1306 
   1307