Procházet zdrojové kódy

qcacld-3.0: Clear connection info of both ml and assoc link when disconnect

When wlan0 connect, connect info as bssid are saved to both ML adapter and
assoc link adapter.
When wlan0 disconnect, connect info as bssid isn't cleared in both adapter.

When 2nd sta connected same bssid, in __wlan_hdd_cfg80211_get_station old
wlan0 adapter is got by hdd_get_adapter_by_bssid, but it is disconnected,
so no right rssi reported.

Change-Id: I5dd2b6dcdd063509ee42088270cc85f2466e3b67
CRs-Fixed: 3317428
Jianmin Zhu před 2 roky
rodič
revize
5fb29aca2e

+ 15 - 0
core/hdd/inc/wlan_hdd_mlo.h

@@ -128,6 +128,15 @@ void hdd_adapter_set_ml_adapter(struct hdd_adapter *adapter);
  * Return: adapter or NULL
  */
 struct hdd_adapter *hdd_get_ml_adater(struct hdd_context *hdd_ctx);
+
+/**
+ * hdd_get_assoc_link_adapter() - get assoc link adapter
+ * @ml_adapter: ML adapter
+ *
+ * This function returns assoc link adapter
+ * Return: adapter or NULL
+ */
+struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter);
 #else
 static inline
 QDF_STATUS hdd_wlan_unregister_mlo_interfaces(struct hdd_adapter *adapter,
@@ -158,5 +167,11 @@ struct hdd_adapter *hdd_get_ml_adater(struct hdd_context *hdd_ctx)
 {
 	return NULL;
 }
+
+static inline
+struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
+{
+	return NULL;
+}
 #endif
 #endif

+ 0 - 8
core/hdd/src/wlan_hdd_cm_connect.c

@@ -1217,7 +1217,6 @@ static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx,
 #endif
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC)
-static
 struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
 {
 	int i;
@@ -1236,13 +1235,6 @@ struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
 	}
 	return NULL;
 }
-
-#else
-static
-struct hdd_adapter *hdd_get_assoc_link_adapter(struct hdd_adapter *ml_adapter)
-{
-	return NULL;
-}
 #endif
 
 static void

+ 12 - 0
core/hdd/src/wlan_hdd_cm_disconnect.c

@@ -165,6 +165,8 @@ void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter,
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	mac_handle_t mac_handle;
+	struct hdd_adapter *link_adapter;
+	struct hdd_station_ctx *link_sta_ctx;
 
 	mac_handle = hdd_ctx->mac_handle;
 
@@ -188,6 +190,16 @@ void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter,
 						 SCAN_EVENT_TYPE_MAX, true);
 	}
 
+	if (adapter->device_mode == QDF_STA_MODE &&
+	    hdd_adapter_is_ml_adapter(adapter)) {
+		/* Clear connection info in assoc link adapter as well */
+		link_adapter = hdd_get_assoc_link_adapter(adapter);
+		if (link_adapter) {
+			link_sta_ctx =
+				WLAN_HDD_GET_STATION_CTX_PTR(link_adapter);
+			hdd_conn_remove_connect_info(link_sta_ctx);
+		}
+	}
 	/* Clear saved connection information in HDD */
 	hdd_conn_remove_connect_info(sta_ctx);