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 <jouni@qca.qualcomm.com>
This commit is contained in:
parent
e699a7a9b3
commit
2b12b3602a
1 changed files with 8 additions and 0 deletions
|
@ -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");
|
||||
|
|
Loading…
Reference in a new issue