Cumulative patch from commit commit add7add09d72c3294c63a113635d69b766acf504
add7add IBSS RSN: Add a timeout for Authentication frame exchange
c1c0b35 P2P: Postpone concurrent scans when waiting for first client as GO
6fb7b58 IBSS RSN: Work around Data RX vs. Authentication RX race condition
Bug: 10513949
Change-Id: Ic4d77c94a5b6e4729cd798f7b033e3ea5b2481cc
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 0827f35..239e608 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -61,6 +61,16 @@
#define P2P_MAX_INITIAL_CONN_WAIT 10
#endif /* P2P_MAX_INITIAL_CONN_WAIT */
+#ifndef P2P_MAX_INITIAL_CONN_WAIT_GO
+/*
+ * How many seconds to wait for initial 4-way handshake to get completed after
+ * WPS provisioning step on the GO. This controls the extra time the P2P
+ * operation is considered to be in progress (e.g., to delay other scans) after
+ * WPS provisioning has been completed on the GO during group formation.
+ */
+#define P2P_MAX_INITIAL_CONN_WAIT_GO 10
+#endif /* P2P_MAX_INITIAL_CONN_WAIT_GO */
+
#ifndef P2P_CONCURRENT_SEARCH_DELAY
#define P2P_CONCURRENT_SEARCH_DELAY 500
#endif /* P2P_CONCURRENT_SEARCH_DELAY */
@@ -792,8 +802,10 @@
ssid, go_dev_addr);
if (network_id < 0 && ssid)
network_id = ssid->id;
- if (!client)
+ if (!client) {
wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
+ os_get_time(&wpa_s->global->p2p_go_wait_client);
+ }
}
@@ -5823,6 +5835,19 @@
}
}
+ if (!ret && wpa_s->global->p2p_go_wait_client.sec) {
+ struct os_time now;
+ os_get_time(&now);
+ if (now.sec > wpa_s->global->p2p_go_wait_client.sec +
+ P2P_MAX_INITIAL_CONN_WAIT_GO) {
+ /* Wait for the first client has expired */
+ wpa_s->global->p2p_go_wait_client.sec = 0;
+ } else {
+ wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Waiting for initial client connection during group formation");
+ ret = 1;
+ }
+ }
+
return ret;
}
@@ -5882,6 +5907,7 @@
void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
const u8 *addr)
{
+ wpa_s->global->p2p_go_wait_client.sec = 0;
if (addr == NULL)
return;
wpas_p2p_add_persistent_group_client(wpa_s, addr);