Jelajahi Sumber

mac80211: disassociate prior to unlinking AP/station

This patch reorders calls during disassociation in
ieee80211_set_disassoc function.
Since sta_info_unlink calls sta_notify(REMOVE) it will
remove the station representing AP from the driver before
it has disassociated from it using bss_info_changed callback.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Tomas Winkler 16 tahun lalu
induk
melakukan
8e268e47b8
1 mengubah file dengan 14 tambahan dan 4 penghapusan
  1. 14 4
      net/mac80211/mlme.c

+ 14 - 4
net/mac80211/mlme.c

@@ -855,16 +855,26 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
 	if (self_disconnected || reason == WLAN_REASON_DISASSOC_STA_HAS_LEFT)
 	if (self_disconnected || reason == WLAN_REASON_DISASSOC_STA_HAS_LEFT)
 		ifsta->state = IEEE80211_STA_MLME_DISABLED;
 		ifsta->state = IEEE80211_STA_MLME_DISABLED;
 
 
-	sta_info_unlink(&sta);
-
 	rcu_read_unlock();
 	rcu_read_unlock();
 
 
-	sta_info_destroy(sta);
-
 	local->hw.conf.ht.enabled = false;
 	local->hw.conf.ht.enabled = false;
 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_HT);
 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_HT);
 
 
 	ieee80211_bss_info_change_notify(sdata, changed);
 	ieee80211_bss_info_change_notify(sdata, changed);
+
+	rcu_read_lock();
+
+	sta = sta_info_get(local, ifsta->bssid);
+	if (!sta) {
+		rcu_read_unlock();
+		return;
+	}
+
+	sta_info_unlink(&sta);
+
+	rcu_read_unlock();
+
+	sta_info_destroy(sta);
 }
 }
 
 
 static int ieee80211_sta_wep_configured(struct ieee80211_sub_if_data *sdata)
 static int ieee80211_sta_wep_configured(struct ieee80211_sub_if_data *sdata)