ap.c revision b36ed7cd946148d829f311de8fe53ea3ffaaffe3
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - Basic AP mode support routines 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, Atheros Communications 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 7c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/eloop.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/uuid.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h" 17b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 18cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt#include "crypto/dh_group5.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/hostapd.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ap_config.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ap_drv_ops.h" 221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ieee802_11.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/beacon.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ieee802_1x.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/wps_hostapd.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ctrl_iface_ap.h" 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps/wps.h" 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config_ssid.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_supplicant_i.h" 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "driver_i.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p_supplicant.h" 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap.h" 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/sta_info.h" 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "notify.h" 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx); 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt#ifdef CONFIG_IEEE80211N 4768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidtstatic void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s, 4868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt struct hostapd_config *conf, 4968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt struct hostapd_hw_modes *mode) 5068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt{ 5168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt u8 center_chan = 0; 5268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt u8 channel = conf->channel; 5368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 5468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (!conf->secondary_channel) 5568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt goto no_vht; 5668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 5768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt center_chan = wpas_p2p_get_vht80_center(wpa_s, mode, channel); 5868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (!center_chan) 5968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt goto no_vht; 6068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 6168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt /* Use 80 MHz channel */ 6268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_oper_chwidth = 1; 6368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_oper_centr_freq_seg0_idx = center_chan; 6468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt return; 6568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 6668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidtno_vht: 6768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->vht_oper_centr_freq_seg0_idx = 6868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt channel + conf->secondary_channel * 2; 6968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt} 7068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt#endif /* CONFIG_IEEE80211N */ 7168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 7268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s, 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid, 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_config *conf) 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 77cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt struct hostapd_bss_config *bss = conf->bss[0]; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->driver = wpa_s->driver; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->iface, wpa_s->ifname, sizeof(bss->iface)); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 83b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt conf->hw_mode = ieee80211_freq_to_chan(ssid->frequency, 84b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt &conf->channel); 85b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt if (conf->hw_mode == NUM_HOSTAPD_MODES) { 86b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz", 87b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt ssid->frequency); 88b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt return -1; 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 91c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt /* TODO: enable HT40 if driver supports it; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * drop to 11b if driver does not support 11g */ 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 94c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt#ifdef CONFIG_IEEE80211N 95c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt /* 961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Enable HT20 if the driver supports it, by setting conf->ieee80211n 971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * and a mask of allowed capabilities within conf->ht_capab. 98c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt * Using default config settings for: conf->ht_op_mode_fixed, 991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * conf->secondary_channel, conf->require_ht 100c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt */ 1011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_s->hw.modes) { 102c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt struct hostapd_hw_modes *mode = NULL; 10304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int i, no_ht = 0; 1041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < wpa_s->hw.num_modes; i++) { 1051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_s->hw.modes[i].mode == conf->hw_mode) { 1061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt mode = &wpa_s->hw.modes[i]; 107c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt break; 108c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } 109c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } 11004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HT_OVERRIDES 11204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssid->disable_ht) { 11304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->ieee80211n = 0; 11404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->ht_capab = 0; 11504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt no_ht = 1; 11604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 11704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HT_OVERRIDES */ 11804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!no_ht && mode && mode->ht_capab) { 120c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt conf->ieee80211n = 1; 12161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_P2P 12261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A && 12361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (mode->ht_capab & 12461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) && 12561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ssid->ht40) 12661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->secondary_channel = 12761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpas_p2p_get_ht40_mode(wpa_s, mode, 12861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->channel); 12961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (conf->secondary_channel) 13061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->ht_capab |= 13161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; 13261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_P2P */ 1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * white-list capabilities that won't cause issues 1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * to connecting stations, while leaving the current 1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * capabilities intact (currently disabled SMPS). 1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt conf->ht_capab |= mode->ht_capab & 1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (HT_CAP_INFO_GREEN_FIELD | 1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_SHORT_GI20MHZ | 1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_SHORT_GI40MHZ | 1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_RX_STBC_MASK | 1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_MAX_AMSDU_SIZE); 14568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 14668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (mode->vht_capab && ssid->vht) { 14768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt conf->ieee80211ac = 1; 14868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt wpas_conf_ap_vht(wpa_s, conf, mode); 14968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt } 1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 151c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } 152c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt#endif /* CONFIG_IEEE80211N */ 153c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 15534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt if (conf->hw_mode == HOSTAPD_MODE_IEEE80211G && 15634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt (ssid->mode == WPAS_MODE_P2P_GO || 15734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)) { 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Remove 802.11b rates from supported and basic rate sets */ 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *list = os_malloc(4 * sizeof(int)); 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (list) { 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[0] = 60; 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[1] = 120; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[2] = 240; 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[3] = -1; 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->basic_rates = list; 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list = os_malloc(9 * sizeof(int)); 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (list) { 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[0] = 60; 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[1] = 90; 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[2] = 120; 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[3] = 180; 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[4] = 240; 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[5] = 360; 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[6] = 480; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[7] = 540; 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[8] = -1; 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->supported_rates = list; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->isolate = !wpa_s->conf->p2p_intra_bss; 184391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt bss->force_per_enrollee_psk = wpa_s->global->p2p_per_sta_psk; 185cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 186cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt if (ssid->p2p_group) { 187cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt os_memcpy(bss->ip_addr_go, wpa_s->parent->conf->ip_addr_go, 4); 188cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt os_memcpy(bss->ip_addr_mask, wpa_s->parent->conf->ip_addr_mask, 189cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 4); 190cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt os_memcpy(bss->ip_addr_start, 191cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpa_s->parent->conf->ip_addr_start, 4); 192cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt os_memcpy(bss->ip_addr_end, wpa_s->parent->conf->ip_addr_end, 193cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 4); 194cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt } 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->ssid_len == 0) { 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No SSID configured for AP mode"); 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.ssid, ssid->ssid, ssid->ssid_len); 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_len = ssid->ssid_len; 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_set = 1; 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ignore_broadcast_ssid = ssid->ignore_broadcast_ssid; 20604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid->auth_alg) 2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->auth_algs = ssid->auth_alg; 2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa = ssid->proto; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_key_mgmt = ssid->key_mgmt; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_pairwise = ssid->pairwise_cipher; 214d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (ssid->psk_set) { 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ssid.wpa_psk); 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ssid.wpa_psk == NULL) 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN); 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk->group = 1; 221d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } else if (ssid->passphrase) { 222d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase); 2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] || 2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->wep_key_len[2] || ssid->wep_key_len[3]) { 2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct hostapd_wep_keys *wep = &bss->ssid.wep; 2261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int i; 2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < NUM_WEP_KEYS; i++) { 2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid->wep_key_len[i] == 0) 2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt continue; 2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->key[i] = os_malloc(ssid->wep_key_len[i]); 2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wep->key[i] == NULL) 2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(wep->key[i], ssid->wep_key[i], 2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->wep_key_len[i]); 2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->len[i] = ssid->wep_key_len[i]; 2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->idx = ssid->wep_tx_keyidx; 2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->keys_set = 1; 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssid->ap_max_inactivity) 24204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ap_max_inactivity = ssid->ap_max_inactivity; 24304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 24404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssid->dtim_period) 24504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->dtim_period = ssid->dtim_period; 2467a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt else if (wpa_s->conf->dtim_period) 2477a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt bss->dtim_period = wpa_s->conf->dtim_period; 2487a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt 2497a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt if (ssid->beacon_int) 2507a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt conf->beacon_int = ssid->beacon_int; 2517a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt else if (wpa_s->conf->beacon_int) 2527a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt conf->beacon_int = wpa_s->conf->beacon_int; 25304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 254a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if ((bss->wpa & 2) && bss->rsn_pairwise == 0) 255a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->rsn_pairwise = bss->wpa_pairwise; 256a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->wpa_group = wpa_select_ap_group_cipher(bss->wpa, bss->wpa_pairwise, 257a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bss->rsn_pairwise); 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa && bss->ieee802_1x) 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_WPA; 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (bss->wpa) 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_WPA_PSK; 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (bss->ieee802_1x) { 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int cipher = WPA_CIPHER_NONE; 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_IEEE_802_1X; 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wep.default_len = bss->default_wep_key_len; 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->default_wep_key_len) 2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cipher = bss->default_wep_key_len >= 13 ? 2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_CIPHER_WEP104 : WPA_CIPHER_WEP40; 2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_group = cipher; 2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_pairwise = cipher; 2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->rsn_pairwise = cipher; 2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (bss->ssid.wep.keys_set) { 2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int cipher = WPA_CIPHER_WEP40; 2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->ssid.wep.len[0] >= 13) 2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cipher = WPA_CIPHER_WEP104; 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_STATIC_WEP; 2781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_group = cipher; 2791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_pairwise = cipher; 2801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->rsn_pairwise = cipher; 2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else { 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_PLAINTEXT; 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_group = WPA_CIPHER_NONE; 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_pairwise = WPA_CIPHER_NONE; 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->rsn_pairwise = WPA_CIPHER_NONE; 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2888da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt if (bss->wpa_group_rekey < 86400 && (bss->wpa & 2) && 2898da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt (bss->wpa_group == WPA_CIPHER_CCMP || 290fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt bss->wpa_group == WPA_CIPHER_GCMP || 291fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt bss->wpa_group == WPA_CIPHER_CCMP_256 || 292fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt bss->wpa_group == WPA_CIPHER_GCMP_256)) { 2938da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt /* 2948da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Strong ciphers do not need frequent rekeying, so increase 2958da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * the default GTK rekeying period to 24 hours. 2968da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 2978da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt bss->wpa_group_rekey = 86400; 2988da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt } 2998da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 300b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt#ifdef CONFIG_IEEE80211W 301b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt if (ssid->ieee80211w != MGMT_FRAME_PROTECTION_DEFAULT) 302b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt bss->ieee80211w = ssid->ieee80211w; 303b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 304b36ed7cd946148d829f311de8fe53ea3ffaaffe3Dmitry Shmidt 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Enable WPS by default for open and WPA/WPA2-Personal network, but 3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * require user interaction to actually use it. Only the internal 3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Registrar is supported. 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->ssid.security_policy != SECURITY_WPA_PSK && 3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->ssid.security_policy != SECURITY_PLAINTEXT) 3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto no_wps; 3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_WPS2 3151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->ssid.security_policy == SECURITY_WPA_PSK && 316a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt (!(bss->rsn_pairwise & WPA_CIPHER_CCMP) || !(bss->wpa & 2))) 3171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto no_wps; /* WPS2 does not allow WPA/TKIP-only 3181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * configuration */ 3191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_WPS2 */ 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_server = 1; 32104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 32204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!ssid->ignore_broadcast_ssid) 32304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_state = 2; 32404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ap_setup_locked = 2; 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->config_methods) 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->config_methods = os_strdup(wpa_s->conf->config_methods); 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->device_type, wpa_s->conf->device_type, 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPS_DEV_TYPE_LEN); 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->device_name) { 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->device_name = os_strdup(wpa_s->conf->device_name); 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->friendly_name = os_strdup(wpa_s->conf->device_name); 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->manufacturer) 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->manufacturer = os_strdup(wpa_s->conf->manufacturer); 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->model_name) 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_name = os_strdup(wpa_s->conf->model_name); 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->model_number) 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_number = os_strdup(wpa_s->conf->model_number); 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->serial_number) 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->serial_number = os_strdup(wpa_s->conf->serial_number); 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (is_nil_uuid(wpa_s->conf->uuid)) 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->uuid, wpa_s->wps->uuid, WPS_UUID_LEN); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->uuid, wpa_s->conf->uuid, WPS_UUID_LEN); 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->os_version, wpa_s->conf->os_version, 4); 34704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->pbc_in_m1 = wpa_s->conf->pbc_in_m1; 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtno_wps: 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->max_stations && 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->max_stations < wpa_s->conf->max_num_sta) 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_num_sta = wpa_s->max_stations; 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_num_sta = wpa_s->conf->max_num_sta; 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->disassoc_low_ack = wpa_s->conf->disassoc_low_ack; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3590ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (wpa_s->conf->ap_vendor_elements) { 3600ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt bss->vendor_elements = 3610ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt wpabuf_dup(wpa_s->conf->ap_vendor_elements); 3620ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt } 3630ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_public_action_rx(void *ctx, const u8 *buf, size_t len, int freq) 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt; 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t hdr_len; 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt = (const struct ieee80211_mgmt *) buf; 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr_len = (const u8 *) &mgmt->u.action.u.vs_public_action.action - buf; 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hdr_len > len) 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3791846323989242844f0e857458a8939fa5836429cDmitry Shmidt if (mgmt->u.action.category != WLAN_ACTION_PUBLIC) 3801846323989242844f0e857458a8939fa5836429cDmitry Shmidt return; 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid, 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt->u.action.category, 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mgmt->u.action.u.vs_public_action.action, 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len - hdr_len, freq); 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_wps_event_cb(void *ctx, enum wps_event event, 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wps_event_data *data) 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (event == WPS_EV_FAIL) { 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wps_event_fail *fail = &data->fail; 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (wpa_s->parent && wpa_s->parent != wpa_s && 39975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen wpa_s == wpa_s->global->p2p_group_formation) { 40075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /* 40175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen * src/ap/wps_hostapd.c has already sent this on the 40275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen * main interface, so only send on the parent interface 40375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen * here if needed. 40475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen */ 40575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen wpa_msg(wpa_s->parent, MSG_INFO, WPS_EVENT_FAIL 40675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen "msg=%d config_error=%d", 40775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen fail->msg, fail->config_error); 40875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 40975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen wpas_p2p_wps_failed(wpa_s, fail); 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_sta_authorized_cb(void *ctx, const u8 *mac_addr, 4161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int authorized, const u8 *p2p_dev_addr) 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpas_notify_sta_authorized(ctx, mac_addr, authorized, p2p_dev_addr); 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 422391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#ifdef CONFIG_P2P 423391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic void ap_new_psk_cb(void *ctx, const u8 *mac_addr, const u8 *p2p_dev_addr, 424391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt const u8 *psk, size_t psk_len) 425391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{ 426391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 427391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 428391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt if (wpa_s->ap_iface == NULL || wpa_s->current_ssid == NULL) 429391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return; 430391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt wpas_p2p_new_psk_cb(wpa_s, mac_addr, p2p_dev_addr, psk, psk_len); 431391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt} 432391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt#endif /* CONFIG_P2P */ 433391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 434391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ap_vendor_action_rx(void *ctx, const u8 *buf, size_t len, int freq) 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt; 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t hdr_len; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt = (const struct ieee80211_mgmt *) buf; 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr_len = (const u8 *) &mgmt->u.action.u.vs_public_action.action - buf; 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hdr_len > len) 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid, 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt->u.action.category, 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mgmt->u.action.u.vs_public_action.action, 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len - hdr_len, freq); 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int ap_probe_req_rx(void *ctx, const u8 *sa, const u8 *da, 45604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *bssid, const u8 *ie, size_t ie_len, 45704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int ssi_signal) 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len, 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssi_signal); 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_P2P */ 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_wps_reg_success_cb(void *ctx, const u8 *mac_addr, 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *uuid_e) 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_wps_success(wpa_s, mac_addr, 1); 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_ap_configured_cb(void *ctx) 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_state(wpa_s, WPA_COMPLETED); 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_configured_cb) 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_configured_cb(wpa_s->ap_configured_cb_ctx, 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_configured_cb_data); 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s, 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid) 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_associate_params params; 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_iface *hapd_iface; 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_config *conf; 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->ssid == NULL || ssid->ssid_len == 0) { 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No SSID configured for AP mode"); 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Setting up AP (SSID='%s')", 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.ssid = ssid->ssid; 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.ssid_len = ssid->ssid_len; 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ssid->mode) { 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_AP: 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_P2P_GO: 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_P2P_GROUP_FORMATION: 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.mode = IEEE80211_MODE_AP; 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 5183c4793790bf06f1fe08a2ddf604c9caa855151f1Dmitry Shmidt default: 5193c4793790bf06f1fe08a2ddf604c9caa855151f1Dmitry Shmidt return -1; 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 521b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt if (ssid->frequency == 0) 522b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt ssid->frequency = 2462; /* default channel 11 */ 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.freq = ssid->frequency; 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.wpa_proto = ssid->proto; 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->key_mgmt & WPA_KEY_MGMT_PSK) 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt = WPA_KEY_MGMT_PSK; 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt = WPA_KEY_MGMT_NONE; 530fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt params.key_mgmt_suite = wpa_s->key_mgmt; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 532a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(ssid->pairwise_cipher, 533a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 1); 534a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (wpa_s->pairwise_cipher < 0) { 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise " 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "cipher."); 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 539fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt params.pairwise_suite = wpa_s->pairwise_cipher; 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.group_suite = params.pairwise_suite; 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->mode == WPAS_MODE_P2P_GO || 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.p2p = 1; 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->parent->set_ap_uapsd) 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.uapsd = wpa_s->parent->ap_uapsd; 550ec58b164a608cbc1d99e71bb3d86ef4b263377dcDmitry Shmidt else if (params.p2p && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_UAPSD)) 551ec58b164a608cbc1d99e71bb3d86ef4b263377dcDmitry Shmidt params.uapsd = 1; /* mandatory for P2P GO */ 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.uapsd = -1; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_drv_associate(wpa_s, ¶ms) < 0) { 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg(wpa_s, MSG_INFO, "Failed to start AP functionality"); 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface = hapd_iface = os_zalloc(sizeof(*wpa_s->ap_iface)); 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd_iface == NULL) 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->owner = wpa_s; 5641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd_iface->drv_flags = wpa_s->drv_flags; 5651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd_iface->probe_resp_offloads = wpa_s->probe_resp_offloads; 566444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt hapd_iface->extended_capa = wpa_s->extended_capa; 567444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt hapd_iface->extended_capa_mask = wpa_s->extended_capa_mask; 568444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt hapd_iface->extended_capa_len = wpa_s->extended_capa_len; 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface->conf = conf = hostapd_config_defaults(); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf == NULL) { 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 57661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(wpa_s->ap_iface->conf->wmm_ac_params, 57761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_s->conf->wmm_ac_params, 57861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(wpa_s->conf->wmm_ac_params)); 57961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 5801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (params.uapsd > 0) { 581cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss[0]->wmm_enabled = 1; 582cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss[0]->wmm_uapsd = 1; 5831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 5841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_conf_ap(wpa_s, ssid, conf)) { 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to create AP configuration"); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->mode == WPAS_MODE_P2P_GO) 593cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER; 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 595cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER | 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_GROUP_FORMATION; 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->num_bss = conf->num_bss; 60061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt hapd_iface->bss = os_calloc(conf->num_bss, 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(struct hostapd_data *)); 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd_iface->bss == NULL) { 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < conf->num_bss; i++) { 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i] = 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_alloc_bss_data(hapd_iface, conf, 610cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt conf->bss[i]); 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd_iface->bss[i] == NULL) { 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->msg_ctx = wpa_s; 617497c1d5e50162d6b3c1cce5dbd9c5fd9da69aaefDmitry Shmidt hapd_iface->bss[i]->msg_ctx_parent = wpa_s->parent; 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->public_action_cb = ap_public_action_rx; 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->public_action_cb_ctx = wpa_s; 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->vendor_action_cb = ap_vendor_action_rx; 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->vendor_action_cb_ctx = wpa_s; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_register_probereq_cb(hapd_iface->bss[i], 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ap_probe_req_rx, wpa_s); 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_reg_success_cb = ap_wps_reg_success_cb; 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_reg_success_cb_ctx = wpa_s; 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_event_cb = ap_wps_event_cb; 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_event_cb_ctx = wpa_s; 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->sta_authorized_cb = ap_sta_authorized_cb; 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->sta_authorized_cb_ctx = wpa_s; 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 631391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt hapd_iface->bss[i]->new_psk_cb = ap_new_psk_cb; 632391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt hapd_iface->bss[i]->new_psk_cb_ctx = wpa_s; 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->p2p = wpa_s->global->p2p; 63404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hapd_iface->bss[i]->p2p_group = wpas_p2p_group_init(wpa_s, 63504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssid); 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->setup_complete_cb = wpas_ap_configured_cb; 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->setup_complete_cb_ctx = wpa_s; 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN); 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[0]->driver = wpa_s->driver; 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[0]->drv_priv = wpa_s->drv_priv; 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid = ssid; 646b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wpa_s->bssid, wpa_s->own_addr, ETH_ALEN); 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->assoc_freq = ssid->frequency; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_setup_interface(wpa_s->ap_iface)) { 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to initialize AP interface"); 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_supplicant_ap_deinit(struct wpa_supplicant *wpa_s) 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL); 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid = NULL; 670b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->assoc_freq = 0; 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface->bss) 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface->bss[0]->p2p_group = NULL; 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_group_deinit(wpa_s); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 677a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt wpa_s->ap_iface->driver_ap_teardown = 678a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt !!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT); 679a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_interface_deinit(wpa_s->ap_iface); 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_interface_free(wpa_s->ap_iface); 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface = NULL; 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_drv_deinit_ap(wpa_s); 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ap_tx_status(void *ctx, const u8 *addr, 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *buf, size_t len, int ack) 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef NEED_AP_MLME 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_tx_status(wpa_s->ap_iface->bss[0], addr, buf, len, ack); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ap_eapol_tx_status(void *ctx, const u8 *dst, 6981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const u8 *data, size_t len, int ack) 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef NEED_AP_MLME 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 702fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (!wpa_s->ap_iface) 703fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return; 7041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_tx_status(wpa_s->ap_iface->bss[0], dst, data, len, ack); 7051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ap_client_poll_ok(void *ctx, const u8 *addr) 7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 7111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 7121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 7131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_s->ap_iface) 7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_client_poll_ok(wpa_s->ap_iface->bss[0], addr); 7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 7171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ap_rx_from_unknown_sta(void *ctx, const u8 *addr, int wds) 7201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 7211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 7221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 7231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ieee802_11_rx_from_unknown(wpa_s->ap_iface->bss[0], addr, wds); 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ap_mgmt_rx(void *ctx, struct rx_mgmt *rx_mgmt) 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_frame_info fi; 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&fi, 0, sizeof(fi)); 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fi.datarate = rx_mgmt->datarate; 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fi.ssi_signal = rx_mgmt->ssi_signal; 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_11_mgmt(wpa_s->ap_iface->bss[0], rx_mgmt->frame, 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rx_mgmt->frame_len, &fi); 7381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ap_mgmt_tx_cb(void *ctx, const u8 *buf, size_t len, u16 stype, int ok) 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef NEED_AP_MLME 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_11_mgmt_cb(wpa_s->ap_iface->bss[0], buf, len, stype, ok); 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_supplicant_ap_rx_eapol(struct wpa_supplicant *wpa_s, 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *src_addr, const u8 *buf, size_t len) 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_1x_receive(wpa_s->ap_iface->bss[0], src_addr, buf, len); 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_wps_pbc(struct wpa_supplicant *wpa_s, const u8 *bssid, 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *p2p_dev_addr) 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface) 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_wps_button_pushed(wpa_s->ap_iface->bss[0], 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_dev_addr); 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_wps_cancel(struct wpa_supplicant *wpa_s) 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wps_registrar *reg; 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int reg_sel = 0, wps_sta = 0; 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]->wps) 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reg = wpa_s->ap_iface->bss[0]->wps->registrar; 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reg_sel = wps_registrar_wps_cancel(reg); 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps_sta = ap_for_each_sta(wpa_s->ap_iface->bss[0], 78104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ap_sta_wps_cancel, NULL); 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reg_sel && !wps_sta) { 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "No WPS operation in progress at this " 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "time"); 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * There are 2 cases to return wps cancel as success: 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1. When wps cancel was initiated but no connection has been 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * established with client yet. 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2. Client is in the middle of exchanging WPS messages. 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_wps_pin(struct wpa_supplicant *wpa_s, const u8 *bssid, 801d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *pin, char *buf, size_t buflen, 802d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt int timeout) 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret, ret_len = 0; 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface) 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pin == NULL) { 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int rpin = wps_generate_pin(); 8111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ret_len = os_snprintf(buf, buflen, "%08d", rpin); 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pin = buf; 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret_len = os_snprintf(buf, buflen, "%s", pin); 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = hostapd_wps_add_pin(wpa_s->ap_iface->bss[0], bssid, "any", pin, 817d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt timeout); 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret) 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret_len; 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx) 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = eloop_data; 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: AP PIN timed out"); 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_disable(wpa_s); 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_wps_ap_pin_enable(struct wpa_supplicant *wpa_s, int timeout) 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: Enabling AP PIN (timeout=%d)", timeout); 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures = 0; 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL); 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (timeout > 0) 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(timeout, 0, 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_timeout, wpa_s, NULL); 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpas_wps_ap_pin_disable(struct wpa_supplicant *wpa_s) 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: Disabling AP PIN"); 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = NULL; 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL); 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst char * wpas_wps_ap_pin_random(struct wpa_supplicant *wpa_s, int timeout) 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int pin; 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char pin_txt[9]; 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pin = wps_generate_pin(); 8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_snprintf(pin_txt, sizeof(pin_txt), "%08u", pin); 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = os_strdup(pin_txt); 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ap_pin == NULL) 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_enable(wpa_s, timeout); 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hapd->conf->ap_pin; 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst char * wpas_wps_ap_pin_get(struct wpa_supplicant *wpa_s) 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hapd->conf->ap_pin; 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpas_wps_ap_pin_set(struct wpa_supplicant *wpa_s, const char *pin, 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int timeout) 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char pin_txt[9]; 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pin_txt, sizeof(pin_txt), "%s", pin); 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= (int) sizeof(pin_txt)) 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = os_strdup(pin_txt); 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ap_pin == NULL) 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_enable(wpa_s, timeout); 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_supplicant_ap_pwd_auth_fail(struct wpa_supplicant *wpa_s) 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Registrar failed to prove its knowledge of the AP PIN. Disable AP 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PIN if this happens multiple times to slow down brute force attacks. 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures++; 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: AP PIN authentication failure number %u", 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures); 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->ap_pin_failures < 3) 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: Disable AP PIN"); 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures = 0; 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = NULL; 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 940f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 941f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt#ifdef CONFIG_WPS_NFC 942f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 943f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstruct wpabuf * wpas_ap_wps_nfc_config_token(struct wpa_supplicant *wpa_s, 944f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt int ndef) 945f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{ 946f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt struct hostapd_data *hapd; 947f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 948f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt if (wpa_s->ap_iface == NULL) 949f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return NULL; 950f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 951f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return hostapd_wps_nfc_config_token(hapd, ndef); 952f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt} 953f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 954f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 955f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstruct wpabuf * wpas_ap_wps_nfc_handover_sel(struct wpa_supplicant *wpa_s, 956f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt int ndef) 957f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{ 958f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt struct hostapd_data *hapd; 959f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 960f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt if (wpa_s->ap_iface == NULL) 961f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return NULL; 962f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 963f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return hostapd_wps_nfc_hs_cr(hapd, ndef); 964f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt} 965f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 966cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 967cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidtint wpas_ap_wps_nfc_report_handover(struct wpa_supplicant *wpa_s, 968cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt const struct wpabuf *req, 969cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt const struct wpabuf *sel) 970cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt{ 971cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt struct hostapd_data *hapd; 972cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 973cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt if (wpa_s->ap_iface == NULL) 974cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return -1; 975cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 976cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return hostapd_wps_nfc_report_handover(hapd, req, sel); 977cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt} 978cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 979f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt#endif /* CONFIG_WPS_NFC */ 980f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_sta_first(struct wpa_supplicant *wpa_s, 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_ctrl_iface_sta_first(wpa_s->ap_iface->bss[0], 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf, buflen); 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_sta(struct wpa_supplicant *wpa_s, const char *txtaddr, 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_ctrl_iface_sta(wpa_s->ap_iface->bss[0], txtaddr, 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf, buflen); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_sta_next(struct wpa_supplicant *wpa_s, const char *txtaddr, 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_ctrl_iface_sta_next(wpa_s->ap_iface->bss[0], txtaddr, 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf, buflen); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 101604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint ap_ctrl_iface_sta_disassociate(struct wpa_supplicant *wpa_s, 101704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *txtaddr) 101804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 101904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->ap_iface == NULL) 102004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 102104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return hostapd_ctrl_iface_disassociate(wpa_s->ap_iface->bss[0], 102204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt txtaddr); 102304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 102404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 102504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 102604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint ap_ctrl_iface_sta_deauthenticate(struct wpa_supplicant *wpa_s, 102704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *txtaddr) 102804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 102904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->ap_iface == NULL) 103004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 103104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return hostapd_ctrl_iface_deauthenticate(wpa_s->ap_iface->bss[0], 103204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt txtaddr); 103304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 103404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 103504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_wpa_get_status(struct wpa_supplicant *wpa_s, char *buf, 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t buflen, int verbose) 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos = buf, *end = buf + buflen; 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *conf; 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf = wpa_s->ap_iface->bss[0]->conf; 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->wpa == 0) 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "pairwise_cipher=%s\n" 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "group_cipher=%s\n" 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt=%s\n", 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cipher_txt(conf->rsn_pairwise), 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cipher_txt(conf->wpa_group), 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_key_mgmt_txt(conf->wpa_key_mgmt, 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->wpa)); 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos - buf; 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos - buf; 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_update_beacon(struct wpa_supplicant *wpa_s) 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_iface *iface = wpa_s->ap_iface; 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = wpa_s->current_ssid; 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL || wpa_s->ap_iface == NULL || 10741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->mode == WPAS_MODE_INFRA || 10751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->mode == WPAS_MODE_IBSS) 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->mode == WPAS_MODE_P2P_GO) 1080cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt iface->conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER; 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 1082cce06667447b5aec83452adb0c15100ada531095Dmitry Shmidt iface->conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER | 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_GROUP_FORMATION; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = iface->bss[0]; 10871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->drv_priv == NULL) 10881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 10891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ieee802_11_set_beacons(iface); 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_set_ap_wps_ie(hapd); 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1096e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtint ap_switch_channel(struct wpa_supplicant *wpa_s, 1097e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct csa_settings *settings) 1098e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 1099e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef NEED_AP_MLME 1100e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]) 1101e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return -1; 1102e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1103e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return hostapd_switch_channel(wpa_s->ap_iface->bss[0], settings); 1104e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#else /* NEED_AP_MLME */ 1105e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return -1; 1106e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* NEED_AP_MLME */ 1107e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 1108e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1109e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1110e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtint ap_ctrl_iface_chanswitch(struct wpa_supplicant *wpa_s, const char *pos) 1111e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 1112e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct csa_settings settings; 1113e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret = hostapd_parse_csa_settings(pos, &settings); 1114e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1115e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) 1116e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return ret; 1117e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return ap_switch_channel(wpa_s, &settings); 1119e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 1120e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1121e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 112204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_ap_ch_switch(struct wpa_supplicant *wpa_s, int freq, int ht, 112304f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt int offset, int width, int cf1, int cf2) 112404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 112504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->ap_iface) 112604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 112704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 112804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->assoc_freq = freq; 112904f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt hostapd_event_ch_switch(wpa_s->ap_iface->bss[0], freq, ht, offset, width, cf1, cf1); 113004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 113104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 113204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_mac_addr_filter(struct wpa_supplicant *wpa_s, 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *addr) 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *conf; 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface) 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr) 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "AP: Set MAC address filter: " MACSTR, 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(addr)); 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "AP: Clear MAC address filter"); 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf = hapd->conf; 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(conf->accept_mac); 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->accept_mac = NULL; 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_accept_mac = 0; 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(conf->deny_mac); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->deny_mac = NULL; 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_deny_mac = 0; 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr == NULL) { 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->macaddr_acl = ACCEPT_UNLESS_DENIED; 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->macaddr_acl = DENY_UNLESS_ACCEPTED; 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->accept_mac = os_zalloc(sizeof(struct mac_acl_entry)); 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->accept_mac == NULL) 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(conf->accept_mac[0].addr, addr, ETH_ALEN); 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_accept_mac = 1; 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1172cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 1173cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 1174cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt#ifdef CONFIG_WPS_NFC 1175cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidtint wpas_ap_wps_add_nfc_pw(struct wpa_supplicant *wpa_s, u16 pw_id, 1176cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt const struct wpabuf *pw, const u8 *pubkey_hash) 1177cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt{ 1178cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt struct hostapd_data *hapd; 1179cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt struct wps_context *wps; 1180cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 1181cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt if (!wpa_s->ap_iface) 1182cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return -1; 1183cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 1184cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps = hapd->wps; 1185cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 1186cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt if (wpa_s->parent->conf->wps_nfc_dh_pubkey == NULL || 1187cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpa_s->parent->conf->wps_nfc_dh_privkey == NULL) { 1188cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: No NFC DH key known"); 1189cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return -1; 1190cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt } 1191cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 1192cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt dh5_free(wps->dh_ctx); 1193cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpabuf_free(wps->dh_pubkey); 1194cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpabuf_free(wps->dh_privkey); 1195cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps->dh_privkey = wpabuf_dup( 1196cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpa_s->parent->conf->wps_nfc_dh_privkey); 1197cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps->dh_pubkey = wpabuf_dup( 1198cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpa_s->parent->conf->wps_nfc_dh_pubkey); 1199cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt if (wps->dh_privkey == NULL || wps->dh_pubkey == NULL) { 1200cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps->dh_ctx = NULL; 1201cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpabuf_free(wps->dh_pubkey); 1202cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps->dh_pubkey = NULL; 1203cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wpabuf_free(wps->dh_privkey); 1204cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps->dh_privkey = NULL; 1205cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return -1; 1206cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt } 1207cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt wps->dh_ctx = dh5_init_fixed(wps->dh_privkey, wps->dh_pubkey); 1208cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt if (wps->dh_ctx == NULL) 1209cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return -1; 1210cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt 1211cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt return wps_registrar_add_nfc_pw_token(hapd->wps->registrar, pubkey_hash, 1212cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt pw_id, 1213cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt pw ? wpabuf_head(pw) : NULL, 1214cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt pw ? wpabuf_len(pw) : 0, 1); 1215cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt} 1216cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50eDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 1217