Browse Source

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 at rmmod.

Change-Id: I20a73127bb41c807315dbcd18adc1fb4278aa6d3
CRs-Fixed: 2921256
sheenam monga 4 years ago
parent
commit
d672135750
1 changed files with 26 additions and 6 deletions
  1. 26 6
      core/hdd/src/wlan_hdd_power.c

+ 26 - 6
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 (!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");
-		return QDF_STATUS_E_FAILURE;
+		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_by_user(adapter, WLAN_OSIF_POWER_ID);
+	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_by_user(vdev, WLAN_OSIF_POWER_ID);
 	qdf_mem_free(igmp_req);
+out:
 	return status;
 }