Home | History | Annotate | Download | only in QOS
      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