Commit 24e64622 authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville

mac80211: stop queues before carrier off

During testing of the disassociation fixes, Tomas noticed that it
was possible to run into a situation where you'd suddenly get a
few "wlan0: dropped frame to <AP> (unauthorized port)" messages
and I found this to be due to the AP's sta_info having been
removed but netif_carrier_off not having removed/stopped traffic
yet. To avoid that, stop the queue for the interface (and avoid
bringing them up when another vif scans when they weren't up.)
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f5e5bf25
...@@ -428,6 +428,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, ...@@ -428,6 +428,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
sdata->bss_conf.assoc = 1; sdata->bss_conf.assoc = 1;
ieee80211_bss_info_change_notify(sdata, changed); ieee80211_bss_info_change_notify(sdata, changed);
netif_tx_start_all_queues(sdata->dev);
netif_carrier_on(sdata->dev); netif_carrier_on(sdata->dev);
ieee80211_sta_send_apinfo(sdata, ifsta); ieee80211_sta_send_apinfo(sdata, ifsta);
...@@ -849,6 +850,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, ...@@ -849,6 +850,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
ifsta->assoc_scan_tries = 0; ifsta->assoc_scan_tries = 0;
ifsta->assoc_tries = 0; ifsta->assoc_tries = 0;
netif_tx_stop_all_queues(sdata->dev);
netif_carrier_off(sdata->dev); netif_carrier_off(sdata->dev);
ieee80211_sta_tear_down_BA_sessions(sdata, sta->addr); ieee80211_sta_tear_down_BA_sessions(sdata, sta->addr);
...@@ -3268,6 +3270,7 @@ static void ieee80211_sta_reset_auth(struct ieee80211_sub_if_data *sdata, ...@@ -3268,6 +3270,7 @@ static void ieee80211_sta_reset_auth(struct ieee80211_sub_if_data *sdata,
ifsta->direct_probe_tries = 0; ifsta->direct_probe_tries = 0;
ifsta->auth_tries = 0; ifsta->auth_tries = 0;
ifsta->assoc_tries = 0; ifsta->assoc_tries = 0;
netif_tx_stop_all_queues(sdata->dev);
netif_carrier_off(sdata->dev); netif_carrier_off(sdata->dev);
} }
...@@ -3744,13 +3747,15 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw) ...@@ -3744,13 +3747,15 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(sdata, &local->interfaces, list) { list_for_each_entry_rcu(sdata, &local->interfaces, list) {
/* Tell AP we're back */ /* Tell AP we're back */
if (sdata->vif.type == IEEE80211_IF_TYPE_STA && if (sdata->vif.type == IEEE80211_IF_TYPE_STA) {
sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) {
ieee80211_send_nullfunc(local, sdata, 0); ieee80211_send_nullfunc(local, sdata, 0);
netif_tx_wake_all_queues(sdata->dev);
}
} else
netif_tx_wake_all_queues(sdata->dev);
ieee80211_restart_sta_timer(sdata); ieee80211_restart_sta_timer(sdata);
netif_wake_queue(sdata->dev);
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -3908,10 +3913,13 @@ static int ieee80211_sta_start_scan(struct ieee80211_sub_if_data *scan_sdata, ...@@ -3908,10 +3913,13 @@ static int ieee80211_sta_start_scan(struct ieee80211_sub_if_data *scan_sdata,
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(sdata, &local->interfaces, list) { list_for_each_entry_rcu(sdata, &local->interfaces, list) {
netif_stop_queue(sdata->dev); if (sdata->vif.type == IEEE80211_IF_TYPE_STA) {
if (sdata->vif.type == IEEE80211_IF_TYPE_STA && if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) {
(sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED)) netif_tx_stop_all_queues(sdata->dev);
ieee80211_send_nullfunc(local, sdata, 1); ieee80211_send_nullfunc(local, sdata, 1);
}
} else
netif_tx_stop_all_queues(sdata->dev);
} }
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment