P2P: Add p2p_client_list support for FullMAC Persistent GO
authorMasashi Honma <masashi.honma@gmail.com>
Sun, 17 Jun 2012 08:58:46 +0000 (11:58 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 17 Jun 2012 08:58:46 +0000 (11:58 +0300)
Currently, FullMAC Persistent GO can't use p2p_client_list because its
own hapd->p2p_group is NULL at ap_sta_set_authorized(). This patch
changes the processing to use sta->p2p_ie instead of
p2p_group_get_dev_addr() on FullMAC GO.

Signed-hostap: Masashi Honma <masashi.honma@gmail.com>

src/ap/sta_info.c
src/p2p/p2p.c
src/p2p/p2p.h

index a7dffc7..95b701c 100644 (file)
@@ -845,11 +845,20 @@ void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
                           int authorized)
 {
        const u8 *dev_addr = NULL;
+#ifdef CONFIG_P2P
+       u8 addr[ETH_ALEN];
+#endif /* CONFIG_P2P */
+
        if (!!authorized == !!(sta->flags & WLAN_STA_AUTHORIZED))
                return;
 
 #ifdef CONFIG_P2P
-       dev_addr = p2p_group_get_dev_addr(hapd->p2p_group, sta->addr);
+       if (hapd->p2p_group == NULL) {
+               if (sta->p2p_ie != NULL &&
+                   p2p_parse_dev_addr_in_p2p_ie(sta->p2p_ie, addr) == 0)
+                       dev_addr = addr;
+       } else
+               dev_addr = p2p_group_get_dev_addr(hapd->p2p_group, sta->addr);
 #endif /* CONFIG_P2P */
 
        if (authorized) {
index f7915bd..5b1af43 100644 (file)
@@ -2167,30 +2167,35 @@ 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)
+int p2p_parse_dev_addr_in_p2p_ie(struct wpabuf *p2p_ie, u8 *dev_addr)
 {
-       struct wpabuf *p2p_ie;
        struct p2p_message msg;
-       int ret = -1;
 
-       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);
+       if (p2p_parse_p2p_ie(p2p_ie, &msg))
                return -1;
-       }
 
        if (msg.p2p_device_addr) {
                os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
-               ret = 0;
+               return 0;
        } else if (msg.device_id) {
                os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
-               ret = 0;
+               return 0;
        }
+       return -1;
+}
 
+
+int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
+{
+       struct wpabuf *p2p_ie;
+       int ret;
+
+       p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
+                                            P2P_IE_VENDOR_TYPE);
+       if (p2p_ie == NULL)
+               return -1;
+       ret = p2p_parse_dev_addr_in_p2p_ie(p2p_ie, dev_addr);
        wpabuf_free(p2p_ie);
        return ret;
 }
index a759adf..98ba5cd 100644 (file)
@@ -1427,6 +1427,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_in_p2p_ie - Parse P2P Device Address from a concatenated
+ * P2P IE
+ * @p2p_ie: P2P IE
+ * @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_in_p2p_ie(struct wpabuf *p2p_ie, u8 *dev_addr);
+
+/**
  * 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