mac80211: deauth before flushing STA information
Even after commit "mac80211: deauth when interface is marked down" (e327b847
on Linus tree), userspace still isn't notified when interface goes down. There isn't a problem with this commit, but because of other code changes it doesn't work on kernels >= 2.6.28 (works if same/similar change applied on 2.6.27 for example). The issue is as follows: after commit "mac80211: restructure disassoc/deauth flows" in 2.6.28, the call to ieee80211_sta_deauthenticate added by commite327b847
will not work: because we do sta_info_flush(local, sdata) inside ieee80211_stop (iface.c), all stations in interface are cleared, so when calling ieee80211_sta_deauthenticate->ieee80211_set_disassoc (mlme.c), inside ieee80211_set_disassoc we have this in the beginning: sta = sta_info_get(local, ifsta->bssid); if (!sta) { The !sta check triggers, thus the function returns early and ieee80211_sta_send_apinfo(sdata, ifsta) later isn't called, so wpa_supplicant/userspace isn't notified with SIOCGIWAP. This commit moves deauthentication to before flushing STA info (sta_info_flush), thus the above can't happen and userspace is really notified when interface goes down. Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
af88b9078d
commit
1a28c78b46
|
@ -369,6 +369,18 @@ static int ieee80211_stop(struct net_device *dev)
|
|||
|
||||
rcu_read_unlock();
|
||||
|
||||
/*
|
||||
* Announce that we are leaving the network, in case we are a
|
||||
* station interface type. This must be done before removing
|
||||
* all stations associated with sta_info_flush, otherwise STA
|
||||
* information will be gone and no announce being done.
|
||||
*/
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
if (sdata->u.mgd.state != IEEE80211_STA_MLME_DISABLED)
|
||||
ieee80211_sta_deauthenticate(sdata,
|
||||
WLAN_REASON_DEAUTH_LEAVING);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove all stations associated with this interface.
|
||||
*
|
||||
|
@ -454,10 +466,6 @@ static int ieee80211_stop(struct net_device *dev)
|
|||
netif_addr_unlock_bh(local->mdev);
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
/* Announce that we are leaving the network. */
|
||||
if (sdata->u.mgd.state != IEEE80211_STA_MLME_DISABLED)
|
||||
ieee80211_sta_deauthenticate(sdata,
|
||||
WLAN_REASON_DEAUTH_LEAVING);
|
||||
memset(sdata->u.mgd.bssid, 0, ETH_ALEN);
|
||||
del_timer_sync(&sdata->u.mgd.chswitch_timer);
|
||||
del_timer_sync(&sdata->u.mgd.timer);
|
||||
|
|
Loading…
Reference in New Issue