185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * hostapd / P2P integration 38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Copyright (c) 2009-2010, Atheros Communications 485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This software may be distributed under the terms of the BSD license. 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * See README for more details. 785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "utils/includes.h" 1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "utils/common.h" 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "common/ieee802_11_defs.h" 1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "p2p/p2p.h" 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "hostapd.h" 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "ap_config.h" 1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "ap_drv_ops.h" 1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "sta_info.h" 1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "p2p_hostapd.h" 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifdef CONFIG_P2P 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta, 2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char *buf, size_t buflen) 2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (sta->p2p_ie == NULL) 2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 0; 2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return p2p_ie_text(sta->p2p_ie, buf, buf + buflen); 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint hostapd_p2p_set_noa(struct hostapd_data *hapd, u8 count, int start, 3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int duration) 3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho wpa_printf(MSG_DEBUG, "P2P: Set NoA parameters: count=%u start=%d " 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "duration=%d", count, start, duration); 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (count == 0) { 408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius hapd->noa_enabled = 0; 418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius hapd->noa_start = 0; 428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius hapd->noa_duration = 0; 438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (count != 255) { 4659d709d503bab6e2b61931737e662dd293b40578ccornelius wpa_printf(MSG_DEBUG, "P2P: Non-periodic NoA - set " 4759d709d503bab6e2b61931737e662dd293b40578ccornelius "NoA parameters"); 4859d709d503bab6e2b61931737e662dd293b40578ccornelius return hostapd_driver_set_noa(hapd, count, start, duration); 4959d709d503bab6e2b61931737e662dd293b40578ccornelius } 5059d709d503bab6e2b61931737e662dd293b40578ccornelius 5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho hapd->noa_enabled = 1; 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho hapd->noa_start = start; 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho hapd->noa_duration = duration; 5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (hapd->num_sta_no_p2p == 0) { 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho wpa_printf(MSG_DEBUG, "P2P: No legacy STAs connected - update " 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "periodic NoA parameters"); 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return hostapd_driver_set_noa(hapd, count, start, duration); 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho wpa_printf(MSG_DEBUG, "P2P: Legacy STA(s) connected - do not enable " 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "periodic NoA"); 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return 0; 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid hostapd_p2p_non_p2p_sta_connected(struct hostapd_data *hapd) 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho wpa_printf(MSG_DEBUG, "P2P: First non-P2P device connected"); 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (hapd->noa_enabled) { 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho wpa_printf(MSG_DEBUG, "P2P: Disable periodic NoA"); 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho hostapd_driver_set_noa(hapd, 0, 0, 0); 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 77 78 79void hostapd_p2p_non_p2p_sta_disconnected(struct hostapd_data *hapd) 80{ 81 wpa_printf(MSG_DEBUG, "P2P: Last non-P2P device disconnected"); 82 83 if (hapd->noa_enabled) { 84 wpa_printf(MSG_DEBUG, "P2P: Enable periodic NoA"); 85 hostapd_driver_set_noa(hapd, 255, hapd->noa_start, 86 hapd->noa_duration); 87 } 88} 89 90#endif /* CONFIG_P2P */ 91 92 93#ifdef CONFIG_P2P_MANAGER 94u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid) 95{ 96 u8 bitmap; 97 *eid++ = WLAN_EID_VENDOR_SPECIFIC; 98 *eid++ = 4 + 3 + 1; 99 WPA_PUT_BE32(eid, P2P_IE_VENDOR_TYPE); 100 eid += 4; 101 102 *eid++ = P2P_ATTR_MANAGEABILITY; 103 WPA_PUT_LE16(eid, 1); 104 eid += 2; 105 bitmap = P2P_MAN_DEVICE_MANAGEMENT; 106 if (hapd->conf->p2p & P2P_ALLOW_CROSS_CONNECTION) 107 bitmap |= P2P_MAN_CROSS_CONNECTION_PERMITTED; 108 bitmap |= P2P_MAN_COEXISTENCE_OPTIONAL; 109 *eid++ = bitmap; 110 111 return eid; 112} 113#endif /* CONFIG_P2P_MANAGER */ 114