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. 5a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt * Copyright (c) 2008-2012, Jouni Malinen <j@w1.fi> 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 8fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt * See README for more details. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_common.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps/wps_defs.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p/p2p.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "hostapd.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ieee802_11.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_auth.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wmm.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_config.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sta_info.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p_hostapd.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_drv_ops.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "beacon.h" 2961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#include "hs20.h" 30f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt#include "dfs.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 35051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic u8 * hostapd_eid_bss_load(struct hostapd_data *hapd, u8 *eid, size_t len) 36051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 37051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS 38051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (hapd->conf->bss_load_test_set) { 39051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (2 + 5 > len) 40051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return eid; 41051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *eid++ = WLAN_EID_BSS_LOAD; 42051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *eid++ = 5; 43051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt os_memcpy(eid, hapd->conf->bss_load_test, 5); 44051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt eid += 5; 45051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 46051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */ 47051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return eid; 48051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 49051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 50051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 ieee802_11_erp_info(struct hostapd_data *hapd) 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 erp = 0; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->iface->current_mode == NULL || 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G) 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->iface->olbc) 601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt erp |= ERP_INFO_USE_PROTECTION; 611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->iface->num_sta_non_erp > 0) { 621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt erp |= ERP_INFO_NON_ERP_PRESENT | 631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ERP_INFO_USE_PROTECTION; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->iface->num_sta_no_short_preamble > 0 || 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iconf->preamble == LONG_PREAMBLE) 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt erp |= ERP_INFO_BARKER_PREAMBLE_MODE; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return erp; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_ds_params(struct hostapd_data *hapd, u8 *eid) 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = WLAN_EID_DS_PARAMS; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = 1; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = hapd->iconf->channel; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_erp_info(struct hostapd_data *hapd, u8 *eid) 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->iface->current_mode == NULL || 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211G) 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Set NonERP_present and use_protection bits if there 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * are any associated NonERP stations. */ 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: use_protection bit can be set to zero even if 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * there are NonERP stations present. This optimization 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * might be useful if NonERP stations are "quiet". 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See 802.11g/D6 E-1 for recommended practice. 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * In addition, Non ERP present might be set, if AP detects Non ERP 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * operation on other APs. */ 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add ERP Information element */ 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = WLAN_EID_ERP_INFO; 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = 1; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *eid++ = ieee802_11_erp_info(hapd); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 106f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic u8 * hostapd_eid_pwr_constraint(struct hostapd_data *hapd, u8 *eid) 107f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 108f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt u8 *pos = eid; 109f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt u8 local_pwr_constraint = 0; 110f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt int dfs; 111f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 112f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (hapd->iface->current_mode == NULL || 113f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A) 114f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return eid; 115f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 116661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt /* Let host drivers add this IE if DFS support is offloaded */ 117661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) 118661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return eid; 119661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 120f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* 121f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * There is no DFS support and power constraint was not directly 122f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * requested by config option. 123f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt */ 124f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (!hapd->iconf->ieee80211h && 125f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt hapd->iconf->local_pwr_constraint == -1) 126f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return eid; 127f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 128f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* Check if DFS is required by regulatory. */ 129f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt dfs = hostapd_is_dfs_required(hapd->iface); 130f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (dfs < 0) { 131f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_printf(MSG_WARNING, "Failed to check if DFS is required; ret=%d", 132f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt dfs); 133f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt dfs = 0; 134f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 135f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 136f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (dfs == 0 && hapd->iconf->local_pwr_constraint == -1) 137f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return eid; 138f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 139f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* 140f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * ieee80211h (DFS) is enabled so Power Constraint element shall 141f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * be added when running on DFS channel whenever local_pwr_constraint 142f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * is configured or not. In order to meet regulations when TPC is not 143f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * implemented using a transmit power that is below the legal maximum 144f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * (including any mitigation factor) should help. In this case, 145f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * indicate 3 dB below maximum allowed transmit power. 146f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt */ 147f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (hapd->iconf->local_pwr_constraint == -1) 148f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt local_pwr_constraint = 3; 149f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 150f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* 151f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * A STA that is not an AP shall use a transmit power less than or 152f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * equal to the local maximum transmit power level for the channel. 153f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * The local maximum transmit power can be calculated from the formula: 154f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * local max TX pwr = max TX pwr - local pwr constraint 155f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * Where max TX pwr is maximum transmit power level specified for 156f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * channel in Country element and local pwr constraint is specified 157f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt * for channel in this Power Constraint element. 158f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt */ 159f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 160f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* Element ID */ 161f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt *pos++ = WLAN_EID_PWR_CONSTRAINT; 162f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* Length */ 163f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt *pos++ = 1; 164f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* Local Power Constraint */ 165f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (local_pwr_constraint) 166f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt *pos++ = local_pwr_constraint; 167f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt else 168f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt *pos++ = hapd->iconf->local_pwr_constraint; 169f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 170f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return pos; 171f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 172f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 173f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_country_add(u8 *pos, u8 *end, int chan_spacing, 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *start, 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *prev) 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end - pos < 3) 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* first channel number */ 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = start->chan; 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* number of channels */ 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = (prev->chan - start->chan) / chan_spacing + 1; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* maximum transmit power level */ 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = start->max_tx_power; 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * hostapd_eid_country(struct hostapd_data *hapd, u8 *eid, 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int max_len) 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = eid; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *end = eid + max_len; 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_hw_modes *mode; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *start, *prev; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int chan_spacing = 1; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hapd->iconf->ieee80211d || max_len < 6 || 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->iface->current_mode == NULL) 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = WLAN_EID_COUNTRY; 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; /* length will be set later */ 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(pos, hapd->iconf->country, 3); /* e.g., 'US ' */ 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 3; 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = hapd->iface->current_mode; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mode->mode == HOSTAPD_MODE_IEEE80211A) 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt chan_spacing = 4; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = prev = NULL; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < mode->num_channels; i++) { 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_channel_data *chan = &mode->channels[i]; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (chan->flag & HOSTAPD_CHAN_DISABLED) 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start && prev && 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev->chan + chan_spacing == chan->chan && 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start->max_tx_power == chan->max_tx_power) { 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev = chan; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; /* can use same entry */ 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22709f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt if (start && prev) { 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_country_add(pos, end, chan_spacing, 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, prev); 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = NULL; 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Start new group */ 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = prev = chan; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start) { 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_country_add(pos, end, chan_spacing, 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start, prev); 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((pos - eid) & 1) { 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end - pos < 1) 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = 0; /* pad for 16-bit alignment */ 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eid[1] = (pos - eid) - 2; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic u8 * hostapd_eid_wpa(struct hostapd_data *hapd, u8 *eid, size_t len) 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ielen; 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &ielen); 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie == NULL || ielen > len) 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid; 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(eid, ie, ielen); 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return eid + ielen; 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtstatic u8 * hostapd_eid_csa(struct hostapd_data *hapd, u8 *eid) 269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 chan; 271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 272d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt if (!hapd->cs_freq_params.freq) 273e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return eid; 274e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 275d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt if (ieee80211_freq_to_chan(hapd->cs_freq_params.freq, &chan) == 276e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt NUM_HOSTAPD_MODES) 277e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return eid; 278e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 279e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *eid++ = WLAN_EID_CHANNEL_SWITCH; 280e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *eid++ = 3; 281d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt *eid++ = hapd->cs_block_tx; 282e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *eid++ = chan; 283d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt *eid++ = hapd->cs_count; 284e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 285e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return eid; 286e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 287e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 288e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 289fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtstatic u8 * hostapd_eid_secondary_channel(struct hostapd_data *hapd, u8 *eid) 290fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt{ 291fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt u8 sec_ch; 292fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 293d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt if (!hapd->cs_freq_params.sec_channel_offset) 294fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return eid; 295fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 296d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt if (hapd->cs_freq_params.sec_channel_offset == -1) 297fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt sec_ch = HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW; 298d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt else if (hapd->cs_freq_params.sec_channel_offset == 1) 299fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt sec_ch = HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE; 300fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt else 301fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return eid; 302fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 303fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt *eid++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET; 304fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt *eid++ = 1; 305fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt *eid++ = sec_ch; 306fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 307fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return eid; 308fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt} 309fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 310fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 311fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtstatic u8 * hostapd_add_csa_elems(struct hostapd_data *hapd, u8 *pos, 312fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt u8 *start, unsigned int *csa_counter_off) 313fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt{ 314fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt u8 *old_pos = pos; 315fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 316fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (!csa_counter_off) 317fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return pos; 318fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 319fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt *csa_counter_off = 0; 320fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pos = hostapd_eid_csa(hapd, pos); 321fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 322fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (pos != old_pos) { 323fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt /* save an offset to the counter - should be last byte */ 324fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt *csa_counter_off = pos - start - 1; 325fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pos = hostapd_eid_secondary_channel(hapd, pos); 326fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 327fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 328fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return pos; 329fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt} 330fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 331fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 3321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, 3331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct sta_info *sta, 3341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const struct ieee80211_mgmt *req, 3351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int is_p2p, size_t *resp_len) 3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 3371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct ieee80211_mgmt *resp; 338fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt u8 *pos, *epos; 3391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t buflen; 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#define MAX_PROBERESP_LEN 768 3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buflen = MAX_PROBERESP_LEN; 3431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_WPS 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->wps_probe_resp_ie) 3451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buflen += wpabuf_len(hapd->wps_probe_resp_ie); 3461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_WPS */ 3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->p2p_probe_resp_ie) 3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buflen += wpabuf_len(hapd->p2p_probe_resp_ie); 3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 35161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hapd->conf->vendor_elements) 35261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buflen += wpabuf_len(hapd->conf->vendor_elements); 3531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp = os_zalloc(buflen); 3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (resp == NULL) 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt epos = ((u8 *) resp) + MAX_PROBERESP_LEN; 3581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, 3601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WLAN_FC_STYPE_PROBE_RESP); 3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (req) 3621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(resp->da, req->sa, ETH_ALEN); 3631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN); 3641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN); 3661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp->u.probe_resp.beacon_int = 3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt host_to_le16(hapd->iconf->beacon_int); 3681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* hardware or low-level driver will setup seq_ctrl and timestamp */ 3701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp->u.probe_resp.capab_info = 3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt host_to_le16(hostapd_own_capab_info(hapd, sta, 1)); 3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = resp->u.probe_resp.variable; 3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *pos++ = WLAN_EID_SSID; 3751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *pos++ = hapd->conf->ssid.ssid_len; 3761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(pos, hapd->conf->ssid.ssid, hapd->conf->ssid.ssid_len); 3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos += hapd->conf->ssid.ssid_len; 3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Supported rates */ 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_supp_rates(hapd, pos); 3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* DS Params */ 3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ds_params(hapd, pos); 3841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_country(hapd, pos, epos - pos); 3861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 387f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* Power Constraint element */ 388f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = hostapd_eid_pwr_constraint(hapd, pos); 389f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* ERP Information element */ 3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_erp_info(hapd, pos); 3921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extended supported rates */ 3941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ext_supp_rates(hapd, pos); 3951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* RSN, MDIE, WPA */ 3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_wpa(hapd, pos, epos - pos); 3981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 399051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt pos = hostapd_eid_bss_load(hapd, pos, epos - pos); 400051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_IEEE80211N 4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ht_capabilities(hapd, pos); 4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ht_operation(hapd, pos); 4041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_IEEE80211N */ 4051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_ext_capab(hapd, pos); 4071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_time_adv(hapd, pos); 4091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_time_zone(hapd, pos); 4101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_interworking(hapd, pos); 4121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_adv_proto(hapd, pos); 4131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_roaming_consortium(hapd, pos); 4141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 415fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pos = hostapd_add_csa_elems(hapd, pos, (u8 *)resp, 416d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt &hapd->cs_c_off_proberesp); 41704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_IEEE80211AC 41804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = hostapd_eid_vht_capabilities(hapd, pos); 41904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = hostapd_eid_vht_operation(hapd, pos); 42004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_IEEE80211AC */ 42104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 4221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Wi-Fi Alliance WMM */ 4231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_wmm(hapd, pos); 4241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_WPS 4261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->wps_state && hapd->wps_probe_resp_ie) { 4271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(pos, wpabuf_head(hapd->wps_probe_resp_ie), 4281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_len(hapd->wps_probe_resp_ie)); 4291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos += wpabuf_len(hapd->wps_probe_resp_ie); 4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_WPS */ 4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 4341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((hapd->conf->p2p & P2P_ENABLED) && is_p2p && 4351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->p2p_probe_resp_ie) { 4361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(pos, wpabuf_head(hapd->p2p_probe_resp_ie), 4371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_len(hapd->p2p_probe_resp_ie)); 4381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos += wpabuf_len(hapd->p2p_probe_resp_ie); 4391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 4411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P_MANAGER 4421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) == 4431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt P2P_MANAGE) 4441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt pos = hostapd_eid_p2p_manage(hapd, pos); 4451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 4461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 44761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 44861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = hostapd_eid_hs20_indication(hapd, pos); 449f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt pos = hostapd_eid_osen(hapd, pos); 45061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 45161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 45261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hapd->conf->vendor_elements) { 45361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(pos, wpabuf_head(hapd->conf->vendor_elements), 45461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpabuf_len(hapd->conf->vendor_elements)); 45561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += wpabuf_len(hapd->conf->vendor_elements); 45661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 45761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 4581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *resp_len = pos - (u8 *) resp; 4591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return (u8 *) resp; 4601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 4611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 463a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtenum ssid_match_result { 464a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt NO_SSID_MATCH, 465a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt EXACT_SSID_MATCH, 466a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt WILDCARD_SSID_MATCH 467a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt}; 468a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 469a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtstatic enum ssid_match_result ssid_match(struct hostapd_data *hapd, 470a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt const u8 *ssid, size_t ssid_len, 471a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt const u8 *ssid_list, 472a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt size_t ssid_list_len) 473a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt{ 474a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt const u8 *pos, *end; 475a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt int wildcard = 0; 476a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 477a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (ssid_len == 0) 478a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt wildcard = 1; 479a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (ssid_len == hapd->conf->ssid.ssid_len && 480a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt os_memcmp(ssid, hapd->conf->ssid.ssid, ssid_len) == 0) 481a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt return EXACT_SSID_MATCH; 482a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 483a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (ssid_list == NULL) 484a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt return wildcard ? WILDCARD_SSID_MATCH : NO_SSID_MATCH; 485a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 486a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt pos = ssid_list; 487a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt end = ssid_list + ssid_list_len; 488a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt while (pos + 1 <= end) { 489a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (pos + 2 + pos[1] > end) 490a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt break; 491a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (pos[1] == 0) 492a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt wildcard = 1; 493a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (pos[1] == hapd->conf->ssid.ssid_len && 494a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt os_memcmp(pos + 2, hapd->conf->ssid.ssid, pos[1]) == 0) 495a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt return EXACT_SSID_MATCH; 496a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt pos += 2 + pos[1]; 497a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 498a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 499a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt return wildcard ? WILDCARD_SSID_MATCH : NO_SSID_MATCH; 500a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt} 501a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 502a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid handle_probe_req(struct hostapd_data *hapd, 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const struct ieee80211_mgmt *mgmt, size_t len, 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int ssi_signal) 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *resp; 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee802_11_elems elems; 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 5101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t ie_len; 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sta_info *sta = NULL; 5121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t i, resp_len; 5131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int noack; 514a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt enum ssid_match_result res; 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = mgmt->u.probe_req.variable; 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)) 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)); 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, 5231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt mgmt->sa, mgmt->da, mgmt->bssid, 52404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ie, ie_len, ssi_signal) > 0) 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hapd->iconf->send_probe_response) 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ieee802_11_parse_elems(ie, ie_len, &elems, 0) == ParseFailed) { 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Could not parse ProbeReq from " MACSTR, 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->sa)); 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((!elems.ssid || !elems.supp_rates)) { 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "STA " MACSTR " sent probe request " 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "without SSID or supported rates element", 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->sa)); 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->p2p && elems.wps_ie) { 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *wps; 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps = ieee802_11_vendor_ie_concat(ie, ie_len, WPS_DEV_OUI_WFA); 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wps && !p2p_group_match_dev_type(hapd->p2p_group, wps)) { 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "P2P: Ignore Probe Request " 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "due to mismatch with Requested Device " 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Type"); 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(wps); 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(wps); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 556c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 557c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (hapd->p2p && elems.p2p) { 558c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpabuf *p2p; 559c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt p2p = ieee802_11_vendor_ie_concat(ie, ie_len, P2P_IE_VENDOR_TYPE); 560c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (p2p && !p2p_group_match_dev_id(hapd->p2p_group, p2p)) { 561c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "P2P: Ignore Probe Request " 562c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "due to mismatch with Device ID"); 563c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpabuf_free(p2p); 564c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return; 565c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 566c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpabuf_free(p2p); 567c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 570a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0 && 571a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt elems.ssid_list_len == 0) { 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for " 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "broadcast SSID ignored", MAC2STR(mgmt->sa)); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sta = ap_get_sta(hapd, mgmt->sa); 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((hapd->conf->p2p & P2P_GROUP_OWNER) && 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems.ssid_len == P2P_WILDCARD_SSID_LEN && 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcmp(elems.ssid, P2P_WILDCARD_SSID, 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_WILDCARD_SSID_LEN) == 0) { 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Process P2P Wildcard SSID like Wildcard SSID */ 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt elems.ssid_len = 0; 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 589a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt res = ssid_match(hapd, elems.ssid, elems.ssid_len, 590a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt elems.ssid_list, elems.ssid_list_len); 591a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (res != NO_SSID_MATCH) { 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta) 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sta->ssid_probe = &hapd->conf->ssid; 5941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else { 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!(mgmt->da[0] & 0x01)) { 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR 597a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt " for foreign SSID '%s' (DA " MACSTR ")%s", 5983c4793790bf06f1fe08a2ddf604c9caa855151f1Dmitry Shmidt MAC2STR(mgmt->sa), 5993c4793790bf06f1fe08a2ddf604c9caa855151f1Dmitry Shmidt wpa_ssid_txt(elems.ssid, elems.ssid_len), 600a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt MAC2STR(mgmt->da), 601a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt elems.ssid_list ? " (SSID list)" : ""); 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 607f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt if (hapd->conf->interworking && 608f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt elems.interworking && elems.interworking_len >= 1) { 6091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 ant = elems.interworking[0] & 0x0f; 6101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ant != INTERWORKING_ANT_WILDCARD && 6111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ant != hapd->conf->access_network_type) { 6121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR 6131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt " for mismatching ANT %u ignored", 6141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MAC2STR(mgmt->sa), ant); 6151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 6161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 6171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 6181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 619f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt if (hapd->conf->interworking && elems.interworking && 6201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (elems.interworking_len == 7 || elems.interworking_len == 9)) { 6211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const u8 *hessid; 6221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (elems.interworking_len == 7) 6231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hessid = elems.interworking + 1; 6241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 6251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hessid = elems.interworking + 1 + 2; 6261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!is_broadcast_ether_addr(hessid) && 6271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcmp(hessid, hapd->conf->hessid, ETH_ALEN) != 0) { 6281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR 6291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt " for mismatching HESSID " MACSTR 6301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt " ignored", 6311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MAC2STR(mgmt->sa), MAC2STR(hessid)); 6321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 6331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 6341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 6351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 6361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 63734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#ifdef CONFIG_P2P 63834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt if ((hapd->conf->p2p & P2P_GROUP_OWNER) && 63934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt supp_rates_11b_only(&elems)) { 64034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /* Indicates support for 11b rates only */ 64134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt wpa_printf(MSG_EXCESSIVE, "P2P: Ignore Probe Request from " 64234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt MACSTR " with only 802.11b rates", 64334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt MAC2STR(mgmt->sa)); 64434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return; 64534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 64634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt#endif /* CONFIG_P2P */ 64734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: verify that supp_rates contains at least one matching rate 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with AP configuration */ 6501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6518da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS 6527832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt if (hapd->iconf->ignore_probe_probability > 0.0 && 6538da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt drand48() < hapd->iconf->ignore_probe_probability) { 6548da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt wpa_printf(MSG_INFO, 6558da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt "TESTING: ignoring probe request from " MACSTR, 6568da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt MAC2STR(mgmt->sa)); 6578da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return; 6588da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt } 6598da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */ 6608da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 6611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp = hostapd_gen_probe_resp(hapd, sta, mgmt, elems.p2p != NULL, 6621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &resp_len); 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (resp == NULL) 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 6671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * If this is a broadcast probe request, apply no ack policy to avoid 6681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * excessive retries. 6691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 670a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt noack = !!(res == WILDCARD_SSID_MATCH && 671a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt is_broadcast_ether_addr(mgmt->da)); 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hostapd_drv_send_mlme(hapd, resp, resp_len, noack) < 0) 674cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt wpa_printf(MSG_INFO, "handle_probe_req: send failed"); 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(resp); 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_EXCESSIVE, "STA " MACSTR " sent probe request for %s " 6791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "SSID", MAC2STR(mgmt->sa), 6801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt elems.ssid_len == 0 ? "broadcast" : "our"); 6811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd, 6851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t *resp_len) 6861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 6871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* check probe response offloading caps and print warnings */ 6881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_PROBE_RESP_OFFLOAD)) 6891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 6921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->wps_state && hapd->wps_probe_resp_ie && 6931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (!(hapd->iface->probe_resp_offloads & 6941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (WPA_DRIVER_PROBE_RESP_OFFLOAD_WPS | 6951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_DRIVER_PROBE_RESP_OFFLOAD_WPS2)))) 6961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_WARNING, "Device is trying to offload WPS " 6971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Probe Response while not supporting this"); 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 7011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_probe_resp_ie && 7021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !(hapd->iface->probe_resp_offloads & 7031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_DRIVER_PROBE_RESP_OFFLOAD_P2P)) 7041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_WARNING, "Device is trying to offload P2P " 7051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Probe Response while not supporting this"); 7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->interworking && 7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !(hapd->iface->probe_resp_offloads & 7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_DRIVER_PROBE_RESP_OFFLOAD_INTERWORKING)) 7111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_WARNING, "Device is trying to offload " 7121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Interworking Probe Response while not supporting " 7131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "this"); 7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Generate a Probe Response template for the non-P2P case */ 7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return hostapd_gen_probe_resp(hapd, NULL, NULL, 0, resp_len); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 7201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 722e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtint ieee802_11_build_ap_params(struct hostapd_data *hapd, 723e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_driver_ap_params *params) 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct ieee80211_mgmt *head = NULL; 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *tail = NULL; 7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t head_len = 0, tail_len = 0; 7281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 *resp = NULL; 7291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t resp_len = 0; 7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 capab_info; 732fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt u8 *pos, *tailpos; 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define BEACON_HEAD_BUF_SIZE 256 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define BEACON_TAIL_BUF_SIZE 512 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head = os_zalloc(BEACON_HEAD_BUF_SIZE); 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len = BEACON_TAIL_BUF_SIZE; 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->wps_state && hapd->wps_beacon_ie) 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len += wpabuf_len(hapd->wps_beacon_ie); 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->p2p_beacon_ie) 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len += wpabuf_len(hapd->p2p_beacon_ie); 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 74661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hapd->conf->vendor_elements) 74761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tail_len += wpabuf_len(hapd->conf->vendor_elements); 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = tail = os_malloc(tail_len); 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (head == NULL || tail == NULL) { 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to set beacon data"); 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(head); 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(tail); 753e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return -1; 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_STYPE_BEACON); 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->duration = host_to_le16(0); 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(head->da, 0xff, ETH_ALEN); 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(head->sa, hapd->own_addr, ETH_ALEN); 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(head->bssid, hapd->own_addr, ETH_ALEN); 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->u.beacon.beacon_int = 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt host_to_le16(hapd->iconf->beacon_int); 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* hardware or low-level driver will setup seq_ctrl and timestamp */ 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capab_info = hostapd_own_capab_info(hapd, NULL, 0); 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head->u.beacon.capab_info = host_to_le16(capab_info); 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = &head->u.beacon.variable[0]; 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* SSID */ 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = WLAN_EID_SSID; 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ignore_broadcast_ssid == 2) { 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* clear the data, but keep the correct length of the SSID */ 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = hapd->conf->ssid.ssid_len; 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(pos, 0, hapd->conf->ssid.ssid_len); 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += hapd->conf->ssid.ssid_len; 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (hapd->conf->ignore_broadcast_ssid) { 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = 0; /* empty SSID */ 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = hapd->conf->ssid.ssid_len; 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(pos, hapd->conf->ssid.ssid, 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ssid.ssid_len); 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += hapd->conf->ssid.ssid_len; 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Supported rates */ 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_supp_rates(hapd, pos); 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* DS Params */ 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = hostapd_eid_ds_params(hapd, pos); 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head_len = pos - (u8 *) head; 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_country(hapd, tailpos, 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail + BEACON_TAIL_BUF_SIZE - tailpos); 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 798f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt /* Power Constraint element */ 799f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt tailpos = hostapd_eid_pwr_constraint(hapd, tailpos); 800f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* ERP Information element */ 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_erp_info(hapd, tailpos); 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extended supported rates */ 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ext_supp_rates(hapd, tailpos); 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* RSN, MDIE, WPA */ 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_wpa(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE - 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos); 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 811051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt tailpos = hostapd_eid_bss_load(hapd, tailpos, 812051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt tail + BEACON_TAIL_BUF_SIZE - tailpos); 813051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211N 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ht_capabilities(hapd, tailpos); 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ht_operation(hapd, tailpos); 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_ext_capab(hapd, tailpos); 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * TODO: Time Advertisement element should only be included in some 8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * DTIM Beacon frames. 8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_time_adv(hapd, tailpos); 8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_interworking(hapd, tailpos); 8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_adv_proto(hapd, tailpos); 8291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tailpos = hostapd_eid_roaming_consortium(hapd, tailpos); 830fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt tailpos = hostapd_add_csa_elems(hapd, tailpos, tail, 831d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt &hapd->cs_c_off_beacon); 83204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_IEEE80211AC 83304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tailpos = hostapd_eid_vht_capabilities(hapd, tailpos); 83404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tailpos = hostapd_eid_vht_operation(hapd, tailpos); 83504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_IEEE80211AC */ 83604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Wi-Fi Alliance WMM */ 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_wmm(hapd, tailpos); 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->wps_state && hapd->wps_beacon_ie) { 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(tailpos, wpabuf_head(hapd->wps_beacon_ie), 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_len(hapd->wps_beacon_ie)); 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos += wpabuf_len(hapd->wps_beacon_ie); 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_beacon_ie) { 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(tailpos, wpabuf_head(hapd->p2p_beacon_ie), 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_len(hapd->p2p_beacon_ie)); 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos += wpabuf_len(hapd->p2p_beacon_ie); 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P_MANAGER 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) == 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_MANAGE) 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tailpos = hostapd_eid_p2p_manage(hapd, tailpos); 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P_MANAGER */ 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 86161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 86261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tailpos = hostapd_eid_hs20_indication(hapd, tailpos); 863f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt tailpos = hostapd_eid_osen(hapd, tailpos); 86461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 86561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 86661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (hapd->conf->vendor_elements) { 86761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(tailpos, wpabuf_head(hapd->conf->vendor_elements), 86861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpabuf_len(hapd->conf->vendor_elements)); 86961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt tailpos += wpabuf_len(hapd->conf->vendor_elements); 87061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 87161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail_len = tailpos > tail ? tailpos - tail : 0; 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt resp = hostapd_probe_resp_offloads(hapd, &resp_len); 8751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 8761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 877e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt os_memset(params, 0, sizeof(*params)); 878e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->head = (u8 *) head; 879e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->head_len = head_len; 880e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->tail = tail; 881e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->tail_len = tail_len; 882e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->proberesp = resp; 883e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->proberesp_len = resp_len; 884e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->dtim_period = hapd->conf->dtim_period; 885e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->beacon_int = hapd->iconf->beacon_int; 886e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->basic_rates = hapd->iface->basic_rates; 887e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->ssid = hapd->conf->ssid.ssid; 888e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->ssid_len = hapd->conf->ssid.ssid_len; 889b5d893b5dec601a58c3ce0fc9e5d6da3816ce97aDmitry Shmidt params->pairwise_ciphers = hapd->conf->wpa_pairwise | 890b5d893b5dec601a58c3ce0fc9e5d6da3816ce97aDmitry Shmidt hapd->conf->rsn_pairwise; 891e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->group_cipher = hapd->conf->wpa_group; 892e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->key_mgmt_suites = hapd->conf->wpa_key_mgmt; 893e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->auth_algs = hapd->conf->auth_algs; 894e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->wpa_version = hapd->conf->wpa; 895e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa || 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (hapd->conf->ieee802_1x && 8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (hapd->conf->default_wep_key_len || 8981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->conf->individual_wep_key_len)); 8991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (hapd->conf->ignore_broadcast_ssid) { 9001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 0: 901e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->hide_ssid = NO_SSID_HIDING; 9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 904e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->hide_ssid = HIDDEN_SSID_ZERO_LEN; 9051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 9061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 2: 907e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->hide_ssid = HIDDEN_SSID_ZERO_CONTENTS; 9081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 9091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 910e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->isolate = hapd->conf->isolate; 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 912e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->cts_protect = !!(ieee802_11_erp_info(hapd) & 9131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ERP_INFO_USE_PROTECTION); 914e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->preamble = hapd->iface->num_sta_no_short_preamble == 0 && 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->iconf->preamble == SHORT_PREAMBLE; 9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->iface->current_mode && 9171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G) 918e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->short_slot_time = 9191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd->iface->num_sta_no_short_slot_time > 0 ? 0 : 1; 9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 921e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->short_slot_time = -1; 9221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n) 923e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->ht_opmode = -1; 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 925e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->ht_opmode = hapd->iface->ht_op_mode; 9261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 927e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->interworking = hapd->conf->interworking; 9281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->conf->interworking && 9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !is_zero_ether_addr(hapd->conf->hessid)) 930e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->hessid = hapd->conf->hessid; 931e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->access_network_type = hapd->conf->access_network_type; 932e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->ap_max_inactivity = hapd->conf->ap_max_inactivity; 93361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_HS20 934e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->disable_dgaf = hapd->conf->disable_dgaf; 935f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (hapd->conf->osen) { 936f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt params->privacy = 1; 937f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt params->osen = 1; 938f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 93961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_HS20 */ 940e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return 0; 941e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 942e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 943e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 944e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtvoid ieee802_11_free_ap_params(struct wpa_driver_ap_params *params) 945e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 946e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt os_free(params->tail); 947e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->tail = NULL; 948e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt os_free(params->head); 949e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->head = NULL; 950e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt os_free(params->proberesp); 951e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params->proberesp = NULL; 952e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 953e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 954e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 955fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtint ieee802_11_set_beacon(struct hostapd_data *hapd) 956e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 957e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_driver_ap_params params; 9587832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt struct hostapd_freq_params freq; 9597832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt struct hostapd_iface *iface = hapd->iface; 9607832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt struct hostapd_config *iconf = iface->conf; 961e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpabuf *beacon, *proberesp, *assocresp; 962fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt int res, ret = -1; 963e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 964d30ac604c9f6da71a0dd7f46d25be05a2a62cfbbDmitry Shmidt if (hapd->csa_in_progress) { 965e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_ERROR, "Cannot set beacons during CSA period"); 966fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return -1; 967e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 968e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 969e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt hapd->beacon_set_done = 1; 970e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 971e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ieee802_11_build_ap_params(hapd, ¶ms) < 0) 972fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return -1; 973e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 974e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp) < 975e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 0) 976e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt goto fail; 977e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 978e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params.beacon_ies = beacon; 979e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params.proberesp_ies = proberesp; 980e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt params.assocresp_ies = assocresp; 981e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 9827832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt if (iface->current_mode && 9837832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt hostapd_set_freq_params(&freq, iconf->hw_mode, iface->freq, 9847832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iconf->channel, iconf->ieee80211n, 9857832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iconf->ieee80211ac, 9867832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iconf->secondary_channel, 9877832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iconf->vht_oper_chwidth, 9887832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iconf->vht_oper_centr_freq_seg0_idx, 9897832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iconf->vht_oper_centr_freq_seg1_idx, 9907832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt iface->current_mode->vht_capab) == 0) 9917832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt params.freq = &freq; 9927832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt 993fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt res = hostapd_drv_set_ap(hapd, ¶ms); 9941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp); 995fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (res) 996fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to set beacon parameters"); 997fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt else 998fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt ret = 0; 999e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtfail: 1000e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ieee802_11_free_ap_params(¶ms); 1001fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return ret; 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1005fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtint ieee802_11_set_beacons(struct hostapd_iface *iface) 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1008fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt int ret = 0; 1009fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 1010292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt for (i = 0; i < iface->num_bss; i++) { 1011fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (iface->bss[i]->started && 1012fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt ieee802_11_set_beacon(iface->bss[i]) < 0) 1013fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt ret = -1; 1014292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt } 1015fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 1016fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return ret; 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 101904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 102004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/* only update beacons if started */ 1021fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtint ieee802_11_update_beacons(struct hostapd_iface *iface) 102204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 102304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 1024fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt int ret = 0; 1025fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 1026fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt for (i = 0; i < iface->num_bss; i++) { 1027fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (iface->bss[i]->beacon_set_done && iface->bss[i]->started && 1028fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt ieee802_11_set_beacon(iface->bss[i]) < 0) 1029fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt ret = -1; 1030fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 1031fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 1032fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return ret; 103304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 103404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 1036