beacon.c revision 1f69aa52ea2e0a73ac502565df8c666ee49cab6a
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / IEEE 802.11 Management: Beacon and Probe Request/Response 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2002-2004, Instant802 Networks, Inc. 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2005-2006, Devicescape Software, Inc. 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2008-2009, Jouni Malinen <j@w1.fi> 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation. 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details. 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_common.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "drivers/driver.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps/wps_defs.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p/p2p.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "hostapd.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ieee802_11.h" 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_auth.h" 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wmm.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_config.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sta_info.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p_hostapd.h" 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_drv_ops.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "beacon.h" 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 ieee802_11_erp_info(struct hostapd_data *hapd) 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 erp = 0; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->iface->current_mode == NULL || 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G) 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->iface->olbc) 491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt erp |= ERP_INFO_USE_PROTECTION; 501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->iface->num_sta_non_erp > 0) { 511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt erp |= ERP_INFO_NON_ERP_PRESENT | 521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ERP_INFO_USE_PROTECTION; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->iface->num_sta_no_short_preamble > 0 || 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iconf->preamble == LONG_PREAMBLE) 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt erp |= ERP_INFO_BARKER_PREAMBLE_MODE; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return erp; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_ds_params(struct hostapd_data *hapd, u8 *eid) 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = WLAN_EID_DS_PARAMS; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = 1; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = hapd->iconf->channel; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_erp_info(struct hostapd_data *hapd, u8 *eid) 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->iface->current_mode == NULL || 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G) 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Set NonERP_present and use_protection bits if there 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * are any associated NonERP stations. */ 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: use_protection bit can be set to zero even if 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * there are NonERP stations present. This optimization 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * might be useful if NonERP stations are "quiet". 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See 802.11g/D6 E-1 for recommended practice. 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * In addition, Non ERP present might be set, if AP detects Non ERP 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * operation on other APs. */ 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add ERP Information element */ 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = WLAN_EID_ERP_INFO; 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = 1; 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = ieee802_11_erp_info(hapd); 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_country_add(u8 *pos, u8 *end, int chan_spacing, 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *start, 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *prev) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end - pos < 3) 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* first channel number */ 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = start->chan; 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* number of channels */ 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = (prev->chan - start->chan) / chan_spacing + 1; 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* maximum transmit power level */ 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = start->max_tx_power; 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_country(struct hostapd_data *hapd, u8 *eid, 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int max_len) 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = eid; 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *end = eid + max_len; 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_hw_modes *mode; 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *start, *prev; 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int chan_spacing = 1; 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hapd->iconf->ieee80211d || max_len < 6 || 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iface->current_mode == NULL) 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = WLAN_EID_COUNTRY; 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; /* length will be set later */ 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(pos, hapd->iconf->country, 3); /* e.g., 'US ' */ 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 3; 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = hapd->iface->current_mode; 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mode->mode == HOSTAPD_MODE_IEEE80211A) 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt chan_spacing = 4; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = prev = NULL; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < mode->num_channels; i++) { 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *chan = &mode->channels[i]; 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (chan->flag & HOSTAPD_CHAN_DISABLED) 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start && prev && 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev->chan + chan_spacing == chan->chan && 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start->max_tx_power == chan->max_tx_power) { 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev = chan; 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; /* can use same entry */ 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start) { 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_country_add(pos, end, chan_spacing, 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, prev); 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = NULL; 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Start new group */ 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = prev = chan; 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start) { 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_country_add(pos, end, chan_spacing, 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, prev); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((pos - eid) & 1) { 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end - pos < 1) 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = 0; /* pad for 16-bit alignment */ 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eid[1] = (pos - eid) - 2; 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic u8 * hostapd_eid_wpa(struct hostapd_data *hapd, u8 *eid, size_t len) 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ielen; 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &ielen); 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie == NULL || ielen > len) 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(eid, ie, ielen); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid + ielen; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, 1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct sta_info *sta, 1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const struct ieee80211_mgmt *req, 1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int is_p2p, size_t *resp_len) 1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct ieee80211_mgmt *resp; 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *pos, *epos; 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t buflen; 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#define MAX_PROBERESP_LEN 768 1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buflen = MAX_PROBERESP_LEN; 2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_WPS 2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->wps_probe_resp_ie) 2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buflen += wpabuf_len(hapd->wps_probe_resp_ie); 2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_WPS */ 2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->p2p_probe_resp_ie) 2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buflen += wpabuf_len(hapd->p2p_probe_resp_ie); 2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp = os_zalloc(buflen); 2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (resp == NULL) 2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt epos = ((u8 *) resp) + MAX_PROBERESP_LEN; 2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, 2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WLAN_FC_STYPE_PROBE_RESP); 2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (req) 2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(resp->da, req->sa, ETH_ALEN); 2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN); 2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN); 2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp->u.probe_resp.beacon_int = 2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt host_to_le16(hapd->iconf->beacon_int); 2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* hardware or low-level driver will setup seq_ctrl and timestamp */ 2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp->u.probe_resp.capab_info = 2261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt host_to_le16(hostapd_own_capab_info(hapd, sta, 1)); 2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = resp->u.probe_resp.variable; 2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *pos++ = WLAN_EID_SSID; 2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *pos++ = hapd->conf->ssid.ssid_len; 2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(pos, hapd->conf->ssid.ssid, hapd->conf->ssid.ssid_len); 2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos += hapd->conf->ssid.ssid_len; 2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Supported rates */ 2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_supp_rates(hapd, pos); 2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* DS Params */ 2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ds_params(hapd, pos); 2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_country(hapd, pos, epos - pos); 2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* ERP Information element */ 2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_erp_info(hapd, pos); 2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extended supported rates */ 2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ext_supp_rates(hapd, pos); 2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* RSN, MDIE, WPA */ 2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_wpa(hapd, pos, epos - pos); 2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_IEEE80211N 2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ht_capabilities(hapd, pos); 2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ht_operation(hapd, pos); 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_IEEE80211N */ 2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ext_capab(hapd, pos); 2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_time_adv(hapd, pos); 2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_time_zone(hapd, pos); 2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_interworking(hapd, pos); 2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_adv_proto(hapd, pos); 2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_roaming_consortium(hapd, pos); 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Wi-Fi Alliance WMM */ 2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_wmm(hapd, pos); 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_WPS 2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->wps_state && hapd->wps_probe_resp_ie) { 2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(pos, wpabuf_head(hapd->wps_probe_resp_ie), 2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_len(hapd->wps_probe_resp_ie)); 2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos += wpabuf_len(hapd->wps_probe_resp_ie); 2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_WPS */ 2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 2771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((hapd->conf->p2p & P2P_ENABLED) && is_p2p && 2781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->p2p_probe_resp_ie) { 2791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(pos, wpabuf_head(hapd->p2p_probe_resp_ie), 2801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_len(hapd->p2p_probe_resp_ie)); 2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos += wpabuf_len(hapd->p2p_probe_resp_ie); 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P_MANAGER 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) == 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt P2P_MANAGE) 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_p2p_manage(hapd, pos); 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *resp_len = pos - (u8 *) resp; 2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return (u8 *) resp; 2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid handle_probe_req(struct hostapd_data *hapd, 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt, size_t len) 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *resp; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee802_11_elems elems; 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t ie_len; 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sta_info *sta = NULL; 3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t i, resp_len; 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int noack; 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = mgmt->u.probe_req.variable; 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)) 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)); 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, 3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt mgmt->sa, mgmt->da, mgmt->bssid, 3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ie, ie_len) > 0) 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hapd->iconf->send_probe_response) 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ieee802_11_parse_elems(ie, ie_len, &elems, 0) == ParseFailed) { 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Could not parse ProbeReq from " MACSTR, 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->sa)); 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((!elems.ssid || !elems.supp_rates)) { 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "STA " MACSTR " sent probe request " 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "without SSID or supported rates element", 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->sa)); 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->p2p && elems.wps_ie) { 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *wps; 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps = ieee802_11_vendor_ie_concat(ie, ie_len, WPS_DEV_OUI_WFA); 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wps && !p2p_group_match_dev_type(hapd->p2p_group, wps)) { 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "P2P: Ignore Probe Request " 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "due to mismatch with Requested Device " 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Type"); 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(wps); 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(wps); 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0) { 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for " 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "broadcast SSID ignored", MAC2STR(mgmt->sa)); 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sta = ap_get_sta(hapd, mgmt->sa); 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((hapd->conf->p2p & P2P_GROUP_OWNER) && 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems.ssid_len == P2P_WILDCARD_SSID_LEN && 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcmp(elems.ssid, P2P_WILDCARD_SSID, 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_WILDCARD_SSID_LEN) == 0) { 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Process P2P Wildcard SSID like Wildcard SSID */ 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems.ssid_len = 0; 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (elems.ssid_len == 0 || 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (elems.ssid_len == hapd->conf->ssid.ssid_len && 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) == 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0)) { 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta) 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sta->ssid_probe = &hapd->conf->ssid; 3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else { 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!(mgmt->da[0] & 0x01)) { 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char ssid_txt[33]; 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_11_print_ssid(ssid_txt, elems.ssid, 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems.ssid_len); 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " for foreign SSID '%s' (DA " MACSTR ")", 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->sa), ssid_txt, 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->da)); 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 3861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (elems.interworking && elems.interworking_len >= 1) { 3871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 ant = elems.interworking[0] & 0x0f; 3881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ant != INTERWORKING_ANT_WILDCARD && 3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ant != hapd->conf->access_network_type) { 3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt " for mismatching ANT %u ignored", 3921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MAC2STR(mgmt->sa), ant); 3931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 3941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 3951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 3961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (elems.interworking && 3981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (elems.interworking_len == 7 || elems.interworking_len == 9)) { 3991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const u8 *hessid; 4001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (elems.interworking_len == 7) 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hessid = elems.interworking + 1; 4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hessid = elems.interworking + 1 + 2; 4041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!is_broadcast_ether_addr(hessid) && 4051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcmp(hessid, hapd->conf->hessid, ETH_ALEN) != 0) { 4061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR 4071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt " for mismatching HESSID " MACSTR 4081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt " ignored", 4091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MAC2STR(mgmt->sa), MAC2STR(hessid)); 4101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 4111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 4141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: verify that supp_rates contains at least one matching rate 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with AP configuration */ 4171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp = hostapd_gen_probe_resp(hapd, sta, mgmt, elems.p2p != NULL, 4191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &resp_len); 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (resp == NULL) 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 4241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * If this is a broadcast probe request, apply no ack policy to avoid 4251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * excessive retries. 4261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 4271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt noack = !!(elems.ssid_len == 0 && is_broadcast_ether_addr(mgmt->da)); 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hostapd_drv_send_mlme(hapd, resp, resp_len, noack) < 0) 4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt perror("handle_probe_req: send"); 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(resp); 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_EXCESSIVE, "STA " MACSTR " sent probe request for %s " 4351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "SSID", MAC2STR(mgmt->sa), 4361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt elems.ssid_len == 0 ? "broadcast" : "our"); 4371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd, 4411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t *resp_len) 4421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 4431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* check probe response offloading caps and print warnings */ 4441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_PROBE_RESP_OFFLOAD)) 4451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 4481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->wps_state && hapd->wps_probe_resp_ie && 4491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (!(hapd->iface->probe_resp_offloads & 4501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (WPA_DRIVER_PROBE_RESP_OFFLOAD_WPS | 4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_DRIVER_PROBE_RESP_OFFLOAD_WPS2)))) 4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_WARNING, "Device is trying to offload WPS " 4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Probe Response while not supporting this"); 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_probe_resp_ie && 4581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !(hapd->iface->probe_resp_offloads & 4591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_DRIVER_PROBE_RESP_OFFLOAD_P2P)) 4601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_WARNING, "Device is trying to offload P2P " 4611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Probe Response while not supporting this"); 4621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 4631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->interworking && 4651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !(hapd->iface->probe_resp_offloads & 4661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_DRIVER_PROBE_RESP_OFFLOAD_INTERWORKING)) 4671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_WARNING, "Device is trying to offload " 4681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Interworking Probe Response while not supporting " 4691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "this"); 4701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Generate a Probe Response template for the non-P2P case */ 4721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return hostapd_gen_probe_resp(hapd, NULL, NULL, 0, resp_len); 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 4761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ieee802_11_set_beacon(struct hostapd_data *hapd) 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct ieee80211_mgmt *head = NULL; 4811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *tail = NULL; 4821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t head_len = 0, tail_len = 0; 4831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *resp = NULL; 4841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t resp_len = 0; 4851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_driver_ap_params params; 4861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpabuf *beacon, *proberesp, *assocresp; 4871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 capab_info; 4891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *pos, *tailpos; 4901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->beacon_set_done = 1; 4931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define BEACON_HEAD_BUF_SIZE 256 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define BEACON_TAIL_BUF_SIZE 512 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head = os_zalloc(BEACON_HEAD_BUF_SIZE); 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len = BEACON_TAIL_BUF_SIZE; 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->wps_state && hapd->wps_beacon_ie) 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len += wpabuf_len(hapd->wps_beacon_ie); 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->p2p_beacon_ie) 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len += wpabuf_len(hapd->p2p_beacon_ie); 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = tail = os_malloc(tail_len); 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (head == NULL || tail == NULL) { 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to set beacon data"); 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(head); 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(tail); 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_STYPE_BEACON); 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->duration = host_to_le16(0); 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(head->da, 0xff, ETH_ALEN); 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(head->sa, hapd->own_addr, ETH_ALEN); 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(head->bssid, hapd->own_addr, ETH_ALEN); 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->u.beacon.beacon_int = 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt host_to_le16(hapd->iconf->beacon_int); 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* hardware or low-level driver will setup seq_ctrl and timestamp */ 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capab_info = hostapd_own_capab_info(hapd, NULL, 0); 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->u.beacon.capab_info = host_to_le16(capab_info); 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = &head->u.beacon.variable[0]; 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* SSID */ 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = WLAN_EID_SSID; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ignore_broadcast_ssid == 2) { 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* clear the data, but keep the correct length of the SSID */ 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = hapd->conf->ssid.ssid_len; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(pos, 0, hapd->conf->ssid.ssid_len); 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += hapd->conf->ssid.ssid_len; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (hapd->conf->ignore_broadcast_ssid) { 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = 0; /* empty SSID */ 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = hapd->conf->ssid.ssid_len; 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(pos, hapd->conf->ssid.ssid, 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ssid.ssid_len); 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += hapd->conf->ssid.ssid_len; 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Supported rates */ 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_supp_rates(hapd, pos); 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* DS Params */ 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_ds_params(hapd, pos); 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head_len = pos - (u8 *) head; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_country(hapd, tailpos, 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail + BEACON_TAIL_BUF_SIZE - tailpos); 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* ERP Information element */ 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_erp_info(hapd, tailpos); 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extended supported rates */ 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ext_supp_rates(hapd, tailpos); 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* RSN, MDIE, WPA */ 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_wpa(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE - 5661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ht_capabilities(hapd, tailpos); 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ht_operation(hapd, tailpos); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ext_capab(hapd, tailpos); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 5761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * TODO: Time Advertisement element should only be included in some 5771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * DTIM Beacon frames. 5781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 5791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_time_adv(hapd, tailpos); 5801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_interworking(hapd, tailpos); 5821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_adv_proto(hapd, tailpos); 5831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_roaming_consortium(hapd, tailpos); 5841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Wi-Fi Alliance WMM */ 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_wmm(hapd, tailpos); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->wps_state && hapd->wps_beacon_ie) { 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(tailpos, wpabuf_head(hapd->wps_beacon_ie), 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_len(hapd->wps_beacon_ie)); 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos += wpabuf_len(hapd->wps_beacon_ie); 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_beacon_ie) { 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(tailpos, wpabuf_head(hapd->p2p_beacon_ie), 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_len(hapd->p2p_beacon_ie)); 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos += wpabuf_len(hapd->p2p_beacon_ie); 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P_MANAGER 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) == 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_MANAGE) 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_p2p_manage(hapd, tailpos); 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len = tailpos > tail ? tailpos - tail : 0; 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp = hostapd_probe_resp_offloads(hapd, &resp_len); 6121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 6131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 6151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.head = (u8 *) head; 6161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.head_len = head_len; 6171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.tail = tail; 6181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.tail_len = tail_len; 6191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.proberesp = resp; 6201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.proberesp_len = resp_len; 6211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.dtim_period = hapd->conf->dtim_period; 6221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.beacon_int = hapd->iconf->beacon_int; 6231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.basic_rates = hapd->iconf->basic_rates; 6241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.ssid = (u8 *) hapd->conf->ssid.ssid; 6251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.ssid_len = hapd->conf->ssid.ssid_len; 6261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.pairwise_ciphers = hapd->conf->rsn_pairwise ? 6271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->conf->rsn_pairwise : hapd->conf->wpa_pairwise; 6281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.group_cipher = hapd->conf->wpa_group; 6291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.key_mgmt_suites = hapd->conf->wpa_key_mgmt; 6301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.auth_algs = hapd->conf->auth_algs; 6311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.wpa_version = hapd->conf->wpa; 6321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa || 6331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (hapd->conf->ieee802_1x && 6341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (hapd->conf->default_wep_key_len || 6351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->conf->individual_wep_key_len)); 6361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (hapd->conf->ignore_broadcast_ssid) { 6371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 0: 6381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.hide_ssid = NO_SSID_HIDING; 6391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 6401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 6411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.hide_ssid = HIDDEN_SSID_ZERO_LEN; 6421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 6431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 2: 6441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.hide_ssid = HIDDEN_SSID_ZERO_CONTENTS; 6451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 6461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 6471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp); 6481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.beacon_ies = beacon; 6491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.proberesp_ies = proberesp; 6501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.assocresp_ies = assocresp; 6511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.isolate = hapd->conf->isolate; 6521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 6531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.cts_protect = !!(ieee802_11_erp_info(hapd) & 6541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ERP_INFO_USE_PROTECTION); 6551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.preamble = hapd->iface->num_sta_no_short_preamble == 0 && 6561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->iconf->preamble == SHORT_PREAMBLE; 6571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->iface->current_mode && 6581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G) 6591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.short_slot_time = 6601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->iface->num_sta_no_short_slot_time > 0 ? 0 : 1; 6611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 6621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.short_slot_time = -1; 6631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n) 6641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.ht_opmode = -1; 6651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 6661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.ht_opmode = hapd->iface->ht_op_mode; 6671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 6681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.interworking = hapd->conf->interworking; 6691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->interworking && 6701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !is_zero_ether_addr(hapd->conf->hessid)) 6711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.hessid = hapd->conf->hessid; 6721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.access_network_type = hapd->conf->access_network_type; 6731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hostapd_drv_set_ap(hapd, ¶ms)) 6741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "Failed to set beacon parameters"); 6751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(tail); 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(head); 6791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(resp); 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ieee802_11_set_beacons(struct hostapd_iface *iface) 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < iface->num_bss; i++) 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_11_set_beacon(iface->bss[i]); 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 691