P2P: Allow GO Negotiation Request to update peer entry after PD
authorPo-Lun Lai <llai@qca.qualcomm.com>
Fri, 17 Jan 2014 17:35:03 +0000 (19:35 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 17 Jan 2014 17:35:03 +0000 (19:35 +0200)
Previously, GO Negotiation Request frame was used to update a peer entry
if only a Probe Request from that peer had been received. However, it
would be possible, even if unlikely, for a peer to be discovered based
on receiving Provision Discovery Request frame from it and no Probe
Request frame. In such a case, the Listen frequency of the peer would
not be known and group formation could not be (re-)initialized with that
peer. Fix this by allowing the GO Negotiation Request frame to update
peer entry if the current peer entry does not include Listen or
Operating frequency.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

src/p2p/p2p_go_neg.c

index 874f434..a887a5e 100644 (file)
@@ -590,6 +590,18 @@ void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa,
                dev = p2p_add_dev_from_go_neg_req(p2p, sa, &msg);
        else if (dev->flags & P2P_DEV_PROBE_REQ_ONLY)
                p2p_add_dev_info(p2p, sa, dev, &msg);
+       else if (!dev->listen_freq && !dev->oper_freq) {
+               /*
+                * This may happen if the peer entry was added based on PD
+                * Request and no Probe Request/Response frame has been received
+                * from this peer (or that information has timed out).
+                */
+               p2p_dbg(p2p, "Update peer " MACSTR
+                       " based on GO Neg Req since listen/oper freq not known",
+                       MAC2STR(dev->info.p2p_device_addr));
+               p2p_add_dev_info(p2p, sa, dev, &msg);
+       }
+
        if (dev && dev->flags & P2P_DEV_USER_REJECTED) {
                p2p_dbg(p2p, "User has rejected this peer");
                status = P2P_SC_FAIL_REJECTED_BY_USER;