wlan: Fix for ARP offload issue

Change is to make sure ARP offload works fine
for active sessions when any one out of multiple
session terminated in suspend mode.
Setting of mc/bc filter without considering
ARP offload parameter during DUT suspend mode
was the issue.

CRs-fixed: 452179
Change-Id: I9bd72a43b5bb02df70d63085638b7e8027fcb076
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index b500b2f..fdbeac8 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -720,6 +720,71 @@
    }
 }
 
+/*
+ * This function is called before setting mcbc filters
+ * to modify filter value considering ARP
+*/
+void hdd_mcbc_filter_modification(hdd_context_t* pHddCtx, v_BOOL_t arpFlag,
+                                  tANI_U8 *pMcBcFilter)
+{
+    if (TRUE == arpFlag)
+    {
+        /*ARP offload is enabled, do not block bcast packets at RXP*/
+        if (pHddCtx->dynamic_mcbc_filter.enableCfg)
+        {
+            if ((HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST_BROADCAST ==
+                  pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting))
+            {
+                *pMcBcFilter = HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST;
+            }
+            else if ((HDD_MCASTBCASTFILTER_FILTER_ALL_BROADCAST ==
+                  pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting))
+            {
+                *pMcBcFilter = HDD_MCASTBCASTFILTER_FILTER_NONE;
+            }
+            else
+            {
+                *pMcBcFilter = pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting;
+            }
+
+            pHddCtx->dynamic_mcbc_filter.enableSuspend = TRUE;
+            pHddCtx->dynamic_mcbc_filter.mcBcFilterSuspend = *pMcBcFilter;
+        }
+        else
+        {
+            if (HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST_BROADCAST ==
+                  pHddCtx->cfg_ini->mcastBcastFilterSetting)
+            {
+                *pMcBcFilter = HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST;
+            }
+            else if (HDD_MCASTBCASTFILTER_FILTER_ALL_BROADCAST ==
+                  pHddCtx->cfg_ini->mcastBcastFilterSetting)
+            {
+                *pMcBcFilter = HDD_MCASTBCASTFILTER_FILTER_NONE;
+            }
+            else
+            {
+                *pMcBcFilter = pHddCtx->cfg_ini->mcastBcastFilterSetting;
+            }
+
+            pHddCtx->dynamic_mcbc_filter.enableSuspend = FALSE;
+        }
+    }
+    else
+    {
+        if (pHddCtx->dynamic_mcbc_filter.enableCfg)
+        {
+            *pMcBcFilter = pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting;
+            pHddCtx->dynamic_mcbc_filter.enableSuspend = TRUE;
+        }
+        else
+        {
+            pHddCtx->dynamic_mcbc_filter.enableSuspend = FALSE;
+            *pMcBcFilter = pHddCtx->cfg_ini->mcastBcastFilterSetting;
+        }
+    }
+}
+
 void hdd_conf_mcastbcast_filter(hdd_context_t* pHddCtx, v_BOOL_t setfilter)
 {
     eHalStatus halStatus = eHAL_STATUS_FAILURE;
@@ -747,9 +812,24 @@
       hddLog(VOS_TRACE_LEVEL_FATAL, "%s: pMac is initialised to NULL",__func__ );
     }
 #else
+    if (TRUE == setfilter)
+    {
+        if (pHddCtx->cfg_ini->fhostArpOffload)
+        {
+            hdd_mcbc_filter_modification(pHddCtx, TRUE,
+                  &wlanRxpFilterParam->configuredMcstBcstFilterSetting);
+        }
+        else
+        {
+            hdd_mcbc_filter_modification(pHddCtx, FALSE,
+                  &wlanRxpFilterParam->configuredMcstBcstFilterSetting);
+        }
+    }
+    else
+        wlanRxpFilterParam->configuredMcstBcstFilterSetting =
+                              pHddCtx->cfg_ini->mcastBcastFilterSetting;
+
     wlanRxpFilterParam->setMcstBcstFilter = setfilter;
-    wlanRxpFilterParam->configuredMcstBcstFilterSetting = 
-                      pHddCtx->cfg_ini->mcastBcastFilterSetting;
     halStatus = sme_ConfigureRxpFilter(pHddCtx->hHal, wlanRxpFilterParam);
 #endif
     if(setfilter && (eHAL_STATUS_SUCCESS == halStatus))
@@ -784,87 +864,27 @@
             vstatus = hdd_conf_hostarpoffload(pAdapter, TRUE);
             if (!VOS_IS_STATUS_SUCCESS(vstatus))
             {
-                if(pHddCtx->dynamic_mcbc_filter.enableCfg)
-                {
-                  wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                          pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting;
-                  pHddCtx->dynamic_mcbc_filter.enableSuspend = TRUE;
-                }
-                else
-                {
-                  wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                             pHddCtx->cfg_ini->mcastBcastFilterSetting;
-                }
+                hdd_mcbc_filter_modification(pHddCtx, FALSE,
+                      &wlanSuspendParam->configuredMcstBcstFilterSetting);
                 hddLog(VOS_TRACE_LEVEL_INFO,
                        "%s:Failed to enable ARPOFFLOAD Feature %d\n",
                        __func__, vstatus);
             }
             else
             {
-                if(pHddCtx->dynamic_mcbc_filter.enableCfg)
-                {
-                    if((HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST_BROADCAST == 
-                         pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting))
-                   {
-                       wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                                     HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST;
-                   }
-                   else if((HDD_MCASTBCASTFILTER_FILTER_ALL_BROADCAST == 
-                         pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting))
-                   {
-                       wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                                             HDD_MCASTBCASTFILTER_FILTER_NONE;
-                   }
-                   else
-                   {
-                       wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                          pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting;
-                   }
-
-                   pHddCtx->dynamic_mcbc_filter.enableSuspend = TRUE;
-                   pHddCtx->dynamic_mcbc_filter.mcBcFilterSuspend = 
-                        wlanSuspendParam->configuredMcstBcstFilterSetting;
-                }
-                else
-                {
-                    if (HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST_BROADCAST == 
-                        pHddCtx->cfg_ini->mcastBcastFilterSetting)
-                    {
-                        wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                                     HDD_MCASTBCASTFILTER_FILTER_ALL_MULTICAST;
-                    }
-                    else if(HDD_MCASTBCASTFILTER_FILTER_ALL_BROADCAST == 
-                            pHddCtx->cfg_ini->mcastBcastFilterSetting)
-                    {
-                        wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                                             HDD_MCASTBCASTFILTER_FILTER_NONE;
-                    }
-                    else
-                    {
-                        wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                                 pHddCtx->cfg_ini->mcastBcastFilterSetting;
-                    }
-
-                    pHddCtx->dynamic_mcbc_filter.enableSuspend = FALSE;
-                }
+                hdd_mcbc_filter_modification(pHddCtx, TRUE,
+                      &wlanSuspendParam->configuredMcstBcstFilterSetting);
             }
         }
         else
         {
+            hdd_mcbc_filter_modification(pHddCtx, FALSE,
+                      &wlanSuspendParam->configuredMcstBcstFilterSetting);
             if(pHddCtx->dynamic_mcbc_filter.enableCfg)
             {
-                wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                      pHddCtx->dynamic_mcbc_filter.mcastBcastFilterSetting;
-                pHddCtx->dynamic_mcbc_filter.enableSuspend = TRUE;
                 pHddCtx->dynamic_mcbc_filter.mcBcFilterSuspend = 
                         wlanSuspendParam->configuredMcstBcstFilterSetting;
             }
-            else
-            {
-                pHddCtx->dynamic_mcbc_filter.enableSuspend = FALSE;
-                wlanSuspendParam->configuredMcstBcstFilterSetting = 
-                             pHddCtx->cfg_ini->mcastBcastFilterSetting;
-            }
         }
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING