wlan: Enable or disable aggregation dynamically

Add vendor command to enable or disable aggregation
at runtime.

CRs-Fixed: 2002690
Change-Id: I2e17a4dcd5109ee42da9ae5b3605be49c96a6f48
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 3f8edad..df39309 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6364,4 +6364,11 @@
 };
 #endif
 
+/**
+ * struct tDelBaParams - Del BA Session req
+ * @session_id: adapter session id
+ */
+typedef struct {
+    tANI_U8 session_id;
+}tDelBaParams,*ptDelBaParams;
 #endif /* __SIR_API_H */
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 6ed2bb0..6445286 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -395,6 +395,7 @@
     eWNI_SME_MBB_PRE_AUTH_REASSOC_RSP,
 #endif
 
+    eWNI_SME_DEL_BA_SES_REQ,
     eWNI_SME_MSG_TYPES_END
 };
 
diff --git a/CORE/MAC/inc/wniCfg.h b/CORE/MAC/inc/wniCfg.h
index 3a62078..f0e6aac 100644
--- a/CORE/MAC/inc/wniCfg.h
+++ b/CORE/MAC/inc/wniCfg.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -395,7 +395,8 @@
      WNI_CFG_ENABLE_UNITS_BWAIT,
      WNI_CFG_ENABLE_CONC_BMISS,
      WNI_CFG_BTC_DISABLE_WLAN_LINK_CRITICAL,
-     WNI_CFG_DISABLE_SCAN_DURING_SCO
+     WNI_CFG_DISABLE_SCAN_DURING_SCO,
+     WNI_CFG_ENABLE_TX_RX_AGGREGATION
 };
 
 /*
@@ -1936,9 +1937,12 @@
 #define WNI_CFG_DISABLE_SCAN_DURING_SCO_MAX   1
 #define WNI_CFG_DISABLE_SCAN_DURING_SCO_DEF   0
 
+#define WNI_CFG_ENABLE_TX_RX_AGGREGATION_MIN  0
+#define WNI_CFG_ENABLE_TX_RX_AGGREGATION_MAX  1
+#define WNI_CFG_ENABLE_TX_RX_AGGREGATION_DEF  1
 
-#define CFG_PARAM_MAX_NUM        362
-#define CFG_STA_IBUF_MAX_SIZE    296
+#define CFG_PARAM_MAX_NUM        363
+#define CFG_STA_IBUF_MAX_SIZE    297
 #define CFG_STA_SBUF_MAX_SIZE    3389
 
 #define CFG_STA_MAGIC_DWORD    0xbeefbeef
diff --git a/CORE/MAC/src/cfg/cfgProcMsg.c b/CORE/MAC/src/cfg/cfgProcMsg.c
index afc19e2..a6ae4c2 100644
--- a/CORE/MAC/src/cfg/cfgProcMsg.c
+++ b/CORE/MAC/src/cfg/cfgProcMsg.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -1723,7 +1723,11 @@
      WNI_CFG_ENABLE_UNITS_BWAIT_STAMIN,
      WNI_CFG_ENABLE_UNITS_BWAIT_STAMAX,
      WNI_CFG_ENABLE_UNITS_BWAIT_STADEF},
-
+    {WNI_CFG_ENABLE_TX_RX_AGGREGATION,
+     CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT,
+     WNI_CFG_ENABLE_TX_RX_AGGREGATION_MIN,
+     WNI_CFG_ENABLE_TX_RX_AGGREGATION_MAX,
+     WNI_CFG_ENABLE_TX_RX_AGGREGATION_DEF},
 };
 
 tAniSirCfgStaticString cfgStaticString[CFG_MAX_STATIC_STRING] =
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 24a0fa4..ddac0e6 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -2799,3 +2799,49 @@
 
     return eSIR_SUCCESS;
 }
+
+/**
+ * lim_process_sme_del_ba_ses_req()- process del ba req
+ * @pMac:Mac ctx
+ * @pMsgBuf: message buffer from sme
+ * Returns success on taking action based on cfg value, otherwise failure
+ */
+tSirRetStatus lim_process_sme_del_ba_ses_req(tpAniSirGlobal pMac,
+                                          tANI_U32 *pMsgBuf)
+{
+    tDelBaParams *pMsg = NULL;
+    tpPESession psessionEntry = NULL;
+    int val;
+
+    pMsg = (tDelBaParams*)pMsgBuf;
+    if (pMsg == NULL) {
+        limLog(pMac, LOGE, FL("NULL pMsg"));
+        return eSIR_FAILURE;
+    }
+
+    psessionEntry = peFindSessionBySessionId(pMac, pMsg->session_id);
+    if (NULL == psessionEntry)
+    {
+        limLog(pMac, LOGE, FL("NULL psessionEntry"));
+        return eSIR_FAILURE;
+    }
+
+    if (wlan_cfgGetInt
+       (pMac, WNI_CFG_ENABLE_TX_RX_AGGREGATION, &val) !=
+              eSIR_SUCCESS)
+    {
+        limLog(pMac, LOGE,
+               FL( "Unable to get WNI_CFG_ENABLE_TX_RX_AGGREGATION"));
+        return eSIR_FAILURE;
+    }
+
+    if (!val)
+    {
+        limLog(pMac, LOGW,
+               FL("user requested to disable all RX BA sessions"));
+        limDeleteBASessions(pMac, psessionEntry, BA_BOTH_DIRECTIONS,
+                             eSIR_MAC_PEER_TIMEDOUT_REASON);
+    }
+
+    return eSIR_SUCCESS;
+}
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index 8b402d1..37c8457 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -1270,7 +1270,7 @@
     tpDphHashNode pSta;
     tSirMacStatusCodes status = eSIR_MAC_SUCCESS_STATUS;
     tANI_U16 aid;
-    tANI_U32 frameLen, nStatus,val;
+    tANI_U32 frameLen, nStatus,val, val1;
     tANI_U8 *pBody;
     tANI_U8 delBAFlag =0;
 
@@ -1278,6 +1278,7 @@
     pBody = WDA_GET_RX_MPDU_DATA( pRxPacketInfo );
     frameLen = WDA_GET_RX_PAYLOAD_LEN( pRxPacketInfo );
     val = 0;
+    val1 = 0;
 
     // Unpack the received frame
     nStatus = dot11fUnpackAddBAReq( pMac, pBody, frameLen, &frmAddBAReq );
@@ -1339,6 +1340,20 @@
     }
 #endif //WLAN_SOFTAP_VSTA_FEATURE
 
+    if (wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_TX_RX_AGGREGATION, &val1) !=
+                    eSIR_SUCCESS)
+    {
+        limLog(pMac, LOGE,
+               FL("Unable to get WNI_CFG_ENABLE_TX_RX_AGGREGATION"));
+        val1 = 1;
+    }
+    if (!val1)
+    {
+        limLog(pMac, LOGE,
+               FL("aggregation disabled - ignoring ADDBA"));
+        goto returnAfterError;
+    }
+
     if (wlan_cfgGetInt(pMac, WNI_CFG_DEL_ALL_RX_TX_BA_SESSIONS_2_4_G_BTC, &val) !=
                     eSIR_SUCCESS)
     {
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index 15d6c64..835a6e6 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -2534,6 +2534,11 @@
         vos_mem_free((v_VOID_t*)limMsg->bodyptr);
         limMsg->bodyptr = NULL;
         break;
+    case eWNI_SME_DEL_BA_SES_REQ:
+        lim_process_sme_del_ba_ses_req(pMac, limMsg->bodyptr);
+        vos_mem_free((v_VOID_t*)limMsg->bodyptr);
+        limMsg->bodyptr = NULL;
+        break;
     default:
         vos_mem_free((v_VOID_t*)limMsg->bodyptr);
         limMsg->bodyptr = NULL;
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index feaf1ed..6a8fb8d 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -1078,5 +1078,9 @@
 
 tSirRetStatus lim_process_sme_get_tsf_req(tpAniSirGlobal pMac,
                                           tANI_U32 *pMsgBuf);
+
+tSirRetStatus lim_process_sme_del_ba_ses_req(tpAniSirGlobal pMac,
+                                             tANI_U32 *pMsgBuf);
+
 #endif /* __LIM_TYPES_H */