wlan: Drop mgmt frames if they exceed 1/4 of total VOS pkts in peMcMq.
Before sending management frames to MC thread context to process it,
check if already 1/4th of total number of RX VOS packets are present
in MC thread's queue ( peMcMq ) and accordingly drop it.
10 frames are reserved for auth, action, assoc type frames before
the threshold ( 1/4th ) for dropping all mgmt frames.
A new variable is added in sys context which keeps the count of
bbt msgs in peMcMq.
Change-Id: I9dfca2b4c13c943f61d7c7762c97c56df54ccf3b
CRs-Fixed: 771609
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index c4ed16b..fd1a22e 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -991,6 +991,7 @@
return eSIR_SUCCESS;
pMac->lim.maxBssId = pMacOpenParam->maxBssId;
pMac->lim.maxStation = pMacOpenParam->maxStation;
+ vos_spin_lock_init( &pMac->sys.lock );
if ((pMac->lim.maxBssId == 0) || (pMac->lim.maxStation == 0))
{
@@ -1087,7 +1088,9 @@
if (ANI_DRIVER_TYPE(pMac) == eDRIVER_TYPE_MFG)
return eSIR_SUCCESS;
-
+
+ vos_spin_lock_destroy( &pMac->sys.lock );
+
for(i =0; i < pMac->lim.maxBssId; i++)
{
if(pMac->lim.gpSession[i].valid == TRUE)
@@ -1339,7 +1342,7 @@
return eSIR_SUCCESS;
}
-
+#define RSRVD_MGMT_RX_PACKETS 10
// ---------------------------------------------------------------------------
/**
@@ -1413,6 +1416,30 @@
msg.bodyptr = vosBuff;
msg.bodyval = 0;
+ vos_spin_lock_acquire( &pMac->sys.lock );
+ if( pMac->sys.gSysBbtPendingMgmtCount > (vos_pkt_get_num_of_rx_raw_pkts()/4) )
+ {
+ vos_spin_lock_release( &pMac->sys.lock );
+ // drop all management packets
+ vos_pkt_return_packet(pVosPkt);
+ return VOS_STATUS_SUCCESS;
+ }
+
+ if( pMac->sys.gSysBbtPendingMgmtCount > ( vos_pkt_get_num_of_rx_raw_pkts()/4
+ - RSRVD_MGMT_RX_PACKETS ))
+ {
+ // drop all probereq, proberesp and beacons
+ if( mHdr->fc.subType == SIR_MAC_MGMT_BEACON || mHdr->fc.subType ==
+ SIR_MAC_MGMT_PROBE_REQ || mHdr->fc.subType == SIR_MAC_MGMT_PROBE_RSP )
+ {
+ vos_spin_lock_release( &pMac->sys.lock );
+ vos_pkt_return_packet(pVosPkt);
+ return VOS_STATUS_SUCCESS;
+ }
+ }
+ pMac->sys.gSysBbtPendingMgmtCount++;
+ vos_spin_lock_release( &pMac->sys.lock );
+
if( eSIR_SUCCESS != sysBbtProcessMessageCore( pMac,
&msg,
mHdr->fc.type,
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index 5a44351..09ea7e9 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -1385,7 +1385,9 @@
#ifdef WLAN_DEBUG
pMac->lim.numBbt++;
#endif
-
+ vos_spin_lock_acquire( &pMac->sys.lock );
+ pMac->sys.gSysBbtPendingMgmtCount--;
+ vos_spin_lock_release( &pMac->sys.lock );
{
v_U16_t pktLen = 0;
vos_pkt_t *pVosPkt;