mac80211: abort CAC in stop_ap()
authorSimon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>
Tue, 11 Jun 2013 08:44:39 +0000 (10:44 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 12 Jun 2013 07:12:43 +0000 (09:12 +0200)
When a CAC is running and stop_ap is called (e.g. when hostapd is killed
while performing CAC), the CAC must be aborted immediately.
Otherwise ieee80211_stop_ap() will try to stop it when it's too late -
wdev->channel is already NULL and the abort event can not be generated.

Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c

index 1a89c80..4fdb306 100644 (file)
@@ -1057,6 +1057,12 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
        clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
 
+       if (sdata->wdev.cac_started) {
+               cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
+               cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_ABORTED,
+                                  GFP_KERNEL);
+       }
+
        drv_stop_ap(sdata->local, sdata);
 
        /* free all potentially still buffered bcast frames */