From 2b12b3602aa5ee60fbbaf723e508321eb86ee10f Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Thu, 15 Oct 2015 21:21:28 +0300 Subject: [PATCH] P2P: Do not reply to GO Negotiation Request if peer is waiting for us This improves robustness of GO Negotiation in special cases where GO Negotiation Request frames from the peer may end up getting delivered multiple times, e.g., due to interference and retransmitted frames not getting properly filtered out in duplicate detection (which is something that number of drivers do not implement for pre-associated state). If we have already replied with GO Negotiation Response frame with Status 1 (not yet ready), do not reply to another GO Negotiation Request frame from the peer if we have already received authorization from the user (P2P_CONNECT command) for group formation and have sent out our GO Negotiation Request frame. This avoids a possible sequence where two independent GO Negotiation instances could go through in parallel if the MAC address based rule on avoiding duplicate negotiations is not able to prevent the case. This can allow GO Negotiation to complete successfully whereas the previous behavior would have likely resulted in a failure with neither device sending a GO Negotiation Confirm frame. Signed-off-by: Jouni Malinen --- src/p2p/p2p_go_neg.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/p2p/p2p_go_neg.c b/src/p2p/p2p_go_neg.c index 83b43563d..dfbf14ad7 100644 --- a/src/p2p/p2p_go_neg.c +++ b/src/p2p/p2p_go_neg.c @@ -901,6 +901,14 @@ void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa, return; } + if (dev->go_neg_req_sent && + (dev->flags & P2P_DEV_PEER_WAITING_RESPONSE)) { + p2p_dbg(p2p, + "Do not reply since peer is waiting for us to start a new GO Negotiation and GO Neg Request already sent"); + p2p_parse_free(&msg); + return; + } + go = p2p_go_det(p2p->go_intent, *msg.go_intent); if (go < 0) { p2p_dbg(p2p, "Incompatible GO Intent");