P2P: Trigger channel selection correctly during CSA
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Tue, 8 Sep 2015 09:46:19 +0000 (12:46 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 3 Oct 2015 17:22:09 +0000 (20:22 +0300)
Do not consider moving GOs to a new channel if one of them is in the
middle of CSA. In addition, call wpas_p2p_update_channel_list() after
EVENT_CH_SWITCH is handled.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
wpa_supplicant/events.c
wpa_supplicant/p2p_supplicant.c

index 23cf127..f15630c 100644 (file)
@@ -3473,6 +3473,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                                  data->ch_switch.ch_width,
                                  data->ch_switch.cf1,
                                  data->ch_switch.cf2);
+
+               wpas_p2p_update_channel_list(wpa_s, WPAS_P2P_CHANNEL_UPDATE_CS);
                break;
 #ifdef NEED_AP_MLME
        case EVENT_DFS_RADAR_DETECTED:
index dbfae3e..5ca058a 100644 (file)
@@ -8667,6 +8667,13 @@ static void wpas_p2p_move_go(void *eloop_ctx, void *timeout_ctx)
 
        wpas_p2p_go_update_common_freqs(wpa_s);
 
+       /* Do not move GO in the middle of a CSA */
+       if (hostapd_csa_in_progress(wpa_s->ap_iface)) {
+               wpa_printf(MSG_DEBUG,
+                          "P2P: CSA is in progress - not moving GO");
+               return;
+       }
+
        /*
         * First, try a channel switch flow. If it is not supported or fails,
         * take down the GO and bring it up again.
@@ -8777,6 +8784,16 @@ static void wpas_p2p_consider_moving_one_go(struct wpa_supplicant *wpa_s,
                return;
        }
 
+       /*
+        * Do not consider moving GO if it is in the middle of a CSA. When the
+        * CSA is finished this flow should be retriggered.
+        */
+       if (hostapd_csa_in_progress(wpa_s->ap_iface)) {
+               wpa_dbg(wpa_s, MSG_DEBUG,
+                       "P2P: Not initiating a GO frequency change - CSA is in progress");
+               return;
+       }
+
        if (invalid_freq && !wpas_p2p_disallowed_freq(wpa_s->global, freq))
                timeout = P2P_GO_FREQ_CHANGE_TIME;
        else