P2P: Update peer listen channel from Probe Request frames
authorIlan Peer <ilan.peer@intel.com>
Mon, 29 Feb 2016 12:30:05 +0000 (14:30 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 3 Mar 2016 15:10:26 +0000 (17:10 +0200)
In case a Probe Request frame is received from a known peer P2P Device,
update the listen channel based on the P2P attributes in the Probe
Request frame. This can be useful for cases where the peer P2P Device
changed its listen channel, and the local P2P device is about to start a
GO Negotiation or invitation signaling with the peer.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
src/p2p/p2p.c

index bddd30c..6942c85 100644 (file)
@@ -2035,8 +2035,23 @@ static void p2p_add_dev_from_probe_req(struct p2p_data *p2p, const u8 *addr,
 
        dev = p2p_get_device(p2p, addr);
        if (dev) {
-               if (dev->country[0] == 0 && msg.listen_channel)
-                       os_memcpy(dev->country, msg.listen_channel, 3);
+               if (msg.listen_channel) {
+                       int freq;
+
+                       if (dev->country[0] == 0)
+                               os_memcpy(dev->country, msg.listen_channel, 3);
+
+                       freq = p2p_channel_to_freq(msg.listen_channel[3],
+                                                  msg.listen_channel[4]);
+
+                       if (freq > 0 && dev->listen_freq != freq) {
+                               p2p_dbg(p2p,
+                                       "Updated peer " MACSTR " Listen channel (Probe Request): %d -> %d MHz",
+                                       MAC2STR(addr), dev->listen_freq, freq);
+                               dev->listen_freq = freq;
+                       }
+               }
+
                os_get_reltime(&dev->last_seen);
                p2p_parse_free(&msg);
                return; /* already known */