Patchwork P2P: Add p2p_client_list support for FullMAC Persistent GO

login
register
mail settings
Submitter Masashi Honma
Date June 14, 2012, 12:13 p.m.
Message ID <CAFk-A4nL+5TkMoEsZGcPpqORcPcJbgChdD0vkCfUbHr8pbzgKA@mail.gmail.com>
Download mbox | patch
Permalink /patch/164920/
State Accepted
Commit c2d76aa6247b4769b935f11c902aa3f31278278e
Headers show

Comments

Masashi Honma - June 14, 2012, 12:13 p.m.
Hello.

Currenlty FullMAC Persistent GO can't use p2p_client_list. Because it's 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>

  * @ies_len: ies buffer length in octets


Regards,
Masashi Honma.
Jouni Malinen - June 17, 2012, 9:03 a.m.
On Thu, Jun 14, 2012 at 09:13:56PM +0900, Masashi Honma wrote:
> Currenlty FullMAC Persistent GO can't use p2p_client_list. Because it's 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.

Thanks, applied.

Patch

diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index a7dffc7..95b701c 100644
--- a/src/ap/sta_info.c
+++ b/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) {
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c
index 7046f7b..1deaced 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -2148,30 +2148,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;
 }
diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h
index a759adf..f2692ca 100644
--- a/src/p2p/p2p.h
+++ b/src/p2p/p2p.h
@@ -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 concatinated
+ * P2P IE
+ * @p2p_ie: P2P Information element
+ * @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