P2P: Try fast associate if p2p GO is found in external scan
Before supplicant issues a scan to driver, check if p2p GO
was found in external scan. If yes, try to do a fast associate.
Bug:187543099
Test: Manual-File transfer using Nearby APP and check the connection
latency.
Change-Id: Idf91d51c08023c4b7a09484cfcce1d271f032589
diff --git a/wpa_supplicant/hidl/1.4/p2p_iface.cpp b/wpa_supplicant/hidl/1.4/p2p_iface.cpp
index 1350c06..db8f3a4 100644
--- a/wpa_supplicant/hidl/1.4/p2p_iface.cpp
+++ b/wpa_supplicant/hidl/1.4/p2p_iface.cpp
@@ -1239,6 +1239,7 @@
if (!wpa_group_s) {
return {SupplicantStatusCode::FAILURE_IFACE_UNKNOWN, ""};
}
+ wpa_group_s->global->p2p_go_found_external_scan = 0;
if (wpas_p2p_group_remove(wpa_group_s, group_ifname.c_str())) {
return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
}
@@ -1804,8 +1805,10 @@
struct wpa_bss *bss = findBssBySsid(
wpa_s, peer_address.data(), ssid.data(), ssid.size());
if (bss) {
+ wpa_s->global->p2p_go_found_external_scan = 1;
if (0 != joinGroup(wpa_s, bss->bssid, ssid, passphrase)) {
wpa_printf(MSG_ERROR, "P2P: Failed to join a group.");
+ wpa_s->global->p2p_go_found_external_scan = 0;
}
// no need to notify group join failure here,
// it will be handled by wpas_p2p_group_add_persistent
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index c53474d..24d06c0 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -1013,6 +1013,19 @@
}
#ifdef CONFIG_P2P
+#ifdef ANDROID
+ if (wpa_s->global->p2p_go_found_external_scan &&
+ (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT) &&
+ (wpa_s->global->p2p_group_formation == wpa_s)) {
+ wpa_dbg(wpa_s, MSG_DEBUG,
+ "Try to fast associate since GO is found in external scan");
+ wpa_s->global->p2p_go_found_external_scan = 0;
+ if (wpa_supplicant_fast_associate(wpa_s) >= 0) {
+ return;
+ }
+ }
+#endif
+
if ((wpa_s->p2p_in_provisioning || wpa_s->show_group_started) &&
wpa_s->go_params && !wpa_s->conf->passive_scan) {
wpa_printf(MSG_DEBUG, "P2P: Use specific SSID for scan during P2P group formation (p2p_in_provisioning=%d show_group_started=%d)",
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 99dd5b0..9ce3233 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -307,6 +307,7 @@
unsigned int p2p_24ghz_social_channels:1;
unsigned int pending_p2ps_group:1;
unsigned int pending_group_iface_for_p2ps:1;
+ unsigned int p2p_go_found_external_scan:1;
unsigned int pending_p2ps_group_freq;
#ifdef CONFIG_WIFI_DISPLAY