]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Limit number of SD retries during find
authorJouni Malinen <jouni@qca.qualcomm.com>
Thu, 23 Oct 2014 18:49:42 +0000 (21:49 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 23 Oct 2014 18:51:48 +0000 (21:51 +0300)
Commit 7139cf4a4f1fecfd03d0daff9bb33adb80cc3530 ('P2P: Decrement
sd_pending_bcast_queries when sd returns success') added support for
retrying P2P SD queries. However, it did this without limiting how many
retries are allowed. This can result in excessive number of retries if a
peer device does not show up on its Listen channel and there is a
pending SD query to it. Limit the maximum number of SD retries to 100
per p2p_find operation for each peer to avoid unlimited retries.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/p2p/p2p.c
src/p2p/p2p_i.h
src/p2p/p2p_sd.c

index b29b5060bf746c5926a63318a4af459c49ce1430..7c13188eccfd09630363ce61e6bf340b30c9c6f6 100644 (file)
@@ -348,8 +348,10 @@ int p2p_listen(struct p2p_data *p2p, unsigned int timeout)
 static void p2p_device_clear_reported(struct p2p_data *p2p)
 {
        struct p2p_device *dev;
-       dl_list_for_each(dev, &p2p->devices, struct p2p_device, list)
+       dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
                dev->flags &= ~P2P_DEV_REPORTED;
+               dev->sd_reqs = 0;
+       }
 }
 
 
index 75ae8dcd8d072ee75988f777df7994d9630f25fc..bb8952d1e28a189129bb02d8e345882390a6c1c6 100644 (file)
@@ -105,6 +105,7 @@ struct p2p_device {
        unsigned int wait_count;
        unsigned int connect_reqs;
        unsigned int invitation_reqs;
+       unsigned int sd_reqs;
 
        u16 ext_listen_period;
        u16 ext_listen_interval;
index 13119c2005ebcff2a3b7e098c6feb90c90628fbf..1a2af04b8004393b362275a791acb78c9452f2ea 100644 (file)
@@ -75,16 +75,25 @@ struct p2p_sd_query * p2p_pending_sd_req(struct p2p_data *p2p,
                                return NULL;
                        /* query number that needs to be send to the device */
                        if (count == dev->sd_pending_bcast_queries - 1)
-                               return q;
+                               goto found;
                        count++;
                }
                if (!q->for_all_peers &&
                    os_memcmp(q->peer, dev->info.p2p_device_addr, ETH_ALEN) ==
                    0)
-                       return q;
+                       goto found;
        }
 
        return NULL;
+
+found:
+       if (dev->sd_reqs > 100) {
+               p2p_dbg(p2p, "Too many SD request attempts to " MACSTR
+                       " - skip remaining queries",
+                       MAC2STR(dev->info.p2p_device_addr));
+               return NULL;
+       }
+       return q;
 }
 
 
@@ -287,6 +296,7 @@ int p2p_start_sd(struct p2p_data *p2p, struct p2p_device *dev)
        if (req == NULL)
                return -1;
 
+       dev->sd_reqs++;
        p2p->sd_peer = dev;
        p2p->sd_query = query;
        p2p->pending_action_state = P2P_PENDING_SD;