P2P: Optimize scan frequencies list when re-joining a persistent group
authorAvraham Stern <avraham.stern@intel.com>
Sun, 29 Mar 2015 10:10:36 +0000 (13:10 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 29 Mar 2015 17:52:09 +0000 (20:52 +0300)
When starting a P2P client to re-join a persistent group
(P2P_GROUP_ADD persistent=<id>), it is possible that the P2P GO was
already found in previous scans. Try to get the P2P GO operating
frequency from the scan results list so wpa_supplicant will initially
scan only the P2P GO known operating frequency.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Ilan Peer <ilan.peer@intel.com>
wpa_supplicant/p2p_supplicant.c

index bb61808..4c71ef4 100644 (file)
@@ -5504,18 +5504,26 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
                            (freq > 0 && !freq_included(channels, freq)))
                                freq = 0;
                }
-       } else {
+       } else if (ssid->mode == WPAS_MODE_INFRA) {
                freq = neg_freq;
-               if (freq < 0 ||
-                   (freq > 0 && !freq_included(channels, freq)))
-                       freq = 0;
-       }
+               if (freq <= 0 || !freq_included(channels, freq)) {
+                       struct os_reltime now;
+                       struct wpa_bss *bss =
+                               wpa_bss_get_p2p_dev_addr(wpa_s, ssid->bssid);
+
+                       os_get_reltime(&now);
+                       if (bss &&
+                           !os_reltime_expired(&now, &bss->last_update, 5) &&
+                           freq_included(channels, bss->freq))
+                               freq = bss->freq;
+                       else
+                               freq = 0;
+               }
 
-       if (ssid->mode == WPAS_MODE_INFRA)
                return wpas_start_p2p_client(wpa_s, ssid, addr_allocated, freq);
-
-       if (ssid->mode != WPAS_MODE_P2P_GO)
+       } else {
                return -1;
+       }
 
        if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, vht, channels))
                return -1;