Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58b684e9 authored by sheenam monga's avatar sheenam monga Committed by snandini
Browse files

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
parent 03924eab
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -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(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;
}