From 58b684e9fe704ff6fe4a569a688b7b2df0b2acb3 Mon Sep 17 00:00:00 2001 From: sheenam monga Date: Fri, 16 Apr 2021 11:30:04 +0530 Subject: [PATCH] qcacld-3.0: Release reference of in_dev after fetching ipv4 list Currently, while fetching ipv4 list in_dev is get via in_dev_get and ref count of in_dev is incremented but after fetching ip list in_dev_put is not used. So, ref count will not be zero and may lead to issue while destorying in_dev. Fix is to use in_dev_put to maintain ref count to free in_dev during rmmod. Change-Id: I20a73127bb41c807315dbcd18adc1fb4278aa6d3 CRs-Fixed: 2921256 --- core/hdd/src/wlan_hdd_power.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index ca12f36e6a22..d41186b4aa4c 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -206,20 +206,30 @@ static QDF_STATUS hdd_send_igmp_offload_params(struct hdd_adapter *adapter, bool enable) { - struct in_device *in_dev = in_dev_get(adapter->dev); - struct ip_mc_list *ip_list = in_dev->mc_list; + struct wlan_objmgr_vdev *vdev; + struct in_device *in_dev = adapter->dev->ip_ptr; + struct ip_mc_list *ip_list; struct pmo_igmp_offload_req *igmp_req = NULL; int count = 0; QDF_STATUS status; - if (!ip_list) { - hdd_debug("ip list empty"); + if (!in_dev) { + hdd_err("in_dev is NULL"); return QDF_STATUS_E_FAILURE; } + ip_list = in_dev->mc_list; + if (!ip_list) { + hdd_debug("ip list empty"); + status = QDF_STATUS_E_FAILURE; + goto out; + } + igmp_req = qdf_mem_malloc(sizeof(*igmp_req)); - if (!igmp_req) - return QDF_STATUS_E_FAILURE; + if (!igmp_req) { + status = QDF_STATUS_E_FAILURE; + goto out; + } while (ip_list && ip_list->multiaddr && enable && count < MAX_MC_IP_ADDR) { @@ -233,11 +243,21 @@ hdd_send_igmp_offload_params(struct hdd_adapter *adapter, igmp_req->enable = enable; igmp_req->num_grp_ip_address = count; - status = ucfg_pmo_enable_igmp_offload(adapter->vdev, igmp_req); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + qdf_mem_free(igmp_req); + status = QDF_STATUS_E_FAILURE; + goto out; + } + + status = ucfg_pmo_enable_igmp_offload(vdev, igmp_req); if (status != QDF_STATUS_SUCCESS) hdd_info("Failed to enable igmp offload"); + hdd_objmgr_put_vdev(vdev); qdf_mem_free(igmp_req); +out: return status; }