From c165d81eea6f794deddf77915f2d2cb8b1ac8dc5 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Thu, 24 Feb 2011 22:05:22 +0200 Subject: [PATCH] P2P: Add p2p_get_peer_found to get peer info This will only retrieve information about peers that have been fully discovered, not peers that are only half-discovered based on their Probe Request frames. Signed-off-by: Johannes Berg --- src/p2p/p2p.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/p2p/p2p.h | 10 ++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index d42249900..76cdf277a 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -3239,3 +3239,44 @@ const u8 * p2p_get_go_neg_peer(struct p2p_data *p2p) return NULL; return p2p->go_neg_peer->info.p2p_device_addr; } + + +const struct p2p_peer_info * +p2p_get_peer_found(struct p2p_data *p2p, const u8 *addr, int next) +{ + struct p2p_device *dev; + + if (addr) { + dev = p2p_get_device(p2p, addr); + if (!dev) + return NULL; + + if (!next) { + if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) + return NULL; + + return &dev->info; + } else { + do { + dev = dl_list_first(&dev->list, + struct p2p_device, + list); + if (&dev->list == &p2p->devices) + return NULL; + } while (dev->flags & P2P_DEV_PROBE_REQ_ONLY); + } + } else { + dev = dl_list_first(&p2p->devices, struct p2p_device, list); + if (!dev) + return NULL; + while (dev->flags & P2P_DEV_PROBE_REQ_ONLY) { + dev = dl_list_first(&dev->list, + struct p2p_device, + list); + if (&dev->list == &p2p->devices) + return NULL; + } + } + + return &dev->info; +} diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h index baf51d8bb..0d09d1e94 100644 --- a/src/p2p/p2p.h +++ b/src/p2p/p2p.h @@ -1372,4 +1372,14 @@ unsigned int p2p_get_group_num_members(struct p2p_group *group); */ const u8 * p2p_iterate_group_members(struct p2p_group *group, void **next); +/** + * p2p_get_peer_found - Get P2P peer info structure of a found peer + * @p2p: P2P module context from p2p_init() + * @addr: P2P Device Address of the peer or %NULL to indicate the first peer + * @next: Whether to select the peer entry following the one indicated by addr + * Returns: The first P2P peer info available or %NULL if no such peer exists + */ +const struct p2p_peer_info * +p2p_get_peer_found(struct p2p_data *p2p, const u8 *addr, int next); + #endif /* P2P_H */