Updated to hostap_2_6
[mech_eap.git] / libeap / src / ap / dfs.c
index 715f19b..47adba7 100644 (file)
@@ -450,7 +450,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
                return NULL;
 
        if (os_get_random((u8 *) &_rand, sizeof(_rand)) < 0)
-               _rand = os_random();
+               return NULL;
        chan_idx = _rand % num_available_chandefs;
        dfs_find_channel(iface, &chan, chan_idx, skip_radar);
 
@@ -704,7 +704,8 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
                                                        skip_radar);
                        if (!channel) {
                                wpa_printf(MSG_ERROR, "could not get valid channel");
-                               return -1;
+                               hostapd_set_state(iface, HAPD_IFACE_DFS);
+                               return 0;
                        }
 
                        iface->freq = channel->freq;
@@ -793,7 +794,6 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface)
 
        if (!channel) {
                wpa_printf(MSG_ERROR, "No valid channel available");
-               hostapd_setup_interface_complete(iface, err);
                return err;
        }
 
@@ -817,16 +817,6 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface)
 }
 
 
-static int hostapd_csa_in_progress(struct hostapd_iface *iface)
-{
-       unsigned int i;
-       for (i = 0; i < iface->num_bss; i++)
-               if (iface->bss[i]->csa_in_progress)
-                       return 1;
-       return 0;
-}
-
-
 static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
 {
        struct hostapd_channel_data *channel;
@@ -868,8 +858,9 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
                                                &vht_oper_centr_freq_seg1_idx,
                                                skip_radar);
                if (!channel) {
-                       /* FIXME: Wait for channel(s) to become available */
-                       hostapd_disable_iface(iface);
+                       wpa_printf(MSG_INFO,
+                                  "%s: no DFS channels left, waiting for NOP to finish",
+                                  __func__);
                        return err;
                }
 
@@ -992,6 +983,11 @@ int hostapd_dfs_nop_finished(struct hostapd_iface *iface, int freq,
        /* TODO add correct implementation here */
        set_dfs_state(iface, freq, ht_enabled, chan_offset, chan_width,
                      cf1, cf2, HOSTAPD_CHAN_DFS_USABLE);
+
+       /* Handle cases where all channels were initially unavailable */
+       if (iface->state == HAPD_IFACE_DFS && !iface->cac_started)
+               hostapd_handle_dfs(iface);
+
        return 0;
 }