Browse Source

qcacmn: Reject tdls_vdev create/destroy when disabled in INI

Reject tdls_vdev creation and destroy, when TDLS is disabled in INI.

Change-Id: Ie85e8ed231e14dc413e4bfdcff205c47115c84dd
CRs-Fixed: 2229872
Frank Liu 7 năm trước cách đây
mục cha
commit
2688ed785d
1 tập tin đã thay đổi với 36 bổ sung13 xóa
  1. 36 13
      core/src/wlan_tdls_main.c

+ 36 - 13
core/src/wlan_tdls_main.c

@@ -150,13 +150,26 @@ QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
 	QDF_STATUS status;
 	struct tdls_vdev_priv_obj *tdls_vdev_obj;
 	struct wlan_objmgr_pdev *pdev;
-	struct tdls_soc_priv_obj *tdls_soc;
+	struct tdls_soc_priv_obj *tdls_soc_obj;
+	uint32_t tdls_feature_flags;
 
 	tdls_notice("tdls vdev mode %d", wlan_vdev_mlme_get_opmode(vdev));
 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE &&
 	    wlan_vdev_mlme_get_opmode(vdev) != QDF_P2P_CLIENT_MODE)
 		return QDF_STATUS_SUCCESS;
 
+	tdls_soc_obj = wlan_vdev_get_tdls_soc_obj(vdev);
+	if (!tdls_soc_obj) {
+		tdls_err("get soc by vdev failed");
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	tdls_feature_flags = tdls_soc_obj->tdls_configs.tdls_feature_flags;
+	if (!TDLS_IS_ENABLED(tdls_feature_flags)) {
+		tdls_debug("disabled in ini");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	/* TODO: Add concurrency check */
 
 	tdls_vdev_obj = qdf_mem_malloc(sizeof(*tdls_vdev_obj));
@@ -171,33 +184,29 @@ QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
 						       QDF_STATUS_SUCCESS);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		tdls_err("Failed to attach vdev tdls component");
-		qdf_mem_free(tdls_vdev_obj);
-		goto out;
+		goto err;
 	}
 	tdls_vdev_obj->vdev = vdev;
 	status = tdls_vdev_init(tdls_vdev_obj);
 	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
-	tdls_soc = wlan_vdev_get_tdls_soc_obj(vdev);
-	if (!tdls_soc) {
-		tdls_err("get soc by vdev failed ");
-		return QDF_STATUS_E_NOMEM;
-	}
+		goto err;
 
 	pdev = wlan_vdev_get_pdev(vdev);
 
 	status = ucfg_scan_register_event_handler(pdev,
 				tdls_scan_complete_event_handler,
-				tdls_soc);
+				tdls_soc_obj);
 
 	if (QDF_STATUS_SUCCESS != status) {
 		tdls_err("scan event register failed ");
-		return QDF_STATUS_E_FAILURE;
+		tdls_vdev_deinit(tdls_vdev_obj);
+		goto err;
 	}
 
 	tdls_notice("tdls object attach to vdev successfully");
-out:
+	return status;
+err:
+	qdf_mem_free(tdls_vdev_obj);
 	return status;
 }
 
@@ -206,12 +215,26 @@ QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev,
 {
 	QDF_STATUS status;
 	void *tdls_vdev_obj;
+	struct tdls_soc_priv_obj *tdls_soc_obj;
+	uint32_t tdls_feature_flags;
 
 	tdls_notice("tdls vdev mode %d", wlan_vdev_mlme_get_opmode(vdev));
 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE &&
 	    wlan_vdev_mlme_get_opmode(vdev) != QDF_P2P_CLIENT_MODE)
 		return QDF_STATUS_SUCCESS;
 
+	tdls_soc_obj = wlan_vdev_get_tdls_soc_obj(vdev);
+	if (!tdls_soc_obj) {
+		tdls_err("get soc by vdev failed");
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	tdls_feature_flags = tdls_soc_obj->tdls_configs.tdls_feature_flags;
+	if (!TDLS_IS_ENABLED(tdls_feature_flags)) {
+		tdls_debug("disabled in ini");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	tdls_vdev_obj = wlan_objmgr_vdev_get_comp_private_obj(vdev,
 							WLAN_UMAC_COMP_TDLS);
 	if (!tdls_vdev_obj) {