diff --git a/src/p2p/p2p_go_neg.c b/src/p2p/p2p_go_neg.c index 9137aebe9..f50618365 100644 --- a/src/p2p/p2p_go_neg.c +++ b/src/p2p/p2p_go_neg.c @@ -1191,5 +1191,17 @@ void p2p_process_go_neg_conf(struct p2p_data *p2p, const u8 *sa, return; } + /* + * The peer could have missed our ctrl::ack frame for GO Negotiation + * Confirm and continue retransmitting the frame. To reduce the + * likelihood of the peer not getting successful TX status for the + * GO Negotiation Confirm frame, wait a short time here before starting + * the group so that we will remain on the current channel to + * acknowledge any possible retransmission from the peer. + */ + wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: 20 ms wait on current " + "channel before starting group"); + os_sleep(0, 20000); + p2p_go_complete(p2p, dev); } diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 39924b17e..9e552c82e 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -2318,6 +2318,18 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid) return; } + /* + * The peer could have missed our ctrl::ack frame for Invitation + * Response and continue retransmitting the frame. To reduce the + * likelihood of the peer not getting successful TX status for the + * Invitation Response frame, wait a short time here before starting + * the persistent group so that we will remain on the current channel to + * acknowledge any possible retransmission from the peer. + */ + wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 50 ms wait on current channel before " + "starting persistent group"); + os_sleep(0, 50000); + wpas_p2p_group_add_persistent(wpa_s, ssid, ssid->mode == WPAS_MODE_P2P_GO, wpa_s->p2p_persistent_go_freq,