mac80211: cancel the connection monitor timers/work
authorJohannes Berg <johannes@sipsolutions.net>
Mon, 13 Jul 2009 11:23:39 +0000 (13:23 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 24 Jul 2009 19:05:13 +0000 (15:05 -0400)
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>
net/mac80211/iface.c
net/mac80211/mlme.c

index 4839a2d97a3b9060afc9d5b4b6408cef53be4af2..090aa5a47182c3f3830d5e02fb5ea79baedf359e 100644 (file)
@@ -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);
 
                /*
index 18dad229344ca9205e3de35d1c87116c13807499..e3b3156aca9e7f59f655621ca8dd87820d74a95f 100644 (file)
@@ -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)