18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / P2P integration 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Atheros Communications 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p/p2p.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "hostapd.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_config.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_drv_ops.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sta_info.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p_hostapd.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta, 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta->p2p_ie == NULL) 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return p2p_ie_text(sta->p2p_ie, buf, buf + buflen); 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint hostapd_p2p_set_noa(struct hostapd_data *hapd, u8 count, int start, 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int duration) 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Set NoA parameters: count=%u start=%d " 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "duration=%d", count, start, duration); 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (count == 0) { 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_enabled = 0; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_start = 0; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_duration = 0; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (count != 255) { 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Non-periodic NoA - set " 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "NoA parameters"); 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_driver_set_noa(hapd, count, start, duration); 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_enabled = 1; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_start = start; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_duration = duration; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->num_sta_no_p2p == 0) { 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: No legacy STAs connected - update " 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "periodic NoA parameters"); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_driver_set_noa(hapd, count, start, duration); 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Legacy STA(s) connected - do not enable " 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "periodic NoA"); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_p2p_non_p2p_sta_connected(struct hostapd_data *hapd) 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: First non-P2P device connected"); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->noa_enabled) { 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Disable periodic NoA"); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_driver_set_noa(hapd, 0, 0, 0); 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_p2p_non_p2p_sta_disconnected(struct hostapd_data *hapd) 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Last non-P2P device disconnected"); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->noa_enabled) { 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Enable periodic NoA"); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_driver_set_noa(hapd, 255, hapd->noa_start, 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->noa_duration); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P_MANAGER 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtu8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid) 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 bitmap; 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = WLAN_EID_VENDOR_SPECIFIC; 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = 4 + 3 + 1; 99a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt WPA_PUT_BE32(eid, P2P_IE_VENDOR_TYPE); 100a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt eid += 4; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = P2P_ATTR_MANAGEABILITY; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_PUT_LE16(eid, 1); 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eid += 2; 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bitmap = P2P_MAN_DEVICE_MANAGEMENT; 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->p2p & P2P_ALLOW_CROSS_CONNECTION) 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bitmap |= P2P_MAN_CROSS_CONNECTION_PERMITTED; 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bitmap |= P2P_MAN_COEXISTENCE_OPTIONAL; 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = bitmap; 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 114