wlan: Toggle ARP packets BD rates and send using TID 3

To make sure AP receives ARP packets, sending ARP packets on BD
rates 1(1Mbps) and 3(6Mbps) alternatively and for reliability
sending on TID 3.
This support will be enabled when ini parameter, gToggleArpBDRates
is set to TRUE. By default ini parameter will be set to FALSE.

Change-Id: I858c696f9299c37d564cc3e04ea813081e79acad
CRs-Fixed: 843313
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 90e768c..352b41d 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2475,6 +2475,11 @@
 #define CFG_DXE_SSR_ENABLE_MIN       ( 0 )
 #define CFG_DXE_SSR_ENABLE_MAX       ( 1 )
 
+#define CFG_TOGGLE_ARP_BDRATES_NAME       "gToggleArpBDRates"
+#define CFG_TOGGLE_ARP_BDRATES_MIN         0
+#define CFG_TOGGLE_ARP_BDRATES_MAX         1
+#define CFG_TOGGLE_ARP_BDRATES_DEFAULT     0
+
 /*--------------------------------------------------------------------------- 
   Type declarations
   -------------------------------------------------------------------------*/ 
@@ -2980,6 +2985,7 @@
    v_U32_t                     dxeReplenishRXTimerVal;
    v_U32_t                     dxeSSREnable;
    v_U8_t                      multicast_host_msgs;
+   v_BOOL_t                    toggleArpBDRates;
 } hdd_config_t;
 /*--------------------------------------------------------------------------- 
   Function declarations and documenation
diff --git a/CORE/HDD/inc/wlan_hdd_tx_rx.h b/CORE/HDD/inc/wlan_hdd_tx_rx.h
index a16b64e..5fab180 100644
--- a/CORE/HDD/inc/wlan_hdd_tx_rx.h
+++ b/CORE/HDD/inc/wlan_hdd_tx_rx.h
@@ -111,8 +111,7 @@
 #define DHCP_OPTION53_STATUS_OFFSET    ( 0x11C )
 /* WLAN_DHCP_DEBUG */
 
-
-
+#define TID3 0x60
 
 
 /*--------------------------------------------------------------------------- 
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 6c93fc6..f3bdcd8 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3331,6 +3331,13 @@
                   CFG_MULTICAST_HOST_FW_MSGS_MIN,
                   CFG_MULTICAST_HOST_FW_MSGS_MAX),
 
+   REG_VARIABLE( CFG_TOGGLE_ARP_BDRATES_NAME, WLAN_PARAM_Integer,
+                 hdd_config_t, toggleArpBDRates,
+                 VAR_FLAGS_OPTIONAL |
+                 VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+                 CFG_TOGGLE_ARP_BDRATES_DEFAULT,
+                 CFG_TOGGLE_ARP_BDRATES_MIN,
+                 CFG_TOGGLE_ARP_BDRATES_MAX),
 };
 
 /*
@@ -3747,6 +3754,7 @@
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableTDLSScan] value = [%u]\n",pHddCtx->cfg_ini->fEnableTDLSScan);
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gDxeReplenishRXTimerVal] Value = [%u] ", pHddCtx->cfg_ini->dxeReplenishRXTimerVal);
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gDxeSSREnable] Value = [%u] ", pHddCtx->cfg_ini->dxeSSREnable);
+  VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [toggleArpBDRates] Value = [%u] ", pHddCtx->cfg_ini->toggleArpBDRates);
 }
 
 
@@ -5259,6 +5267,15 @@
        hddLog(LOGE, "Could not pass on"
                "WNI_CFG_ENABLE_RTSCTS_HTVHT to CCM");
    }
+
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TOGGLE_ARP_BDRATES,
+               pConfig->toggleArpBDRates,
+               NULL, eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE)
+   {
+       fStatus = FALSE;
+       hddLog(LOGE, "Could not pass on"
+               "WNI_CFG_TOGGLE_ARP_BDRATES to CCM");
+   }
    return fStatus;
 }
 
diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c
index ae09c42..16edd15 100644
--- a/CORE/HDD/src/wlan_hdd_wmm.c
+++ b/CORE/HDD/src/wlan_hdd_wmm.c
@@ -1990,6 +1990,8 @@
       }
       else
       {
+          v_BOOL_t toggleArpBDRates =
+                        (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini->toggleArpBDRates;
           // default
 #ifdef HDD_WMM_DEBUG
           VOS_TRACE(VOS_MODULE_ID_HDD, WMM_TRACE_LEVEL_WARN,
@@ -1999,6 +2001,11 @@
           //Give the highest priority to 802.1x packet
           if (pHdr->eth_II.h_proto == htons(HDD_ETHERTYPE_802_1_X))
               tos = 0xC0;
+          else if (TRUE == toggleArpBDRates &&
+                   pHdr->eth_II.h_proto == htons(HDD_ETHERTYPE_ARP))
+          {
+              tos = TID3;
+          }
           else
               tos = 0;
       }
diff --git a/CORE/MAC/inc/wniCfg.h b/CORE/MAC/inc/wniCfg.h
index caf3c77..be04fb1 100644
--- a/CORE/MAC/inc/wniCfg.h
+++ b/CORE/MAC/inc/wniCfg.h
@@ -380,7 +380,8 @@
      WNI_CFG_BURST_MODE_BE_TXOP_VALUE,
      WNI_CFG_ENABLE_DYNAMIC_RA_START_RATE,
      WNI_CFG_BTC_FAST_WLAN_CONN_PREF,
-     WNI_CFG_ENABLE_RTSCTS_HTVHT
+     WNI_CFG_ENABLE_RTSCTS_HTVHT,
+     WNI_CFG_TOGGLE_ARP_BDRATES
 };
 
 /*
@@ -1861,8 +1862,12 @@
 #define WNI_CFG_ENABLE_RTSCTS_HTVHT_MAX 0x1f0f
 #define WNI_CFG_ENABLE_RTSCTS_HTVHT_DEF 0x0000
 
-#define CFG_PARAM_MAX_NUM        347
-#define CFG_STA_IBUF_MAX_SIZE    281
+#define WNI_CFG_TOGGLE_ARP_BDRATES_MIN 0
+#define WNI_CFG_TOGGLE_ARP_BDRATES_MAX 1
+#define WNI_CFG_TOGGLE_ARP_BDRATES_DEF 0
+
+#define CFG_PARAM_MAX_NUM        348
+#define CFG_STA_IBUF_MAX_SIZE    282
 #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 321a3d6..b992b08 100644
--- a/CORE/MAC/src/cfg/cfgProcMsg.c
+++ b/CORE/MAC/src/cfg/cfgProcMsg.c
@@ -1647,7 +1647,11 @@
      WNI_CFG_ENABLE_RTSCTS_HTVHT_MIN,
      WNI_CFG_ENABLE_RTSCTS_HTVHT_MAX,
      WNI_CFG_ENABLE_RTSCTS_HTVHT_DEF},
-
+    {WNI_CFG_TOGGLE_ARP_BDRATES,
+     CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT | CFG_CTL_NTF_HAL,
+     WNI_CFG_TOGGLE_ARP_BDRATES_MIN,
+     WNI_CFG_TOGGLE_ARP_BDRATES_MAX,
+     WNI_CFG_TOGGLE_ARP_BDRATES_DEF},
 };
 
 tAniSirCfgStaticString cfgStaticString[CFG_MAX_STATIC_STRING] =
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 0d0da27..d160b0b 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -138,6 +138,7 @@
 #include "vos_trace.h"
 #include "wlan_qct_tl_trace.h"
 #include "tlDebug.h"
+#include "cfgApi.h"
 #ifdef FEATURE_WLAN_WAPI
 /*Included to access WDI_RxBdType */
 #include "wlan_qct_wdi_bd.h"
@@ -1150,6 +1151,8 @@
   WLANTL_CbType*  pTLCb = NULL;
   WLANTL_STAClientType* pClientSTA = NULL;
   v_U8_t    ucTid = 0;/*Local variable to clear previous replay counters of STA on all TIDs*/
+  v_U32_t   istoggleArpEnb = 0;
+  tpAniSirGlobal pMac;
   /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
 
   /*------------------------------------------------------------------------
@@ -1233,10 +1236,17 @@
   pClientSTA->wSTADesc.ucSTAId  = pwSTADescType->ucSTAId;
   pClientSTA->ptkInstalled = 0;
 
+  pMac = vos_get_context(VOS_MODULE_ID_PE, pvosGCtx);
+  if ( NULL != pMac )
+  {
+    wlan_cfgGetInt(pMac, WNI_CFG_TOGGLE_ARP_BDRATES, &istoggleArpEnb);
+  }
+  pClientSTA->arpRate = (v_U8_t)istoggleArpEnb;
+
   TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
-             "WLAN TL:Registering STA Client ID: %d with UC %d and BC %d", 
-             pwSTADescType->ucSTAId, 
-              pwSTADescType->ucUcastSig, pwSTADescType->ucBcastSig));
+   "WLAN TL:Registering STA Client ID: %d with UC %d and BC %d toggleArp :%hhu",
+    pwSTADescType->ucSTAId, pwSTADescType->ucUcastSig,
+    pwSTADescType->ucBcastSig, pClientSTA->arpRate));
 
   pClientSTA->wSTADesc.wSTAType = pwSTADescType->wSTAType;
 
@@ -7995,8 +8005,17 @@
 #endif /* FEATURE_WLAN_TDLS */
   if( tlMetaInfo.ucIsArp )
   {
-    /*Send ARP at lowest Phy rate and through WQ5 */
-    ucTxFlag |= HAL_USE_BD_RATE_MASK;
+    if (pStaClient->arpRate == 0)
+    {
+        ucTxFlag |= HAL_USE_BD_RATE_1_MASK;
+    }
+    else if (pStaClient->arpRate == 1 || pStaClient->arpRate == 3)
+    {
+        pStaClient->arpRate ^= 0x2;
+        ucTxFlag |= HAL_USE_BD_RATE_1_MASK<<(pStaClient->arpRate-1);
+    }
+    TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
+           "arp pkt sending on BD rate: %hhu", pStaClient->arpRate));
   }
 
   vosStatus = (VOS_STATUS)WDA_DS_BuildTxPacketInfo( pvosGCtx, 
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index af20126..b9f3744 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -122,6 +122,7 @@
 
 /*WAPI protocol type */
 #define WLANTL_LLC_WAI_TYPE              0x88b4
+#define WLANTL_ETHERTYPE_ARP             0x0806
 
 #ifdef FEATURE_WLAN_TDLS
 #define WLANTL_LLC_TDLS_TYPE             0x890d
@@ -695,6 +696,8 @@
 
   WLANTL_InterfaceStatsType         interfaceStats;
 #endif
+  /* BD Rate for transmitting ARP packets */
+  v_U8_t arpRate;
 }WLANTL_STAClientType;
 
 /*---------------------------------------------------------------------------
diff --git a/CORE/WDA/inc/legacy/wlan_qct_hal.h b/CORE/WDA/inc/legacy/wlan_qct_hal.h
index d1d7901..d334230 100644
--- a/CORE/WDA/inc/legacy/wlan_qct_hal.h
+++ b/CORE/WDA/inc/legacy/wlan_qct_hal.h
@@ -341,7 +341,9 @@
 
 #define HAL_RELIABLE_MCAST_REQUESTED_MASK   0x100
 
-#define HAL_USE_BD_RATE_MASK                0x1000
+#define HAL_USE_BD_RATE_1_MASK              0x1000 // bit 12 for BD RATE 1
+#define HAL_USE_BD_RATE_2_MASK              0x2000 // bit 13 for BD RATE 1
+#define HAL_USE_BD_RATE_3_MASK              0x4000 // bit 14 for BD RATE 1
 #define HAL_USE_FW_IN_TX_PATH               0x200 //bit 9 to send via WQ5
 /*==========================================================================
 
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h b/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
index 9d13ed8..76b3395 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
@@ -124,7 +124,9 @@
    This dynamically changes ACK_POLICY = TRUE for multicast frames */
 #define WDI_RELIABLE_MCAST_REQUESTED_MASK 0x100
 
-#define WDI_USE_BD_RATE_MASK              0x1000
+#define WDI_USE_BD_RATE_1_MASK            0x1000
+#define WDI_USE_BD_RATE_2_MASK            0x2000
+#define WDI_USE_BD_RATE_3_MASK            0x4000
 #define WDI_USE_FW_IN_TX_PATH             0x200 //bit 9 used to route the frames to Work Queue 5
 
 /*Macro for getting the size of the TX BD*/
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi_dp.c b/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
index 8db73aa..9355787 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
@@ -552,10 +552,18 @@
         }
 #endif
 
-        if(ucTxFlag & WDI_USE_BD_RATE_MASK)
+        if(ucTxFlag & WDI_USE_BD_RATE_1_MASK)
         {
             pBd->bdRate = WDI_BDRATE_BCDATA_FRAME;
         }
+        else if(ucTxFlag & WDI_USE_BD_RATE_2_MASK)
+        {
+            pBd->bdRate = WDI_BDRATE_BCMGMT_FRAME;
+        }
+        else if(ucTxFlag & WDI_USE_BD_RATE_3_MASK)
+        {
+            pBd->bdRate = WDI_BDRATE_CTRL_FRAME;
+        }
 
         pBd->rmf    = WDI_RMF_DISABLED;