Browse Source

qcacld-3.0: Check vdev from CDP vdev_id API

Check for validity of vdev obtained from the CDP
cdp_get_vdev_from_vdev_id API.

Change-Id: Ie7fb99a0e08135bd3f2cc6b63070a4bd72df943a
CRs-Fixed: 2434583
Mohit Khanna 6 years ago
parent
commit
e1b8602571

+ 9 - 3
components/ipa/core/src/wlan_ipa_core.c

@@ -354,13 +354,15 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward(
 	if ((desc & FW_RX_DESC_FORWARD_M)) {
 		void *vdev = cdp_get_vdev_from_vdev_id(soc, pdev,
 						       iface_ctx->session_id);
+		if (!vdev)
+			goto drop_pkt;
+
 		if (cdp_tx_desc_thresh_reached(soc, vdev)) {
 			/* Drop the packet*/
 			ipa_ctx->stats.num_tx_fwd_err++;
-			dev_kfree_skb_any(skb);
-			ret = WLAN_IPA_FORWARD_PKT_DISCARD;
-			return ret;
+			goto drop_pkt;
 		}
+
 		ipa_debug_rl("Forward packet to Tx (fw_desc=%d)", desc);
 		ipa_ctx->ipa_tx_forward++;
 
@@ -380,7 +382,11 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward(
 			ret = WLAN_IPA_FORWARD_PKT_LOCAL_STACK;
 		}
 	}
+	return ret;
 
+drop_pkt:
+	dev_kfree_skb_any(skb);
+	ret = WLAN_IPA_FORWARD_PKT_DISCARD;
 	return ret;
 }
 

+ 10 - 6
core/hdd/src/wlan_hdd_assoc.c

@@ -2126,7 +2126,6 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
 				(struct cdp_pdev *)pdev,
 				adapter->vdev_id);
 	if (!adapter->txrx_vdev) {
-		hdd_err("%s find vdev fail", __func__);
 		return QDF_STATUS_E_FAILURE;
 	}
 
@@ -4020,6 +4019,7 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
 	struct ol_txrx_ops txrx_ops;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	struct cdp_vdev *txrx_vdev;
 
 	/*
 	 * TDLS sta in BSS should be set as STA type TDLS and STA MAC should
@@ -4039,12 +4039,16 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
 		txrx_ops.rx.rx = hdd_rx_packet_cbk;
 		txrx_ops.rx.rx_stack = NULL;
 	}
+	txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
+					      (struct cdp_pdev *)pdev,
+					      adapter->vdev_id);
+	if (!txrx_vdev)
+		return QDF_STATUS_E_FAILURE;
 
-	cdp_vdev_register(soc,
-		(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
-		(struct cdp_pdev *)pdev, adapter->vdev_id),
-		adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
-		&txrx_ops);
+	cdp_vdev_register(soc, txrx_vdev,
+			  adapter,
+			  (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
+			  &txrx_ops);
 	adapter->tx_fn = txrx_ops.tx.tx;
 	txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
 

+ 10 - 6
core/hdd/src/wlan_hdd_cfg80211.c

@@ -4470,6 +4470,7 @@ static int __wlan_hdd_cfg80211_handle_wisa_cmd(struct wiphy *wiphy,
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 	mac_handle_t mac_handle;
+	struct cdp_vdev *txrx_vdev = NULL;
 
 	hdd_enter_dev(dev);
 	ret_val = wlan_hdd_validate_context(hdd_ctx);
@@ -4503,12 +4504,15 @@ static int __wlan_hdd_cfg80211_handle_wisa_cmd(struct wiphy *wiphy,
 		hdd_err("Unable to set WISA mode: %d to FW", wisa_mode);
 		ret_val = -EINVAL;
 	}
-	if (QDF_IS_STATUS_SUCCESS(status) || wisa_mode == false)
-		cdp_set_wisa_mode(soc,
-			(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
-				(struct cdp_pdev *)pdev,
-				adapter->vdev_id),
-			wisa_mode);
+	if (QDF_IS_STATUS_SUCCESS(status) || !wisa_mode) {
+		txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
+						      (struct cdp_pdev *)pdev,
+						      adapter->vdev_id);
+		if (!txrx_vdev)
+			ret_val = -EINVAL;
+		else
+			cdp_set_wisa_mode(soc, txrx_vdev, wisa_mode);
+	}
 err:
 	hdd_exit();
 	return ret_val;

+ 11 - 7
core/hdd/src/wlan_hdd_ocb.c

@@ -222,6 +222,7 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
 	struct ol_txrx_ops txrx_ops;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	struct cdp_vdev *vdev;
 
 	qdf_status = cdp_peer_register_ocb_peer(soc,
 				adapter->mac_addr.bytes,
@@ -239,16 +240,19 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
 	/* Register the vdev transmit and receive functions */
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	txrx_ops.rx.rx = hdd_rx_packet_cbk;
-	cdp_vdev_register(soc,
-		(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
-		(struct cdp_pdev *)pdev, adapter->vdev_id),
-		adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
-		&txrx_ops);
+	vdev = cdp_get_vdev_from_vdev_id(soc,
+					 (struct cdp_pdev *)pdev,
+					 adapter->vdev_id);
+	if (!vdev)
+		return -EINVAL;
+
+	cdp_vdev_register(soc, vdev, adapter,
+			  (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
+			  &txrx_ops);
 	txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
 	adapter->tx_fn = txrx_ops.tx.tx;
 
-	qdf_status = cdp_peer_register(soc,
-			(struct cdp_pdev *)pdev, &sta_desc);
+	qdf_status = cdp_peer_register(soc, (struct cdp_pdev *)pdev, &sta_desc);
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hdd_err("Failed to register. Status= %d [0x%08X]",
 		       qdf_status, qdf_status);

+ 11 - 4
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -1013,6 +1013,7 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
 	struct ol_txrx_ops txrx_ops;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	struct cdp_vdev *txrx_vdev = NULL;
 
 	hdd_info("STA:%u, Auth:%u, Priv:%u, WMM:%u",
 		 sta_id, auth_required, privacy_required, wmm_enabled);
@@ -1048,11 +1049,17 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
 		txrx_ops.rx.rx_stack = NULL;
 	}
 
+	txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
+					      (struct cdp_pdev *)pdev,
+					      adapter->vdev_id);
+	if (!txrx_vdev)
+		return QDF_STATUS_E_FAILURE;
+
 	cdp_vdev_register(soc,
-		(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
-		(struct cdp_pdev *)pdev, adapter->vdev_id),
-		adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
-		&txrx_ops);
+			  txrx_vdev,
+			  adapter,
+			  (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
+			  &txrx_ops);
 	adapter->txrx_vdev = (void *)cdp_get_vdev_from_vdev_id(soc,
 					(struct cdp_pdev *)pdev,
 					adapter->vdev_id);