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/include/sysGlobal.h b/CORE/MAC/src/include/sysGlobal.h
index c21aa3c..7f26e9b 100644
--- a/CORE/MAC/src/include/sysGlobal.h
+++ b/CORE/MAC/src/include/sysGlobal.h
@@ -34,6 +34,7 @@
 
     tANI_U32 gSysFrameCount[4][16];
     tANI_U32 gSysBbtReceived;
+    tANI_U32 gSysBbtPendingMgmtCount;
     tANI_U32 gSysBbtPostedToLim;
     tANI_U32 gSysBbtPostedToSch;
     tANI_U32 gSysBbtPostedToPmm;
@@ -49,6 +50,7 @@
     tANI_U32 gSysEnableLearnMode;
     tANI_U32 gSysEnableScanMode;
     tANI_U32 gSysEnableLinkMonitorMode;
+    vos_spin_lock_t lock;
 } tAniSirSys, *tpAniSirSys;
 
 #endif
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;