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