Browse Source

P2P: Add p2p_client_list support for FullMAC Persistent GO

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>
Masashi Honma 12 years ago
parent
commit
c2d76aa624
3 changed files with 36 additions and 13 deletions
  1. 10 1
      src/ap/sta_info.c
  2. 17 12
      src/p2p/p2p.c
  3. 9 0
      src/p2p/p2p.h

+ 10 - 1
src/ap/sta_info.c

@@ -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) {

+ 17 - 12
src/p2p/p2p.c

@@ -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;
 }

+ 9 - 0
src/p2p/p2p.h

@@ -1426,6 +1426,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