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>
This commit is contained in:
Masashi Honma 2012-06-17 11:58:46 +03:00 committed by Jouni Malinen
parent 17706d1c76
commit c2d76aa624
3 changed files with 40 additions and 17 deletions

View file

@ -845,10 +845,19 @@ void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
int authorized) int authorized)
{ {
const u8 *dev_addr = NULL; const u8 *dev_addr = NULL;
#ifdef CONFIG_P2P
u8 addr[ETH_ALEN];
#endif /* CONFIG_P2P */
if (!!authorized == !!(sta->flags & WLAN_STA_AUTHORIZED)) if (!!authorized == !!(sta->flags & WLAN_STA_AUTHORIZED))
return; return;
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
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); dev_addr = p2p_group_get_dev_addr(hapd->p2p_group, sta->addr);
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */

View 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_in_p2p_ie(struct wpabuf *p2p_ie, u8 *dev_addr)
{
struct p2p_message msg;
os_memset(&msg, 0, sizeof(msg));
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);
return 0;
} else if (msg.device_id) {
os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
return 0;
}
return -1;
}
int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr) int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
{ {
struct wpabuf *p2p_ie; struct wpabuf *p2p_ie;
struct p2p_message msg; int ret;
int ret = -1;
p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len, p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
P2P_IE_VENDOR_TYPE); P2P_IE_VENDOR_TYPE);
if (p2p_ie == NULL) if (p2p_ie == NULL)
return -1; return -1;
os_memset(&msg, 0, sizeof(msg)); ret = p2p_parse_dev_addr_in_p2p_ie(p2p_ie, dev_addr);
if (p2p_parse_p2p_ie(p2p_ie, &msg)) {
wpabuf_free(p2p_ie);
return -1;
}
if (msg.p2p_device_addr) {
os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
ret = 0;
} else if (msg.device_id) {
os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
ret = 0;
}
wpabuf_free(p2p_ie); wpabuf_free(p2p_ie);
return ret; return ret;
} }

View file

@ -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); 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) * p2p_parse_dev_addr - Parse P2P Device Address from P2P IE(s)
* @ies: Information elements from scan results * @ies: Information elements from scan results