]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Allow BSS entry to be fetched based on GO P2P Device Address
authorJouni Malinen <jouni@qca.qualcomm.com>
Tue, 7 Feb 2012 14:23:21 +0000 (16:23 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 7 Feb 2012 14:23:21 +0000 (16:23 +0200)
"BSS p2p_dev_addr=<P2P Device Address>" can now be used to fetch a
specific BSS entry based on the P2P Device Address of the GO to avoid
having to iterate through the full BSS table when an external program
needs to figure out whether a specific peer is currently operating as
a GO.

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

src/p2p/p2p.c
src/p2p/p2p.h
wpa_supplicant/bss.c
wpa_supplicant/bss.h
wpa_supplicant/ctrl_iface.c

index 2f4c1147ca37b944b9de12c4744be6016f97eec9..e7ce2308f329e7ad218f8348faa8364ac68aef22 100644 (file)
@@ -2096,6 +2096,32 @@ int p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, char *end)
 }
 
 
+int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
+{
+       struct wpabuf *p2p_ie;
+       struct p2p_message msg;
+
+       p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
+                                            P2P_IE_VENDOR_TYPE);
+       if (p2p_ie == NULL)
+               return -1;
+       os_memset(&msg, 0, sizeof(msg));
+       if (p2p_parse_p2p_ie(p2p_ie, &msg)) {
+               wpabuf_free(p2p_ie);
+               return -1;
+       }
+
+       if (msg.p2p_device_addr == NULL) {
+               wpabuf_free(p2p_ie);
+               return -1;
+       }
+
+       os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
+       wpabuf_free(p2p_ie);
+       return 0;
+}
+
+
 static void p2p_clear_go_neg(struct p2p_data *p2p)
 {
        p2p->go_neg_peer = NULL;
index 0924db5ccff1b0acacb532841a9034f787bbde15..9c4070c93241c5e8b4d90f3d116ecadce27b3287 100644 (file)
@@ -1376,6 +1376,15 @@ int p2p_ie_text(struct wpabuf *p2p_ie, char *buf, char *end);
  */
 int p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, char *end);
 
+/**
+ * p2p_parse_dev_addr - Parse P2P Device Address from P2P IE(s)
+ * @ies: Information elements from scan results
+ * @ies_len: ies buffer length in octets
+ * @dev_addr: Buffer for returning P2P Device Address
+ * Returns: 0 on success or -1 if P2P Device Address could not be parsed
+ */
+int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr);
+
 /**
  * p2p_assoc_req_ie - Build P2P IE for (Re)Association Request frame
  * @p2p: P2P module context from p2p_init()
index 078e22d7c93ff6dd522f99856f798e1460e7c2b7..1e79658952d6632fa9263e27a88c3287460fa940 100644 (file)
@@ -540,6 +540,23 @@ struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s,
 }
 
 
+#ifdef CONFIG_P2P
+struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s,
+                                         const u8 *dev_addr)
+{
+       struct wpa_bss *bss;
+       dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
+               u8 addr[ETH_ALEN];
+               if (p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len,
+                                      addr) == 0 &&
+                   os_memcmp(addr, dev_addr, ETH_ALEN) == 0)
+                       return bss;
+       }
+       return NULL;
+}
+#endif /* CONFIG_P2P */
+
+
 struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id)
 {
        struct wpa_bss *bss;
index bb19f492c73d159e3594630bba652ee6063facd9..9f132986868be0aeb110bf789e8bbd6fd44460fc 100644 (file)
@@ -94,6 +94,8 @@ struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid,
                             const u8 *ssid, size_t ssid_len);
 struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s,
                                   const u8 *bssid);
+struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s,
+                                         const u8 *dev_addr);
 struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id);
 const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie);
 const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type);
index 6a3223e36e7c0d488dcdb9fc859e722c003d1b95..7f4fb09741a5dc83364183354c98c4ac95445b65 100644 (file)
@@ -2210,6 +2210,13 @@ static int wpa_supplicant_ctrl_iface_bss(struct wpa_supplicant *wpa_s,
                                bss = dl_list_entry(next, struct wpa_bss,
                                                    list_id);
                }
+#ifdef CONFIG_P2P
+       } else if (os_strncmp(cmd, "p2p_dev_addr=", 13) == 0) {
+               if (hwaddr_aton(cmd + 13, bssid) == 0)
+                       bss = wpa_bss_get_p2p_dev_addr(wpa_s, bssid);
+               else
+                       bss = NULL;
+#endif /* CONFIG_P2P */
        } else if (hwaddr_aton(cmd, bssid) == 0)
                bss = wpa_bss_get_bssid(wpa_s, bssid);
        else {