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