Просмотр исходного кода

qcacmn: Add API with flag to validate disconnect request

In case of ml_activate_pend_disconn_req_cb, mlo_disconnect is called
which validates disconnect request. If the disconnect was deferred due
to race in mlo connect notify event and disconnect received by mlo
manager, then ml_activate_pend_disconn_req_cb will end up in a deadloop
where it will always defer any disconnect due to above race.
Hence, add API with flag to validate disconnect request.

Change-Id: Ifa434a2f2f5e7a4d17d25349cb7ab86fa50ce043
CRs-Fixed: 3361387
Himanshu Batra 2 лет назад
Родитель
Сommit
fcba5ea249
1 измененных файлов с 31 добавлено и 13 удалено
  1. 31 13
      umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

+ 31 - 13
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -36,6 +36,12 @@
 #include <wlan_scan_api.h>
 
 #ifdef WLAN_FEATURE_11BE_MLO
+static QDF_STATUS mlo_disocnnect_req(struct wlan_objmgr_vdev *vdev,
+				     enum wlan_cm_source source,
+				     enum wlan_reason_code reason_code,
+				     struct qdf_mac_addr *bssid,
+				     bool validate_req);
+
 static inline void
 mlo_allocate_and_copy_ies(struct wlan_cm_connect_req *target,
 			  struct wlan_cm_connect_req *source)
@@ -844,9 +850,9 @@ static QDF_STATUS ml_activate_pend_disconn_req_cb(struct scheduler_msg *msg)
 
 	mlo_dev_ctx = vdev->mlo_dev_ctx;
 	sta_ctx = mlo_dev_ctx->sta_ctx;
-	mlo_disconnect(vdev, sta_ctx->disconn_req->source,
-		       sta_ctx->disconn_req->reason_code,
-		       &sta_ctx->disconn_req->bssid);
+	mlo_disocnnect_req(vdev, sta_ctx->disconn_req->source,
+			   sta_ctx->disconn_req->reason_code,
+			   &sta_ctx->disconn_req->bssid, false);
 
 	qdf_mem_free(sta_ctx->disconn_req);
 	sta_ctx->disconn_req = NULL;
@@ -1076,10 +1082,11 @@ mlo_send_link_disconnect_sync(struct wlan_mlo_dev_context *mlo_dev_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS mlo_disconnect(struct wlan_objmgr_vdev *vdev,
-			  enum wlan_cm_source source,
-			  enum wlan_reason_code reason_code,
-			  struct qdf_mac_addr *bssid)
+static QDF_STATUS mlo_disocnnect_req(struct wlan_objmgr_vdev *vdev,
+				     enum wlan_cm_source source,
+				     enum wlan_reason_code reason_code,
+				     struct qdf_mac_addr *bssid,
+				     bool validate_req)
 {
 	struct wlan_mlo_dev_context *mlo_dev_ctx = NULL;
 	struct wlan_mlo_sta *sta_ctx = NULL;
@@ -1100,13 +1107,16 @@ QDF_STATUS mlo_disconnect(struct wlan_objmgr_vdev *vdev,
 			sta_ctx->connect_req = NULL;
 		}
 
-		status = mlo_validate_disconn_req(vdev, source,
-						  reason_code, bssid);
-		if (QDF_IS_STATUS_ERROR(status)) {
-			mlo_debug("Connect in progress, deferring disconnect");
-			mlo_dev_lock_release(mlo_dev_ctx);
-			return status;
+		if (validate_req) {
+			status = mlo_validate_disconn_req(vdev, source,
+							  reason_code, bssid);
+			if (QDF_IS_STATUS_ERROR(status)) {
+				mlo_debug("Connect in progress, deferring disconnect");
+				mlo_dev_lock_release(mlo_dev_ctx);
+				return status;
+			}
 		}
+
 		mlo_dev_lock_release(mlo_dev_ctx);
 
 		status = mlo_send_link_disconnect(vdev, source,
@@ -1124,6 +1134,14 @@ QDF_STATUS mlo_disconnect(struct wlan_objmgr_vdev *vdev,
 	return status;
 }
 
+QDF_STATUS mlo_disconnect(struct wlan_objmgr_vdev *vdev,
+			  enum wlan_cm_source source,
+			  enum wlan_reason_code reason_code,
+			  struct qdf_mac_addr *bssid)
+{
+	return mlo_disocnnect_req(vdev, source, reason_code, bssid, true);
+}
+
 QDF_STATUS mlo_sync_disconnect(struct wlan_objmgr_vdev *vdev,
 			       enum wlan_cm_source source,
 			       enum wlan_reason_code reason_code,