From d83167190384539393eaa46eed18cf60d277a33b Mon Sep 17 00:00:00 2001 From: Hanumanth Reddy Pothula Date: Fri, 25 Nov 2016 17:13:11 +0530 Subject: qcacld-2.0: Don't process set multicast address list on ini disabled Presently, Host processing set MC request though ini is disabled and also as MC address list is not initialized observed a dog bark while processing MC request with invalid data(MC address list count) Don't process set MC address list if MC address list ini is disabled. Also, initialize MC address list, during driver initialization. Change-Id: Ic199c3ca73526a74d19c1342267979e313b8ba02 CRs-Fixed: 1092414 --- CORE/HDD/inc/wlan_hdd_wext.h | 2 +- CORE/HDD/src/wlan_hdd_assoc.c | 3 ++- CORE/HDD/src/wlan_hdd_main.c | 12 ++++++++++-- CORE/HDD/src/wlan_hdd_wext.c | 18 ++++++++++-------- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CORE/HDD/inc/wlan_hdd_wext.h b/CORE/HDD/inc/wlan_hdd_wext.h index c4b54031ac3c..67b90725fe47 100644 --- a/CORE/HDD/inc/wlan_hdd_wext.h +++ b/CORE/HDD/inc/wlan_hdd_wext.h @@ -460,7 +460,7 @@ VOS_STATUS iw_set_tdls_params(struct net_device *dev, struct iw_request_info *in #endif #ifdef WLAN_FEATURE_PACKET_FILTERING -void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set); +int wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set); #endif void* wlan_hdd_change_country_code_callback(void *pAdapter); diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index c2a22e101870..939633940253 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -4057,7 +4057,8 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, /* Call to clear any MC Addr List filter applied after * successful connection. */ - wlan_hdd_set_mc_addr_list(pAdapter, FALSE); + if (wlan_hdd_set_mc_addr_list(pAdapter, FALSE)) + hddLog(VOS_TRACE_LEVEL_ERROR, FL("failed to clear mc addr list")); #endif } break; diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 51982058447b..f337788285f4 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -10009,7 +10009,11 @@ static void __hdd_set_multicast_list(struct net_device *dev) /* Delete already configured multicast address list */ if (0 < pAdapter->mc_addr_list.mc_cnt) - wlan_hdd_set_mc_addr_list(pAdapter, false); + if (wlan_hdd_set_mc_addr_list(pAdapter, false)) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("failed to clear mc addr list")); + return; + } + if (dev->flags & IFF_ALLMULTI) { @@ -10066,7 +10070,8 @@ static void __hdd_set_multicast_list(struct net_device *dev) } /* Configure the updated multicast address list */ - wlan_hdd_set_mc_addr_list(pAdapter, true); + if (wlan_hdd_set_mc_addr_list(pAdapter, true)) + hddLog(VOS_TRACE_LEVEL_INFO, FL("failed to set mc addr list")); EXIT(); return; @@ -18463,6 +18468,9 @@ int hdd_init_packet_filtering(hdd_context_t *hdd_ctx, return -ENOMEM; } + vos_mem_zero(adapter->mc_addr_list.addr, + (hdd_ctx->max_mc_addr_list * ETH_ALEN)); + return 0; } diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index 5f3c325cc810..0549c3c2f70a 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -9944,11 +9944,12 @@ int wlan_hdd_setIPv6Filter(hdd_context_t *pHddCtx, tANI_U8 filterType, * @pAdapter: Adapter context * @set: flag to notify set/clear action on the multicast addr * - * Returns: None + * Returns: 0 on success, errno on failure */ -void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set) +int wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set) { v_U8_t i; + int ret = 0; tpSirRcvFltMcAddrList pMulticastAddrs = NULL; tHalHandle hHal; hdd_context_t* pHddCtx = (hdd_context_t*)pAdapter->pHddCtx; @@ -9956,26 +9957,26 @@ void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set) ENTER(); - if (wlan_hdd_validate_context(pHddCtx)) - return; + if ((ret = wlan_hdd_validate_context(pHddCtx))) + return ret; hHal = pHddCtx->hHal; if (NULL == hHal) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("HAL Handle is NULL")); - return; + return -EINVAL; } if (!sta_ctx) { hddLog(LOGE, "sta_ctx is NULL"); - return; + return -EINVAL; } if (pHddCtx->cfg_ini->fEnableMCAddrList) { pMulticastAddrs = vos_mem_malloc(sizeof(tSirRcvFltMcAddrList)); if (NULL == pMulticastAddrs) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Could not allocate Memory")); - return; + return -ENOMEM; } vos_mem_zero(pMulticastAddrs, sizeof(tSirRcvFltMcAddrList)); pMulticastAddrs->action = set; @@ -10048,10 +10049,11 @@ void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set) } else { hddLog(VOS_TRACE_LEVEL_INFO, FL("gMCAddrListEnable is not enabled in INI")); + return -EINVAL; } EXIT(); - return; + return ret; } static int __iw_set_packet_filter_params(struct net_device *dev, -- cgit v1.2.3