wlan: move mcast list to adapter context

Earlier mcast list was present in HDD context
but in case of concurrency scenarios the multicast
filter list has to be maintained per session,
so move multicast filter list to adapter context.

CRs-fixed: 451973
Change-Id: I02ac95127af02dd2c2fc568552d5b2ac2fd5ef92
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 944bbde..3351d79 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -638,6 +638,17 @@
 
 }hdd_scaninfo_t;
 
+#define WLAN_HDD_MAX_MC_ADDR_LIST 10
+
+#ifdef WLAN_FEATURE_PACKET_FILTERING
+typedef struct multicast_addr_list
+{
+   v_U8_t isFilterApplied;
+   v_U8_t mc_cnt;
+   v_U8_t addr[WLAN_HDD_MAX_MC_ADDR_LIST][ETH_ALEN];
+} t_multicast_add_list;
+#endif
+
 #define WLAN_HDD_ADAPTER_MAGIC 0x574c414e //ASCII "WLAN"
 struct hdd_adapter_s
 {
@@ -765,6 +776,10 @@
    hdd_cfg80211_state_t cfg80211State;
 #endif
 
+#ifdef WLAN_FEATURE_PACKET_FILTERING
+   t_multicast_add_list mc_addr_list;
+#endif
+
    //Magic cookie for adapter sanity verification
    v_U32_t magic;
    v_BOOL_t higherDtimTransition;
@@ -785,7 +800,6 @@
 #define WLAN_HDD_GET_HAL_CTX(pAdapter)  (((hdd_context_t*)(pAdapter->pHddCtx))->hHal)
 #define WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter) (&(pAdapter)->sessionCtx.ap.HostapdState)
 #define WLAN_HDD_GET_CFG_STATE_PTR(pAdapter)  (&(pAdapter)->cfg80211State)
-#define WLAN_HDD_MAX_MC_ADDR_LIST 10
 
 typedef struct hdd_adapter_list_node
 {
@@ -800,15 +814,6 @@
    int total_len;
 }hdd_priv_data_t;
 
-#ifdef WLAN_FEATURE_PACKET_FILTERING
-typedef struct multicast_addr_list
-{
-   v_U8_t isFilterApplied;
-   v_U8_t mc_cnt;
-   v_U8_t addr[WLAN_HDD_MAX_MC_ADDR_LIST][ETH_ALEN];
-} t_multicast_add_list;
-#endif
-
 /** Adapter stucture definition */
 
 struct hdd_context_s
@@ -929,9 +934,6 @@
 
    /* Thermal mitigation information */
    hdd_thermal_mitigation_info_t tmInfo;
-#ifdef WLAN_FEATURE_PACKET_FILTERING
-   t_multicast_add_list mc_addr_list;
-#endif
 
 #ifdef WLAN_OPEN_SOURCE
 #ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
diff --git a/CORE/HDD/inc/wlan_hdd_wext.h b/CORE/HDD/inc/wlan_hdd_wext.h
index 8b70b04..e9538d9 100644
--- a/CORE/HDD/inc/wlan_hdd_wext.h
+++ b/CORE/HDD/inc/wlan_hdd_wext.h
@@ -423,5 +423,9 @@
 VOS_STATUS iw_set_tdls_params(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra, int nOffset);
 #endif
 
+#ifdef WLAN_FEATURE_PACKET_FILTERING
+void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set);
+#endif
+
 #endif // __WEXT_IW_H__
 
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index f756429..b14fd4f 100755
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -122,10 +122,6 @@
 
 #define BEACON_FRAME_IES_OFFSET 12
 
-#ifdef WLAN_FEATURE_PACKET_FILTERING
-extern void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId);
-#endif
-
 void hdd_ResetCountryCodeAfterDisAssoc(hdd_adapter_t *pAdapter);
 
 v_VOID_t hdd_connSetConnectionState( hdd_station_ctx_t *pHddStaCtx,
@@ -2198,11 +2194,11 @@
                 if (pHddCtx->cfg_ini->isMcAddrListFilter)
                 {
                     /*Multicast addr filtering is enabled*/
-                    if(pHddCtx->mc_addr_list.isFilterApplied)
+                    if (pAdapter->mc_addr_list.isFilterApplied)
                     {
                         /*Filter applied during suspend mode*/
                         /*Clear it here*/
-                        wlan_hdd_set_mc_addr_list(pHddCtx, FALSE, pAdapter->sessionId);
+                        wlan_hdd_set_mc_addr_list(pAdapter, FALSE);
                     }
                 }
 #endif
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index fdbeac8..d70df48 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -131,9 +131,6 @@
 extern tVOS_CON_MODE hdd_get_conparam ( void );
 #endif
 
-#ifdef WLAN_FEATURE_PACKET_FILTERING
-extern void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId);
-#endif
 static struct timer_list ssr_timer;
 static bool ssr_timer_started;
 
@@ -893,12 +890,12 @@
            /*Multicast addr list filter is enabled during suspend*/
            if (((pAdapter->device_mode == WLAN_HDD_INFRA_STATION) || 
                     (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT))
-                 && pHddCtx->mc_addr_list.mc_cnt
+                 && pAdapter->mc_addr_list.mc_cnt
                  && (eConnectionState_Associated == 
                     (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
            {
               /*set the filter*/
-              wlan_hdd_set_mc_addr_list(pHddCtx, TRUE, pAdapter->sessionId);
+              wlan_hdd_set_mc_addr_list(pAdapter, TRUE);
            }
         }
 #endif
@@ -911,7 +908,7 @@
     }
 }
 
-static void hdd_conf_resume_ind(hdd_adapter_t *pAdapter, v_U8_t sessionId)
+static void hdd_conf_resume_ind(hdd_adapter_t *pAdapter)
 {
     VOS_STATUS vstatus;
     hdd_context_t* pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
@@ -925,39 +922,43 @@
         return;
     }
 
-    hddLog(VOS_TRACE_LEVEL_INFO, 
+    hddLog(VOS_TRACE_LEVEL_INFO,
       "%s: send wlan resume indication", __func__);
 
-    if(pHddCtx->cfg_ini->fhostArpOffload)
+    if (pHddCtx->hdd_mcastbcast_filter_set == TRUE)
     {
-        vstatus = hdd_conf_hostarpoffload(pAdapter, FALSE);
-        if (!VOS_IS_STATUS_SUCCESS(vstatus))
+        if (pHddCtx->cfg_ini->fhostArpOffload)
         {
-            hddLog(VOS_TRACE_LEVEL_INFO, "%s:Failed to disable ARPOFFLOAD "
-                  "Feature %d\n", __func__, vstatus);
+            vstatus = hdd_conf_hostarpoffload(pAdapter, FALSE);
+            if (!VOS_IS_STATUS_SUCCESS(vstatus))
+            {
+                hddLog(VOS_TRACE_LEVEL_INFO, "%s:Failed to disable ARPOFFLOAD "
+                      "Feature %d\n", __func__, vstatus);
+            }
         }
+        if (pHddCtx->dynamic_mcbc_filter.enableSuspend)
+        {
+            wlanResumeParam->configuredMcstBcstFilterSetting =
+                                   pHddCtx->dynamic_mcbc_filter.mcBcFilterSuspend;
+        }
+        else
+        {
+            wlanResumeParam->configuredMcstBcstFilterSetting =
+                                        pHddCtx->cfg_ini->mcastBcastFilterSetting;
+        }
+        sme_ConfigureResumeReq(pHddCtx->hHal, wlanResumeParam);
+        pHddCtx->hdd_mcastbcast_filter_set = FALSE;
     }
-    if (pHddCtx->dynamic_mcbc_filter.enableSuspend)
-    {
-        wlanResumeParam->configuredMcstBcstFilterSetting = 
-                               pHddCtx->dynamic_mcbc_filter.mcBcFilterSuspend;
-    }
-    else
-    {
-        wlanResumeParam->configuredMcstBcstFilterSetting = 
-                                    pHddCtx->cfg_ini->mcastBcastFilterSetting;
-    }
-    sme_ConfigureResumeReq(pHddCtx->hHal, wlanResumeParam);
 
 #ifdef WLAN_FEATURE_PACKET_FILTERING    
     if (pHddCtx->cfg_ini->isMcAddrListFilter)
     {
-       /*Mutlicast addr filtering is enabled*/
-       if(pHddCtx->mc_addr_list.isFilterApplied)
+       /*Multicast addr filtering is enabled*/
+       if (pAdapter->mc_addr_list.isFilterApplied)
        {
           /*Filter applied during suspend mode*/
           /*Clear it here*/
-          wlan_hdd_set_mc_addr_list(pHddCtx, FALSE, sessionId);
+          wlan_hdd_set_mc_addr_list(pAdapter, FALSE);
        }
     }
 #endif
@@ -1114,19 +1115,8 @@
       }
    }
 
-#ifdef FEATURE_WLAN_INTEGRATED_SOC
    /*Suspend notification sent down to driver*/
-      hdd_conf_suspend_ind(pHddCtx, pAdapter);
-#else
-      if(pHddCtx->cfg_ini->nEnableSuspend == WLAN_MAP_SUSPEND_TO_MCAST_BCAST_FILTER) {
-         if(eConnectionState_Associated == 
-            (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState) {
-            hdd_conf_mcastbcast_filter(pHddCtx, TRUE);
-            halPSAppsCpuWakeupState(vos_get_context(VOS_MODULE_ID_SME,
-                                  pHddCtx->pvosContext), FALSE);
-         }
-      } 
-#endif
+   hdd_conf_suspend_ind(pHddCtx, pAdapter);
    status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
    pAdapterNode = pNext;
   }
@@ -1347,17 +1337,7 @@
          }
       }
 
-         if(pHddCtx->hdd_mcastbcast_filter_set == TRUE) {
-#ifdef FEATURE_WLAN_INTEGRATED_SOC
-           hdd_conf_resume_ind(pAdapter, pAdapter->sessionId);
-#else
-                  hdd_conf_mcastbcast_filter(pHddCtx, FALSE);
-                              pHddCtx->hdd_mcastbcast_filter_set = FALSE;
-                  halPSAppsCpuWakeupState(vos_get_context(VOS_MODULE_ID_SME,
-                                          pHddCtx->pvosContext), TRUE);
-#endif
-           pHddCtx->hdd_mcastbcast_filter_set = FALSE;
-      }
+      hdd_conf_resume_ind(pAdapter);
       status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
       pAdapterNode = pNext;
    }
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index b935fd2..a266337 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -3090,15 +3090,14 @@
 static void hdd_set_multicast_list(struct net_device *dev)
 {
    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
-   hdd_context_t *pHddCtx;
    int mc_count;
    int i = 0;
    struct netdev_hw_addr *ha;
-   pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
-   if (NULL == pHddCtx)
+
+   if (NULL == pAdapter)
    {
       hddLog(VOS_TRACE_LEVEL_ERROR,
-            "%s: HDD context is Null", __func__);
+            "%s: Adapter context is Null", __func__);
       return;
    }
 
@@ -3106,7 +3105,7 @@
    {
       hddLog(VOS_TRACE_LEVEL_INFO,
             "%s: allow all multicast frames", __func__);
-      pHddCtx->mc_addr_list.mc_cnt = 0;
+      pAdapter->mc_addr_list.mc_cnt = 0;
    }
    else 
    {
@@ -3117,22 +3116,20 @@
       {
          hddLog(VOS_TRACE_LEVEL_INFO,
                "%s: No free filter available; allow all multicast frames", __func__);
-         pHddCtx->mc_addr_list.mc_cnt = 0;
+         pAdapter->mc_addr_list.mc_cnt = 0;
          return;
       }
 
-      pHddCtx->mc_addr_list.mc_cnt = mc_count;
+      pAdapter->mc_addr_list.mc_cnt = mc_count;
 
       netdev_for_each_mc_addr(ha, dev) {
          if (i == mc_count)
             break;
-         memset(&(pHddCtx->mc_addr_list.addr[i][0]), 0, ETH_ALEN);
-         memcpy(&(pHddCtx->mc_addr_list.addr[i][0]), ha->addr, ETH_ALEN);
-         hddLog(VOS_TRACE_LEVEL_INFO, "\n%s: mlist[%d] = %02x:%02x:%02x:%02x:%02x:%02x", 
+         memset(&(pAdapter->mc_addr_list.addr[i][0]), 0, ETH_ALEN);
+         memcpy(&(pAdapter->mc_addr_list.addr[i][0]), ha->addr, ETH_ALEN);
+         hddLog(VOS_TRACE_LEVEL_INFO, "\n%s: mlist[%d] = "MAC_ADDRESS_STR,
                __func__, i, 
-               pHddCtx->mc_addr_list.addr[i][0], pHddCtx->mc_addr_list.addr[i][1], 
-               pHddCtx->mc_addr_list.addr[i][2], pHddCtx->mc_addr_list.addr[i][3], 
-               pHddCtx->mc_addr_list.addr[i][4], pHddCtx->mc_addr_list.addr[i][5]);
+               MAC_ADDR_ARRAY(pAdapter->mc_addr_list.addr[i]));
          i++;
       }
    }
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 43141a9..40cfd89 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -368,7 +368,6 @@
 #ifdef WLAN_FEATURE_PACKET_FILTERING
 int wlan_hdd_set_filter(hdd_context_t *pHddCtx, tpPacketFilterCfg pRequest, 
                            v_U8_t sessionId);
-void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId);
 #endif
 
 /**---------------------------------------------------------------------------
@@ -5341,16 +5340,17 @@
     return 0;
 }
 
-void wlan_hdd_set_mc_addr_list(hdd_context_t *pHddCtx, v_U8_t set, v_U8_t sessionId)
+void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set)
 {
-    v_U8_t filterAction = 0; 
-    tPacketFilterCfg request = {0}; 
-    v_U8_t i = 0;
+    v_U8_t filterAction;
+    tPacketFilterCfg request;
+    v_U8_t i;
+    hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 
     filterAction = set ? HDD_RCV_FILTER_SET : HDD_RCV_FILTER_CLEAR;
 
     /*set mulitcast addr list*/
-    for (i = 0; i < pHddCtx->mc_addr_list.mc_cnt; i++)
+    for (i = 0; i < pAdapter->mc_addr_list.mc_cnt; i++)
     {
         memset(&request, 0, sizeof (tPacketFilterCfg));
         request.filterAction = filterAction;
@@ -5363,22 +5363,17 @@
             request.paramsData[0].dataOffset = WLAN_HDD_80211_FRM_DA_OFFSET;
             request.paramsData[0].dataLength = ETH_ALEN;
             memcpy(&(request.paramsData[0].compareData[0]), 
-                    &(pHddCtx->mc_addr_list.addr[i][0]), ETH_ALEN);
+                    &(pAdapter->mc_addr_list.addr[i][0]), ETH_ALEN);
             /*set mulitcast filters*/
             hddLog(VOS_TRACE_LEVEL_INFO, 
                     "%s: %s multicast filter: addr =" 
-                    "%02x:%02x:%02x:%02x:%02x:%02x", 
+                    MAC_ADDRESS_STR,
                     __func__, set ? "setting" : "clearing", 
-                    request.paramsData[0].compareData[0], 
-                    request.paramsData[0].compareData[1],
-                    request.paramsData[0].compareData[2], 
-                    request.paramsData[0].compareData[3],
-                    request.paramsData[0].compareData[4], 
-                    request.paramsData[0].compareData[5]);
+                    MAC_ADDR_ARRAY(request.paramsData[0].compareData));
         }
-        wlan_hdd_set_filter(pHddCtx, &request, sessionId);
+        wlan_hdd_set_filter(pHddCtx, &request, pAdapter->sessionId);
     }
-    pHddCtx->mc_addr_list.isFilterApplied = set ? TRUE : FALSE;
+    pAdapter->mc_addr_list.isFilterApplied = set ? TRUE : FALSE;
 }
 
 static int iw_set_packet_filter_params(struct net_device *dev, struct iw_request_info *info,