aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-07-13 13:23:39 +0200
committerJohn W. Linville <linville@tuxdriver.com>2009-07-24 15:05:13 -0400
commit0e2b6286805c419d28a4c1e19e3a121af7449b20 (patch)
treedef761584adbf70629938db1590a112e9f7ba6d9
parentec96cfd8215af1cda016837efb266409164e3a30 (diff)
mac80211: cancel the connection monitor timers/work
In "mac80211: monitor the connection" I forgot to add code to cancel the new timers & work when the interface is brought down, which isn't a problem if you just bring it down, but _is_ a problem when you destroy the interface. Correct this lapse. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/iface.c8
-rw-r--r--net/mac80211/mlme.c3
2 files changed, 8 insertions, 3 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 4839a2d97a3..090aa5a4718 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -449,16 +449,18 @@ static int ieee80211_stop(struct net_device *dev)
case NL80211_IFTYPE_STATION:
del_timer_sync(&sdata->u.mgd.chswitch_timer);
del_timer_sync(&sdata->u.mgd.timer);
+ del_timer_sync(&sdata->u.mgd.conn_mon_timer);
+ del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
/*
- * If the timer fired while we waited for it, it will have
- * requeued the work. Now the work will be running again
+ * If any of the timers fired while we waited for it, it will
+ * have queued its work. Now the work will be running again
* but will not rearm the timer again because it checks
* whether the interface is running, which, at this point,
* it no longer is.
*/
cancel_work_sync(&sdata->u.mgd.work);
cancel_work_sync(&sdata->u.mgd.chswitch_work);
-
+ cancel_work_sync(&sdata->u.mgd.monitor_work);
cancel_work_sync(&sdata->u.mgd.beacon_loss_work);
/*
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 18dad229344..e3b3156aca9 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1163,6 +1163,9 @@ static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
const u8 *ssid;
bool already = false;
+ if (!netif_running(sdata->dev))
+ return;
+
mutex_lock(&ifmgd->mtx);
if (!ifmgd->associated)