]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
DFS: Handle radar event when CAC actived correctly
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>
Sat, 26 Oct 2013 13:36:00 +0000 (16:36 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 26 Oct 2013 14:48:55 +0000 (17:48 +0300)
When we have CAC active and receive a radar event, we should ignore
CAC_ABORT event and handle channel switch in the radar event handler.

Signed-hostap: Janusz Dziedzic <janusz.dziedzic@tieto.com>

src/ap/ap_drv_ops.c
src/ap/dfs.c
src/ap/hostapd.h

index 9023eaba893ecdecf3d616942584a9b4feaef15d..1109575cde6ba90fce28021dfe5139aad995d5dc 100644 (file)
@@ -724,6 +724,7 @@ int hostapd_start_dfs_cac(struct hostapd_data *hapd, int mode, int freq,
                          int center_segment0, int center_segment1)
 {
        struct hostapd_freq_params data;
+       int res;
 
        if (!hapd->driver || !hapd->driver->start_dfs_cac)
                return 0;
@@ -740,7 +741,11 @@ int hostapd_start_dfs_cac(struct hostapd_data *hapd, int mode, int freq,
                                    center_segment1))
                return -1;
 
-       return hapd->driver->start_dfs_cac(hapd->drv_priv, &data);
+       res = hapd->driver->start_dfs_cac(hapd->drv_priv, &data);
+       if (!res)
+               hapd->cac_started = 1;
+
+       return res;
 }
 
 
index 27048a3e4d0f48134b85795d8d4f4f952c42c2b9..a745a8a7633745cc46b0ceaff6e15295439dbc0d 100644 (file)
@@ -546,29 +546,13 @@ int hostapd_dfs_complete_cac(struct hostapd_data *hapd, int success, int freq,
                             int ht_enabled, int chan_offset, int chan_width,
                             int cf1, int cf2)
 {
-       struct hostapd_channel_data *channel;
-       int err = 1;
-
        if (success) {
                /* Complete iface/ap configuration */
                set_dfs_state(hapd, freq, ht_enabled, chan_offset,
                              chan_width, cf1, cf2,
                              HOSTAPD_CHAN_DFS_AVAILABLE);
+               hapd->cac_started = 0;
                hostapd_setup_interface_complete(hapd->iface, 0);
-       } else {
-               /* Switch to new channel */
-               set_dfs_state(hapd, freq, ht_enabled, chan_offset,
-                             chan_width, cf1, cf2,
-                             HOSTAPD_CHAN_DFS_UNAVAILABLE);
-               channel = dfs_get_valid_channel(hapd);
-               if (channel) {
-                       hapd->iconf->channel = channel->chan;
-                       hapd->iface->freq = channel->freq;
-                       err = 0;
-               } else
-                       wpa_printf(MSG_ERROR, "No valid channel available");
-
-               hostapd_setup_interface_complete(hapd->iface, err);
        }
 
        return 0;
@@ -588,7 +572,13 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_data *hapd)
                err = 0;
        }
 
-       hapd->driver->stop_ap(hapd->drv_priv);
+       if (!hapd->cac_started) {
+               wpa_printf(MSG_DEBUG, "DFS radar detected");
+               hapd->driver->stop_ap(hapd->drv_priv);
+       } else {
+               wpa_printf(MSG_DEBUG, "DFS radar detected during CAC");
+               hapd->cac_started = 0;
+       }
 
        hostapd_setup_interface_complete(hapd->iface, err);
        return 0;
@@ -614,10 +604,6 @@ int hostapd_dfs_radar_detected(struct hostapd_data *hapd, int freq,
        if (!res)
                return 0;
 
-       /* we are working on non-DFS channel - skip event */
-       if (res == 0)
-               return 0;
-
        /* radar detected while operating, switch the channel. */
        res = hostapd_dfs_start_channel_switch(hapd);
 
index dbf1b52fa27dcccc5fedee711156077c26c1d14a..d79c3e53dbf46f8748b9e8a17f1b3b9a11e75f1c 100644 (file)
@@ -152,6 +152,9 @@ struct hostapd_data {
 
        int parameter_set_count;
 
+       /* DFS specific parameters */
+       int cac_started;
+
        /* Time Advertisement */
        u8 time_update_counter;
        struct wpabuf *time_adv;