blob: f65ed038dae4d8fcfb14ca8fafc1bc92b87ce005 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05302 * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
Kiet Lam1ed83fc2014-02-19 01:15:45 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
Jeff Johnson295189b2012-06-20 16:38:30 -070027
28/*===========================================================================
29
30 W L A N _ Q C T _ T L _ B A. C
31
32 OVERVIEW:
33
34 This software unit holds the implementation of the WLAN Transport Layer
35 Block Ack session support. Also included are the AMSDU de-aggregation
36 completion and MSDU re-ordering functionality.
37
38 The functions externalized by this module are to be called ONLY by the main
39 TL module or the HAL layer.
40
41 DEPENDENCIES:
42
43 Are listed for each API below.
Jeff Johnson295189b2012-06-20 16:38:30 -070044===========================================================================*/
45
46/*===========================================================================
47
48 EDIT HISTORY FOR FILE
49
50
51 This section contains comments describing changes made to the module.
52 Notice that changes are listed in reverse chronological order.
53
54
55 $Header$$DateTime$$Author$
56
57
58 when who what, where, why
59---------- --- --------------------------------------------------------
602010-10-xx dli Change ucCIndex to point to the slot the next frame to be expected to fwd
612008-08-22 sch Update based on unit test
622008-07-31 lti Created module
63
64===========================================================================*/
65
66/*----------------------------------------------------------------------------
67 * Include Files
68 * -------------------------------------------------------------------------*/
69#include "wlan_qct_tl.h"
70#include "wlan_qct_wda.h"
71#include "wlan_qct_tli.h"
72#include "wlan_qct_tli_ba.h"
73#include "wlan_qct_hal.h"
Katya Nigam42e16e82014-02-04 16:28:55 +053074#include "wlan_qct_tl_trace.h"
75#include "vos_trace.h"
76#include "vos_types.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070077#include "vos_list.h"
78#include "vos_lock.h"
79#include "tlDebug.h"
80/*----------------------------------------------------------------------------
81 * Preprocessor Definitions and Constants
82 * -------------------------------------------------------------------------*/
83//#define WLANTL_REORDER_DEBUG_MSG_ENABLE
84#define WLANTL_BA_REORDERING_AGING_TIMER 30 /* 30 millisec */
85#define WLANTL_BA_MIN_FREE_RX_VOS_BUFFER 0 /* RX VOS buffer low threshold */
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +053086#define CSN_WRAP_AROUND_THRESHOLD 3000 /* CSN wrap around threshold */
87
Jeff Johnson295189b2012-06-20 16:38:30 -070088
Dhanashri Atred8c20a32014-01-03 17:20:55 -080089const v_U8_t WLANTL_TID_2_AC[WLAN_MAX_TID] = { WLANTL_AC_BE,
90 WLANTL_AC_BK,
91 WLANTL_AC_BK,
92 WLANTL_AC_BE,
93 WLANTL_AC_VI,
94 WLANTL_AC_VI,
95 WLANTL_AC_VO,
96 WLANTL_AC_VO };
Jeff Johnson295189b2012-06-20 16:38:30 -070097
98/*==========================================================================
99
100 FUNCTION tlReorderingAgingTimerExpierCB
101
102 DESCRIPTION
103 After aging timer expiered, all Qed frames have to be routed to upper
104 layer. Otherwise, there is possibilitied that ahng some frames
105
106 PARAMETERS
107 v_PVOID_t timerUdata Timer callback user data
108 Has information about where frames should be
109 routed
110
111 RETURN VALUE
112 VOS_STATUS_SUCCESS General success
113 VOS_STATUS_E_INVAL Invalid frame handle
114
115============================================================================*/
116v_VOID_t WLANTL_ReorderingAgingTimerExpierCB
117(
118 v_PVOID_t timerUdata
119)
120{
121 WLANTL_TIMER_EXPIER_UDATA_T *expireHandle;
122 WLANTL_BAReorderType *ReorderInfo;
123 WLANTL_CbType *pTLHandle;
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530124 WLANTL_STAClientType* pClientSTA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700125 vos_pkt_t *vosDataBuff;
126 VOS_STATUS status = VOS_STATUS_SUCCESS;
127 v_U8_t ucSTAID;
128 v_U8_t ucTID;
129 v_U8_t opCode;
130 WLANTL_RxMetaInfoType wRxMetaInfo;
131 v_U32_t fwIdx = 0;
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +0530132 WDI_DS_RxMetaInfoType *pRxMetadata;
133 vos_pkt_t *pCurrent;
134 vos_pkt_t *pNext;
Sravan Kumar Kairamb31fa3b2018-03-12 15:44:11 +0530135 v_S15_t seq = 0;
Leo Chang2301cff2014-01-03 20:31:46 -0800136 v_U32_t cIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -0700137 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
138
139 if(NULL == timerUdata)
140 {
141 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Timer Callback User data NULL"));
142 return;
143 }
144
145 expireHandle = (WLANTL_TIMER_EXPIER_UDATA_T *)timerUdata;
146 ucSTAID = (v_U8_t)expireHandle->STAID;
147 ucTID = expireHandle->TID;
148 if(WLANTL_STA_ID_INVALID(ucSTAID) || WLANTL_TID_INVALID(ucTID))
149 {
150 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"SID %d or TID %d is not valid",
151 ucSTAID, ucTID));
152 return;
153 }
154
155 pTLHandle = (WLANTL_CbType *)expireHandle->pTLHandle;
156 if(NULL == pTLHandle)
157 {
158 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"TL Control block NULL"));
159 return;
160 }
161
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530162 pClientSTA = pTLHandle->atlSTAClients[ucSTAID];
163 if( NULL == pClientSTA ){
164 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyylamudi64258222013-01-30 14:35:10 +0530165 "TL:STA Memory not allocated STA ID: %d, %s", ucSTAID, __func__));
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530166 return;
167 }
168
169 ReorderInfo = &pClientSTA->atlBAReorderInfo[ucTID];
Jeff Johnson295189b2012-06-20 16:38:30 -0700170 if(NULL == ReorderInfo)
171 {
172 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Reorder data NULL, this could not happen SID %d, TID %d",
173 ucSTAID, ucTID));
174 return;
175 }
176
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530177 if(0 == pClientSTA->atlBAReorderInfo[ucTID].ucExists)
Jeff Johnson295189b2012-06-20 16:38:30 -0700178 {
179 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Reorder session doesn't exist SID %d, TID %d",
180 ucSTAID, ucTID));
181 return;
182 }
183
184 if(!VOS_IS_STATUS_SUCCESS(vos_lock_acquire(&ReorderInfo->reorderLock)))
185 {
186 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_ReorderingAgingTimerExpierCB, Get LOCK Fail"));
187 return;
188 }
189
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530190 if( 0 == pClientSTA->atlBAReorderInfo[ucTID].ucExists )
Jeff Johnson295189b2012-06-20 16:38:30 -0700191 {
192 vos_lock_release(&ReorderInfo->reorderLock);
193 return;
194 }
195
196 opCode = WLANTL_OPCODE_FWDALL_DROPCUR;
197 vosDataBuff = NULL;
198
Katya Nigam42e16e82014-02-04 16:28:55 +0530199 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_REORDER_TIMER_EXP_CB,
200 ucSTAID , opCode ));
201
Jeff Johnson295189b2012-06-20 16:38:30 -0700202
Mohit Khanna23863762012-09-11 17:40:09 -0700203 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"BA timeout with %d pending frames, curIdx %d", ReorderInfo->pendingFramesCount, ReorderInfo->ucCIndex));
Jeff Johnson295189b2012-06-20 16:38:30 -0700204
205 if(ReorderInfo->pendingFramesCount == 0)
206 {
207 if(!VOS_IS_STATUS_SUCCESS(vos_lock_release(&ReorderInfo->reorderLock)))
208 {
209 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_ReorderingAgingTimerExpierCB, Release LOCK Fail"));
210 }
211 return;
212 }
213
214 if(0 == ReorderInfo->ucCIndex)
215 {
216 fwIdx = ReorderInfo->winSize;
217 }
218 else
219 {
220 fwIdx = ReorderInfo->ucCIndex - 1;
221 }
222
Leo Chang2301cff2014-01-03 20:31:46 -0800223 cIndex = ReorderInfo->ucCIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -0700224 status = WLANTL_ChainFrontPkts(fwIdx, opCode,
225 &vosDataBuff, ReorderInfo, NULL);
Leo Chang2301cff2014-01-03 20:31:46 -0800226 ReorderInfo->ucCIndex = cIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -0700227 if(!VOS_IS_STATUS_SUCCESS(status))
228 {
229 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make packet chain fail with Qed frames %d", status));
230 if(!VOS_IS_STATUS_SUCCESS(vos_lock_release(&ReorderInfo->reorderLock)))
231 {
232 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_ReorderingAgingTimerExpierCB, Release LOCK Fail"));
233 }
234 return;
235 }
236
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530237 if(NULL == pClientSTA->pfnSTARx)
Jeff Johnson295189b2012-06-20 16:38:30 -0700238 {
239 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Callback function NULL with STAID %d", ucSTAID));
240 if(!VOS_IS_STATUS_SUCCESS(vos_lock_release(&ReorderInfo->reorderLock)))
241 {
242 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_ReorderingAgingTimerExpierCB, Release LOCK Fail"));
243 }
244 return;
245 }
246
247 if(NULL == vosDataBuff)
248 {
249 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"No pending frames, why triggered timer? "));
250 if(!VOS_IS_STATUS_SUCCESS(vos_lock_release(&ReorderInfo->reorderLock)))
251 {
252 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_ReorderingAgingTimerExpierCB, Release LOCK Fail"));
253 }
254 return;
255 }
256
Sravan Kumar Kairam04f093a2017-11-16 19:59:05 +0530257 /* Do replay check before giving packets to upper layer
258 replay check code : check whether replay check is needed or not */
259 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid) {
260 WLANTL_ReorderReplayCheck(pClientSTA, &vosDataBuff, ucTID);
261 }
262
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +0530263 pCurrent = vosDataBuff;
264
265 while (pCurrent != NULL)
266 {
267 vos_pkt_walk_packet_chain(pCurrent, &pNext, VOS_FALSE);
268
269 if (NULL == pNext)
270 {
271 /* This is the last packet, retrieve its sequence number */
272 pRxMetadata = WDI_DS_ExtractRxMetaData(VOS_TO_WPAL_PKT(pCurrent));
273 seq = WDA_GET_RX_REORDER_CUR_PKT_SEQ_NO(pRxMetadata);
274 }
275 pCurrent = pNext;
276 }
277 TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
278 "%s: Sending out Frame no: %d to HDD", __func__, seq));
279 ReorderInfo->LastSN = seq;
280
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530281 if( WLAN_STA_SOFTAP == pClientSTA->wSTADesc.wSTAType)
Jeff Johnson295189b2012-06-20 16:38:30 -0700282 {
283 WLANTL_FwdPktToHDD( expireHandle->pAdapter, vosDataBuff, ucSTAID);
284 }
285 else
Jeff Johnson295189b2012-06-20 16:38:30 -0700286 {
287 wRxMetaInfo.ucUP = ucTID;
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530288 pClientSTA->pfnSTARx(expireHandle->pAdapter,
Jeff Johnson295189b2012-06-20 16:38:30 -0700289 vosDataBuff, ucSTAID, &wRxMetaInfo);
290 }
291 if(!VOS_IS_STATUS_SUCCESS(vos_lock_release(&ReorderInfo->reorderLock)))
292 {
293 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_ReorderingAgingTimerExpierCB, Release LOCK Fail"));
294 }
295 return;
296}/*WLANTL_ReorderingAgingTimerExpierCB*/
297
298/*----------------------------------------------------------------------------
299 INTERACTION WITH TL Main
300 ---------------------------------------------------------------------------*/
301/*==========================================================================
302
303 FUNCTION WLANTL_InitBAReorderBuffer
304
305 DESCRIPTION
306 Init Reorder buffer array
307
308 PARAMETERS
309 v_PVOID_t pvosGCtx Global context
310
311 RETURN VALUE
312 NONE
313
314============================================================================*/
315
316void WLANTL_InitBAReorderBuffer
317(
318 v_PVOID_t pvosGCtx
319)
320{
321 WLANTL_CbType *pTLCb;
322 v_U32_t idx;
323 v_U32_t pIdx;
324
325 pTLCb = VOS_GET_TL_CB(pvosGCtx);
326 if (NULL == pTLCb)
327 {
328 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700329 "%s: Invalid TL Control Block", __func__));
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 return;
331 }
332
333 for(idx = 0; idx < WLANTL_MAX_BA_SESSION; idx++)
334 {
335 pTLCb->reorderBufferPool[idx].isAvailable = VOS_TRUE;
336 for(pIdx = 0; pIdx < WLANTL_MAX_WINSIZE; pIdx++)
337 {
338 pTLCb->reorderBufferPool[idx].arrayBuffer[pIdx] = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700339 pTLCb->reorderBufferPool[idx].ullReplayCounter[pIdx] = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700340 }
341 }
342
343 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"BA reorder buffer init"));
344 return;
345}
346
347/*==========================================================================
348
349 FUNCTION WLANTL_BaSessionAdd
350
351 DESCRIPTION
352 HAL notifies TL when a new Block Ack session is being added.
353
354 DEPENDENCIES
355 A BA session on Rx needs to be added in TL before the response is
356 being sent out
357
358 PARAMETERS
359
360 IN
361 pvosGCtx: pointer to the global vos context; a handle to TL's
362 control block can be extracted from its context
363 ucSTAId: identifier of the station for which requested the BA
364 session
365 ucTid: Tspec ID for the new BA session
366 uSize: size of the reordering window
367
368
369 RETURN VALUE
370 The result code associated with performing the operation
371
372 VOS_STATUS_E_INVAL: Input parameters are invalid
373 VOS_STATUS_E_FAULT: Station ID is outside array boundaries or pointer
374 to TL cb is NULL ; access would cause a page fault
375 VOS_STATUS_E_EXISTS: Station was not registered or BA session already
376 exists
377 VOS_STATUS_E_NOSUPPORT: Not yet supported
378
379 SIDE EFFECTS
380
381============================================================================*/
382VOS_STATUS
383WLANTL_BaSessionAdd
384(
385 v_PVOID_t pvosGCtx,
386 v_U16_t sessionID,
387 v_U32_t ucSTAId,
388 v_U8_t ucTid,
389 v_U32_t uBufferSize,
390 v_U32_t winSize,
391 v_U32_t SSN
392)
393{
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530394 WLANTL_CbType *pTLCb = NULL;
395 WLANTL_STAClientType *pClientSTA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700396 WLANTL_BAReorderType *reorderInfo;
397 v_U32_t idx;
398 VOS_STATUS status = VOS_STATUS_SUCCESS;
399 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
400
401 /*------------------------------------------------------------------------
402 Sanity check
403 ------------------------------------------------------------------------*/
404 if ( WLANTL_TID_INVALID(ucTid))
405 {
406 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
407 "WLAN TL:Invalid parameter sent on WLANTL_BaSessionAdd");
408 return VOS_STATUS_E_INVAL;
409 }
410
411 if ( WLANTL_STA_ID_INVALID( ucSTAId ) )
412 {
413 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
414 "WLAN TL:Invalid station id requested on WLANTL_BaSessionAdd");
415 return VOS_STATUS_E_FAULT;
416 }
417
418 /*------------------------------------------------------------------------
419 Extract TL control block and check existance
420 ------------------------------------------------------------------------*/
421 pTLCb = VOS_GET_TL_CB(pvosGCtx);
422 if ( NULL == pTLCb )
423 {
424 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
425 "WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_BaSessionAdd");
426 return VOS_STATUS_E_FAULT;
427 }
428
Leo Chang6b6faaf2014-01-24 21:21:26 -0800429 pClientSTA = pTLCb->atlSTAClients[ucSTAId];
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530430 if ( NULL == pClientSTA )
431 {
432 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
433 "WLAN TL:Client Memory was not allocated on %s", __func__));
434 return VOS_STATUS_E_FAILURE;
435 }
436
437 if ( 0 == pClientSTA->ucExists )
Jeff Johnson295189b2012-06-20 16:38:30 -0700438 {
439 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
440 "WLAN TL:Station was not yet registered on WLANTL_BaSessionAdd");
441 return VOS_STATUS_E_EXISTS;
442 }
443
Leo Chang6b6faaf2014-01-24 21:21:26 -0800444 reorderInfo = &pClientSTA->atlBAReorderInfo[ucTid];
445 if (!VOS_IS_STATUS_SUCCESS(
446 vos_lock_acquire(&reorderInfo->reorderLock)))
447 {
448 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
449 "%s: Release LOCK Fail", __func__));
450 return VOS_STATUS_E_FAULT;
451 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700452 /*------------------------------------------------------------------------
453 Verify that BA session was not already added
454 ------------------------------------------------------------------------*/
Leo Chang6b6faaf2014-01-24 21:21:26 -0800455 if ( 0 != reorderInfo->ucExists )
Jeff Johnson295189b2012-06-20 16:38:30 -0700456 {
Leo Chang6b6faaf2014-01-24 21:21:26 -0800457 reorderInfo->ucExists++;
Jeff Johnson295189b2012-06-20 16:38:30 -0700458 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
459 "WLAN TL:BA session already exists on WLANTL_BaSessionAdd");
Leo Chang6b6faaf2014-01-24 21:21:26 -0800460 vos_lock_release(&reorderInfo->reorderLock);
Jeff Johnson295189b2012-06-20 16:38:30 -0700461 return VOS_STATUS_E_EXISTS;
462 }
463
464 /*------------------------------------------------------------------------
465 Initialize new BA session
466 ------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -0700467 for(idx = 0; idx < WLANTL_MAX_BA_SESSION; idx++)
468 {
469 if(VOS_TRUE == pTLCb->reorderBufferPool[idx].isAvailable)
470 {
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530471 pClientSTA->atlBAReorderInfo[ucTid].reorderBuffer =
Jeff Johnson295189b2012-06-20 16:38:30 -0700472 &(pTLCb->reorderBufferPool[idx]);
473 pTLCb->reorderBufferPool[idx].isAvailable = VOS_FALSE;
Jeff Johnsonddec6482017-09-19 08:33:57 -0700474 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"%dth buffer available, buffer PTR 0x%pK",
Jeff Johnson295189b2012-06-20 16:38:30 -0700475 idx,
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530476 pClientSTA->atlBAReorderInfo[ucTid].reorderBuffer
Jeff Johnson295189b2012-06-20 16:38:30 -0700477 ));
478 break;
479 }
480 }
481
Jeff Johnson295189b2012-06-20 16:38:30 -0700482
Leo Chang6b6faaf2014-01-24 21:21:26 -0800483 if (WLAN_STA_SOFTAP == pClientSTA->wSTADesc.wSTAType)
Jeff Johnson295189b2012-06-20 16:38:30 -0700484 {
Leo Chang6b6faaf2014-01-24 21:21:26 -0800485 if (WLANTL_MAX_BA_SESSION == idx)
Jeff Johnson295189b2012-06-20 16:38:30 -0700486 {
487 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
Arif Hussainf2b00992013-11-17 21:46:15 -0800488 "Number of Add BA request received more than allowed");
Leo Chang6b6faaf2014-01-24 21:21:26 -0800489 vos_lock_release(&reorderInfo->reorderLock);
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 return VOS_STATUS_E_NOSUPPORT;
491 }
492 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 reorderInfo->timerUdata.pAdapter = pvosGCtx;
494 reorderInfo->timerUdata.pTLHandle = (v_PVOID_t)pTLCb;
495 reorderInfo->timerUdata.STAID = ucSTAId;
496 reorderInfo->timerUdata.TID = ucTid;
497
498 /* BA aging timer */
499 status = vos_timer_init(&reorderInfo->agingTimer,
500 VOS_TIMER_TYPE_SW,
501 WLANTL_ReorderingAgingTimerExpierCB,
502 (v_PVOID_t)(&reorderInfo->timerUdata));
503 if(!VOS_IS_STATUS_SUCCESS(status))
504 {
Leo Chang6b6faaf2014-01-24 21:21:26 -0800505 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
506 "%s: Timer Init Fail", __func__));
507 vos_lock_release(&reorderInfo->reorderLock);
Jeff Johnson295189b2012-06-20 16:38:30 -0700508 return status;
509 }
510
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530511 pClientSTA->atlBAReorderInfo[ucTid].ucExists++;
512 pClientSTA->atlBAReorderInfo[ucTid].usCount = 0;
513 pClientSTA->atlBAReorderInfo[ucTid].ucCIndex = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700514 if(0 == winSize)
515 {
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530516 pClientSTA->atlBAReorderInfo[ucTid].winSize = WLANTL_MAX_WINSIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700517 }
518 else
519 {
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530520 pClientSTA->atlBAReorderInfo[ucTid].winSize = winSize;
Jeff Johnson295189b2012-06-20 16:38:30 -0700521 }
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530522 pClientSTA->atlBAReorderInfo[ucTid].SSN = SSN;
523 pClientSTA->atlBAReorderInfo[ucTid].sessionID = sessionID;
524 pClientSTA->atlBAReorderInfo[ucTid].pendingFramesCount = 0;
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +0530525 pClientSTA->atlBAReorderInfo[ucTid].LastSN = SSN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700526 TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
527 "WLAN TL:New BA session added for STA: %d TID: %d",
528 ucSTAId, ucTid));
529
Leo Chang6b6faaf2014-01-24 21:21:26 -0800530 if(!VOS_IS_STATUS_SUCCESS(
531 vos_lock_release(&reorderInfo->reorderLock)))
532 {
533 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
534 "%s: Release LOCK Fail", __func__));
535 return VOS_STATUS_E_FAULT;
536 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 return VOS_STATUS_SUCCESS;
538}/* WLANTL_BaSessionAdd */
539
540/*==========================================================================
541
542 FUNCTION WLANTL_BaSessionDel
543
544 DESCRIPTION
545 HAL notifies TL when a new Block Ack session is being deleted.
546
547 DEPENDENCIES
548
549 PARAMETERS
550
551 IN
552 pvosGCtx: pointer to the global vos context; a handle to TL's
553 control block can be extracted from its context
554 ucSTAId: identifier of the station for which requested the BA
555 session
556 ucTid: Tspec ID for the new BA session
557
558 RETURN VALUE
559 The result code associated with performing the operation
560
561 VOS_STATUS_E_INVAL: Input parameters are invalid
562 VOS_STATUS_E_FAULT: Station ID is outside array boundaries or pointer
563 to TL cb is NULL ; access would cause a page fault
564 VOS_STATUS_E_EXISTS: Station was not registered or BA session already
565 exists
566 VOS_STATUS_E_NOSUPPORT: Not yet supported
567
568 SIDE EFFECTS
569
570============================================================================*/
571VOS_STATUS
572WLANTL_BaSessionDel
573(
574 v_PVOID_t pvosGCtx,
575 v_U16_t ucSTAId,
576 v_U8_t ucTid
577)
578{
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530579 WLANTL_CbType* pTLCb = NULL;
580 WLANTL_STAClientType *pClientSTA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 vos_pkt_t* vosDataBuff = NULL;
582 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
583 VOS_STATUS lockStatus = VOS_STATUS_E_FAILURE;
584 WLANTL_BAReorderType* reOrderInfo = NULL;
585 WLANTL_RxMetaInfoType wRxMetaInfo;
586 v_U32_t fwIdx = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700587 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
588
589 /*------------------------------------------------------------------------
590 Sanity check
591 ------------------------------------------------------------------------*/
592 if ( WLANTL_TID_INVALID(ucTid))
593 {
594 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
595 "WLAN TL:Invalid parameter sent on WLANTL_BaSessionDel");
596 return VOS_STATUS_E_INVAL;
597 }
598
599 if ( WLANTL_STA_ID_INVALID( ucSTAId ) )
600 {
601 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
602 "WLAN TL:Invalid station id requested on WLANTL_BaSessionDel");
603 return VOS_STATUS_E_FAULT;
604 }
605
606 /*------------------------------------------------------------------------
607 Extract TL control block and check existance
608 ------------------------------------------------------------------------*/
609 pTLCb = VOS_GET_TL_CB(pvosGCtx);
610 if ( NULL == pTLCb )
611 {
612 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
613 "WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_BaSessionDel");
614 return VOS_STATUS_E_FAULT;
615 }
616
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530617 pClientSTA = pTLCb->atlSTAClients[ucSTAId];
618
619 if ( NULL == pClientSTA )
620 {
621 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
622 "WLAN TL:Client Memory was not allocated on %s", __func__));
623 return VOS_STATUS_E_FAILURE;
624 }
625
626 if (( 0 == pClientSTA->ucExists ) &&
627 ( 0 == pClientSTA->atlBAReorderInfo[ucTid].ucExists ))
Jeff Johnson295189b2012-06-20 16:38:30 -0700628 {
Madan Mohan Koyyalamudi8b7f1e62012-10-05 14:56:51 -0700629 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
Jeff Johnson295189b2012-06-20 16:38:30 -0700630 "WLAN TL:Station was not yet registered on WLANTL_BaSessionDel");
631 return VOS_STATUS_E_EXISTS;
632 }
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530633 else if(( 0 == pClientSTA->ucExists ) &&
634 ( 0 != pClientSTA->atlBAReorderInfo[ucTid].ucExists ))
Jeff Johnson295189b2012-06-20 16:38:30 -0700635 {
636 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
637 "STA was deleted but BA info is still there, just remove BA info");
638
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530639 reOrderInfo = &pClientSTA->atlBAReorderInfo[ucTid];
Jeff Johnson295189b2012-06-20 16:38:30 -0700640 reOrderInfo->reorderBuffer->isAvailable = VOS_TRUE;
641 memset(&reOrderInfo->reorderBuffer->arrayBuffer[0],
642 0,
643 WLANTL_MAX_WINSIZE * sizeof(v_PVOID_t));
644 vos_timer_destroy(&reOrderInfo->agingTimer);
645 memset(reOrderInfo, 0, sizeof(WLANTL_BAReorderType));
646
647 return VOS_STATUS_SUCCESS;
648 }
649
650 /*------------------------------------------------------------------------
651 Verify that BA session was added
652 ------------------------------------------------------------------------*/
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530653 if ( 0 == pClientSTA->atlBAReorderInfo[ucTid].ucExists )
Jeff Johnson295189b2012-06-20 16:38:30 -0700654 {
Madan Mohan Koyyalamudi179e6fe2012-10-15 15:31:08 -0700655 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
Jeff Johnson295189b2012-06-20 16:38:30 -0700656 "WLAN TL:BA session does not exists on WLANTL_BaSessionDel");
657 return VOS_STATUS_E_EXISTS;
658 }
659
660
661 /*------------------------------------------------------------------------
662 Send all pending packets to HDD
663 ------------------------------------------------------------------------*/
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530664 reOrderInfo = &pClientSTA->atlBAReorderInfo[ucTid];
Jeff Johnson295189b2012-06-20 16:38:30 -0700665
666 /*------------------------------------------------------------------------
667 Invalidate reorder info here. This ensures that no packets are
668 bufferd after reorder buffer is cleaned.
669 */
670 lockStatus = vos_lock_acquire(&reOrderInfo->reorderLock);
671 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
672 {
673 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
Arif Hussainf2b00992013-11-17 21:46:15 -0800674 "Unable to acquire reorder vos lock in %s", __func__));
Jeff Johnson295189b2012-06-20 16:38:30 -0700675 return lockStatus;
676 }
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530677 pClientSTA->atlBAReorderInfo[ucTid].ucExists = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700678
679 TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
680 "WLAN TL: Fwd all packets to HDD on WLANTL_BaSessionDel"));
681
682 if(0 == reOrderInfo->ucCIndex)
683 {
684 fwIdx = reOrderInfo->winSize;
685 }
686 else
687 {
688 fwIdx = reOrderInfo->ucCIndex - 1;
689 }
690
691 if(0 != reOrderInfo->pendingFramesCount)
692 {
693 vosStatus = WLANTL_ChainFrontPkts(fwIdx,
694 WLANTL_OPCODE_FWDALL_DROPCUR,
695 &vosDataBuff, reOrderInfo, pTLCb);
696 }
697
698 if ((VOS_STATUS_SUCCESS == vosStatus) && (NULL != vosDataBuff))
699 {
700 TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
701 "WLAN TL: Chaining was successful sending all pkts to HDD : %x",
702 vosDataBuff ));
703
Sravan Kumar Kairam04f093a2017-11-16 19:59:05 +0530704 /* Do replay check before giving packets to upper layer
705 replay check code : check whether replay check is needed or not */
706 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid) {
707 WLANTL_ReorderReplayCheck(pClientSTA, &vosDataBuff, ucTid);
708 }
709
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530710 if ( WLAN_STA_SOFTAP == pClientSTA->wSTADesc.wSTAType )
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 {
712 WLANTL_FwdPktToHDD( pvosGCtx, vosDataBuff, ucSTAId);
713 }
714 else
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 {
716 wRxMetaInfo.ucUP = ucTid;
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530717 pClientSTA->pfnSTARx( pvosGCtx, vosDataBuff, ucSTAId,
Jeff Johnson295189b2012-06-20 16:38:30 -0700718 &wRxMetaInfo );
719 }
720 }
721
Jeff Johnson295189b2012-06-20 16:38:30 -0700722 /*------------------------------------------------------------------------
723 Delete reordering timer
724 ------------------------------------------------------------------------*/
725 if(VOS_TIMER_STATE_RUNNING == vos_timer_getCurrentState(&reOrderInfo->agingTimer))
726 {
727 vosStatus = vos_timer_stop(&reOrderInfo->agingTimer);
728 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
729 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +0530730 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Timer stop fail: %d", vosStatus));
Leo Chang6b6faaf2014-01-24 21:21:26 -0800731 vos_lock_release(&reOrderInfo->reorderLock);
Jeff Johnson295189b2012-06-20 16:38:30 -0700732 return vosStatus;
733 }
734 }
735
736 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&reOrderInfo->agingTimer))
737 {
738 vosStatus = vos_timer_destroy(&reOrderInfo->agingTimer);
739 }
740 else
741 {
742 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Timer is not stopped state current state is %d",
743 vos_timer_getCurrentState(&reOrderInfo->agingTimer)));
744 }
745 if ( VOS_STATUS_SUCCESS != vosStatus )
746 {
747 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
748 "WLAN TL:Failed to destroy reorder timer on WLANTL_BaSessionAdd");
749 }
750
751 /*------------------------------------------------------------------------
752 Delete session
753 ------------------------------------------------------------------------*/
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530754 pClientSTA->atlBAReorderInfo[ucTid].usCount = 0;
755 pClientSTA->atlBAReorderInfo[ucTid].ucCIndex = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700756 reOrderInfo->winSize = 0;
757 reOrderInfo->SSN = 0;
758 reOrderInfo->sessionID = 0;
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +0530759 reOrderInfo->LastSN = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700760
Katya Nigam42e16e82014-02-04 16:28:55 +0530761 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_BA_SESSION_DEL,
762 ucSTAId, ucTid ));
763
Jeff Johnson295189b2012-06-20 16:38:30 -0700764 TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
765 "WLAN TL: BA session deleted for STA: %d TID: %d",
766 ucSTAId, ucTid));
767
768 memset((v_U8_t *)(&reOrderInfo->reorderBuffer->arrayBuffer[0]),
769 0,
770 WLANTL_MAX_WINSIZE * sizeof(v_PVOID_t));
771 reOrderInfo->reorderBuffer->isAvailable = VOS_TRUE;
772
Leo Chang6b6faaf2014-01-24 21:21:26 -0800773 vos_lock_release(&reOrderInfo->reorderLock);
Jeff Johnson295189b2012-06-20 16:38:30 -0700774 return VOS_STATUS_SUCCESS;
775}/* WLANTL_BaSessionDel */
776
777
778/*----------------------------------------------------------------------------
779 INTERACTION WITH TL main module
780 ---------------------------------------------------------------------------*/
781
782/*==========================================================================
783 AMSDU sub-frame processing module
784 ==========================================================================*/
785/*==========================================================================
786 FUNCTION WLANTL_AMSDUProcess
787
788 DESCRIPTION
789 Process A-MSDU sub-frame. Start of chain if marked as first frame.
790 Linked at the end of the existing AMSDU chain.
791
792 DEPENDENCIES
793
794 PARAMETERS
795
796 IN/OUT:
797 vosDataBuff: vos packet for the received data
798 outgoing contains the root of the chain for the rx
799 aggregated MSDU if the frame is marked as last; otherwise
800 NULL
801
802 IN
803 pvosGCtx: pointer to the global vos context; a handle to TL's
804 control block can be extracted from its context
805 pvBDHeader: pointer to the BD header
806 ucSTAId: Station ID
807 ucMPDUHLen: length of the MPDU header
808 usMPDULen: length of the MPDU
809
810 RETURN VALUE
811 The result code associated with performing the operation
812
813 VOS_STATUS_E_INVAL: invalid input parameters
814 VOS_STATUS_E_FAULT: pointer to TL cb is NULL ; access would cause a
815 page fault
816 VOS_STATUS_SUCCESS: Everything is good :)
817
818 Other values can be returned as a result of a function call, please check
819 corresponding API for more info.
820
821 SIDE EFFECTS
822
823============================================================================*/
824VOS_STATUS
825WLANTL_AMSDUProcess
826(
827 v_PVOID_t pvosGCtx,
828 vos_pkt_t** ppVosDataBuff,
829 v_PVOID_t pvBDHeader,
830 v_U8_t ucSTAId,
831 v_U8_t ucMPDUHLen,
832 v_U16_t usMPDULen
833)
834{
835 v_U8_t ucFsf; /* First AMSDU sub frame */
836 v_U8_t ucAef; /* Error in AMSDU sub frame */
837 WLANTL_CbType* pTLCb = NULL;
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530838 WLANTL_STAClientType *pClientSTA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 v_U8_t MPDUHeaderAMSDUHeader[WLANTL_MPDU_HEADER_LEN + TL_AMSDU_SUBFRM_HEADER_LEN];
840 v_U16_t subFrameLength;
841 v_U16_t paddingSize;
842 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
843 v_U16_t MPDUDataOffset;
844 v_U16_t packetLength;
Madan Mohan Koyyalamudidfd6aa82012-10-18 20:18:43 -0700845 static v_U32_t numAMSDUFrames;
Jeff Johnson295189b2012-06-20 16:38:30 -0700846 vos_pkt_t* vosDataBuff;
847 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
848 /*------------------------------------------------------------------------
849 Sanity check
850 ------------------------------------------------------------------------*/
851 if (( NULL == ppVosDataBuff ) || (NULL == *ppVosDataBuff) || ( NULL == pvBDHeader ) ||
852 ( WLANTL_STA_ID_INVALID(ucSTAId)) )
853 {
854 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
855 "WLAN TL:Invalid parameter sent on WLANTL_AMSDUProcess");
856 return VOS_STATUS_E_INVAL;
857 }
858
859 vosDataBuff = *ppVosDataBuff;
860 /*------------------------------------------------------------------------
861 Extract TL control block
862 ------------------------------------------------------------------------*/
863 pTLCb = VOS_GET_TL_CB(pvosGCtx);
864 if ( NULL == pTLCb )
865 {
866 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
867 "WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_AMSDUProcess");
868 return VOS_STATUS_E_FAULT;
869 }
870
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530871 pClientSTA = pTLCb->atlSTAClients[ucSTAId];
872
873 if ( NULL == pClientSTA )
874 {
875 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
876 "WLAN TL:Client Memory was not allocated on %s", __func__));
877 return VOS_STATUS_E_FAILURE;
878 }
879
Jeff Johnson295189b2012-06-20 16:38:30 -0700880 /*------------------------------------------------------------------------
881 Check frame
882 ------------------------------------------------------------------------*/
883 ucAef = (v_U8_t)WDA_GET_RX_AEF( pvBDHeader );
884 ucFsf = (v_U8_t)WDA_GET_RX_ESF( pvBDHeader );
Jeff Johnson295189b2012-06-20 16:38:30 -0700885 /* On Prima, MPDU data offset not includes BD header size */
886 MPDUDataOffset = (v_U16_t)WDA_GET_RX_MPDU_DATA_OFFSET(pvBDHeader);
Jeff Johnson295189b2012-06-20 16:38:30 -0700887
888 if ( WLANHAL_RX_BD_AEF_SET == ucAef )
889 {
890 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
891 "WLAN TL:Error in AMSDU - dropping entire chain"));
892
893 vos_pkt_return_packet(vosDataBuff);
894 *ppVosDataBuff = NULL;
895 return VOS_STATUS_SUCCESS; /*Not a transport error*/
896 }
897
898 if((0 != ucMPDUHLen) && ucFsf)
899 {
900 /*
901 * This is first AMSDU sub frame
902 * AMSDU Header should be removed
903 * MPDU header should be stored into context to recover next frames
904 */
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800905 /* Assumed here Address4 is never part of AMSDU received at TL */
906 if (ucMPDUHLen > WLANTL_MPDU_HEADER_LEN)
907 {
908 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"MPDU Header length (%d) is greater",ucMPDUHLen));
909 vos_pkt_return_packet(vosDataBuff);
910 *ppVosDataBuff = NULL;
911 return VOS_STATUS_SUCCESS; /*Not a transport error*/
912 }
913
Jeff Johnson295189b2012-06-20 16:38:30 -0700914 vStatus = vos_pkt_pop_head(vosDataBuff, MPDUHeaderAMSDUHeader, ucMPDUHLen + TL_AMSDU_SUBFRM_HEADER_LEN);
915 if(!VOS_IS_STATUS_SUCCESS(vStatus))
916 {
917 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Pop MPDU AMSDU Header fail"));
918 vos_pkt_return_packet(vosDataBuff);
919 *ppVosDataBuff = NULL;
920 return VOS_STATUS_SUCCESS; /*Not a transport error*/
921 }
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530922 pClientSTA->ucMPDUHeaderLen = ucMPDUHLen;
Katya Nigam493ff652014-02-11 14:31:04 +0530923 vos_mem_copy(pClientSTA->aucMPDUHeader, MPDUHeaderAMSDUHeader, ucMPDUHLen);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530924 /* AMSDU header stored to handle garbage data within next frame */
Jeff Johnson295189b2012-06-20 16:38:30 -0700925 }
926 else
927 {
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530928 /* Trim garbage, size is frameLoop */
Jeff Johnson295189b2012-06-20 16:38:30 -0700929 if(MPDUDataOffset > 0)
930 {
931 vStatus = vos_pkt_trim_head(vosDataBuff, MPDUDataOffset);
932 }
933 if(!VOS_IS_STATUS_SUCCESS(vStatus))
934 {
935 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Trim Garbage Data fail"));
936 vos_pkt_return_packet(vosDataBuff);
937 *ppVosDataBuff = NULL;
938 return VOS_STATUS_SUCCESS; /*Not a transport error*/
939 }
940
941 /* Remove MPDU header and AMSDU header from the packet */
942 vStatus = vos_pkt_pop_head(vosDataBuff, MPDUHeaderAMSDUHeader, ucMPDUHLen + TL_AMSDU_SUBFRM_HEADER_LEN);
943 if(!VOS_IS_STATUS_SUCCESS(vStatus))
944 {
945 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"AMSDU Header Pop fail"));
946 vos_pkt_return_packet(vosDataBuff);
947 *ppVosDataBuff = NULL;
948 return VOS_STATUS_SUCCESS; /*Not a transport error*/
949 }
950 } /* End of henalding not first sub frame specific */
951
952 /* Put in MPDU header into all the frame */
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530953 vStatus = vos_pkt_push_head(vosDataBuff, pClientSTA->aucMPDUHeader, pClientSTA->ucMPDUHeaderLen);
Jeff Johnson295189b2012-06-20 16:38:30 -0700954 if(!VOS_IS_STATUS_SUCCESS(vStatus))
955 {
956 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"MPDU Header Push back fail"));
957 vos_pkt_return_packet(vosDataBuff);
958 *ppVosDataBuff = NULL;
959 return VOS_STATUS_SUCCESS; /*Not a transport error*/
960 }
961
962 /* Find Padding and remove */
Katya Nigam493ff652014-02-11 14:31:04 +0530963 vos_mem_copy(&subFrameLength, MPDUHeaderAMSDUHeader + ucMPDUHLen + WLANTL_AMSDU_SUBFRAME_LEN_OFFSET, sizeof(v_U16_t));
Jeff Johnson295189b2012-06-20 16:38:30 -0700964 subFrameLength = vos_be16_to_cpu(subFrameLength);
965 paddingSize = usMPDULen - ucMPDUHLen - subFrameLength - TL_AMSDU_SUBFRM_HEADER_LEN;
966
967 vos_pkt_get_packet_length(vosDataBuff, &packetLength);
968 if((paddingSize > 0) && (paddingSize < packetLength))
969 {
970 /* There is padding bits, remove it */
971 vos_pkt_trim_tail(vosDataBuff, paddingSize);
972 }
973 else if(0 == paddingSize)
974 {
975 /* No Padding bits */
976 /* Do Nothing */
977 }
978 else
979 {
980 /* Padding size is larger than Frame size, Actually negative */
981 /* Not a valid case, not a valid frame, drop it */
982 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Padding Size is negative, no possible %d", paddingSize));
983 vos_pkt_return_packet(vosDataBuff);
984 *ppVosDataBuff = NULL;
985 return VOS_STATUS_SUCCESS; /*Not a transport error*/
986 }
987
988 numAMSDUFrames++;
989 if(0 == (numAMSDUFrames % 5000))
990 {
Jeff Johnson0298bd02013-11-14 19:58:38 -0800991 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"%u AMSDU frames arrived", numAMSDUFrames));
Jeff Johnson295189b2012-06-20 16:38:30 -0700992 }
993 return VOS_STATUS_SUCCESS;
994}/* WLANTL_AMSDUProcess */
995
996/*==========================================================================
997 Re-ordering module
998 ==========================================================================*/
999
1000/*==========================================================================
1001 FUNCTION WLANTL_MSDUReorder
1002
1003 DESCRIPTION
1004 MSDU reordering
1005
1006 DEPENDENCIES
1007
1008 PARAMETERS
1009
1010 IN
1011
1012 vosDataBuff: vos packet for the received data
1013 pvBDHeader: pointer to the BD header
1014 ucSTAId: Station ID
1015
1016 RETURN VALUE
1017 The result code associated with performing the operation
1018
1019 VOS_STATUS_SUCCESS: Everything is good :)
1020
1021 SIDE EFFECTS
1022
1023============================================================================*/
1024VOS_STATUS WLANTL_MSDUReorder
1025(
1026 WLANTL_CbType *pTLCb,
1027 vos_pkt_t **vosDataBuff,
1028 v_PVOID_t pvBDHeader,
1029 v_U8_t ucSTAId,
1030 v_U8_t ucTid
1031)
1032{
1033 WLANTL_BAReorderType *currentReorderInfo;
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301034 WLANTL_STAClientType *pClientSTA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001035 vos_pkt_t *vosPktIdx;
1036 v_U8_t ucOpCode;
1037 v_U8_t ucSlotIdx;
1038 v_U8_t ucFwdIdx;
1039 v_U16_t CSN;
1040 v_U32_t ucCIndexOrig;
1041 VOS_STATUS status = VOS_STATUS_SUCCESS;
1042 VOS_STATUS lockStatus = VOS_STATUS_SUCCESS;
1043 VOS_STATUS timerStatus = VOS_STATUS_SUCCESS;
1044 VOS_TIMER_STATE timerState;
1045 v_SIZE_t rxFree;
Jeff Johnson295189b2012-06-20 16:38:30 -07001046 v_U64_t ullreplayCounter = 0; /* 48-bit replay counter */
Dhanashri Atred8c20a32014-01-03 17:20:55 -08001047 v_U8_t ac;
1048 v_U16_t reorderTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07001049 if((NULL == pTLCb) || (*vosDataBuff == NULL))
1050 {
Jeff Johnsonddec6482017-09-19 08:33:57 -07001051 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Invalid ARG pTLCb 0x%pK, vosDataBuff 0x%pK",
Jeff Johnson295189b2012-06-20 16:38:30 -07001052 pTLCb, *vosDataBuff));
1053 return VOS_STATUS_E_INVAL;
1054 }
1055
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301056 pClientSTA = pTLCb->atlSTAClients[ucSTAId];
1057
1058 if ( NULL == pClientSTA )
1059 {
1060 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1061 "WLAN TL:Client Memory was not allocated on %s", __func__));
1062 return VOS_STATUS_E_FAILURE;
1063 }
1064
1065 currentReorderInfo = &pClientSTA->atlBAReorderInfo[ucTid];
Jeff Johnson295189b2012-06-20 16:38:30 -07001066
1067 lockStatus = vos_lock_acquire(&currentReorderInfo->reorderLock);
1068 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1069 {
1070 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1071 return lockStatus;
1072 }
1073
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301074 if( pClientSTA->atlBAReorderInfo[ucTid].ucExists == 0 )
Jeff Johnson295189b2012-06-20 16:38:30 -07001075 {
1076 vos_lock_release(&currentReorderInfo->reorderLock);
1077 return VOS_STATUS_E_INVAL;
1078 }
1079 ucOpCode = (v_U8_t)WDA_GET_RX_REORDER_OPCODE(pvBDHeader);
1080 ucSlotIdx = (v_U8_t)WDA_GET_RX_REORDER_SLOT_IDX(pvBDHeader);
1081 ucFwdIdx = (v_U8_t)WDA_GET_RX_REORDER_FWD_IDX(pvBDHeader);
1082 CSN = (v_U16_t)WDA_GET_RX_REORDER_CUR_PKT_SEQ_NO(pvBDHeader);
1083
Jeff Johnson295189b2012-06-20 16:38:30 -07001084 /* Replay check code : check whether replay check is needed or not */
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301085 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001086 {
1087 /* Getting 48-bit replay counter from the RX BD */
Sravan Kumar Kairam8bb90ca2017-11-01 19:00:23 +05301088 ullreplayCounter = WDA_DS_GetReplayCounter(pvBDHeader);
Jeff Johnson295189b2012-06-20 16:38:30 -07001089 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001090
1091#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1092 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"opCode %d SI %d, FI %d, CI %d seqNo %d", ucOpCode, ucSlotIdx, ucFwdIdx, currentReorderInfo->ucCIndex, CSN));
1093#else
1094 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"opCode %d SI %d, FI %d, CI %d seqNo %d", ucOpCode, ucSlotIdx, ucFwdIdx, currentReorderInfo->ucCIndex, CSN));
1095#endif
1096
1097 // remember our current CI so that later we can tell if it advanced
1098 ucCIndexOrig = currentReorderInfo->ucCIndex;
1099
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301100 switch(ucOpCode)
Jeff Johnson295189b2012-06-20 16:38:30 -07001101 {
1102 case WLANTL_OPCODE_INVALID:
1103 /* Do nothing just pass through current frame */
1104 break;
1105
1106 case WLANTL_OPCODE_QCUR_FWDBUF:
Sravan Kumar Kairama97e2372016-11-11 17:20:03 +05301107 if ((currentReorderInfo->LastSN > CSN) &&
1108 !(currentReorderInfo->set_data_filter))
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301109 {
1110 if ((currentReorderInfo->LastSN - CSN) < CSN_WRAP_AROUND_THRESHOLD)
1111 {
1112 //this frame is received after BA timer is expired, discard it
1113 TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
1114 "(QCUR_FWDBUF) dropping old frame, SN=%d LastSN=%d",
1115 CSN, currentReorderInfo->LastSN));
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05301116 if (vos_is_arp_pkt((*vosDataBuff)->pSkb, true))
1117 vos_update_arp_rx_drop_reorder();
1118
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301119 status = vos_pkt_return_packet(*vosDataBuff);
1120 if (!VOS_IS_STATUS_SUCCESS(status))
1121 {
1122 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1123 "(QCUR_FWDBUF) drop old frame fail %d", status));
1124 }
1125 *vosDataBuff = NULL;
1126 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1127 if (!VOS_IS_STATUS_SUCCESS(lockStatus))
1128 {
1129 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1130 "WLANTL_MSDUReorder, Release LOCK Fail"));
1131 return lockStatus;
1132 }
1133 return status;
1134 }
1135 }
1136 currentReorderInfo->LastSN = CSN;
Jeff Johnson295189b2012-06-20 16:38:30 -07001137 if(0 == currentReorderInfo->pendingFramesCount)
1138 {
1139 //This frame will be fwd'ed to the OS. The next slot is the one we expect next
1140 currentReorderInfo->ucCIndex = (ucSlotIdx + 1) % currentReorderInfo->winSize;
1141 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1142 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1143 {
1144 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1145 return lockStatus;
1146 }
1147 return status;
1148 }
1149 status = WLANTL_QueueCurrent(currentReorderInfo,
1150 vosDataBuff,
1151 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301152 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001153 {
1154 WLANTL_FillReplayCounter(currentReorderInfo,
1155 ullreplayCounter, ucSlotIdx);
1156 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001157 if(VOS_STATUS_E_RESOURCES == status)
1158 {
Bhargav Shahb70c4692015-12-07 17:17:58 +05301159 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1160 currentReorderInfo->sessionID , ucOpCode ));
1161
Jeff Johnson295189b2012-06-20 16:38:30 -07001162 /* This is the case slot index is already cycle one route, route all the frames Qed */
1163 vosPktIdx = NULL;
1164 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1165 WLANTL_OPCODE_FWDALL_QCUR,
1166 &vosPktIdx,
1167 currentReorderInfo,
1168 pTLCb);
1169 if(!VOS_IS_STATUS_SUCCESS(status))
1170 {
1171 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1172 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1173 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1174 {
1175 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1176 return lockStatus;
1177 }
1178 return status;
1179 }
1180 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1181 *vosDataBuff = vosPktIdx;
1182 currentReorderInfo->pendingFramesCount = 0;
1183 }
1184 else
1185 {
1186 vosPktIdx = NULL;
1187 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1188 WLANTL_OPCODE_QCUR_FWDBUF,
1189 &vosPktIdx,
1190 currentReorderInfo,
1191 pTLCb);
1192 if(!VOS_IS_STATUS_SUCCESS(status))
1193 {
1194 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1195 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1196 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1197 {
1198 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1199 return lockStatus;
1200 }
1201 return status;
1202 }
Leo Chang2301cff2014-01-03 20:31:46 -08001203 currentReorderInfo->ucCIndex = ucFwdIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07001204 *vosDataBuff = vosPktIdx;
1205 }
1206 break;
1207
1208 case WLANTL_OPCODE_FWDBUF_FWDCUR:
1209 vosPktIdx = NULL;
1210 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1211 WLANTL_OPCODE_FWDBUF_FWDCUR,
1212 &vosPktIdx,
1213 currentReorderInfo,
1214 pTLCb);
1215 if(!VOS_IS_STATUS_SUCCESS(status))
1216 {
1217 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1218 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1219 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1220 {
1221 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1222 return lockStatus;
1223 }
1224 return status;
1225 }
1226
1227 if(NULL == vosPktIdx)
1228 {
Arif Hussainf2b00992013-11-17 21:46:15 -08001229 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Nothing to chain, just send current frame"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001230 }
1231 else
1232 {
1233 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1234 if(!VOS_IS_STATUS_SUCCESS(status))
1235 {
1236 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain with CUR frame fail %d",
1237 status));
1238 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1239 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1240 {
1241 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1242 return lockStatus;
1243 }
1244 return status;
1245 }
1246 *vosDataBuff = vosPktIdx;
1247 }
1248 //ucFwdIdx is the slot this packet supposes to take but there is a hole there
1249 //It looks that the chip will put the next packet into the slot ucFwdIdx.
1250 currentReorderInfo->ucCIndex = ucFwdIdx;
1251 break;
1252
1253 case WLANTL_OPCODE_QCUR:
Sravan Kumar Kairama97e2372016-11-11 17:20:03 +05301254 if ((currentReorderInfo->LastSN > CSN) &&
1255 !(currentReorderInfo->set_data_filter))
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301256 {
1257 if ((currentReorderInfo->LastSN - CSN) < CSN_WRAP_AROUND_THRESHOLD)
1258 {
1259 // this frame is received after BA timer is expired, so disard it
1260 TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
1261 "(QCUR) dropping old frame, SN=%d LastSN=%d",
1262 CSN, currentReorderInfo->LastSN));
1263 status = vos_pkt_return_packet(*vosDataBuff);
1264 if (!VOS_IS_STATUS_SUCCESS(status))
1265 {
1266 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1267 "*** (QCUR) drop old frame fail %d", status));
1268 }
1269 *vosDataBuff = NULL;
1270 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1271 if (!VOS_IS_STATUS_SUCCESS(lockStatus))
1272 {
1273 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1274 "WLANTL_MSDUReorder, Release LOCK Fail"));
1275 return lockStatus;
1276 }
1277 return status;
1278 }
1279 }
1280
Jeff Johnson295189b2012-06-20 16:38:30 -07001281 status = WLANTL_QueueCurrent(currentReorderInfo,
1282 vosDataBuff,
1283 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301284 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001285 {
1286 WLANTL_FillReplayCounter(currentReorderInfo,
1287 ullreplayCounter, ucSlotIdx);
1288 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001289 if(VOS_STATUS_E_RESOURCES == status)
1290 {
Bhargav Shahb70c4692015-12-07 17:17:58 +05301291 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1292 currentReorderInfo->sessionID , ucOpCode ));
1293
Jeff Johnson295189b2012-06-20 16:38:30 -07001294 /* This is the case slot index is already cycle one route, route all the frames Qed */
1295 vosPktIdx = NULL;
1296 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1297 WLANTL_OPCODE_FWDALL_QCUR,
1298 &vosPktIdx,
1299 currentReorderInfo,
1300 pTLCb);
1301 if(!VOS_IS_STATUS_SUCCESS(status))
1302 {
1303 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1304 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1305 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1306 {
1307 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1308 return lockStatus;
1309 }
1310 return status;
1311 }
1312 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1313 *vosDataBuff = vosPktIdx;
1314 currentReorderInfo->pendingFramesCount = 0;
1315 }
1316 else
1317 {
1318 /* Since current Frame is Qed, no frame will be routed */
1319 *vosDataBuff = NULL;
1320 }
1321 break;
1322
1323 case WLANTL_OPCODE_FWDBUF_QUEUECUR:
1324 vosPktIdx = NULL;
1325 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1326 WLANTL_OPCODE_FWDBUF_QUEUECUR,
1327 &vosPktIdx,
1328 currentReorderInfo,
1329 pTLCb);
1330 if(!VOS_IS_STATUS_SUCCESS(status))
1331 {
1332 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1333 status));
1334 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1335 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1336 {
1337 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1338 return lockStatus;
1339 }
1340 return status;
1341 }
1342 //This opCode means the window shift. Enforce the current Index
1343 currentReorderInfo->ucCIndex = ucFwdIdx;
1344
1345 status = WLANTL_QueueCurrent(currentReorderInfo,
1346 vosDataBuff,
1347 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301348 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001349 {
1350 WLANTL_FillReplayCounter(currentReorderInfo,
1351 ullreplayCounter, ucSlotIdx);
1352 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001353 if(VOS_STATUS_E_RESOURCES == status)
1354 {
Bhargav Shahb70c4692015-12-07 17:17:58 +05301355 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1356 currentReorderInfo->sessionID , ucOpCode ));
1357
Jeff Johnson295189b2012-06-20 16:38:30 -07001358 vos_pkt_return_packet(vosPktIdx);
1359 /* This is the case slot index is already cycle one route, route all the frames Qed */
1360 vosPktIdx = NULL;
1361 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1362 WLANTL_OPCODE_FWDALL_QCUR,
1363 &vosPktIdx,
1364 currentReorderInfo,
1365 pTLCb);
1366 if(!VOS_IS_STATUS_SUCCESS(status))
1367 {
1368 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1369 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1370 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1371 {
1372 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1373 return lockStatus;
1374 }
1375 return status;
1376 }
1377 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1378 *vosDataBuff = vosPktIdx;
1379 currentReorderInfo->pendingFramesCount = 0;
1380 }
1381 *vosDataBuff = vosPktIdx;
1382 break;
1383
1384 case WLANTL_OPCODE_FWDBUF_DROPCUR:
1385 vosPktIdx = NULL;
1386 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1387 WLANTL_OPCODE_FWDBUF_DROPCUR,
1388 &vosPktIdx,
1389 currentReorderInfo,
1390 pTLCb);
1391 if(!VOS_IS_STATUS_SUCCESS(status))
1392 {
1393 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1394 status));
1395 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1396 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1397 {
1398 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1399 return lockStatus;
1400 }
1401 return status;
1402 }
1403
1404 //Since BAR frame received, set the index to the right location
1405 currentReorderInfo->ucCIndex = ucFwdIdx;
1406
1407 /* Current frame has to be dropped, BAR frame */
1408 status = vos_pkt_return_packet(*vosDataBuff);
1409 if(!VOS_IS_STATUS_SUCCESS(status))
1410 {
1411 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Drop BAR frame fail %d",
1412 status));
1413 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1414 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1415 {
1416 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1417 return lockStatus;
1418 }
1419 return status;
1420 }
1421 *vosDataBuff = vosPktIdx;
1422 break;
1423
1424 case WLANTL_OPCODE_FWDALL_DROPCUR:
1425 vosPktIdx = NULL;
1426 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1427 WLANTL_OPCODE_FWDALL_DROPCUR,
1428 &vosPktIdx,
1429 currentReorderInfo,
1430 pTLCb);
1431 if(!VOS_IS_STATUS_SUCCESS(status))
1432 {
1433 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1434 status));
1435 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1436 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1437 {
1438 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1439 return lockStatus;
1440 }
1441 return status;
1442 }
1443
1444 //Since BAR frame received and beyond cur window, set the index to the right location
1445 currentReorderInfo->ucCIndex = 0;
1446
1447 status = vos_pkt_return_packet(*vosDataBuff);
1448 if(!VOS_IS_STATUS_SUCCESS(status))
1449 {
1450 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Drop BAR frame fail %d",
1451 status));
1452 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1453 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1454 {
1455 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1456 return lockStatus;
1457 }
1458 return status;
1459 }
1460
1461 *vosDataBuff = vosPktIdx;
1462 break;
1463
1464 case WLANTL_OPCODE_FWDALL_QCUR:
1465 vosPktIdx = NULL;
1466 status = WLANTL_ChainFrontPkts(currentReorderInfo->winSize,
1467 WLANTL_OPCODE_FWDALL_DROPCUR,
1468 &vosPktIdx,
1469 currentReorderInfo,
1470 pTLCb);
1471 if(!VOS_IS_STATUS_SUCCESS(status))
1472 {
1473 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1474 status));
1475 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1476 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1477 {
1478 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1479 return lockStatus;
1480 }
1481 return status;
1482 }
1483 status = WLANTL_QueueCurrent(currentReorderInfo,
1484 vosDataBuff,
1485 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301486 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001487 {
1488 WLANTL_FillReplayCounter(currentReorderInfo,
1489 ullreplayCounter, ucSlotIdx);
1490 }
Bhargav Shahb70c4692015-12-07 17:17:58 +05301491
1492 if(VOS_STATUS_E_RESOURCES == status)
1493 {
1494 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1495 currentReorderInfo->sessionID , ucOpCode ));
1496 }
1497
Jeff Johnson295189b2012-06-20 16:38:30 -07001498 if(!VOS_IS_STATUS_SUCCESS(status))
1499 {
1500 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Q Current frame fail %d",
1501 status));
1502 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1503 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1504 {
1505 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1506 return lockStatus;
1507 }
1508 return status;
1509 }
1510 currentReorderInfo->ucCIndex = ucSlotIdx;
1511 *vosDataBuff = vosPktIdx;
1512 break;
1513
1514 case WLANTL_OPCODE_TEARDOWN:
1515 // do we have a procedure in place to teardown BA?
1516
1517 // fall through to drop the current packet
1518 case WLANTL_OPCODE_DROPCUR:
1519 vos_pkt_return_packet(*vosDataBuff);
1520 *vosDataBuff = NULL;
1521 break;
1522
1523 default:
1524 break;
1525 }
1526
1527 /* Check the available VOS RX buffer size
1528 * If remaining VOS RX buffer is too few, have to make space
1529 * Route all the Qed frames upper layer
1530 * Otherwise, RX thread could be stall */
1531 vos_pkt_get_available_buffer_pool(VOS_PKT_TYPE_RX_RAW, &rxFree);
Yue Mad8cac142013-03-28 11:33:46 -07001532 if(WLANTL_BA_MIN_FREE_RX_VOS_BUFFER >= rxFree)
Jeff Johnson295189b2012-06-20 16:38:30 -07001533 {
Yue Ma13da2012013-05-27 17:42:05 -07001534 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO, "RX Free: %d", rxFree));
1535 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO, "RX free buffer count is too low, Pending frame count is %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07001536 currentReorderInfo->pendingFramesCount));
1537 vosPktIdx = NULL;
1538 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1539 WLANTL_OPCODE_FWDALL_DROPCUR,
1540 &vosPktIdx,
1541 currentReorderInfo,
1542 pTLCb);
1543 if(!VOS_IS_STATUS_SUCCESS(status))
1544 {
1545 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1546 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1547 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1548 {
1549 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1550 return lockStatus;
1551 }
1552 return status;
1553 }
1554 if(NULL != *vosDataBuff)
1555 {
1556 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Already something, Chain it"));
1557 vos_pkt_chain_packet(*vosDataBuff, vosPktIdx, 1);
1558 }
1559 else
1560 {
1561 *vosDataBuff = vosPktIdx;
1562 }
1563 currentReorderInfo->pendingFramesCount = 0;
1564 }
1565
1566 /*
1567 * Current aging timer logic:
1568 * 1) if we forwarded any packets and the timer is running:
1569 * stop the timer
1570 * 2) if there are packets queued and the timer is not running:
1571 * start the timer
Leo Chang2301cff2014-01-03 20:31:46 -08001572 * 3) if timer is running and no pending frame:
1573 * stop the timer
Jeff Johnson295189b2012-06-20 16:38:30 -07001574 */
1575 timerState = vos_timer_getCurrentState(&currentReorderInfo->agingTimer);
1576 if ((VOS_TIMER_STATE_RUNNING == timerState) &&
Leo Chang2301cff2014-01-03 20:31:46 -08001577 ((ucCIndexOrig != currentReorderInfo->ucCIndex) ||
1578 (0 == currentReorderInfo->pendingFramesCount)))
Jeff Johnson295189b2012-06-20 16:38:30 -07001579 {
1580 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"HOLE filled, Pending Frames Count %d",
1581 currentReorderInfo->pendingFramesCount));
1582
1583 // we forwarded some packets so stop aging the current hole
1584 timerStatus = vos_timer_stop(&currentReorderInfo->agingTimer);
1585 timerState = VOS_TIMER_STATE_STOPPED;
1586
1587 // ignore the returned status since there is a race condition
1588 // whereby between the time we called getCurrentState() and the
1589 // time we call stop() the timer could have fired. In that case
1590 // stop() will return an error, but we don't care since the
1591 // timer has stopped
1592 }
1593
1594 if (currentReorderInfo->pendingFramesCount > 0)
1595 {
1596 if (VOS_TIMER_STATE_STOPPED == timerState)
1597 {
1598 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"There is a new HOLE, Pending Frames Count %d",
1599 currentReorderInfo->pendingFramesCount));
Dhanashri Atred8c20a32014-01-03 17:20:55 -08001600 ac = WLANTL_TID_2_AC[ucTid];
1601 if (WLANTL_AC_INVALID(ac))
1602 {
1603 reorderTime = WLANTL_BA_REORDERING_AGING_TIMER;
1604 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Invalid AC %d using default reorder time %d",
1605 ac, reorderTime));
1606 }
1607 else
1608 {
1609 reorderTime = pTLCb->tlConfigInfo.ucReorderAgingTime[ac];
1610 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001611 timerStatus = vos_timer_start(&currentReorderInfo->agingTimer,
Dhanashri Atred8c20a32014-01-03 17:20:55 -08001612 reorderTime);
Jeff Johnson295189b2012-06-20 16:38:30 -07001613 if(!VOS_IS_STATUS_SUCCESS(timerStatus))
1614 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301615 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Timer start fail: %d", timerStatus));
Jeff Johnson295189b2012-06-20 16:38:30 -07001616 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1617 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1618 {
1619 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1620 return lockStatus;
1621 }
1622 return timerStatus;
1623 }
1624 }
1625 else
1626 {
1627 // we didn't forward any packets and the timer was already
1628 // running so we're still aging the same hole
1629 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Still HOLE, Pending Frames Count %d",
1630 currentReorderInfo->pendingFramesCount));
1631 }
1632 }
1633
1634 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1635 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1636 {
1637 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1638 return lockStatus;
1639 }
1640 return VOS_STATUS_SUCCESS;
1641}/* WLANTL_MSDUReorder */
1642
1643
1644/*==========================================================================
1645 Utility functions
1646 ==========================================================================*/
1647
1648/*==========================================================================
1649
1650 FUNCTION WLANTL_QueueCurrent
1651
1652 DESCRIPTION
1653 It will queue a packet at a given slot index in the MSDU reordering list.
1654
1655 DEPENDENCIES
1656
1657 PARAMETERS
1658
1659 IN
1660 pwBaReorder: pointer to the BA reordering session info
1661 vosDataBuff: data buffer to be queued
1662 ucSlotIndex: slot index
1663
1664 RETURN VALUE
1665 The result code associated with performing the operation
1666
1667 VOS_STATUS_SUCCESS: Everything is OK
1668
1669
1670 SIDE EFFECTS
1671
1672============================================================================*/
1673VOS_STATUS WLANTL_QueueCurrent
1674(
1675 WLANTL_BAReorderType* pwBaReorder,
1676 vos_pkt_t** vosDataBuff,
1677 v_U8_t ucSlotIndex
1678)
1679{
1680 VOS_STATUS status = VOS_STATUS_SUCCESS;
1681
Jeff Johnsonddec6482017-09-19 08:33:57 -07001682 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"vos Packet has to be Qed 0x%pK",
Jeff Johnson295189b2012-06-20 16:38:30 -07001683 *vosDataBuff));
1684 if(NULL != pwBaReorder->reorderBuffer->arrayBuffer[ucSlotIndex])
1685 {
Katya Nigam42e16e82014-02-04 16:28:55 +05301686 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1687 pwBaReorder->sessionID , pwBaReorder->pendingFramesCount ));
1688
Bhargav Shahb70c4692015-12-07 17:17:58 +05301689 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1690 pwBaReorder->sessionID , ucSlotIndex ));
1691
Bhargav Shah2c894fe2016-02-10 16:02:23 +05301692 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"One Cycle rounded, lost many frames already, not in Q %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07001693 pwBaReorder->pendingFramesCount));
1694 return VOS_STATUS_E_RESOURCES;
1695 }
1696
1697 pwBaReorder->reorderBuffer->arrayBuffer[ucSlotIndex] =
1698 (v_PVOID_t)(*vosDataBuff);
1699 pwBaReorder->pendingFramesCount++;
1700 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Assigned, Pending Frames %d at slot %d, dataPtr 0x%x",
1701 pwBaReorder->pendingFramesCount,
1702 ucSlotIndex,
1703 pwBaReorder->reorderBuffer->arrayBuffer[ucSlotIndex]));
1704
1705 return status;
1706}/*WLANTL_QueueCurrent*/
1707
1708/*==========================================================================
1709
1710 FUNCTION WLANTL_ChainFrontPkts
1711
1712 DESCRIPTION
1713 It will remove all the packets from the front of a vos list and chain
1714 them to a vos pkt .
1715
1716 DEPENDENCIES
1717
1718 PARAMETERS
1719
1720 IN
1721 ucCount: number of packets to extract
1722 pwBaReorder: pointer to the BA reordering session info
1723
1724 OUT
1725 vosDataBuff: data buffer containing the extracted chain of packets
1726
1727 RETURN VALUE
1728 The result code associated with performing the operation
1729
1730 VOS_STATUS_SUCCESS: Everything is OK
1731
1732
1733 SIDE EFFECTS
1734
1735============================================================================*/
1736VOS_STATUS WLANTL_ChainFrontPkts
1737(
1738 v_U32_t fwdIndex,
1739 v_U8_t opCode,
1740 vos_pkt_t **vosDataBuff,
1741 WLANTL_BAReorderType *pwBaReorder,
1742 WLANTL_CbType *pTLCb
1743)
1744{
1745 VOS_STATUS status = VOS_STATUS_SUCCESS;
1746 v_U32_t idx;
1747 v_PVOID_t currentDataPtr = NULL;
1748 int negDetect;
1749#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1750#define WLANTL_OUT_OF_WINDOW_IDX 65
1751 v_U32_t frameIdx[2] = {0, 0}, ffidx = fwdIndex, idx2 = WLANTL_OUT_OF_WINDOW_IDX;
1752 int pending = pwBaReorder->pendingFramesCount, start = WLANTL_OUT_OF_WINDOW_IDX, end;
1753#endif
1754
1755 if(pwBaReorder->ucCIndex >= fwdIndex)
1756 {
1757 fwdIndex += pwBaReorder->winSize;
1758 }
1759
1760 if((WLANTL_OPCODE_FWDALL_DROPCUR == opCode) ||
1761 (WLANTL_OPCODE_FWDALL_QCUR == opCode))
1762 {
1763 fwdIndex = pwBaReorder->ucCIndex + pwBaReorder->winSize;
1764 }
1765
Jeff Johnsonddec6482017-09-19 08:33:57 -07001766 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Current Index %d, FWD Index %d, reorderBuffer 0x%pK",
Jeff Johnson295189b2012-06-20 16:38:30 -07001767 pwBaReorder->ucCIndex % pwBaReorder->winSize,
1768 fwdIndex % pwBaReorder->winSize,
1769 pwBaReorder->reorderBuffer));
1770
1771 negDetect = pwBaReorder->pendingFramesCount;
1772 for(idx = pwBaReorder->ucCIndex; idx <= fwdIndex; idx++)
1773 {
1774 currentDataPtr =
1775 pwBaReorder->reorderBuffer->arrayBuffer[idx % pwBaReorder->winSize];
1776 if(NULL != currentDataPtr)
1777 {
1778#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1779 idx2 = (idx >= pwBaReorder->winSize) ? (idx - pwBaReorder->winSize) : idx;
1780 frameIdx[idx2 / 32] |= 1 << (idx2 % 32);
1781 if(start == WLANTL_OUT_OF_WINDOW_IDX) start = idx2;
1782#endif
1783 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"There is buffered frame %d",
1784 idx % pwBaReorder->winSize));
1785 if(NULL == *vosDataBuff)
1786 {
1787 *vosDataBuff = (vos_pkt_t *)currentDataPtr;
1788 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"This is new head %d",
1789 idx % pwBaReorder->winSize));
1790 }
1791 else
1792 {
1793 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"There is bufered Just add %d",
1794 idx % pwBaReorder->winSize));
1795 vos_pkt_chain_packet(*vosDataBuff,
1796 (vos_pkt_t *)currentDataPtr,
1797 VOS_TRUE);
1798 }
1799 pwBaReorder->reorderBuffer->arrayBuffer[idx % pwBaReorder->winSize]
1800 = NULL;
1801 pwBaReorder->pendingFramesCount--;
1802 negDetect--;
1803 if(negDetect < 0)
1804 {
Arif Hussainf2b00992013-11-17 21:46:15 -08001805 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"This is not possible, some balance has problem"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001806 VOS_ASSERT(0);
1807 return VOS_STATUS_E_FAULT;
1808 }
1809 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Slot Index %d, set as NULL, Pending Frames %d",
1810 idx % pwBaReorder->winSize,
1811 pwBaReorder->pendingFramesCount
1812 ));
1813 pwBaReorder->ucCIndex = (idx + 1) % pwBaReorder->winSize;
1814 }
1815 else
1816 {
1817 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Empty Array %d",
1818 idx % pwBaReorder->winSize));
1819 }
1820 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Current Index %d, winSize %d",
1821 pwBaReorder->ucCIndex,
1822 pwBaReorder->winSize
1823 ));
1824 }
1825
1826#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1827 end = idx2;
1828
1829 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Fwd 0x%08X-%08X opCode %d fwdIdx %d windowSize %d pending frame %d fw no. %d from idx %d to %d",
1830 frameIdx[1], frameIdx[0], opCode, ffidx, pwBaReorder->winSize, pending, pending - negDetect, start, end));
1831#endif
1832
1833 return status;
1834}/*WLANTL_ChainFrontPkts*/
Jeff Johnson295189b2012-06-20 16:38:30 -07001835/*==========================================================================
1836
1837 FUNCTION WLANTL_FillReplayCounter
1838
1839 DESCRIPTION
1840 It will fill repaly counter at a given slot index in the MSDU reordering list.
1841
1842 DEPENDENCIES
1843
1844 PARAMETERS
1845
1846 IN
1847 pwBaReorder : pointer to the BA reordering session info
1848 replayCounter: replay counter to be filled
1849 ucSlotIndex : slot index
1850
1851 RETURN VALUE
1852 NONE
1853
1854
1855 SIDE EFFECTS
1856 NONE
1857
1858 ============================================================================*/
1859void WLANTL_FillReplayCounter
1860(
1861 WLANTL_BAReorderType* pwBaReorder,
1862 v_U64_t ullreplayCounter,
1863 v_U8_t ucSlotIndex
1864)
1865{
1866
1867 //BAMSGDEBUG("replay counter to be filled in Qed frames %llu",
1868 //replayCounter, 0, 0);
1869
1870 pwBaReorder->reorderBuffer->ullReplayCounter[ucSlotIndex] = ullreplayCounter;
1871 //BAMSGDEBUG("Assigned, replay counter Pending Frames %d at slot %d, replay counter[0x%llX]\n",
1872 //pwBaReorder->pendingFramesCount,
1873 //ucSlotIndex,
1874 //pwBaReorder->reorderBuffer->ullReplayCounter);
1875 return;
1876}/*WLANTL_FillReplayCounter*/
Jeff Johnson295189b2012-06-20 16:38:30 -07001877
Sravan Kumar Kairam04f093a2017-11-16 19:59:05 +05301878void WLANTL_ReorderReplayCheck(WLANTL_STAClientType *pClientSTA,
1879 vos_pkt_t **vosDataBuff, v_U8_t ucTid)
1880{
1881 vos_pkt_t *pVosCurPkt;
1882 vos_pkt_t *pNextVosPkt;
1883 vos_pkt_t *pVosHeadPkt = NULL;
1884 vos_pkt_t *pfreeVosPkt = NULL;
1885 v_U64_t prevReplayCounter = 0;
1886 v_BOOL_t status;
1887
1888 pVosCurPkt = *vosDataBuff;
1889
1890 do {
1891 vos_pkt_walk_packet_chain(pVosCurPkt, &pNextVosPkt, VOS_FALSE);
1892 prevReplayCounter = pClientSTA->ullReplayCounter[ucTid];
1893 status = WLANTL_IsReplayPacket(pVosCurPkt->pn_num,
1894 prevReplayCounter);
1895 if(VOS_FALSE == status) {
1896 pClientSTA->ullReplayCounter[ucTid] = pVosCurPkt->pn_num;
1897 pVosHeadPkt = pVosCurPkt;
1898 } else {
1899 VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1900 "%s: Non-AMSDU Drop the replay packet PN: [0x%llX]",
1901 __func__, pVosCurPkt->pn_num);
1902 pClientSTA->ulTotalReplayPacketsDetected++;
1903
1904 pfreeVosPkt = pVosCurPkt;
1905 pfreeVosPkt->pNext = NULL;
1906 vos_pkt_return_packet(pfreeVosPkt);
1907
1908 if (pVosHeadPkt != NULL) {
1909 pVosHeadPkt->pNext = pNextVosPkt;
1910 }
1911 else {
1912 *vosDataBuff = pNextVosPkt;
1913 }
1914 }
1915
1916 pVosCurPkt = pNextVosPkt;
1917 } while (pVosCurPkt);
1918}