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" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/hostapd.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ap_config.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ap_drv_ops.h" 201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ieee802_11.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/beacon.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ieee802_1x.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/wps_hostapd.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/ctrl_iface_ap.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps/wps.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config_ssid.h" 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_supplicant_i.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "driver_i.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p_supplicant.h" 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap/sta_info.h" 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "notify.h" 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx); 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s, 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid, 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_config *conf) 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *bss = &conf->bss[0]; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int pairwise; 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->driver = wpa_s->driver; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->iface, wpa_s->ifname, sizeof(bss->iface)); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->frequency == 0) { 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* default channel 11 */ 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211G; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->channel = 11; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ssid->frequency >= 2412 && ssid->frequency <= 2472) { 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211G; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->channel = (ssid->frequency - 2407) / 5; 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if ((ssid->frequency >= 5180 && ssid->frequency <= 5240) || 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (ssid->frequency >= 5745 && ssid->frequency <= 5825)) { 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->hw_mode = HOSTAPD_MODE_IEEE80211A; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->channel = (ssid->frequency - 5000) / 5; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz", 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->frequency); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 72c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt /* TODO: enable HT40 if driver supports it; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * drop to 11b if driver does not support 11g */ 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 75c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt#ifdef CONFIG_IEEE80211N 76c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt /* 771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Enable HT20 if the driver supports it, by setting conf->ieee80211n 781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * and a mask of allowed capabilities within conf->ht_capab. 79c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt * Using default config settings for: conf->ht_op_mode_fixed, 801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * conf->secondary_channel, conf->require_ht 81c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt */ 821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_s->hw.modes) { 83c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt struct hostapd_hw_modes *mode = NULL; 8404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int i, no_ht = 0; 851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < wpa_s->hw.num_modes; i++) { 861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_s->hw.modes[i].mode == conf->hw_mode) { 871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt mode = &wpa_s->hw.modes[i]; 88c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt break; 89c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } 90c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } 9104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 9204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HT_OVERRIDES 9304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssid->disable_ht) { 9404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->ieee80211n = 0; 9504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt conf->ht_capab = 0; 9604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt no_ht = 1; 9704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 9804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HT_OVERRIDES */ 9904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 10004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!no_ht && mode && mode->ht_capab) { 101c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt conf->ieee80211n = 1; 10261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_P2P 10361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A && 10461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt (mode->ht_capab & 10561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) && 10661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ssid->ht40) 10761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->secondary_channel = 10861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpas_p2p_get_ht40_mode(wpa_s, mode, 10961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->channel); 11061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (conf->secondary_channel) 11161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt conf->ht_capab |= 11261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; 11361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_P2P */ 1141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* 1161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * white-list capabilities that won't cause issues 1171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * to connecting stations, while leaving the current 1181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * capabilities intact (currently disabled SMPS). 1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt conf->ht_capab |= mode->ht_capab & 1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (HT_CAP_INFO_GREEN_FIELD | 1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_SHORT_GI20MHZ | 1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_SHORT_GI40MHZ | 1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_RX_STBC_MASK | 1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt HT_CAP_INFO_MAX_AMSDU_SIZE); 1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 127c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt } 128c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt#endif /* CONFIG_IEEE80211N */ 129c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->hw_mode == HOSTAPD_MODE_IEEE80211G) { 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Remove 802.11b rates from supported and basic rate sets */ 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *list = os_malloc(4 * sizeof(int)); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (list) { 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[0] = 60; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[1] = 120; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[2] = 240; 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[3] = -1; 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->basic_rates = list; 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list = os_malloc(9 * sizeof(int)); 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (list) { 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[0] = 60; 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[1] = 90; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[2] = 120; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[3] = 180; 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[4] = 240; 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[5] = 360; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[6] = 480; 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[7] = 540; 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list[8] = -1; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->supported_rates = list; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->isolate = !wpa_s->conf->p2p_intra_bss; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->ssid_len == 0) { 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No SSID configured for AP mode"); 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.ssid, ssid->ssid, ssid->ssid_len); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_len = ssid->ssid_len; 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.ssid_set = 1; 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ignore_broadcast_ssid = ssid->ignore_broadcast_ssid; 16904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid->auth_alg) 1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->auth_algs = ssid->auth_alg; 1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa = ssid->proto; 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_key_mgmt = ssid->key_mgmt; 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_pairwise = ssid->pairwise_cipher; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->passphrase) { 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase); 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ssid->psk_set) { 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ssid.wpa_psk); 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ssid.wpa_psk == NULL) 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wpa_psk->group = 1; 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] || 1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->wep_key_len[2] || ssid->wep_key_len[3]) { 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct hostapd_wep_keys *wep = &bss->ssid.wep; 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int i; 1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < NUM_WEP_KEYS; i++) { 1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid->wep_key_len[i] == 0) 1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt continue; 1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->key[i] = os_malloc(ssid->wep_key_len[i]); 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wep->key[i] == NULL) 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(wep->key[i], ssid->wep_key[i], 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->wep_key_len[i]); 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->len[i] = ssid->wep_key_len[i]; 1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->idx = ssid->wep_tx_keyidx; 2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wep->keys_set = 1; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssid->ap_max_inactivity) 20504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->ap_max_inactivity = ssid->ap_max_inactivity; 20604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 20704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (ssid->dtim_period) 20804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->dtim_period = ssid->dtim_period; 20904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Select group cipher based on the enabled pairwise cipher suites */ 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise = 0; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa & 1) 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise |= bss->wpa_pairwise; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa & 2) { 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->rsn_pairwise == 0) 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->rsn_pairwise = bss->wpa_pairwise; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise |= bss->rsn_pairwise; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pairwise & WPA_CIPHER_TKIP) 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_group = WPA_CIPHER_TKIP; 22161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else if ((pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)) == 22261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt WPA_CIPHER_GCMP) 22361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bss->wpa_group = WPA_CIPHER_GCMP; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wpa_group = WPA_CIPHER_CCMP; 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wpa && bss->ieee802_1x) 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_WPA; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (bss->wpa) 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_WPA_PSK; 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (bss->ieee802_1x) { 2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int cipher = WPA_CIPHER_NONE; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_IEEE_802_1X; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.wep.default_len = bss->default_wep_key_len; 2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->default_wep_key_len) 2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cipher = bss->default_wep_key_len >= 13 ? 2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt WPA_CIPHER_WEP104 : WPA_CIPHER_WEP40; 2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_group = cipher; 2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_pairwise = cipher; 2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->rsn_pairwise = cipher; 2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (bss->ssid.wep.keys_set) { 2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int cipher = WPA_CIPHER_WEP40; 2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->ssid.wep.len[0] >= 13) 2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cipher = WPA_CIPHER_WEP104; 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_STATIC_WEP; 2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_group = cipher; 2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_pairwise = cipher; 2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->rsn_pairwise = cipher; 2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else { 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid.security_policy = SECURITY_PLAINTEXT; 2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_group = WPA_CIPHER_NONE; 2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->wpa_pairwise = WPA_CIPHER_NONE; 2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->rsn_pairwise = WPA_CIPHER_NONE; 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Enable WPS by default for open and WPA/WPA2-Personal network, but 2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * require user interaction to actually use it. Only the internal 2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Registrar is supported. 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->ssid.security_policy != SECURITY_WPA_PSK && 2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bss->ssid.security_policy != SECURITY_PLAINTEXT) 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto no_wps; 2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_WPS2 2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (bss->ssid.security_policy == SECURITY_WPA_PSK && 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt (!(pairwise & WPA_CIPHER_CCMP) || !(bss->wpa & 2))) 2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto no_wps; /* WPS2 does not allow WPA/TKIP-only 2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * configuration */ 2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_WPS2 */ 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->eap_server = 1; 27204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!ssid->ignore_broadcast_ssid) 27404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->wps_state = 2; 27504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ap_setup_locked = 2; 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->config_methods) 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->config_methods = os_strdup(wpa_s->conf->config_methods); 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->device_type, wpa_s->conf->device_type, 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPS_DEV_TYPE_LEN); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->device_name) { 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->device_name = os_strdup(wpa_s->conf->device_name); 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->friendly_name = os_strdup(wpa_s->conf->device_name); 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->manufacturer) 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->manufacturer = os_strdup(wpa_s->conf->manufacturer); 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->model_name) 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_name = os_strdup(wpa_s->conf->model_name); 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->model_number) 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->model_number = os_strdup(wpa_s->conf->model_number); 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->conf->serial_number) 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->serial_number = os_strdup(wpa_s->conf->serial_number); 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (is_nil_uuid(wpa_s->conf->uuid)) 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->uuid, wpa_s->wps->uuid, WPS_UUID_LEN); 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->uuid, wpa_s->conf->uuid, WPS_UUID_LEN); 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->os_version, wpa_s->conf->os_version, 4); 29804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bss->pbc_in_m1 = wpa_s->conf->pbc_in_m1; 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtno_wps: 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->max_stations && 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->max_stations < wpa_s->conf->max_num_sta) 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_num_sta = wpa_s->max_stations; 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->max_num_sta = wpa_s->conf->max_num_sta; 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->disassoc_low_ack = wpa_s->conf->disassoc_low_ack; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_public_action_rx(void *ctx, const u8 *buf, size_t len, int freq) 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt; 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t hdr_len; 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt = (const struct ieee80211_mgmt *) buf; 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr_len = (const u8 *) &mgmt->u.action.u.vs_public_action.action - buf; 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hdr_len > len) 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid, 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt->u.action.category, 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mgmt->u.action.u.vs_public_action.action, 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len - hdr_len, freq); 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_wps_event_cb(void *ctx, enum wps_event event, 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wps_event_data *data) 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (event == WPS_EV_FAIL) { 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wps_event_fail *fail = &data->fail; 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (wpa_s->parent && wpa_s->parent != wpa_s && 34375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen wpa_s == wpa_s->global->p2p_group_formation) { 34475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /* 34575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen * src/ap/wps_hostapd.c has already sent this on the 34675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen * main interface, so only send on the parent interface 34775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen * here if needed. 34875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen */ 34975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen wpa_msg(wpa_s->parent, MSG_INFO, WPS_EVENT_FAIL 35075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen "msg=%d config_error=%d", 35175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen fail->msg, fail->config_error); 35275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen } 35375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen wpas_p2p_wps_failed(wpa_s, fail); 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_sta_authorized_cb(void *ctx, const u8 *mac_addr, 3601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int authorized, const u8 *p2p_dev_addr) 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpas_notify_sta_authorized(ctx, mac_addr, authorized, p2p_dev_addr); 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ap_vendor_action_rx(void *ctx, const u8 *buf, size_t len, int freq) 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt; 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t hdr_len; 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt = (const struct ieee80211_mgmt *) buf; 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr_len = (const u8 *) &mgmt->u.action.u.vs_public_action.action - buf; 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hdr_len > len) 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid, 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt->u.action.category, 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mgmt->u.action.u.vs_public_action.action, 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len - hdr_len, freq); 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int ap_probe_req_rx(void *ctx, const u8 *sa, const u8 *da, 38704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *bssid, const u8 *ie, size_t ie_len, 38804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int ssi_signal) 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 39204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len, 39304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssi_signal); 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_P2P */ 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void ap_wps_reg_success_cb(void *ctx, const u8 *mac_addr, 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *uuid_e) 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_wps_success(wpa_s, mac_addr, 1); 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_ap_configured_cb(void *ctx) 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_state(wpa_s, WPA_COMPLETED); 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_configured_cb) 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_configured_cb(wpa_s->ap_configured_cb_ctx, 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_configured_cb_data); 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s, 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid) 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_associate_params params; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_iface *hapd_iface; 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_config *conf; 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->ssid == NULL || ssid->ssid_len == 0) { 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "No SSID configured for AP mode"); 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Setting up AP (SSID='%s')", 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.ssid = ssid->ssid; 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.ssid_len = ssid->ssid_len; 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ssid->mode) { 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_INFRA: 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.mode = IEEE80211_MODE_INFRA; 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_IBSS: 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.mode = IEEE80211_MODE_IBSS; 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_AP: 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_P2P_GO: 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPAS_MODE_P2P_GROUP_FORMATION: 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.mode = IEEE80211_MODE_AP; 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.freq = ssid->frequency; 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt params.wpa_proto = ssid->proto; 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->key_mgmt & WPA_KEY_MGMT_PSK) 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt = WPA_KEY_MGMT_PSK; 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt = WPA_KEY_MGMT_NONE; 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt); 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->pairwise_cipher & WPA_CIPHER_CCMP) 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->pairwise_cipher = WPA_CIPHER_CCMP; 46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else if (ssid->pairwise_cipher & WPA_CIPHER_GCMP) 46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_s->pairwise_cipher = WPA_CIPHER_GCMP; 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ssid->pairwise_cipher & WPA_CIPHER_TKIP) 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->pairwise_cipher = WPA_CIPHER_TKIP; 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ssid->pairwise_cipher & WPA_CIPHER_NONE) 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->pairwise_cipher = WPA_CIPHER_NONE; 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise " 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "cipher."); 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.pairwise_suite = cipher_suite2driver(wpa_s->pairwise_cipher); 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.group_suite = params.pairwise_suite; 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->mode == WPAS_MODE_P2P_GO || 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.p2p = 1; 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->parent->set_ap_uapsd) 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.uapsd = wpa_s->parent->ap_uapsd; 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.uapsd = -1; 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_drv_associate(wpa_s, ¶ms) < 0) { 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg(wpa_s, MSG_INFO, "Failed to start AP functionality"); 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface = hapd_iface = os_zalloc(sizeof(*wpa_s->ap_iface)); 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd_iface == NULL) 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->owner = wpa_s; 5011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd_iface->drv_flags = wpa_s->drv_flags; 5021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hapd_iface->probe_resp_offloads = wpa_s->probe_resp_offloads; 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface->conf = conf = hostapd_config_defaults(); 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf == NULL) { 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 51061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_memcpy(wpa_s->ap_iface->conf->wmm_ac_params, 51161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_s->conf->wmm_ac_params, 51261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(wpa_s->conf->wmm_ac_params)); 51361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 5141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (params.uapsd > 0) { 5151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt conf->bss->wmm_enabled = 1; 5161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt conf->bss->wmm_uapsd = 1; 5171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 5181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_conf_ap(wpa_s, ssid, conf)) { 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to create AP configuration"); 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->mode == WPAS_MODE_P2P_GO) 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER; 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER | 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_GROUP_FORMATION; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->num_bss = conf->num_bss; 53461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt hapd_iface->bss = os_calloc(conf->num_bss, 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(struct hostapd_data *)); 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd_iface->bss == NULL) { 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < conf->num_bss; i++) { 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i] = 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_alloc_bss_data(hapd_iface, conf, 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &conf->bss[i]); 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd_iface->bss[i] == NULL) { 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->msg_ctx = wpa_s; 551497c1d5e50162d6b3c1cce5dbd9c5fd9da69aaefDmitry Shmidt hapd_iface->bss[i]->msg_ctx_parent = wpa_s->parent; 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->public_action_cb = ap_public_action_rx; 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->public_action_cb_ctx = wpa_s; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->vendor_action_cb = ap_vendor_action_rx; 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->vendor_action_cb_ctx = wpa_s; 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_register_probereq_cb(hapd_iface->bss[i], 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ap_probe_req_rx, wpa_s); 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_reg_success_cb = ap_wps_reg_success_cb; 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_reg_success_cb_ctx = wpa_s; 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_event_cb = ap_wps_event_cb; 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->wps_event_cb_ctx = wpa_s; 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->sta_authorized_cb = ap_sta_authorized_cb; 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->sta_authorized_cb_ctx = wpa_s; 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->p2p = wpa_s->global->p2p; 56604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hapd_iface->bss[i]->p2p_group = wpas_p2p_group_init(wpa_s, 56704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssid); 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->setup_complete_cb = wpas_ap_configured_cb; 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[i]->setup_complete_cb_ctx = wpa_s; 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[0]->driver = wpa_s->driver; 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd_iface->bss[0]->drv_priv = wpa_s->drv_priv; 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid = ssid; 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(wpa_s->bssid, wpa_s->own_addr, ETH_ALEN); 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->assoc_freq = ssid->frequency; 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_setup_interface(wpa_s->ap_iface)) { 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to initialize AP interface"); 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ap_deinit(wpa_s); 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_supplicant_ap_deinit(struct wpa_supplicant *wpa_s) 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL); 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid = NULL; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->assoc_freq = 0; 602c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt wpa_s->reassociated_connection = 0; 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface->bss) 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface->bss[0]->p2p_group = NULL; 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_p2p_group_deinit(wpa_s); 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_interface_deinit(wpa_s->ap_iface); 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_interface_free(wpa_s->ap_iface); 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ap_iface = NULL; 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_drv_deinit_ap(wpa_s); 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ap_tx_status(void *ctx, const u8 *addr, 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *buf, size_t len, int ack) 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef NEED_AP_MLME 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_tx_status(wpa_s->ap_iface->bss[0], addr, buf, len, ack); 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ap_eapol_tx_status(void *ctx, const u8 *dst, 6261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const u8 *data, size_t len, int ack) 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef NEED_AP_MLME 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_tx_status(wpa_s->ap_iface->bss[0], dst, data, len, ack); 6311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 6321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 6331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ap_client_poll_ok(void *ctx, const u8 *addr) 6361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 6371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 6381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_s->ap_iface) 6401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt hostapd_client_poll_ok(wpa_s->ap_iface->bss[0], addr); 6411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 6421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 6431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid ap_rx_from_unknown_sta(void *ctx, const u8 *addr, int wds) 6461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 6471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 6481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ieee802_11_rx_from_unknown(wpa_s->ap_iface->bss[0], addr, wds); 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ap_mgmt_rx(void *ctx, struct rx_mgmt *rx_mgmt) 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef NEED_AP_MLME 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_frame_info fi; 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&fi, 0, sizeof(fi)); 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fi.datarate = rx_mgmt->datarate; 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fi.ssi_signal = rx_mgmt->ssi_signal; 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_11_mgmt(wpa_s->ap_iface->bss[0], rx_mgmt->frame, 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rx_mgmt->frame_len, &fi); 6641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* NEED_AP_MLME */ 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ap_mgmt_tx_cb(void *ctx, const u8 *buf, size_t len, u16 stype, int ok) 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef NEED_AP_MLME 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_11_mgmt_cb(wpa_s->ap_iface->bss[0], buf, len, stype, ok); 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* NEED_AP_MLME */ 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_supplicant_ap_rx_eapol(struct wpa_supplicant *wpa_s, 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *src_addr, const u8 *buf, size_t len) 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ieee802_1x_receive(wpa_s->ap_iface->bss[0], src_addr, buf, len); 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_wps_pbc(struct wpa_supplicant *wpa_s, const u8 *bssid, 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *p2p_dev_addr) 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface) 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_wps_button_pushed(wpa_s->ap_iface->bss[0], 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_dev_addr); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_wps_cancel(struct wpa_supplicant *wpa_s) 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wps_registrar *reg; 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int reg_sel = 0, wps_sta = 0; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]->wps) 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reg = wpa_s->ap_iface->bss[0]->wps->registrar; 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reg_sel = wps_registrar_wps_cancel(reg); 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps_sta = ap_for_each_sta(wpa_s->ap_iface->bss[0], 70704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ap_sta_wps_cancel, NULL); 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!reg_sel && !wps_sta) { 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "No WPS operation in progress at this " 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "time"); 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * There are 2 cases to return wps cancel as success: 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1. When wps cancel was initiated but no connection has been 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * established with client yet. 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2. Client is in the middle of exchanging WPS messages. 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_wps_pin(struct wpa_supplicant *wpa_s, const u8 *bssid, 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pin, char *buf, size_t buflen) 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret, ret_len = 0; 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface) 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pin == NULL) { 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int rpin = wps_generate_pin(); 7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ret_len = os_snprintf(buf, buflen, "%08d", rpin); 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pin = buf; 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret_len = os_snprintf(buf, buflen, "%s", pin); 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = hostapd_wps_add_pin(wpa_s->ap_iface->bss[0], bssid, "any", pin, 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0); 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret) 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret_len; 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx) 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = eloop_data; 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: AP PIN timed out"); 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_disable(wpa_s); 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpas_wps_ap_pin_enable(struct wpa_supplicant *wpa_s, int timeout) 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: Enabling AP PIN (timeout=%d)", timeout); 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures = 0; 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL); 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (timeout > 0) 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(timeout, 0, 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_timeout, wpa_s, NULL); 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpas_wps_ap_pin_disable(struct wpa_supplicant *wpa_s) 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: Disabling AP PIN"); 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = NULL; 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL); 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst char * wpas_wps_ap_pin_random(struct wpa_supplicant *wpa_s, int timeout) 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int pin; 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char pin_txt[9]; 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pin = wps_generate_pin(); 7971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_snprintf(pin_txt, sizeof(pin_txt), "%08u", pin); 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = os_strdup(pin_txt); 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ap_pin == NULL) 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_enable(wpa_s, timeout); 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hapd->conf->ap_pin; 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst char * wpas_wps_ap_pin_get(struct wpa_supplicant *wpa_s) 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hapd->conf->ap_pin; 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpas_wps_ap_pin_set(struct wpa_supplicant *wpa_s, const char *pin, 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int timeout) 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char pin_txt[9]; 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pin_txt, sizeof(pin_txt), "%s", pin); 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= (int) sizeof(pin_txt)) 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = os_strdup(pin_txt); 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->conf->ap_pin == NULL) 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_wps_ap_pin_enable(wpa_s, timeout); 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_supplicant_ap_pwd_auth_fail(struct wpa_supplicant *wpa_s) 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Registrar failed to prove its knowledge of the AP PIN. Disable AP 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PIN if this happens multiple times to slow down brute force attacks. 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures++; 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: AP PIN authentication failure number %u", 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures); 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hapd->ap_pin_failures < 3) 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "WPS: Disable AP PIN"); 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->ap_pin_failures = 0; 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hapd->conf->ap_pin); 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd->conf->ap_pin = NULL; 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_sta_first(struct wpa_supplicant *wpa_s, 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_ctrl_iface_sta_first(wpa_s->ap_iface->bss[0], 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf, buflen); 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_sta(struct wpa_supplicant *wpa_s, const char *txtaddr, 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_ctrl_iface_sta(wpa_s->ap_iface->bss[0], txtaddr, 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf, buflen); 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_sta_next(struct wpa_supplicant *wpa_s, const char *txtaddr, 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf, size_t buflen) 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return hostapd_ctrl_iface_sta_next(wpa_s->ap_iface->bss[0], txtaddr, 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf, buflen); 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 90004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint ap_ctrl_iface_sta_disassociate(struct wpa_supplicant *wpa_s, 90104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *txtaddr) 90204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 90304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->ap_iface == NULL) 90404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 90504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return hostapd_ctrl_iface_disassociate(wpa_s->ap_iface->bss[0], 90604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt txtaddr); 90704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 90804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 90904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 91004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint ap_ctrl_iface_sta_deauthenticate(struct wpa_supplicant *wpa_s, 91104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *txtaddr) 91204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 91304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->ap_iface == NULL) 91404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 91504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return hostapd_ctrl_iface_deauthenticate(wpa_s->ap_iface->bss[0], 91604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt txtaddr); 91704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 91804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 91904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint ap_ctrl_iface_wpa_get_status(struct wpa_supplicant *wpa_s, char *buf, 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t buflen, int verbose) 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos = buf, *end = buf + buflen; 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *conf; 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ap_iface == NULL) 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf = wpa_s->ap_iface->bss[0]->conf; 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->wpa == 0) 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "pairwise_cipher=%s\n" 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "group_cipher=%s\n" 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt=%s\n", 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cipher_txt(conf->rsn_pairwise), 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cipher_txt(conf->wpa_group), 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_key_mgmt_txt(conf->wpa_key_mgmt, 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->wpa)); 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos - buf; 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos - buf; 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_update_beacon(struct wpa_supplicant *wpa_s) 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_iface *iface = wpa_s->ap_iface; 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = wpa_s->current_ssid; 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL || wpa_s->ap_iface == NULL || 9581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->mode == WPAS_MODE_INFRA || 9591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid->mode == WPAS_MODE_IBSS) 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->mode == WPAS_MODE_P2P_GO) 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER; 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER | 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt P2P_GROUP_FORMATION; 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = iface->bss[0]; 9711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hapd->drv_priv == NULL) 9721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 9731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ieee802_11_set_beacons(iface); 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_set_ap_wps_ie(hapd); 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_ap_ch_switch(struct wpa_supplicant *wpa_s, int freq, int ht, 98104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int offset) 98204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 98304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->ap_iface) 98404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 98504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 98604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->assoc_freq = freq; 98704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt hostapd_event_ch_switch(wpa_s->ap_iface->bss[0], freq, ht, offset); 98804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 98904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 99004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_supplicant_ap_mac_addr_filter(struct wpa_supplicant *wpa_s, 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *addr) 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_data *hapd; 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_bss_config *conf; 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_s->ap_iface) 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr) 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "AP: Set MAC address filter: " MACSTR, 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(addr)); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "AP: Clear MAC address filter"); 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hapd = wpa_s->ap_iface->bss[0]; 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf = hapd->conf; 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(conf->accept_mac); 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->accept_mac = NULL; 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_accept_mac = 0; 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(conf->deny_mac); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->deny_mac = NULL; 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_deny_mac = 0; 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr == NULL) { 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->macaddr_acl = ACCEPT_UNLESS_DENIED; 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->macaddr_acl = DENY_UNLESS_ACCEPTED; 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->accept_mac = os_zalloc(sizeof(struct mac_acl_entry)); 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (conf->accept_mac == NULL) 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(conf->accept_mac[0].addr, addr, ETH_ALEN); 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt conf->num_accept_mac = 1; 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1030