blob: db290d4a1c625336473c15c18ac9a03b1b4f0e9a [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;
Dundi Raviteja09daf5f2021-03-05 21:03:57 +0530847 uint8_t llc_hdr[6] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
848
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
850 /*------------------------------------------------------------------------
851 Sanity check
852 ------------------------------------------------------------------------*/
853 if (( NULL == ppVosDataBuff ) || (NULL == *ppVosDataBuff) || ( NULL == pvBDHeader ) ||
854 ( WLANTL_STA_ID_INVALID(ucSTAId)) )
855 {
856 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
857 "WLAN TL:Invalid parameter sent on WLANTL_AMSDUProcess");
858 return VOS_STATUS_E_INVAL;
859 }
860
861 vosDataBuff = *ppVosDataBuff;
862 /*------------------------------------------------------------------------
863 Extract TL control block
864 ------------------------------------------------------------------------*/
865 pTLCb = VOS_GET_TL_CB(pvosGCtx);
866 if ( NULL == pTLCb )
867 {
868 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
869 "WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_AMSDUProcess");
870 return VOS_STATUS_E_FAULT;
871 }
872
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530873 pClientSTA = pTLCb->atlSTAClients[ucSTAId];
874
875 if ( NULL == pClientSTA )
876 {
877 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
878 "WLAN TL:Client Memory was not allocated on %s", __func__));
879 return VOS_STATUS_E_FAILURE;
880 }
881
Jeff Johnson295189b2012-06-20 16:38:30 -0700882 /*------------------------------------------------------------------------
883 Check frame
884 ------------------------------------------------------------------------*/
885 ucAef = (v_U8_t)WDA_GET_RX_AEF( pvBDHeader );
886 ucFsf = (v_U8_t)WDA_GET_RX_ESF( pvBDHeader );
Jeff Johnson295189b2012-06-20 16:38:30 -0700887 /* On Prima, MPDU data offset not includes BD header size */
888 MPDUDataOffset = (v_U16_t)WDA_GET_RX_MPDU_DATA_OFFSET(pvBDHeader);
Jeff Johnson295189b2012-06-20 16:38:30 -0700889
890 if ( WLANHAL_RX_BD_AEF_SET == ucAef )
891 {
892 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
893 "WLAN TL:Error in AMSDU - dropping entire chain"));
894
895 vos_pkt_return_packet(vosDataBuff);
896 *ppVosDataBuff = NULL;
897 return VOS_STATUS_SUCCESS; /*Not a transport error*/
898 }
899
900 if((0 != ucMPDUHLen) && ucFsf)
901 {
902 /*
903 * This is first AMSDU sub frame
904 * AMSDU Header should be removed
905 * MPDU header should be stored into context to recover next frames
906 */
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800907 /* Assumed here Address4 is never part of AMSDU received at TL */
908 if (ucMPDUHLen > WLANTL_MPDU_HEADER_LEN)
909 {
910 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"MPDU Header length (%d) is greater",ucMPDUHLen));
911 vos_pkt_return_packet(vosDataBuff);
912 *ppVosDataBuff = NULL;
913 return VOS_STATUS_SUCCESS; /*Not a transport error*/
914 }
915
Jeff Johnson295189b2012-06-20 16:38:30 -0700916 vStatus = vos_pkt_pop_head(vosDataBuff, MPDUHeaderAMSDUHeader, ucMPDUHLen + TL_AMSDU_SUBFRM_HEADER_LEN);
917 if(!VOS_IS_STATUS_SUCCESS(vStatus))
918 {
919 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Pop MPDU AMSDU Header fail"));
920 vos_pkt_return_packet(vosDataBuff);
921 *ppVosDataBuff = NULL;
922 return VOS_STATUS_SUCCESS; /*Not a transport error*/
923 }
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530924 pClientSTA->ucMPDUHeaderLen = ucMPDUHLen;
Katya Nigam493ff652014-02-11 14:31:04 +0530925 vos_mem_copy(pClientSTA->aucMPDUHeader, MPDUHeaderAMSDUHeader, ucMPDUHLen);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530926 /* AMSDU header stored to handle garbage data within next frame */
Dundi Raviteja09daf5f2021-03-05 21:03:57 +0530927 pClientSTA->drop_amsdu = false;
Jeff Johnson295189b2012-06-20 16:38:30 -0700928 }
929 else
930 {
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530931 /* Trim garbage, size is frameLoop */
Jeff Johnson295189b2012-06-20 16:38:30 -0700932 if(MPDUDataOffset > 0)
933 {
934 vStatus = vos_pkt_trim_head(vosDataBuff, MPDUDataOffset);
935 }
936 if(!VOS_IS_STATUS_SUCCESS(vStatus))
937 {
938 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Trim Garbage Data fail"));
939 vos_pkt_return_packet(vosDataBuff);
940 *ppVosDataBuff = NULL;
941 return VOS_STATUS_SUCCESS; /*Not a transport error*/
942 }
943
944 /* Remove MPDU header and AMSDU header from the packet */
945 vStatus = vos_pkt_pop_head(vosDataBuff, MPDUHeaderAMSDUHeader, ucMPDUHLen + TL_AMSDU_SUBFRM_HEADER_LEN);
946 if(!VOS_IS_STATUS_SUCCESS(vStatus))
947 {
948 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"AMSDU Header Pop fail"));
949 vos_pkt_return_packet(vosDataBuff);
950 *ppVosDataBuff = NULL;
951 return VOS_STATUS_SUCCESS; /*Not a transport error*/
952 }
953 } /* End of henalding not first sub frame specific */
954
955 /* Put in MPDU header into all the frame */
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +0530956 vStatus = vos_pkt_push_head(vosDataBuff, pClientSTA->aucMPDUHeader, pClientSTA->ucMPDUHeaderLen);
Jeff Johnson295189b2012-06-20 16:38:30 -0700957 if(!VOS_IS_STATUS_SUCCESS(vStatus))
958 {
959 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"MPDU Header Push back fail"));
960 vos_pkt_return_packet(vosDataBuff);
961 *ppVosDataBuff = NULL;
962 return VOS_STATUS_SUCCESS; /*Not a transport error*/
963 }
964
Dundi Raviteja09daf5f2021-03-05 21:03:57 +0530965 if (pClientSTA->drop_amsdu) {
966 vos_pkt_return_packet(vosDataBuff);
967 *ppVosDataBuff = NULL;
968 return VOS_STATUS_SUCCESS;
969 }
970
971 /**
972 * Set drop_amsdu flag and drop AMSDU subframe if AMSDU subframe DA
973 * is equal to LLC header
974 */
975 if (vos_mem_compare2(MPDUHeaderAMSDUHeader + ucMPDUHLen, llc_hdr, 6) == 0) {
976 pClientSTA->drop_amsdu = true;
977 vos_pkt_return_packet(vosDataBuff);
978 *ppVosDataBuff = NULL;
979 VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
980 "WLAN TL:Invalid AMSDU frame - dropping");
981 return VOS_STATUS_SUCCESS;
982 }
983
Jeff Johnson295189b2012-06-20 16:38:30 -0700984 /* Find Padding and remove */
Katya Nigam493ff652014-02-11 14:31:04 +0530985 vos_mem_copy(&subFrameLength, MPDUHeaderAMSDUHeader + ucMPDUHLen + WLANTL_AMSDU_SUBFRAME_LEN_OFFSET, sizeof(v_U16_t));
Jeff Johnson295189b2012-06-20 16:38:30 -0700986 subFrameLength = vos_be16_to_cpu(subFrameLength);
987 paddingSize = usMPDULen - ucMPDUHLen - subFrameLength - TL_AMSDU_SUBFRM_HEADER_LEN;
988
989 vos_pkt_get_packet_length(vosDataBuff, &packetLength);
990 if((paddingSize > 0) && (paddingSize < packetLength))
991 {
992 /* There is padding bits, remove it */
993 vos_pkt_trim_tail(vosDataBuff, paddingSize);
994 }
995 else if(0 == paddingSize)
996 {
997 /* No Padding bits */
998 /* Do Nothing */
999 }
1000 else
1001 {
1002 /* Padding size is larger than Frame size, Actually negative */
1003 /* Not a valid case, not a valid frame, drop it */
1004 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Padding Size is negative, no possible %d", paddingSize));
1005 vos_pkt_return_packet(vosDataBuff);
1006 *ppVosDataBuff = NULL;
1007 return VOS_STATUS_SUCCESS; /*Not a transport error*/
1008 }
1009
1010 numAMSDUFrames++;
1011 if(0 == (numAMSDUFrames % 5000))
1012 {
Jeff Johnson0298bd02013-11-14 19:58:38 -08001013 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"%u AMSDU frames arrived", numAMSDUFrames));
Jeff Johnson295189b2012-06-20 16:38:30 -07001014 }
1015 return VOS_STATUS_SUCCESS;
1016}/* WLANTL_AMSDUProcess */
1017
1018/*==========================================================================
1019 Re-ordering module
1020 ==========================================================================*/
1021
1022/*==========================================================================
1023 FUNCTION WLANTL_MSDUReorder
1024
1025 DESCRIPTION
1026 MSDU reordering
1027
1028 DEPENDENCIES
1029
1030 PARAMETERS
1031
1032 IN
1033
1034 vosDataBuff: vos packet for the received data
1035 pvBDHeader: pointer to the BD header
1036 ucSTAId: Station ID
1037
1038 RETURN VALUE
1039 The result code associated with performing the operation
1040
1041 VOS_STATUS_SUCCESS: Everything is good :)
1042
1043 SIDE EFFECTS
1044
1045============================================================================*/
1046VOS_STATUS WLANTL_MSDUReorder
1047(
1048 WLANTL_CbType *pTLCb,
1049 vos_pkt_t **vosDataBuff,
1050 v_PVOID_t pvBDHeader,
1051 v_U8_t ucSTAId,
1052 v_U8_t ucTid
1053)
1054{
1055 WLANTL_BAReorderType *currentReorderInfo;
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301056 WLANTL_STAClientType *pClientSTA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001057 vos_pkt_t *vosPktIdx;
1058 v_U8_t ucOpCode;
1059 v_U8_t ucSlotIdx;
1060 v_U8_t ucFwdIdx;
1061 v_U16_t CSN;
1062 v_U32_t ucCIndexOrig;
1063 VOS_STATUS status = VOS_STATUS_SUCCESS;
1064 VOS_STATUS lockStatus = VOS_STATUS_SUCCESS;
1065 VOS_STATUS timerStatus = VOS_STATUS_SUCCESS;
1066 VOS_TIMER_STATE timerState;
1067 v_SIZE_t rxFree;
Jeff Johnson295189b2012-06-20 16:38:30 -07001068 v_U64_t ullreplayCounter = 0; /* 48-bit replay counter */
Dhanashri Atred8c20a32014-01-03 17:20:55 -08001069 v_U8_t ac;
1070 v_U16_t reorderTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07001071 if((NULL == pTLCb) || (*vosDataBuff == NULL))
1072 {
Jeff Johnsonddec6482017-09-19 08:33:57 -07001073 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 -07001074 pTLCb, *vosDataBuff));
1075 return VOS_STATUS_E_INVAL;
1076 }
1077
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301078 pClientSTA = pTLCb->atlSTAClients[ucSTAId];
1079
1080 if ( NULL == pClientSTA )
1081 {
1082 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1083 "WLAN TL:Client Memory was not allocated on %s", __func__));
1084 return VOS_STATUS_E_FAILURE;
1085 }
1086
1087 currentReorderInfo = &pClientSTA->atlBAReorderInfo[ucTid];
Jeff Johnson295189b2012-06-20 16:38:30 -07001088
1089 lockStatus = vos_lock_acquire(&currentReorderInfo->reorderLock);
1090 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1091 {
1092 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1093 return lockStatus;
1094 }
1095
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301096 if( pClientSTA->atlBAReorderInfo[ucTid].ucExists == 0 )
Jeff Johnson295189b2012-06-20 16:38:30 -07001097 {
1098 vos_lock_release(&currentReorderInfo->reorderLock);
1099 return VOS_STATUS_E_INVAL;
1100 }
1101 ucOpCode = (v_U8_t)WDA_GET_RX_REORDER_OPCODE(pvBDHeader);
1102 ucSlotIdx = (v_U8_t)WDA_GET_RX_REORDER_SLOT_IDX(pvBDHeader);
1103 ucFwdIdx = (v_U8_t)WDA_GET_RX_REORDER_FWD_IDX(pvBDHeader);
1104 CSN = (v_U16_t)WDA_GET_RX_REORDER_CUR_PKT_SEQ_NO(pvBDHeader);
1105
Jeff Johnson295189b2012-06-20 16:38:30 -07001106 /* Replay check code : check whether replay check is needed or not */
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301107 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001108 {
1109 /* Getting 48-bit replay counter from the RX BD */
Sravan Kumar Kairam8bb90ca2017-11-01 19:00:23 +05301110 ullreplayCounter = WDA_DS_GetReplayCounter(pvBDHeader);
Jeff Johnson295189b2012-06-20 16:38:30 -07001111 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001112
1113#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1114 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));
1115#else
1116 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));
1117#endif
1118
1119 // remember our current CI so that later we can tell if it advanced
1120 ucCIndexOrig = currentReorderInfo->ucCIndex;
1121
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301122 switch(ucOpCode)
Jeff Johnson295189b2012-06-20 16:38:30 -07001123 {
1124 case WLANTL_OPCODE_INVALID:
1125 /* Do nothing just pass through current frame */
1126 break;
1127
1128 case WLANTL_OPCODE_QCUR_FWDBUF:
Sravan Kumar Kairama97e2372016-11-11 17:20:03 +05301129 if ((currentReorderInfo->LastSN > CSN) &&
1130 !(currentReorderInfo->set_data_filter))
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301131 {
1132 if ((currentReorderInfo->LastSN - CSN) < CSN_WRAP_AROUND_THRESHOLD)
1133 {
1134 //this frame is received after BA timer is expired, discard it
1135 TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
1136 "(QCUR_FWDBUF) dropping old frame, SN=%d LastSN=%d",
1137 CSN, currentReorderInfo->LastSN));
Asodi T,Venkateswara Reddy9826c872017-01-18 19:08:25 +05301138 if (vos_is_arp_pkt((*vosDataBuff)->pSkb, true))
1139 vos_update_arp_rx_drop_reorder();
1140
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301141 status = vos_pkt_return_packet(*vosDataBuff);
1142 if (!VOS_IS_STATUS_SUCCESS(status))
1143 {
1144 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1145 "(QCUR_FWDBUF) drop old frame fail %d", status));
1146 }
1147 *vosDataBuff = NULL;
1148 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1149 if (!VOS_IS_STATUS_SUCCESS(lockStatus))
1150 {
1151 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1152 "WLANTL_MSDUReorder, Release LOCK Fail"));
1153 return lockStatus;
1154 }
1155 return status;
1156 }
1157 }
1158 currentReorderInfo->LastSN = CSN;
Jeff Johnson295189b2012-06-20 16:38:30 -07001159 if(0 == currentReorderInfo->pendingFramesCount)
1160 {
1161 //This frame will be fwd'ed to the OS. The next slot is the one we expect next
1162 currentReorderInfo->ucCIndex = (ucSlotIdx + 1) % currentReorderInfo->winSize;
1163 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1164 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1165 {
1166 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1167 return lockStatus;
1168 }
1169 return status;
1170 }
1171 status = WLANTL_QueueCurrent(currentReorderInfo,
1172 vosDataBuff,
1173 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301174 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001175 {
1176 WLANTL_FillReplayCounter(currentReorderInfo,
1177 ullreplayCounter, ucSlotIdx);
1178 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 if(VOS_STATUS_E_RESOURCES == status)
1180 {
Bhargav Shahb70c4692015-12-07 17:17:58 +05301181 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1182 currentReorderInfo->sessionID , ucOpCode ));
1183
Jeff Johnson295189b2012-06-20 16:38:30 -07001184 /* This is the case slot index is already cycle one route, route all the frames Qed */
1185 vosPktIdx = NULL;
1186 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1187 WLANTL_OPCODE_FWDALL_QCUR,
1188 &vosPktIdx,
1189 currentReorderInfo,
1190 pTLCb);
1191 if(!VOS_IS_STATUS_SUCCESS(status))
1192 {
1193 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1194 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1195 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1196 {
1197 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1198 return lockStatus;
1199 }
1200 return status;
1201 }
1202 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1203 *vosDataBuff = vosPktIdx;
1204 currentReorderInfo->pendingFramesCount = 0;
1205 }
1206 else
1207 {
1208 vosPktIdx = NULL;
1209 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1210 WLANTL_OPCODE_QCUR_FWDBUF,
1211 &vosPktIdx,
1212 currentReorderInfo,
1213 pTLCb);
1214 if(!VOS_IS_STATUS_SUCCESS(status))
1215 {
1216 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1217 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1218 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1219 {
1220 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1221 return lockStatus;
1222 }
1223 return status;
1224 }
Leo Chang2301cff2014-01-03 20:31:46 -08001225 currentReorderInfo->ucCIndex = ucFwdIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07001226 *vosDataBuff = vosPktIdx;
1227 }
1228 break;
1229
1230 case WLANTL_OPCODE_FWDBUF_FWDCUR:
1231 vosPktIdx = NULL;
1232 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1233 WLANTL_OPCODE_FWDBUF_FWDCUR,
1234 &vosPktIdx,
1235 currentReorderInfo,
1236 pTLCb);
1237 if(!VOS_IS_STATUS_SUCCESS(status))
1238 {
1239 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1240 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1241 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1242 {
1243 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1244 return lockStatus;
1245 }
1246 return status;
1247 }
1248
1249 if(NULL == vosPktIdx)
1250 {
Arif Hussainf2b00992013-11-17 21:46:15 -08001251 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 -07001252 }
1253 else
1254 {
1255 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1256 if(!VOS_IS_STATUS_SUCCESS(status))
1257 {
1258 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain with CUR frame fail %d",
1259 status));
1260 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1261 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1262 {
1263 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1264 return lockStatus;
1265 }
1266 return status;
1267 }
1268 *vosDataBuff = vosPktIdx;
1269 }
1270 //ucFwdIdx is the slot this packet supposes to take but there is a hole there
1271 //It looks that the chip will put the next packet into the slot ucFwdIdx.
1272 currentReorderInfo->ucCIndex = ucFwdIdx;
1273 break;
1274
1275 case WLANTL_OPCODE_QCUR:
Sravan Kumar Kairama97e2372016-11-11 17:20:03 +05301276 if ((currentReorderInfo->LastSN > CSN) &&
1277 !(currentReorderInfo->set_data_filter))
Madan Mohan Koyyalamudi31e4cad2013-08-21 20:21:14 +05301278 {
1279 if ((currentReorderInfo->LastSN - CSN) < CSN_WRAP_AROUND_THRESHOLD)
1280 {
1281 // this frame is received after BA timer is expired, so disard it
1282 TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
1283 "(QCUR) dropping old frame, SN=%d LastSN=%d",
1284 CSN, currentReorderInfo->LastSN));
1285 status = vos_pkt_return_packet(*vosDataBuff);
1286 if (!VOS_IS_STATUS_SUCCESS(status))
1287 {
1288 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1289 "*** (QCUR) drop old frame fail %d", status));
1290 }
1291 *vosDataBuff = NULL;
1292 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1293 if (!VOS_IS_STATUS_SUCCESS(lockStatus))
1294 {
1295 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1296 "WLANTL_MSDUReorder, Release LOCK Fail"));
1297 return lockStatus;
1298 }
1299 return status;
1300 }
1301 }
1302
Jeff Johnson295189b2012-06-20 16:38:30 -07001303 status = WLANTL_QueueCurrent(currentReorderInfo,
1304 vosDataBuff,
1305 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301306 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001307 {
1308 WLANTL_FillReplayCounter(currentReorderInfo,
1309 ullreplayCounter, ucSlotIdx);
1310 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001311 if(VOS_STATUS_E_RESOURCES == status)
1312 {
Bhargav Shahb70c4692015-12-07 17:17:58 +05301313 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1314 currentReorderInfo->sessionID , ucOpCode ));
1315
Jeff Johnson295189b2012-06-20 16:38:30 -07001316 /* This is the case slot index is already cycle one route, route all the frames Qed */
1317 vosPktIdx = NULL;
1318 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1319 WLANTL_OPCODE_FWDALL_QCUR,
1320 &vosPktIdx,
1321 currentReorderInfo,
1322 pTLCb);
1323 if(!VOS_IS_STATUS_SUCCESS(status))
1324 {
1325 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1326 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1327 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1328 {
1329 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1330 return lockStatus;
1331 }
1332 return status;
1333 }
1334 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1335 *vosDataBuff = vosPktIdx;
1336 currentReorderInfo->pendingFramesCount = 0;
1337 }
1338 else
1339 {
1340 /* Since current Frame is Qed, no frame will be routed */
1341 *vosDataBuff = NULL;
1342 }
1343 break;
1344
1345 case WLANTL_OPCODE_FWDBUF_QUEUECUR:
1346 vosPktIdx = NULL;
1347 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1348 WLANTL_OPCODE_FWDBUF_QUEUECUR,
1349 &vosPktIdx,
1350 currentReorderInfo,
1351 pTLCb);
1352 if(!VOS_IS_STATUS_SUCCESS(status))
1353 {
1354 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1355 status));
1356 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1357 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1358 {
1359 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1360 return lockStatus;
1361 }
1362 return status;
1363 }
1364 //This opCode means the window shift. Enforce the current Index
1365 currentReorderInfo->ucCIndex = ucFwdIdx;
1366
1367 status = WLANTL_QueueCurrent(currentReorderInfo,
1368 vosDataBuff,
1369 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301370 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001371 {
1372 WLANTL_FillReplayCounter(currentReorderInfo,
1373 ullreplayCounter, ucSlotIdx);
1374 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001375 if(VOS_STATUS_E_RESOURCES == status)
1376 {
Bhargav Shahb70c4692015-12-07 17:17:58 +05301377 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1378 currentReorderInfo->sessionID , ucOpCode ));
1379
Jeff Johnson295189b2012-06-20 16:38:30 -07001380 vos_pkt_return_packet(vosPktIdx);
1381 /* This is the case slot index is already cycle one route, route all the frames Qed */
1382 vosPktIdx = NULL;
1383 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1384 WLANTL_OPCODE_FWDALL_QCUR,
1385 &vosPktIdx,
1386 currentReorderInfo,
1387 pTLCb);
1388 if(!VOS_IS_STATUS_SUCCESS(status))
1389 {
1390 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1391 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1392 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1393 {
1394 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1395 return lockStatus;
1396 }
1397 return status;
1398 }
1399 status = vos_pkt_chain_packet(vosPktIdx, *vosDataBuff, 1);
1400 *vosDataBuff = vosPktIdx;
1401 currentReorderInfo->pendingFramesCount = 0;
1402 }
1403 *vosDataBuff = vosPktIdx;
1404 break;
1405
1406 case WLANTL_OPCODE_FWDBUF_DROPCUR:
1407 vosPktIdx = NULL;
1408 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1409 WLANTL_OPCODE_FWDBUF_DROPCUR,
1410 &vosPktIdx,
1411 currentReorderInfo,
1412 pTLCb);
1413 if(!VOS_IS_STATUS_SUCCESS(status))
1414 {
1415 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1416 status));
1417 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1418 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1419 {
1420 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1421 return lockStatus;
1422 }
1423 return status;
1424 }
1425
1426 //Since BAR frame received, set the index to the right location
1427 currentReorderInfo->ucCIndex = ucFwdIdx;
1428
1429 /* Current frame has to be dropped, BAR frame */
1430 status = vos_pkt_return_packet(*vosDataBuff);
1431 if(!VOS_IS_STATUS_SUCCESS(status))
1432 {
1433 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Drop BAR 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 *vosDataBuff = vosPktIdx;
1444 break;
1445
1446 case WLANTL_OPCODE_FWDALL_DROPCUR:
1447 vosPktIdx = NULL;
1448 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1449 WLANTL_OPCODE_FWDALL_DROPCUR,
1450 &vosPktIdx,
1451 currentReorderInfo,
1452 pTLCb);
1453 if(!VOS_IS_STATUS_SUCCESS(status))
1454 {
1455 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1456 status));
1457 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1458 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1459 {
1460 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1461 return lockStatus;
1462 }
1463 return status;
1464 }
1465
1466 //Since BAR frame received and beyond cur window, set the index to the right location
1467 currentReorderInfo->ucCIndex = 0;
1468
1469 status = vos_pkt_return_packet(*vosDataBuff);
1470 if(!VOS_IS_STATUS_SUCCESS(status))
1471 {
1472 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Drop BAR frame fail %d",
1473 status));
1474 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1475 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1476 {
1477 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1478 return lockStatus;
1479 }
1480 return status;
1481 }
1482
1483 *vosDataBuff = vosPktIdx;
1484 break;
1485
1486 case WLANTL_OPCODE_FWDALL_QCUR:
1487 vosPktIdx = NULL;
1488 status = WLANTL_ChainFrontPkts(currentReorderInfo->winSize,
1489 WLANTL_OPCODE_FWDALL_DROPCUR,
1490 &vosPktIdx,
1491 currentReorderInfo,
1492 pTLCb);
1493 if(!VOS_IS_STATUS_SUCCESS(status))
1494 {
1495 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make chain with buffered frame fail %d",
1496 status));
1497 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1498 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1499 {
1500 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1501 return lockStatus;
1502 }
1503 return status;
1504 }
1505 status = WLANTL_QueueCurrent(currentReorderInfo,
1506 vosDataBuff,
1507 ucSlotIdx);
Madan Mohan Koyylamudi3b8400c2013-01-24 17:47:01 +05301508 if(VOS_TRUE == pClientSTA->ucIsReplayCheckValid)
Jeff Johnson295189b2012-06-20 16:38:30 -07001509 {
1510 WLANTL_FillReplayCounter(currentReorderInfo,
1511 ullreplayCounter, ucSlotIdx);
1512 }
Bhargav Shahb70c4692015-12-07 17:17:58 +05301513
1514 if(VOS_STATUS_E_RESOURCES == status)
1515 {
1516 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1517 currentReorderInfo->sessionID , ucOpCode ));
1518 }
1519
Jeff Johnson295189b2012-06-20 16:38:30 -07001520 if(!VOS_IS_STATUS_SUCCESS(status))
1521 {
1522 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Q Current frame fail %d",
1523 status));
1524 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1525 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1526 {
1527 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1528 return lockStatus;
1529 }
1530 return status;
1531 }
1532 currentReorderInfo->ucCIndex = ucSlotIdx;
1533 *vosDataBuff = vosPktIdx;
1534 break;
1535
1536 case WLANTL_OPCODE_TEARDOWN:
1537 // do we have a procedure in place to teardown BA?
1538
1539 // fall through to drop the current packet
1540 case WLANTL_OPCODE_DROPCUR:
1541 vos_pkt_return_packet(*vosDataBuff);
1542 *vosDataBuff = NULL;
1543 break;
1544
1545 default:
1546 break;
1547 }
1548
1549 /* Check the available VOS RX buffer size
1550 * If remaining VOS RX buffer is too few, have to make space
1551 * Route all the Qed frames upper layer
1552 * Otherwise, RX thread could be stall */
1553 vos_pkt_get_available_buffer_pool(VOS_PKT_TYPE_RX_RAW, &rxFree);
Yue Mad8cac142013-03-28 11:33:46 -07001554 if(WLANTL_BA_MIN_FREE_RX_VOS_BUFFER >= rxFree)
Jeff Johnson295189b2012-06-20 16:38:30 -07001555 {
Yue Ma13da2012013-05-27 17:42:05 -07001556 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO, "RX Free: %d", rxFree));
1557 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 -07001558 currentReorderInfo->pendingFramesCount));
1559 vosPktIdx = NULL;
1560 status = WLANTL_ChainFrontPkts(ucFwdIdx,
1561 WLANTL_OPCODE_FWDALL_DROPCUR,
1562 &vosPktIdx,
1563 currentReorderInfo,
1564 pTLCb);
1565 if(!VOS_IS_STATUS_SUCCESS(status))
1566 {
1567 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Make frame chain fail %d", status));
1568 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1569 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1570 {
1571 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1572 return lockStatus;
1573 }
1574 return status;
1575 }
1576 if(NULL != *vosDataBuff)
1577 {
1578 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Already something, Chain it"));
1579 vos_pkt_chain_packet(*vosDataBuff, vosPktIdx, 1);
1580 }
1581 else
1582 {
1583 *vosDataBuff = vosPktIdx;
1584 }
1585 currentReorderInfo->pendingFramesCount = 0;
1586 }
1587
1588 /*
1589 * Current aging timer logic:
1590 * 1) if we forwarded any packets and the timer is running:
1591 * stop the timer
1592 * 2) if there are packets queued and the timer is not running:
1593 * start the timer
Leo Chang2301cff2014-01-03 20:31:46 -08001594 * 3) if timer is running and no pending frame:
1595 * stop the timer
Jeff Johnson295189b2012-06-20 16:38:30 -07001596 */
1597 timerState = vos_timer_getCurrentState(&currentReorderInfo->agingTimer);
1598 if ((VOS_TIMER_STATE_RUNNING == timerState) &&
Leo Chang2301cff2014-01-03 20:31:46 -08001599 ((ucCIndexOrig != currentReorderInfo->ucCIndex) ||
1600 (0 == currentReorderInfo->pendingFramesCount)))
Jeff Johnson295189b2012-06-20 16:38:30 -07001601 {
1602 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"HOLE filled, Pending Frames Count %d",
1603 currentReorderInfo->pendingFramesCount));
1604
1605 // we forwarded some packets so stop aging the current hole
1606 timerStatus = vos_timer_stop(&currentReorderInfo->agingTimer);
1607 timerState = VOS_TIMER_STATE_STOPPED;
1608
1609 // ignore the returned status since there is a race condition
1610 // whereby between the time we called getCurrentState() and the
1611 // time we call stop() the timer could have fired. In that case
1612 // stop() will return an error, but we don't care since the
1613 // timer has stopped
1614 }
1615
1616 if (currentReorderInfo->pendingFramesCount > 0)
1617 {
1618 if (VOS_TIMER_STATE_STOPPED == timerState)
1619 {
1620 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"There is a new HOLE, Pending Frames Count %d",
1621 currentReorderInfo->pendingFramesCount));
Dhanashri Atred8c20a32014-01-03 17:20:55 -08001622 ac = WLANTL_TID_2_AC[ucTid];
1623 if (WLANTL_AC_INVALID(ac))
1624 {
1625 reorderTime = WLANTL_BA_REORDERING_AGING_TIMER;
1626 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Invalid AC %d using default reorder time %d",
1627 ac, reorderTime));
1628 }
1629 else
1630 {
1631 reorderTime = pTLCb->tlConfigInfo.ucReorderAgingTime[ac];
1632 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 timerStatus = vos_timer_start(&currentReorderInfo->agingTimer,
Dhanashri Atred8c20a32014-01-03 17:20:55 -08001634 reorderTime);
Jeff Johnson295189b2012-06-20 16:38:30 -07001635 if(!VOS_IS_STATUS_SUCCESS(timerStatus))
1636 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301637 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Timer start fail: %d", timerStatus));
Jeff Johnson295189b2012-06-20 16:38:30 -07001638 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1639 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1640 {
1641 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1642 return lockStatus;
1643 }
1644 return timerStatus;
1645 }
1646 }
1647 else
1648 {
1649 // we didn't forward any packets and the timer was already
1650 // running so we're still aging the same hole
1651 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Still HOLE, Pending Frames Count %d",
1652 currentReorderInfo->pendingFramesCount));
1653 }
1654 }
1655
1656 lockStatus = vos_lock_release(&currentReorderInfo->reorderLock);
1657 if(!VOS_IS_STATUS_SUCCESS(lockStatus))
1658 {
1659 TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"WLANTL_MSDUReorder, Release LOCK Fail"));
1660 return lockStatus;
1661 }
1662 return VOS_STATUS_SUCCESS;
1663}/* WLANTL_MSDUReorder */
1664
1665
1666/*==========================================================================
1667 Utility functions
1668 ==========================================================================*/
1669
1670/*==========================================================================
1671
1672 FUNCTION WLANTL_QueueCurrent
1673
1674 DESCRIPTION
1675 It will queue a packet at a given slot index in the MSDU reordering list.
1676
1677 DEPENDENCIES
1678
1679 PARAMETERS
1680
1681 IN
1682 pwBaReorder: pointer to the BA reordering session info
1683 vosDataBuff: data buffer to be queued
1684 ucSlotIndex: slot index
1685
1686 RETURN VALUE
1687 The result code associated with performing the operation
1688
1689 VOS_STATUS_SUCCESS: Everything is OK
1690
1691
1692 SIDE EFFECTS
1693
1694============================================================================*/
1695VOS_STATUS WLANTL_QueueCurrent
1696(
1697 WLANTL_BAReorderType* pwBaReorder,
1698 vos_pkt_t** vosDataBuff,
1699 v_U8_t ucSlotIndex
1700)
1701{
1702 VOS_STATUS status = VOS_STATUS_SUCCESS;
1703
Jeff Johnsonddec6482017-09-19 08:33:57 -07001704 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 -07001705 *vosDataBuff));
1706 if(NULL != pwBaReorder->reorderBuffer->arrayBuffer[ucSlotIndex])
1707 {
Katya Nigam42e16e82014-02-04 16:28:55 +05301708 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1709 pwBaReorder->sessionID , pwBaReorder->pendingFramesCount ));
1710
Bhargav Shahb70c4692015-12-07 17:17:58 +05301711 MTRACE(vos_trace(VOS_MODULE_ID_TL, TRACE_CODE_TL_QUEUE_CURRENT,
1712 pwBaReorder->sessionID , ucSlotIndex ));
1713
Bhargav Shah2c894fe2016-02-10 16:02:23 +05301714 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 -07001715 pwBaReorder->pendingFramesCount));
1716 return VOS_STATUS_E_RESOURCES;
1717 }
1718
1719 pwBaReorder->reorderBuffer->arrayBuffer[ucSlotIndex] =
1720 (v_PVOID_t)(*vosDataBuff);
1721 pwBaReorder->pendingFramesCount++;
1722 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Assigned, Pending Frames %d at slot %d, dataPtr 0x%x",
1723 pwBaReorder->pendingFramesCount,
1724 ucSlotIndex,
1725 pwBaReorder->reorderBuffer->arrayBuffer[ucSlotIndex]));
1726
1727 return status;
1728}/*WLANTL_QueueCurrent*/
1729
1730/*==========================================================================
1731
1732 FUNCTION WLANTL_ChainFrontPkts
1733
1734 DESCRIPTION
1735 It will remove all the packets from the front of a vos list and chain
1736 them to a vos pkt .
1737
1738 DEPENDENCIES
1739
1740 PARAMETERS
1741
1742 IN
1743 ucCount: number of packets to extract
1744 pwBaReorder: pointer to the BA reordering session info
1745
1746 OUT
1747 vosDataBuff: data buffer containing the extracted chain of packets
1748
1749 RETURN VALUE
1750 The result code associated with performing the operation
1751
1752 VOS_STATUS_SUCCESS: Everything is OK
1753
1754
1755 SIDE EFFECTS
1756
1757============================================================================*/
1758VOS_STATUS WLANTL_ChainFrontPkts
1759(
1760 v_U32_t fwdIndex,
1761 v_U8_t opCode,
1762 vos_pkt_t **vosDataBuff,
1763 WLANTL_BAReorderType *pwBaReorder,
1764 WLANTL_CbType *pTLCb
1765)
1766{
1767 VOS_STATUS status = VOS_STATUS_SUCCESS;
1768 v_U32_t idx;
1769 v_PVOID_t currentDataPtr = NULL;
1770 int negDetect;
1771#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1772#define WLANTL_OUT_OF_WINDOW_IDX 65
1773 v_U32_t frameIdx[2] = {0, 0}, ffidx = fwdIndex, idx2 = WLANTL_OUT_OF_WINDOW_IDX;
1774 int pending = pwBaReorder->pendingFramesCount, start = WLANTL_OUT_OF_WINDOW_IDX, end;
1775#endif
1776
1777 if(pwBaReorder->ucCIndex >= fwdIndex)
1778 {
1779 fwdIndex += pwBaReorder->winSize;
1780 }
1781
1782 if((WLANTL_OPCODE_FWDALL_DROPCUR == opCode) ||
1783 (WLANTL_OPCODE_FWDALL_QCUR == opCode))
1784 {
1785 fwdIndex = pwBaReorder->ucCIndex + pwBaReorder->winSize;
1786 }
1787
Jeff Johnsonddec6482017-09-19 08:33:57 -07001788 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 -07001789 pwBaReorder->ucCIndex % pwBaReorder->winSize,
1790 fwdIndex % pwBaReorder->winSize,
1791 pwBaReorder->reorderBuffer));
1792
1793 negDetect = pwBaReorder->pendingFramesCount;
1794 for(idx = pwBaReorder->ucCIndex; idx <= fwdIndex; idx++)
1795 {
1796 currentDataPtr =
1797 pwBaReorder->reorderBuffer->arrayBuffer[idx % pwBaReorder->winSize];
1798 if(NULL != currentDataPtr)
1799 {
1800#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1801 idx2 = (idx >= pwBaReorder->winSize) ? (idx - pwBaReorder->winSize) : idx;
1802 frameIdx[idx2 / 32] |= 1 << (idx2 % 32);
1803 if(start == WLANTL_OUT_OF_WINDOW_IDX) start = idx2;
1804#endif
1805 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"There is buffered frame %d",
1806 idx % pwBaReorder->winSize));
1807 if(NULL == *vosDataBuff)
1808 {
1809 *vosDataBuff = (vos_pkt_t *)currentDataPtr;
1810 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"This is new head %d",
1811 idx % pwBaReorder->winSize));
1812 }
1813 else
1814 {
1815 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"There is bufered Just add %d",
1816 idx % pwBaReorder->winSize));
1817 vos_pkt_chain_packet(*vosDataBuff,
1818 (vos_pkt_t *)currentDataPtr,
1819 VOS_TRUE);
1820 }
1821 pwBaReorder->reorderBuffer->arrayBuffer[idx % pwBaReorder->winSize]
1822 = NULL;
1823 pwBaReorder->pendingFramesCount--;
1824 negDetect--;
1825 if(negDetect < 0)
1826 {
Arif Hussainf2b00992013-11-17 21:46:15 -08001827 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 -07001828 VOS_ASSERT(0);
1829 return VOS_STATUS_E_FAULT;
1830 }
1831 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Slot Index %d, set as NULL, Pending Frames %d",
1832 idx % pwBaReorder->winSize,
1833 pwBaReorder->pendingFramesCount
1834 ));
1835 pwBaReorder->ucCIndex = (idx + 1) % pwBaReorder->winSize;
1836 }
1837 else
1838 {
1839 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Empty Array %d",
1840 idx % pwBaReorder->winSize));
1841 }
1842 TLLOG4(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,"Current Index %d, winSize %d",
1843 pwBaReorder->ucCIndex,
1844 pwBaReorder->winSize
1845 ));
1846 }
1847
1848#ifdef WLANTL_REORDER_DEBUG_MSG_ENABLE
1849 end = idx2;
1850
1851 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",
1852 frameIdx[1], frameIdx[0], opCode, ffidx, pwBaReorder->winSize, pending, pending - negDetect, start, end));
1853#endif
1854
1855 return status;
1856}/*WLANTL_ChainFrontPkts*/
Jeff Johnson295189b2012-06-20 16:38:30 -07001857/*==========================================================================
1858
1859 FUNCTION WLANTL_FillReplayCounter
1860
1861 DESCRIPTION
1862 It will fill repaly counter at a given slot index in the MSDU reordering list.
1863
1864 DEPENDENCIES
1865
1866 PARAMETERS
1867
1868 IN
1869 pwBaReorder : pointer to the BA reordering session info
1870 replayCounter: replay counter to be filled
1871 ucSlotIndex : slot index
1872
1873 RETURN VALUE
1874 NONE
1875
1876
1877 SIDE EFFECTS
1878 NONE
1879
1880 ============================================================================*/
1881void WLANTL_FillReplayCounter
1882(
1883 WLANTL_BAReorderType* pwBaReorder,
1884 v_U64_t ullreplayCounter,
1885 v_U8_t ucSlotIndex
1886)
1887{
1888
1889 //BAMSGDEBUG("replay counter to be filled in Qed frames %llu",
1890 //replayCounter, 0, 0);
1891
1892 pwBaReorder->reorderBuffer->ullReplayCounter[ucSlotIndex] = ullreplayCounter;
1893 //BAMSGDEBUG("Assigned, replay counter Pending Frames %d at slot %d, replay counter[0x%llX]\n",
1894 //pwBaReorder->pendingFramesCount,
1895 //ucSlotIndex,
1896 //pwBaReorder->reorderBuffer->ullReplayCounter);
1897 return;
1898}/*WLANTL_FillReplayCounter*/
Jeff Johnson295189b2012-06-20 16:38:30 -07001899
Sravan Kumar Kairam04f093a2017-11-16 19:59:05 +05301900void WLANTL_ReorderReplayCheck(WLANTL_STAClientType *pClientSTA,
1901 vos_pkt_t **vosDataBuff, v_U8_t ucTid)
1902{
1903 vos_pkt_t *pVosCurPkt;
1904 vos_pkt_t *pNextVosPkt;
1905 vos_pkt_t *pVosHeadPkt = NULL;
1906 vos_pkt_t *pfreeVosPkt = NULL;
1907 v_U64_t prevReplayCounter = 0;
1908 v_BOOL_t status;
1909
1910 pVosCurPkt = *vosDataBuff;
1911
1912 do {
1913 vos_pkt_walk_packet_chain(pVosCurPkt, &pNextVosPkt, VOS_FALSE);
1914 prevReplayCounter = pClientSTA->ullReplayCounter[ucTid];
1915 status = WLANTL_IsReplayPacket(pVosCurPkt->pn_num,
1916 prevReplayCounter);
1917 if(VOS_FALSE == status) {
1918 pClientSTA->ullReplayCounter[ucTid] = pVosCurPkt->pn_num;
1919 pVosHeadPkt = pVosCurPkt;
1920 } else {
1921 VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1922 "%s: Non-AMSDU Drop the replay packet PN: [0x%llX]",
1923 __func__, pVosCurPkt->pn_num);
1924 pClientSTA->ulTotalReplayPacketsDetected++;
1925
1926 pfreeVosPkt = pVosCurPkt;
1927 pfreeVosPkt->pNext = NULL;
1928 vos_pkt_return_packet(pfreeVosPkt);
1929
1930 if (pVosHeadPkt != NULL) {
1931 pVosHeadPkt->pNext = pNextVosPkt;
1932 }
1933 else {
1934 *vosDataBuff = pNextVosPkt;
1935 }
1936 }
1937
1938 pVosCurPkt = pNextVosPkt;
1939 } while (pVosCurPkt);
1940}