1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * WPA Supplicant - Basic AP mode support routines
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2003-2009, Jouni Malinen <[email protected]>
4*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2009, Atheros Communications
5*03f9172cSAndroid Build Coastguard Worker *
6*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
7*03f9172cSAndroid Build Coastguard Worker * See README for more details.
8*03f9172cSAndroid Build Coastguard Worker */
9*03f9172cSAndroid Build Coastguard Worker
10*03f9172cSAndroid Build Coastguard Worker #include "utils/includes.h"
11*03f9172cSAndroid Build Coastguard Worker
12*03f9172cSAndroid Build Coastguard Worker #include "utils/common.h"
13*03f9172cSAndroid Build Coastguard Worker #include "utils/eloop.h"
14*03f9172cSAndroid Build Coastguard Worker #include "utils/uuid.h"
15*03f9172cSAndroid Build Coastguard Worker #include "common/ieee802_11_defs.h"
16*03f9172cSAndroid Build Coastguard Worker #include "common/wpa_ctrl.h"
17*03f9172cSAndroid Build Coastguard Worker #include "eapol_supp/eapol_supp_sm.h"
18*03f9172cSAndroid Build Coastguard Worker #include "crypto/dh_group5.h"
19*03f9172cSAndroid Build Coastguard Worker #include "ap/hostapd.h"
20*03f9172cSAndroid Build Coastguard Worker #include "ap/ap_config.h"
21*03f9172cSAndroid Build Coastguard Worker #include "ap/ap_drv_ops.h"
22*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
23*03f9172cSAndroid Build Coastguard Worker #include "ap/ieee802_11.h"
24*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
25*03f9172cSAndroid Build Coastguard Worker #include "ap/beacon.h"
26*03f9172cSAndroid Build Coastguard Worker #include "ap/ieee802_1x.h"
27*03f9172cSAndroid Build Coastguard Worker #include "ap/wps_hostapd.h"
28*03f9172cSAndroid Build Coastguard Worker #include "ap/ctrl_iface_ap.h"
29*03f9172cSAndroid Build Coastguard Worker #include "ap/dfs.h"
30*03f9172cSAndroid Build Coastguard Worker #include "wps/wps.h"
31*03f9172cSAndroid Build Coastguard Worker #include "common/ieee802_11_defs.h"
32*03f9172cSAndroid Build Coastguard Worker #include "config_ssid.h"
33*03f9172cSAndroid Build Coastguard Worker #include "config.h"
34*03f9172cSAndroid Build Coastguard Worker #include "wpa_supplicant_i.h"
35*03f9172cSAndroid Build Coastguard Worker #include "driver_i.h"
36*03f9172cSAndroid Build Coastguard Worker #include "p2p_supplicant.h"
37*03f9172cSAndroid Build Coastguard Worker #include "ap.h"
38*03f9172cSAndroid Build Coastguard Worker #include "ap/sta_info.h"
39*03f9172cSAndroid Build Coastguard Worker #include "notify.h"
40*03f9172cSAndroid Build Coastguard Worker
41*03f9172cSAndroid Build Coastguard Worker
42*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS
43*03f9172cSAndroid Build Coastguard Worker static void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx);
44*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS */
45*03f9172cSAndroid Build Coastguard Worker
46*03f9172cSAndroid Build Coastguard Worker
47*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
is_chanwidth160_supported(struct hostapd_hw_modes * mode,struct hostapd_config * conf)48*03f9172cSAndroid Build Coastguard Worker static bool is_chanwidth160_supported(struct hostapd_hw_modes *mode,
49*03f9172cSAndroid Build Coastguard Worker struct hostapd_config *conf)
50*03f9172cSAndroid Build Coastguard Worker {
51*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211AX
52*03f9172cSAndroid Build Coastguard Worker if (conf->ieee80211ax) {
53*03f9172cSAndroid Build Coastguard Worker struct he_capabilities *he_cap;
54*03f9172cSAndroid Build Coastguard Worker
55*03f9172cSAndroid Build Coastguard Worker he_cap = &mode->he_capab[IEEE80211_MODE_AP];
56*03f9172cSAndroid Build Coastguard Worker if (he_cap->phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] &
57*03f9172cSAndroid Build Coastguard Worker (HE_PHYCAP_CHANNEL_WIDTH_SET_80PLUS80MHZ_IN_5G |
58*03f9172cSAndroid Build Coastguard Worker HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G))
59*03f9172cSAndroid Build Coastguard Worker return true;
60*03f9172cSAndroid Build Coastguard Worker }
61*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211AX */
62*03f9172cSAndroid Build Coastguard Worker if (mode->vht_capab & (VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
63*03f9172cSAndroid Build Coastguard Worker VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))
64*03f9172cSAndroid Build Coastguard Worker return true;
65*03f9172cSAndroid Build Coastguard Worker return false;
66*03f9172cSAndroid Build Coastguard Worker }
67*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
68*03f9172cSAndroid Build Coastguard Worker
69*03f9172cSAndroid Build Coastguard Worker
wpas_conf_ap_vht(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,struct hostapd_config * conf,struct hostapd_hw_modes * mode)70*03f9172cSAndroid Build Coastguard Worker static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
71*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid,
72*03f9172cSAndroid Build Coastguard Worker struct hostapd_config *conf,
73*03f9172cSAndroid Build Coastguard Worker struct hostapd_hw_modes *mode)
74*03f9172cSAndroid Build Coastguard Worker {
75*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
76*03f9172cSAndroid Build Coastguard Worker u8 center_chan = 0;
77*03f9172cSAndroid Build Coastguard Worker u8 channel = conf->channel;
78*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
79*03f9172cSAndroid Build Coastguard Worker u8 freq_seg_idx;
80*03f9172cSAndroid Build Coastguard Worker
81*03f9172cSAndroid Build Coastguard Worker if (!conf->secondary_channel)
82*03f9172cSAndroid Build Coastguard Worker goto no_vht;
83*03f9172cSAndroid Build Coastguard Worker
84*03f9172cSAndroid Build Coastguard Worker /* Use the maximum oper channel width if it's given. */
85*03f9172cSAndroid Build Coastguard Worker if (ssid->max_oper_chwidth)
86*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_chwidth(conf, ssid->max_oper_chwidth);
87*03f9172cSAndroid Build Coastguard Worker if (hostapd_get_oper_chwidth(conf))
88*03f9172cSAndroid Build Coastguard Worker ieee80211_freq_to_channel_ext(ssid->frequency, 0,
89*03f9172cSAndroid Build Coastguard Worker hostapd_get_oper_chwidth(conf),
90*03f9172cSAndroid Build Coastguard Worker &conf->op_class,
91*03f9172cSAndroid Build Coastguard Worker &conf->channel);
92*03f9172cSAndroid Build Coastguard Worker
93*03f9172cSAndroid Build Coastguard Worker if (hostapd_get_oper_chwidth(conf) == CONF_OPER_CHWIDTH_80P80MHZ) {
94*03f9172cSAndroid Build Coastguard Worker ieee80211_freq_to_chan(ssid->vht_center_freq2,
95*03f9172cSAndroid Build Coastguard Worker &freq_seg_idx);
96*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_centr_freq_seg1_idx(conf, freq_seg_idx);
97*03f9172cSAndroid Build Coastguard Worker }
98*03f9172cSAndroid Build Coastguard Worker
99*03f9172cSAndroid Build Coastguard Worker if (!ssid->p2p_group) {
100*03f9172cSAndroid Build Coastguard Worker if (!ssid->vht_center_freq1)
101*03f9172cSAndroid Build Coastguard Worker goto no_vht;
102*03f9172cSAndroid Build Coastguard Worker ieee80211_freq_to_chan(ssid->vht_center_freq1,
103*03f9172cSAndroid Build Coastguard Worker &freq_seg_idx);
104*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_centr_freq_seg0_idx(conf, freq_seg_idx);
105*03f9172cSAndroid Build Coastguard Worker
106*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
107*03f9172cSAndroid Build Coastguard Worker "VHT seg0 index %d and seg1 index %d for AP",
108*03f9172cSAndroid Build Coastguard Worker hostapd_get_oper_centr_freq_seg0_idx(conf),
109*03f9172cSAndroid Build Coastguard Worker hostapd_get_oper_centr_freq_seg1_idx(conf));
110*03f9172cSAndroid Build Coastguard Worker return;
111*03f9172cSAndroid Build Coastguard Worker }
112*03f9172cSAndroid Build Coastguard Worker
113*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
114*03f9172cSAndroid Build Coastguard Worker switch (hostapd_get_oper_chwidth(conf)) {
115*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_80MHZ:
116*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_80P80MHZ:
117*03f9172cSAndroid Build Coastguard Worker center_chan = wpas_p2p_get_vht80_center(wpa_s, mode, channel,
118*03f9172cSAndroid Build Coastguard Worker conf->op_class);
119*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
120*03f9172cSAndroid Build Coastguard Worker "VHT center channel %u for 80 or 80+80 MHz bandwidth",
121*03f9172cSAndroid Build Coastguard Worker center_chan);
122*03f9172cSAndroid Build Coastguard Worker break;
123*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_160MHZ:
124*03f9172cSAndroid Build Coastguard Worker center_chan = wpas_p2p_get_vht160_center(wpa_s, mode, channel,
125*03f9172cSAndroid Build Coastguard Worker conf->op_class);
126*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
127*03f9172cSAndroid Build Coastguard Worker "VHT center channel %u for 160 MHz bandwidth",
128*03f9172cSAndroid Build Coastguard Worker center_chan);
129*03f9172cSAndroid Build Coastguard Worker break;
130*03f9172cSAndroid Build Coastguard Worker default:
131*03f9172cSAndroid Build Coastguard Worker /*
132*03f9172cSAndroid Build Coastguard Worker * conf->vht_oper_chwidth might not be set for non-P2P GO cases,
133*03f9172cSAndroid Build Coastguard Worker * try oper_cwidth 160 MHz first then VHT 80 MHz, if 160 MHz is
134*03f9172cSAndroid Build Coastguard Worker * not supported.
135*03f9172cSAndroid Build Coastguard Worker */
136*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_chwidth(conf, CONF_OPER_CHWIDTH_160MHZ);
137*03f9172cSAndroid Build Coastguard Worker ieee80211_freq_to_channel_ext(ssid->frequency, 0,
138*03f9172cSAndroid Build Coastguard Worker conf->vht_oper_chwidth,
139*03f9172cSAndroid Build Coastguard Worker &conf->op_class,
140*03f9172cSAndroid Build Coastguard Worker &conf->channel);
141*03f9172cSAndroid Build Coastguard Worker center_chan = wpas_p2p_get_vht160_center(wpa_s, mode, channel,
142*03f9172cSAndroid Build Coastguard Worker conf->op_class);
143*03f9172cSAndroid Build Coastguard Worker if (center_chan && is_chanwidth160_supported(mode, conf)) {
144*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
145*03f9172cSAndroid Build Coastguard Worker "VHT center channel %u for auto-selected 160 MHz bandwidth",
146*03f9172cSAndroid Build Coastguard Worker center_chan);
147*03f9172cSAndroid Build Coastguard Worker } else {
148*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_chwidth(conf, CONF_OPER_CHWIDTH_80MHZ);
149*03f9172cSAndroid Build Coastguard Worker ieee80211_freq_to_channel_ext(ssid->frequency, 0,
150*03f9172cSAndroid Build Coastguard Worker conf->vht_oper_chwidth,
151*03f9172cSAndroid Build Coastguard Worker &conf->op_class,
152*03f9172cSAndroid Build Coastguard Worker &conf->channel);
153*03f9172cSAndroid Build Coastguard Worker center_chan = wpas_p2p_get_vht80_center(wpa_s, mode,
154*03f9172cSAndroid Build Coastguard Worker channel,
155*03f9172cSAndroid Build Coastguard Worker conf->op_class);
156*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
157*03f9172cSAndroid Build Coastguard Worker "VHT center channel %u for auto-selected 80 MHz bandwidth",
158*03f9172cSAndroid Build Coastguard Worker center_chan);
159*03f9172cSAndroid Build Coastguard Worker }
160*03f9172cSAndroid Build Coastguard Worker break;
161*03f9172cSAndroid Build Coastguard Worker }
162*03f9172cSAndroid Build Coastguard Worker if (!center_chan)
163*03f9172cSAndroid Build Coastguard Worker goto no_vht;
164*03f9172cSAndroid Build Coastguard Worker
165*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_centr_freq_seg0_idx(conf, center_chan);
166*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "VHT seg0 index %d for P2P GO",
167*03f9172cSAndroid Build Coastguard Worker hostapd_get_oper_centr_freq_seg0_idx(conf));
168*03f9172cSAndroid Build Coastguard Worker return;
169*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
170*03f9172cSAndroid Build Coastguard Worker
171*03f9172cSAndroid Build Coastguard Worker no_vht:
172*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
173*03f9172cSAndroid Build Coastguard Worker "No VHT higher bandwidth support for the selected channel %d",
174*03f9172cSAndroid Build Coastguard Worker conf->channel);
175*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_centr_freq_seg0_idx(
176*03f9172cSAndroid Build Coastguard Worker conf, conf->channel + conf->secondary_channel * 2);
177*03f9172cSAndroid Build Coastguard Worker hostapd_set_oper_chwidth(conf, CONF_OPER_CHWIDTH_USE_HT);
178*03f9172cSAndroid Build Coastguard Worker ieee80211_freq_to_channel_ext(ssid->frequency, 0,
179*03f9172cSAndroid Build Coastguard Worker conf->vht_oper_chwidth,
180*03f9172cSAndroid Build Coastguard Worker &conf->op_class, &conf->channel);
181*03f9172cSAndroid Build Coastguard Worker }
182*03f9172cSAndroid Build Coastguard Worker
183*03f9172cSAndroid Build Coastguard Worker
184*03f9172cSAndroid Build Coastguard Worker static struct hostapd_hw_modes *
wpa_supplicant_find_hw_mode(struct wpa_supplicant * wpa_s,enum hostapd_hw_mode hw_mode)185*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_find_hw_mode(struct wpa_supplicant *wpa_s,
186*03f9172cSAndroid Build Coastguard Worker enum hostapd_hw_mode hw_mode)
187*03f9172cSAndroid Build Coastguard Worker {
188*03f9172cSAndroid Build Coastguard Worker struct hostapd_hw_modes *mode = NULL;
189*03f9172cSAndroid Build Coastguard Worker int i;
190*03f9172cSAndroid Build Coastguard Worker
191*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < wpa_s->hw.num_modes; i++) {
192*03f9172cSAndroid Build Coastguard Worker if (wpa_s->hw.modes[i].mode == hw_mode) {
193*03f9172cSAndroid Build Coastguard Worker mode = &wpa_s->hw.modes[i];
194*03f9172cSAndroid Build Coastguard Worker break;
195*03f9172cSAndroid Build Coastguard Worker }
196*03f9172cSAndroid Build Coastguard Worker }
197*03f9172cSAndroid Build Coastguard Worker
198*03f9172cSAndroid Build Coastguard Worker return mode;
199*03f9172cSAndroid Build Coastguard Worker }
200*03f9172cSAndroid Build Coastguard Worker
201*03f9172cSAndroid Build Coastguard Worker
202*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
203*03f9172cSAndroid Build Coastguard Worker
get_max_oper_chwidth_6ghz(int chwidth)204*03f9172cSAndroid Build Coastguard Worker static int get_max_oper_chwidth_6ghz(int chwidth)
205*03f9172cSAndroid Build Coastguard Worker {
206*03f9172cSAndroid Build Coastguard Worker switch (chwidth) {
207*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_USE_HT:
208*03f9172cSAndroid Build Coastguard Worker return 20;
209*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_40MHZ_6GHZ:
210*03f9172cSAndroid Build Coastguard Worker return 40;
211*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_80MHZ:
212*03f9172cSAndroid Build Coastguard Worker return 80;
213*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_80P80MHZ:
214*03f9172cSAndroid Build Coastguard Worker case CONF_OPER_CHWIDTH_160MHZ:
215*03f9172cSAndroid Build Coastguard Worker return 160;
216*03f9172cSAndroid Build Coastguard Worker default:
217*03f9172cSAndroid Build Coastguard Worker return 0;
218*03f9172cSAndroid Build Coastguard Worker }
219*03f9172cSAndroid Build Coastguard Worker }
220*03f9172cSAndroid Build Coastguard Worker
221*03f9172cSAndroid Build Coastguard Worker
wpas_conf_ap_he_6ghz(struct wpa_supplicant * wpa_s,struct hostapd_hw_modes * mode,struct wpa_ssid * ssid,struct hostapd_config * conf)222*03f9172cSAndroid Build Coastguard Worker static void wpas_conf_ap_he_6ghz(struct wpa_supplicant *wpa_s,
223*03f9172cSAndroid Build Coastguard Worker struct hostapd_hw_modes *mode,
224*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid,
225*03f9172cSAndroid Build Coastguard Worker struct hostapd_config *conf)
226*03f9172cSAndroid Build Coastguard Worker {
227*03f9172cSAndroid Build Coastguard Worker bool is_chanwidth_40_80, is_chanwidth_160;
228*03f9172cSAndroid Build Coastguard Worker int he_chanwidth;
229*03f9172cSAndroid Build Coastguard Worker
230*03f9172cSAndroid Build Coastguard Worker he_chanwidth =
231*03f9172cSAndroid Build Coastguard Worker mode->he_capab[wpas_mode_to_ieee80211_mode(
232*03f9172cSAndroid Build Coastguard Worker ssid->mode)].phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX];
233*03f9172cSAndroid Build Coastguard Worker is_chanwidth_40_80 = he_chanwidth &
234*03f9172cSAndroid Build Coastguard Worker HE_PHYCAP_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
235*03f9172cSAndroid Build Coastguard Worker is_chanwidth_160 = he_chanwidth &
236*03f9172cSAndroid Build Coastguard Worker HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
237*03f9172cSAndroid Build Coastguard Worker
238*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
239*03f9172cSAndroid Build Coastguard Worker "Enable HE support (p2p_group=%d he_chwidth_cap=%d)",
240*03f9172cSAndroid Build Coastguard Worker ssid->p2p_group, he_chanwidth);
241*03f9172cSAndroid Build Coastguard Worker
242*03f9172cSAndroid Build Coastguard Worker if (mode->he_capab[wpas_mode_to_ieee80211_mode(
243*03f9172cSAndroid Build Coastguard Worker ssid->mode)].he_supported &&
244*03f9172cSAndroid Build Coastguard Worker ssid->he)
245*03f9172cSAndroid Build Coastguard Worker conf->ieee80211ax = 1;
246*03f9172cSAndroid Build Coastguard Worker
247*03f9172cSAndroid Build Coastguard Worker if (is_chanwidth_40_80 && ssid->p2p_group &&
248*03f9172cSAndroid Build Coastguard Worker get_max_oper_chwidth_6ghz(ssid->max_oper_chwidth) >= 40) {
249*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel =
250*03f9172cSAndroid Build Coastguard Worker wpas_p2p_get_sec_channel_offset_40mhz(
251*03f9172cSAndroid Build Coastguard Worker wpa_s, mode, conf->channel);
252*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
253*03f9172cSAndroid Build Coastguard Worker "Secondary channel offset %d for P2P group",
254*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel);
255*03f9172cSAndroid Build Coastguard Worker if (ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_40MHZ_6GHZ)
256*03f9172cSAndroid Build Coastguard Worker ssid->max_oper_chwidth = CONF_OPER_CHWIDTH_USE_HT;
257*03f9172cSAndroid Build Coastguard Worker }
258*03f9172cSAndroid Build Coastguard Worker
259*03f9172cSAndroid Build Coastguard Worker if ((is_chanwidth_40_80 || is_chanwidth_160) && ssid->p2p_group &&
260*03f9172cSAndroid Build Coastguard Worker get_max_oper_chwidth_6ghz(ssid->max_oper_chwidth) >= 80)
261*03f9172cSAndroid Build Coastguard Worker wpas_conf_ap_vht(wpa_s, ssid, conf, mode);
262*03f9172cSAndroid Build Coastguard Worker }
263*03f9172cSAndroid Build Coastguard Worker
264*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
265*03f9172cSAndroid Build Coastguard Worker
266*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_conf_ap_ht(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,struct hostapd_config * conf)267*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s,
268*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid,
269*03f9172cSAndroid Build Coastguard Worker struct hostapd_config *conf)
270*03f9172cSAndroid Build Coastguard Worker {
271*03f9172cSAndroid Build Coastguard Worker conf->hw_mode = ieee80211_freq_to_channel_ext(ssid->frequency, 0,
272*03f9172cSAndroid Build Coastguard Worker CONF_OPER_CHWIDTH_USE_HT,
273*03f9172cSAndroid Build Coastguard Worker &conf->op_class,
274*03f9172cSAndroid Build Coastguard Worker &conf->channel);
275*03f9172cSAndroid Build Coastguard Worker if (conf->hw_mode == NUM_HOSTAPD_MODES) {
276*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz",
277*03f9172cSAndroid Build Coastguard Worker ssid->frequency);
278*03f9172cSAndroid Build Coastguard Worker return -1;
279*03f9172cSAndroid Build Coastguard Worker }
280*03f9172cSAndroid Build Coastguard Worker
281*03f9172cSAndroid Build Coastguard Worker /*
282*03f9172cSAndroid Build Coastguard Worker * Enable HT20 if the driver supports it, by setting conf->ieee80211n
283*03f9172cSAndroid Build Coastguard Worker * and a mask of allowed capabilities within conf->ht_capab.
284*03f9172cSAndroid Build Coastguard Worker * Using default config settings for: conf->ht_op_mode_fixed,
285*03f9172cSAndroid Build Coastguard Worker * conf->secondary_channel, conf->require_ht
286*03f9172cSAndroid Build Coastguard Worker */
287*03f9172cSAndroid Build Coastguard Worker if (wpa_s->hw.modes) {
288*03f9172cSAndroid Build Coastguard Worker struct hostapd_hw_modes *mode = NULL;
289*03f9172cSAndroid Build Coastguard Worker int no_ht = 0;
290*03f9172cSAndroid Build Coastguard Worker
291*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
292*03f9172cSAndroid Build Coastguard Worker "Determining HT/VHT options based on driver capabilities (freq=%u chan=%u)",
293*03f9172cSAndroid Build Coastguard Worker ssid->frequency, conf->channel);
294*03f9172cSAndroid Build Coastguard Worker
295*03f9172cSAndroid Build Coastguard Worker mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes,
296*03f9172cSAndroid Build Coastguard Worker conf->hw_mode, is_6ghz_freq(ssid->frequency));
297*03f9172cSAndroid Build Coastguard Worker
298*03f9172cSAndroid Build Coastguard Worker /* May drop to IEEE 802.11b if the driver does not support IEEE
299*03f9172cSAndroid Build Coastguard Worker * 802.11g */
300*03f9172cSAndroid Build Coastguard Worker if (!mode && conf->hw_mode == HOSTAPD_MODE_IEEE80211G) {
301*03f9172cSAndroid Build Coastguard Worker conf->hw_mode = HOSTAPD_MODE_IEEE80211B;
302*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_INFO,
303*03f9172cSAndroid Build Coastguard Worker "Try downgrade to IEEE 802.11b as 802.11g is not supported by the current hardware");
304*03f9172cSAndroid Build Coastguard Worker mode = wpa_supplicant_find_hw_mode(wpa_s,
305*03f9172cSAndroid Build Coastguard Worker conf->hw_mode);
306*03f9172cSAndroid Build Coastguard Worker }
307*03f9172cSAndroid Build Coastguard Worker
308*03f9172cSAndroid Build Coastguard Worker if (!mode) {
309*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR,
310*03f9172cSAndroid Build Coastguard Worker "No match between requested and supported hw modes found");
311*03f9172cSAndroid Build Coastguard Worker return -1;
312*03f9172cSAndroid Build Coastguard Worker }
313*03f9172cSAndroid Build Coastguard Worker
314*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_HT_OVERRIDES
315*03f9172cSAndroid Build Coastguard Worker if (ssid->disable_ht)
316*03f9172cSAndroid Build Coastguard Worker ssid->ht = 0;
317*03f9172cSAndroid Build Coastguard Worker if (ssid->disable_ht40)
318*03f9172cSAndroid Build Coastguard Worker ssid->ht40 = 0;
319*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_HT_OVERRIDES */
320*03f9172cSAndroid Build Coastguard Worker
321*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_VHT_OVERRIDES
322*03f9172cSAndroid Build Coastguard Worker if (ssid->disable_vht)
323*03f9172cSAndroid Build Coastguard Worker ssid->vht = 0;
324*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_VHT_OVERRIDES */
325*03f9172cSAndroid Build Coastguard Worker
326*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_HE_OVERRIDES
327*03f9172cSAndroid Build Coastguard Worker if (ssid->disable_he)
328*03f9172cSAndroid Build Coastguard Worker ssid->he = 0;
329*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_HE_OVERRIDES */
330*03f9172cSAndroid Build Coastguard Worker
331*03f9172cSAndroid Build Coastguard Worker if (!ssid->ht) {
332*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
333*03f9172cSAndroid Build Coastguard Worker "HT not enabled in network profile");
334*03f9172cSAndroid Build Coastguard Worker conf->ieee80211n = 0;
335*03f9172cSAndroid Build Coastguard Worker conf->ht_capab = 0;
336*03f9172cSAndroid Build Coastguard Worker no_ht = 1;
337*03f9172cSAndroid Build Coastguard Worker }
338*03f9172cSAndroid Build Coastguard Worker
339*03f9172cSAndroid Build Coastguard Worker if (mode && is_6ghz_freq(ssid->frequency) &&
340*03f9172cSAndroid Build Coastguard Worker conf->hw_mode == HOSTAPD_MODE_IEEE80211A) {
341*03f9172cSAndroid Build Coastguard Worker if (mode->eht_capab[wpas_mode_to_ieee80211_mode(
342*03f9172cSAndroid Build Coastguard Worker ssid->mode)].eht_supported &&
343*03f9172cSAndroid Build Coastguard Worker ssid->eht)
344*03f9172cSAndroid Build Coastguard Worker conf->ieee80211be = 1;
345*03f9172cSAndroid Build Coastguard Worker
346*03f9172cSAndroid Build Coastguard Worker if (mode->he_capab[wpas_mode_to_ieee80211_mode(
347*03f9172cSAndroid Build Coastguard Worker ssid->mode)].he_supported &&
348*03f9172cSAndroid Build Coastguard Worker ssid->he)
349*03f9172cSAndroid Build Coastguard Worker conf->ieee80211ax = 1;
350*03f9172cSAndroid Build Coastguard Worker
351*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
352*03f9172cSAndroid Build Coastguard Worker wpas_conf_ap_he_6ghz(wpa_s, mode, ssid, conf);
353*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
354*03f9172cSAndroid Build Coastguard Worker } else if (!no_ht && mode && mode->ht_capab) {
355*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
356*03f9172cSAndroid Build Coastguard Worker "Enable HT support (p2p_group=%d 11a=%d ht40_hw_capab=%d ssid->ht40=%d)",
357*03f9172cSAndroid Build Coastguard Worker ssid->p2p_group,
358*03f9172cSAndroid Build Coastguard Worker conf->hw_mode == HOSTAPD_MODE_IEEE80211A,
359*03f9172cSAndroid Build Coastguard Worker !!(mode->ht_capab &
360*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET),
361*03f9172cSAndroid Build Coastguard Worker ssid->ht40);
362*03f9172cSAndroid Build Coastguard Worker conf->ieee80211n = 1;
363*03f9172cSAndroid Build Coastguard Worker
364*03f9172cSAndroid Build Coastguard Worker if (ssid->ht40 &&
365*03f9172cSAndroid Build Coastguard Worker (mode->ht_capab &
366*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET))
367*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel = ssid->ht40;
368*03f9172cSAndroid Build Coastguard Worker else
369*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel = 0;
370*03f9172cSAndroid Build Coastguard Worker
371*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
372*03f9172cSAndroid Build Coastguard Worker if (ssid->p2p_group &&
373*03f9172cSAndroid Build Coastguard Worker conf->hw_mode == HOSTAPD_MODE_IEEE80211A &&
374*03f9172cSAndroid Build Coastguard Worker (mode->ht_capab &
375*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) &&
376*03f9172cSAndroid Build Coastguard Worker ssid->ht40) {
377*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel =
378*03f9172cSAndroid Build Coastguard Worker wpas_p2p_get_sec_channel_offset_40mhz(
379*03f9172cSAndroid Build Coastguard Worker wpa_s, mode, conf->channel);
380*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
381*03f9172cSAndroid Build Coastguard Worker "HT secondary channel offset %d for P2P group",
382*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel);
383*03f9172cSAndroid Build Coastguard Worker } else if (ssid->p2p_group && conf->secondary_channel &&
384*03f9172cSAndroid Build Coastguard Worker conf->hw_mode != HOSTAPD_MODE_IEEE80211A) {
385*03f9172cSAndroid Build Coastguard Worker /* This ended up trying to configure invalid
386*03f9172cSAndroid Build Coastguard Worker * 2.4 GHz channels (e.g., HT40+ on channel 11)
387*03f9172cSAndroid Build Coastguard Worker * in some cases, so clear the secondary channel
388*03f9172cSAndroid Build Coastguard Worker * configuration now to avoid such cases that
389*03f9172cSAndroid Build Coastguard Worker * would lead to group formation failures. */
390*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
391*03f9172cSAndroid Build Coastguard Worker "Disable HT secondary channel for P2P group on 2.4 GHz");
392*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel = 0;
393*03f9172cSAndroid Build Coastguard Worker }
394*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
395*03f9172cSAndroid Build Coastguard Worker
396*03f9172cSAndroid Build Coastguard Worker if (!ssid->p2p_group &&
397*03f9172cSAndroid Build Coastguard Worker (mode->ht_capab &
398*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)) {
399*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel = ssid->ht40;
400*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
401*03f9172cSAndroid Build Coastguard Worker "HT secondary channel offset %d for AP",
402*03f9172cSAndroid Build Coastguard Worker conf->secondary_channel);
403*03f9172cSAndroid Build Coastguard Worker }
404*03f9172cSAndroid Build Coastguard Worker
405*03f9172cSAndroid Build Coastguard Worker if (conf->secondary_channel)
406*03f9172cSAndroid Build Coastguard Worker conf->ht_capab |=
407*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
408*03f9172cSAndroid Build Coastguard Worker
409*03f9172cSAndroid Build Coastguard Worker /*
410*03f9172cSAndroid Build Coastguard Worker * include capabilities that won't cause issues
411*03f9172cSAndroid Build Coastguard Worker * to connecting stations, while leaving the current
412*03f9172cSAndroid Build Coastguard Worker * capabilities intact (currently disabled SMPS).
413*03f9172cSAndroid Build Coastguard Worker */
414*03f9172cSAndroid Build Coastguard Worker conf->ht_capab |= mode->ht_capab &
415*03f9172cSAndroid Build Coastguard Worker (HT_CAP_INFO_GREEN_FIELD |
416*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SHORT_GI20MHZ |
417*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_SHORT_GI40MHZ |
418*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_RX_STBC_MASK |
419*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_TX_STBC |
420*03f9172cSAndroid Build Coastguard Worker HT_CAP_INFO_MAX_AMSDU_SIZE);
421*03f9172cSAndroid Build Coastguard Worker
422*03f9172cSAndroid Build Coastguard Worker /* check this before VHT, because setting oper chan
423*03f9172cSAndroid Build Coastguard Worker * width and friends is the same call for HE and VHT
424*03f9172cSAndroid Build Coastguard Worker * and checks if conf->ieee8021ax == 1 */
425*03f9172cSAndroid Build Coastguard Worker if (mode->eht_capab[wpas_mode_to_ieee80211_mode(
426*03f9172cSAndroid Build Coastguard Worker ssid->mode)].eht_supported &&
427*03f9172cSAndroid Build Coastguard Worker ssid->eht)
428*03f9172cSAndroid Build Coastguard Worker conf->ieee80211be = 1;
429*03f9172cSAndroid Build Coastguard Worker
430*03f9172cSAndroid Build Coastguard Worker if (mode->he_capab[wpas_mode_to_ieee80211_mode(
431*03f9172cSAndroid Build Coastguard Worker ssid->mode)].he_supported &&
432*03f9172cSAndroid Build Coastguard Worker ssid->he)
433*03f9172cSAndroid Build Coastguard Worker conf->ieee80211ax = 1;
434*03f9172cSAndroid Build Coastguard Worker
435*03f9172cSAndroid Build Coastguard Worker if (mode->vht_capab && ssid->vht) {
436*03f9172cSAndroid Build Coastguard Worker conf->ieee80211ac = 1;
437*03f9172cSAndroid Build Coastguard Worker conf->vht_capab |= mode->vht_capab;
438*03f9172cSAndroid Build Coastguard Worker wpas_conf_ap_vht(wpa_s, ssid, conf, mode);
439*03f9172cSAndroid Build Coastguard Worker }
440*03f9172cSAndroid Build Coastguard Worker }
441*03f9172cSAndroid Build Coastguard Worker }
442*03f9172cSAndroid Build Coastguard Worker
443*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
444*03f9172cSAndroid Build Coastguard Worker if (ssid->p2p_group && wpa_s->p2p_go_no_pri_sec_switch) {
445*03f9172cSAndroid Build Coastguard Worker conf->no_pri_sec_switch = 1;
446*03f9172cSAndroid Build Coastguard Worker return 0;
447*03f9172cSAndroid Build Coastguard Worker }
448*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
449*03f9172cSAndroid Build Coastguard Worker
450*03f9172cSAndroid Build Coastguard Worker if (conf->secondary_channel) {
451*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *iface;
452*03f9172cSAndroid Build Coastguard Worker
453*03f9172cSAndroid Build Coastguard Worker for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
454*03f9172cSAndroid Build Coastguard Worker {
455*03f9172cSAndroid Build Coastguard Worker if (iface == wpa_s ||
456*03f9172cSAndroid Build Coastguard Worker iface->wpa_state < WPA_AUTHENTICATING ||
457*03f9172cSAndroid Build Coastguard Worker (int) iface->assoc_freq != ssid->frequency)
458*03f9172cSAndroid Build Coastguard Worker continue;
459*03f9172cSAndroid Build Coastguard Worker
460*03f9172cSAndroid Build Coastguard Worker /*
461*03f9172cSAndroid Build Coastguard Worker * Do not allow 40 MHz co-ex PRI/SEC switch to force us
462*03f9172cSAndroid Build Coastguard Worker * to change our PRI channel since we have an existing,
463*03f9172cSAndroid Build Coastguard Worker * concurrent connection on that channel and doing
464*03f9172cSAndroid Build Coastguard Worker * multi-channel concurrency is likely to cause more
465*03f9172cSAndroid Build Coastguard Worker * harm than using different PRI/SEC selection in
466*03f9172cSAndroid Build Coastguard Worker * environment with multiple BSSes on these two channels
467*03f9172cSAndroid Build Coastguard Worker * with mixed 20 MHz or PRI channel selection.
468*03f9172cSAndroid Build Coastguard Worker */
469*03f9172cSAndroid Build Coastguard Worker conf->no_pri_sec_switch = 1;
470*03f9172cSAndroid Build Coastguard Worker }
471*03f9172cSAndroid Build Coastguard Worker }
472*03f9172cSAndroid Build Coastguard Worker
473*03f9172cSAndroid Build Coastguard Worker return 0;
474*03f9172cSAndroid Build Coastguard Worker }
475*03f9172cSAndroid Build Coastguard Worker
476*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_conf_ap(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,struct hostapd_config * conf)477*03f9172cSAndroid Build Coastguard Worker static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
478*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid,
479*03f9172cSAndroid Build Coastguard Worker struct hostapd_config *conf)
480*03f9172cSAndroid Build Coastguard Worker {
481*03f9172cSAndroid Build Coastguard Worker struct hostapd_bss_config *bss = conf->bss[0];
482*03f9172cSAndroid Build Coastguard Worker
483*03f9172cSAndroid Build Coastguard Worker conf->driver = wpa_s->driver;
484*03f9172cSAndroid Build Coastguard Worker
485*03f9172cSAndroid Build Coastguard Worker os_strlcpy(bss->iface, wpa_s->ifname, sizeof(bss->iface));
486*03f9172cSAndroid Build Coastguard Worker
487*03f9172cSAndroid Build Coastguard Worker if (wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf))
488*03f9172cSAndroid Build Coastguard Worker return -1;
489*03f9172cSAndroid Build Coastguard Worker
490*03f9172cSAndroid Build Coastguard Worker if (ssid->pbss > 1) {
491*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR, "Invalid pbss value(%d) for AP mode",
492*03f9172cSAndroid Build Coastguard Worker ssid->pbss);
493*03f9172cSAndroid Build Coastguard Worker return -1;
494*03f9172cSAndroid Build Coastguard Worker }
495*03f9172cSAndroid Build Coastguard Worker bss->pbss = ssid->pbss;
496*03f9172cSAndroid Build Coastguard Worker
497*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_ACS
498*03f9172cSAndroid Build Coastguard Worker if (ssid->acs) {
499*03f9172cSAndroid Build Coastguard Worker /* Setting channel to 0 in order to enable ACS */
500*03f9172cSAndroid Build Coastguard Worker conf->channel = 0;
501*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "Use automatic channel selection");
502*03f9172cSAndroid Build Coastguard Worker }
503*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_ACS */
504*03f9172cSAndroid Build Coastguard Worker
505*03f9172cSAndroid Build Coastguard Worker if (ieee80211_is_dfs(ssid->frequency, wpa_s->hw.modes,
506*03f9172cSAndroid Build Coastguard Worker wpa_s->hw.num_modes) && wpa_s->conf->country[0]) {
507*03f9172cSAndroid Build Coastguard Worker conf->ieee80211h = 1;
508*03f9172cSAndroid Build Coastguard Worker conf->ieee80211d = 1;
509*03f9172cSAndroid Build Coastguard Worker conf->country[0] = wpa_s->conf->country[0];
510*03f9172cSAndroid Build Coastguard Worker conf->country[1] = wpa_s->conf->country[1];
511*03f9172cSAndroid Build Coastguard Worker conf->country[2] = ' ';
512*03f9172cSAndroid Build Coastguard Worker }
513*03f9172cSAndroid Build Coastguard Worker
514*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
515*03f9172cSAndroid Build Coastguard Worker if (conf->hw_mode == HOSTAPD_MODE_IEEE80211G &&
516*03f9172cSAndroid Build Coastguard Worker (ssid->mode == WPAS_MODE_P2P_GO ||
517*03f9172cSAndroid Build Coastguard Worker ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)) {
518*03f9172cSAndroid Build Coastguard Worker /* Remove 802.11b rates from supported and basic rate sets */
519*03f9172cSAndroid Build Coastguard Worker int *list = os_malloc(4 * sizeof(int));
520*03f9172cSAndroid Build Coastguard Worker if (list) {
521*03f9172cSAndroid Build Coastguard Worker list[0] = 60;
522*03f9172cSAndroid Build Coastguard Worker list[1] = 120;
523*03f9172cSAndroid Build Coastguard Worker list[2] = 240;
524*03f9172cSAndroid Build Coastguard Worker list[3] = -1;
525*03f9172cSAndroid Build Coastguard Worker }
526*03f9172cSAndroid Build Coastguard Worker conf->basic_rates = list;
527*03f9172cSAndroid Build Coastguard Worker
528*03f9172cSAndroid Build Coastguard Worker list = os_malloc(9 * sizeof(int));
529*03f9172cSAndroid Build Coastguard Worker if (list) {
530*03f9172cSAndroid Build Coastguard Worker list[0] = 60;
531*03f9172cSAndroid Build Coastguard Worker list[1] = 90;
532*03f9172cSAndroid Build Coastguard Worker list[2] = 120;
533*03f9172cSAndroid Build Coastguard Worker list[3] = 180;
534*03f9172cSAndroid Build Coastguard Worker list[4] = 240;
535*03f9172cSAndroid Build Coastguard Worker list[5] = 360;
536*03f9172cSAndroid Build Coastguard Worker list[6] = 480;
537*03f9172cSAndroid Build Coastguard Worker list[7] = 540;
538*03f9172cSAndroid Build Coastguard Worker list[8] = -1;
539*03f9172cSAndroid Build Coastguard Worker }
540*03f9172cSAndroid Build Coastguard Worker conf->supported_rates = list;
541*03f9172cSAndroid Build Coastguard Worker }
542*03f9172cSAndroid Build Coastguard Worker
543*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211AX
544*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_P2P_GO ||
545*03f9172cSAndroid Build Coastguard Worker ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
546*03f9172cSAndroid Build Coastguard Worker conf->ieee80211ax = ssid->he;
547*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211AX */
548*03f9172cSAndroid Build Coastguard Worker
549*03f9172cSAndroid Build Coastguard Worker bss->isolate = !wpa_s->conf->p2p_intra_bss;
550*03f9172cSAndroid Build Coastguard Worker bss->extended_key_id = wpa_s->conf->extended_key_id;
551*03f9172cSAndroid Build Coastguard Worker bss->force_per_enrollee_psk = wpa_s->global->p2p_per_sta_psk;
552*03f9172cSAndroid Build Coastguard Worker bss->wpa_deny_ptk0_rekey = ssid->wpa_deny_ptk0_rekey;
553*03f9172cSAndroid Build Coastguard Worker
554*03f9172cSAndroid Build Coastguard Worker if (ssid->p2p_group) {
555*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->ip_addr_go, wpa_s->p2pdev->conf->ip_addr_go, 4);
556*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->ip_addr_mask, wpa_s->p2pdev->conf->ip_addr_mask,
557*03f9172cSAndroid Build Coastguard Worker 4);
558*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->ip_addr_start,
559*03f9172cSAndroid Build Coastguard Worker wpa_s->p2pdev->conf->ip_addr_start, 4);
560*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->ip_addr_end, wpa_s->p2pdev->conf->ip_addr_end,
561*03f9172cSAndroid Build Coastguard Worker 4);
562*03f9172cSAndroid Build Coastguard Worker }
563*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
564*03f9172cSAndroid Build Coastguard Worker
565*03f9172cSAndroid Build Coastguard Worker if (ssid->ssid_len == 0) {
566*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR, "No SSID configured for AP mode");
567*03f9172cSAndroid Build Coastguard Worker return -1;
568*03f9172cSAndroid Build Coastguard Worker }
569*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->ssid.ssid, ssid->ssid, ssid->ssid_len);
570*03f9172cSAndroid Build Coastguard Worker bss->ssid.ssid_len = ssid->ssid_len;
571*03f9172cSAndroid Build Coastguard Worker bss->ssid.ssid_set = 1;
572*03f9172cSAndroid Build Coastguard Worker
573*03f9172cSAndroid Build Coastguard Worker bss->ignore_broadcast_ssid = ssid->ignore_broadcast_ssid;
574*03f9172cSAndroid Build Coastguard Worker
575*03f9172cSAndroid Build Coastguard Worker if (ssid->auth_alg)
576*03f9172cSAndroid Build Coastguard Worker bss->auth_algs = ssid->auth_alg;
577*03f9172cSAndroid Build Coastguard Worker
578*03f9172cSAndroid Build Coastguard Worker if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt))
579*03f9172cSAndroid Build Coastguard Worker bss->wpa = ssid->proto;
580*03f9172cSAndroid Build Coastguard Worker if (ssid->key_mgmt == DEFAULT_KEY_MGMT)
581*03f9172cSAndroid Build Coastguard Worker bss->wpa_key_mgmt = WPA_KEY_MGMT_PSK;
582*03f9172cSAndroid Build Coastguard Worker else
583*03f9172cSAndroid Build Coastguard Worker bss->wpa_key_mgmt = ssid->key_mgmt;
584*03f9172cSAndroid Build Coastguard Worker bss->wpa_pairwise = ssid->pairwise_cipher;
585*03f9172cSAndroid Build Coastguard Worker if (wpa_key_mgmt_sae(bss->wpa_key_mgmt) && ssid->passphrase) {
586*03f9172cSAndroid Build Coastguard Worker bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase);
587*03f9172cSAndroid Build Coastguard Worker } else if (ssid->psk_set) {
588*03f9172cSAndroid Build Coastguard Worker bin_clear_free(bss->ssid.wpa_psk, sizeof(*bss->ssid.wpa_psk));
589*03f9172cSAndroid Build Coastguard Worker bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
590*03f9172cSAndroid Build Coastguard Worker if (bss->ssid.wpa_psk == NULL)
591*03f9172cSAndroid Build Coastguard Worker return -1;
592*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN);
593*03f9172cSAndroid Build Coastguard Worker bss->ssid.wpa_psk->group = 1;
594*03f9172cSAndroid Build Coastguard Worker bss->ssid.wpa_psk_set = 1;
595*03f9172cSAndroid Build Coastguard Worker } else if (ssid->passphrase) {
596*03f9172cSAndroid Build Coastguard Worker bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase);
597*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WEP
598*03f9172cSAndroid Build Coastguard Worker } else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] ||
599*03f9172cSAndroid Build Coastguard Worker ssid->wep_key_len[2] || ssid->wep_key_len[3]) {
600*03f9172cSAndroid Build Coastguard Worker struct hostapd_wep_keys *wep = &bss->ssid.wep;
601*03f9172cSAndroid Build Coastguard Worker int i;
602*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < NUM_WEP_KEYS; i++) {
603*03f9172cSAndroid Build Coastguard Worker if (ssid->wep_key_len[i] == 0)
604*03f9172cSAndroid Build Coastguard Worker continue;
605*03f9172cSAndroid Build Coastguard Worker wep->key[i] = os_memdup(ssid->wep_key[i],
606*03f9172cSAndroid Build Coastguard Worker ssid->wep_key_len[i]);
607*03f9172cSAndroid Build Coastguard Worker if (wep->key[i] == NULL)
608*03f9172cSAndroid Build Coastguard Worker return -1;
609*03f9172cSAndroid Build Coastguard Worker wep->len[i] = ssid->wep_key_len[i];
610*03f9172cSAndroid Build Coastguard Worker }
611*03f9172cSAndroid Build Coastguard Worker wep->idx = ssid->wep_tx_keyidx;
612*03f9172cSAndroid Build Coastguard Worker wep->keys_set = 1;
613*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WEP */
614*03f9172cSAndroid Build Coastguard Worker }
615*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_SAE
616*03f9172cSAndroid Build Coastguard Worker if (ssid->sae_password) {
617*03f9172cSAndroid Build Coastguard Worker struct sae_password_entry *pw;
618*03f9172cSAndroid Build Coastguard Worker
619*03f9172cSAndroid Build Coastguard Worker pw = os_zalloc(sizeof(*pw));
620*03f9172cSAndroid Build Coastguard Worker if (!pw)
621*03f9172cSAndroid Build Coastguard Worker return -1;
622*03f9172cSAndroid Build Coastguard Worker os_memset(pw->peer_addr, 0xff, ETH_ALEN);
623*03f9172cSAndroid Build Coastguard Worker pw->password = os_strdup(ssid->sae_password);
624*03f9172cSAndroid Build Coastguard Worker if (!pw->password) {
625*03f9172cSAndroid Build Coastguard Worker os_free(pw);
626*03f9172cSAndroid Build Coastguard Worker return -1;
627*03f9172cSAndroid Build Coastguard Worker }
628*03f9172cSAndroid Build Coastguard Worker if (ssid->sae_password_id) {
629*03f9172cSAndroid Build Coastguard Worker pw->identifier = os_strdup(ssid->sae_password_id);
630*03f9172cSAndroid Build Coastguard Worker if (!pw->identifier) {
631*03f9172cSAndroid Build Coastguard Worker str_clear_free(pw->password);
632*03f9172cSAndroid Build Coastguard Worker os_free(pw);
633*03f9172cSAndroid Build Coastguard Worker return -1;
634*03f9172cSAndroid Build Coastguard Worker }
635*03f9172cSAndroid Build Coastguard Worker }
636*03f9172cSAndroid Build Coastguard Worker
637*03f9172cSAndroid Build Coastguard Worker pw->next = bss->sae_passwords;
638*03f9172cSAndroid Build Coastguard Worker bss->sae_passwords = pw;
639*03f9172cSAndroid Build Coastguard Worker }
640*03f9172cSAndroid Build Coastguard Worker
641*03f9172cSAndroid Build Coastguard Worker if (ssid->sae_pwe != DEFAULT_SAE_PWE)
642*03f9172cSAndroid Build Coastguard Worker bss->sae_pwe = ssid->sae_pwe;
643*03f9172cSAndroid Build Coastguard Worker else
644*03f9172cSAndroid Build Coastguard Worker bss->sae_pwe = wpa_s->conf->sae_pwe;
645*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_SAE */
646*03f9172cSAndroid Build Coastguard Worker
647*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->go_interworking) {
648*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
649*03f9172cSAndroid Build Coastguard Worker "P2P: Enable Interworking with access_network_type: %d",
650*03f9172cSAndroid Build Coastguard Worker wpa_s->conf->go_access_network_type);
651*03f9172cSAndroid Build Coastguard Worker bss->interworking = wpa_s->conf->go_interworking;
652*03f9172cSAndroid Build Coastguard Worker bss->access_network_type = wpa_s->conf->go_access_network_type;
653*03f9172cSAndroid Build Coastguard Worker bss->internet = wpa_s->conf->go_internet;
654*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->go_venue_group) {
655*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG,
656*03f9172cSAndroid Build Coastguard Worker "P2P: Venue group: %d Venue type: %d",
657*03f9172cSAndroid Build Coastguard Worker wpa_s->conf->go_venue_group,
658*03f9172cSAndroid Build Coastguard Worker wpa_s->conf->go_venue_type);
659*03f9172cSAndroid Build Coastguard Worker bss->venue_group = wpa_s->conf->go_venue_group;
660*03f9172cSAndroid Build Coastguard Worker bss->venue_type = wpa_s->conf->go_venue_type;
661*03f9172cSAndroid Build Coastguard Worker bss->venue_info_set = 1;
662*03f9172cSAndroid Build Coastguard Worker }
663*03f9172cSAndroid Build Coastguard Worker }
664*03f9172cSAndroid Build Coastguard Worker
665*03f9172cSAndroid Build Coastguard Worker if (ssid->ap_max_inactivity)
666*03f9172cSAndroid Build Coastguard Worker bss->ap_max_inactivity = ssid->ap_max_inactivity;
667*03f9172cSAndroid Build Coastguard Worker
668*03f9172cSAndroid Build Coastguard Worker if (ssid->dtim_period)
669*03f9172cSAndroid Build Coastguard Worker bss->dtim_period = ssid->dtim_period;
670*03f9172cSAndroid Build Coastguard Worker else if (wpa_s->conf->dtim_period)
671*03f9172cSAndroid Build Coastguard Worker bss->dtim_period = wpa_s->conf->dtim_period;
672*03f9172cSAndroid Build Coastguard Worker
673*03f9172cSAndroid Build Coastguard Worker if (ssid->beacon_int)
674*03f9172cSAndroid Build Coastguard Worker conf->beacon_int = ssid->beacon_int;
675*03f9172cSAndroid Build Coastguard Worker else if (wpa_s->conf->beacon_int)
676*03f9172cSAndroid Build Coastguard Worker conf->beacon_int = wpa_s->conf->beacon_int;
677*03f9172cSAndroid Build Coastguard Worker
678*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
679*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_P2P_GO ||
680*03f9172cSAndroid Build Coastguard Worker ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
681*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->p2p_go_ctwindow > conf->beacon_int) {
682*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_INFO,
683*03f9172cSAndroid Build Coastguard Worker "CTWindow (%d) is bigger than beacon interval (%d) - avoid configuring it",
684*03f9172cSAndroid Build Coastguard Worker wpa_s->conf->p2p_go_ctwindow,
685*03f9172cSAndroid Build Coastguard Worker conf->beacon_int);
686*03f9172cSAndroid Build Coastguard Worker conf->p2p_go_ctwindow = 0;
687*03f9172cSAndroid Build Coastguard Worker } else {
688*03f9172cSAndroid Build Coastguard Worker conf->p2p_go_ctwindow = wpa_s->conf->p2p_go_ctwindow;
689*03f9172cSAndroid Build Coastguard Worker }
690*03f9172cSAndroid Build Coastguard Worker }
691*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
692*03f9172cSAndroid Build Coastguard Worker
693*03f9172cSAndroid Build Coastguard Worker if ((bss->wpa & 2) && bss->rsn_pairwise == 0)
694*03f9172cSAndroid Build Coastguard Worker bss->rsn_pairwise = bss->wpa_pairwise;
695*03f9172cSAndroid Build Coastguard Worker bss->wpa_group = wpa_select_ap_group_cipher(bss->wpa, bss->wpa_pairwise,
696*03f9172cSAndroid Build Coastguard Worker bss->rsn_pairwise);
697*03f9172cSAndroid Build Coastguard Worker
698*03f9172cSAndroid Build Coastguard Worker if (bss->wpa && bss->ieee802_1x) {
699*03f9172cSAndroid Build Coastguard Worker bss->ssid.security_policy = SECURITY_WPA;
700*03f9172cSAndroid Build Coastguard Worker } else if (bss->wpa) {
701*03f9172cSAndroid Build Coastguard Worker bss->ssid.security_policy = SECURITY_WPA_PSK;
702*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WEP
703*03f9172cSAndroid Build Coastguard Worker } else if (bss->ieee802_1x) {
704*03f9172cSAndroid Build Coastguard Worker int cipher = WPA_CIPHER_NONE;
705*03f9172cSAndroid Build Coastguard Worker bss->ssid.security_policy = SECURITY_IEEE_802_1X;
706*03f9172cSAndroid Build Coastguard Worker bss->ssid.wep.default_len = bss->default_wep_key_len;
707*03f9172cSAndroid Build Coastguard Worker if (bss->default_wep_key_len)
708*03f9172cSAndroid Build Coastguard Worker cipher = bss->default_wep_key_len >= 13 ?
709*03f9172cSAndroid Build Coastguard Worker WPA_CIPHER_WEP104 : WPA_CIPHER_WEP40;
710*03f9172cSAndroid Build Coastguard Worker bss->wpa_group = cipher;
711*03f9172cSAndroid Build Coastguard Worker bss->wpa_pairwise = cipher;
712*03f9172cSAndroid Build Coastguard Worker bss->rsn_pairwise = cipher;
713*03f9172cSAndroid Build Coastguard Worker } else if (bss->ssid.wep.keys_set) {
714*03f9172cSAndroid Build Coastguard Worker int cipher = WPA_CIPHER_WEP40;
715*03f9172cSAndroid Build Coastguard Worker if (bss->ssid.wep.len[0] >= 13)
716*03f9172cSAndroid Build Coastguard Worker cipher = WPA_CIPHER_WEP104;
717*03f9172cSAndroid Build Coastguard Worker bss->ssid.security_policy = SECURITY_STATIC_WEP;
718*03f9172cSAndroid Build Coastguard Worker bss->wpa_group = cipher;
719*03f9172cSAndroid Build Coastguard Worker bss->wpa_pairwise = cipher;
720*03f9172cSAndroid Build Coastguard Worker bss->rsn_pairwise = cipher;
721*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WEP */
722*03f9172cSAndroid Build Coastguard Worker } else {
723*03f9172cSAndroid Build Coastguard Worker bss->ssid.security_policy = SECURITY_PLAINTEXT;
724*03f9172cSAndroid Build Coastguard Worker bss->wpa_group = WPA_CIPHER_NONE;
725*03f9172cSAndroid Build Coastguard Worker bss->wpa_pairwise = WPA_CIPHER_NONE;
726*03f9172cSAndroid Build Coastguard Worker bss->rsn_pairwise = WPA_CIPHER_NONE;
727*03f9172cSAndroid Build Coastguard Worker }
728*03f9172cSAndroid Build Coastguard Worker
729*03f9172cSAndroid Build Coastguard Worker if (bss->wpa_group_rekey < 86400 && (bss->wpa & 2) &&
730*03f9172cSAndroid Build Coastguard Worker (bss->wpa_group == WPA_CIPHER_CCMP ||
731*03f9172cSAndroid Build Coastguard Worker bss->wpa_group == WPA_CIPHER_GCMP ||
732*03f9172cSAndroid Build Coastguard Worker bss->wpa_group == WPA_CIPHER_CCMP_256 ||
733*03f9172cSAndroid Build Coastguard Worker bss->wpa_group == WPA_CIPHER_GCMP_256)) {
734*03f9172cSAndroid Build Coastguard Worker /*
735*03f9172cSAndroid Build Coastguard Worker * Strong ciphers do not need frequent rekeying, so increase
736*03f9172cSAndroid Build Coastguard Worker * the default GTK rekeying period to 24 hours.
737*03f9172cSAndroid Build Coastguard Worker */
738*03f9172cSAndroid Build Coastguard Worker bss->wpa_group_rekey = 86400;
739*03f9172cSAndroid Build Coastguard Worker }
740*03f9172cSAndroid Build Coastguard Worker
741*03f9172cSAndroid Build Coastguard Worker if (ssid->ieee80211w != MGMT_FRAME_PROTECTION_DEFAULT) {
742*03f9172cSAndroid Build Coastguard Worker bss->ieee80211w = ssid->ieee80211w;
743*03f9172cSAndroid Build Coastguard Worker } else if (wpa_s->conf->pmf != MGMT_FRAME_PROTECTION_DEFAULT) {
744*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_AP)
745*03f9172cSAndroid Build Coastguard Worker bss->ieee80211w = wpa_s->conf->pmf;
746*03f9172cSAndroid Build Coastguard Worker }
747*03f9172cSAndroid Build Coastguard Worker
748*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_OCV
749*03f9172cSAndroid Build Coastguard Worker bss->ocv = ssid->ocv;
750*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_OCV */
751*03f9172cSAndroid Build Coastguard Worker
752*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS
753*03f9172cSAndroid Build Coastguard Worker /*
754*03f9172cSAndroid Build Coastguard Worker * Enable WPS by default for open and WPA/WPA2-Personal network, but
755*03f9172cSAndroid Build Coastguard Worker * require user interaction to actually use it. Only the internal
756*03f9172cSAndroid Build Coastguard Worker * Registrar is supported.
757*03f9172cSAndroid Build Coastguard Worker */
758*03f9172cSAndroid Build Coastguard Worker if (bss->ssid.security_policy != SECURITY_WPA_PSK &&
759*03f9172cSAndroid Build Coastguard Worker bss->ssid.security_policy != SECURITY_PLAINTEXT)
760*03f9172cSAndroid Build Coastguard Worker goto no_wps;
761*03f9172cSAndroid Build Coastguard Worker if (bss->ssid.security_policy == SECURITY_WPA_PSK &&
762*03f9172cSAndroid Build Coastguard Worker (!(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)) ||
763*03f9172cSAndroid Build Coastguard Worker !(bss->wpa & 2)))
764*03f9172cSAndroid Build Coastguard Worker goto no_wps; /* WPS2 does not allow WPA/TKIP-only
765*03f9172cSAndroid Build Coastguard Worker * configuration */
766*03f9172cSAndroid Build Coastguard Worker if (ssid->wps_disabled)
767*03f9172cSAndroid Build Coastguard Worker goto no_wps;
768*03f9172cSAndroid Build Coastguard Worker bss->eap_server = 1;
769*03f9172cSAndroid Build Coastguard Worker
770*03f9172cSAndroid Build Coastguard Worker if (!ssid->ignore_broadcast_ssid)
771*03f9172cSAndroid Build Coastguard Worker bss->wps_state = 2;
772*03f9172cSAndroid Build Coastguard Worker
773*03f9172cSAndroid Build Coastguard Worker bss->ap_setup_locked = 2;
774*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->config_methods)
775*03f9172cSAndroid Build Coastguard Worker bss->config_methods = os_strdup(wpa_s->conf->config_methods);
776*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->device_type, wpa_s->conf->device_type,
777*03f9172cSAndroid Build Coastguard Worker WPS_DEV_TYPE_LEN);
778*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->device_name) {
779*03f9172cSAndroid Build Coastguard Worker bss->device_name = os_strdup(wpa_s->conf->device_name);
780*03f9172cSAndroid Build Coastguard Worker bss->friendly_name = os_strdup(wpa_s->conf->device_name);
781*03f9172cSAndroid Build Coastguard Worker }
782*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->manufacturer)
783*03f9172cSAndroid Build Coastguard Worker bss->manufacturer = os_strdup(wpa_s->conf->manufacturer);
784*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->model_name)
785*03f9172cSAndroid Build Coastguard Worker bss->model_name = os_strdup(wpa_s->conf->model_name);
786*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->model_number)
787*03f9172cSAndroid Build Coastguard Worker bss->model_number = os_strdup(wpa_s->conf->model_number);
788*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->serial_number)
789*03f9172cSAndroid Build Coastguard Worker bss->serial_number = os_strdup(wpa_s->conf->serial_number);
790*03f9172cSAndroid Build Coastguard Worker if (is_nil_uuid(wpa_s->conf->uuid))
791*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->uuid, wpa_s->wps->uuid, WPS_UUID_LEN);
792*03f9172cSAndroid Build Coastguard Worker else
793*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->uuid, wpa_s->conf->uuid, WPS_UUID_LEN);
794*03f9172cSAndroid Build Coastguard Worker os_memcpy(bss->os_version, wpa_s->conf->os_version, 4);
795*03f9172cSAndroid Build Coastguard Worker bss->pbc_in_m1 = wpa_s->conf->pbc_in_m1;
796*03f9172cSAndroid Build Coastguard Worker if (ssid->eap.fragment_size != DEFAULT_FRAGMENT_SIZE)
797*03f9172cSAndroid Build Coastguard Worker bss->fragment_size = ssid->eap.fragment_size;
798*03f9172cSAndroid Build Coastguard Worker no_wps:
799*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS */
800*03f9172cSAndroid Build Coastguard Worker
801*03f9172cSAndroid Build Coastguard Worker if (wpa_s->max_stations &&
802*03f9172cSAndroid Build Coastguard Worker wpa_s->max_stations < wpa_s->conf->max_num_sta)
803*03f9172cSAndroid Build Coastguard Worker bss->max_num_sta = wpa_s->max_stations;
804*03f9172cSAndroid Build Coastguard Worker else
805*03f9172cSAndroid Build Coastguard Worker bss->max_num_sta = wpa_s->conf->max_num_sta;
806*03f9172cSAndroid Build Coastguard Worker
807*03f9172cSAndroid Build Coastguard Worker if (!bss->isolate)
808*03f9172cSAndroid Build Coastguard Worker bss->isolate = wpa_s->conf->ap_isolate;
809*03f9172cSAndroid Build Coastguard Worker
810*03f9172cSAndroid Build Coastguard Worker bss->disassoc_low_ack = wpa_s->conf->disassoc_low_ack;
811*03f9172cSAndroid Build Coastguard Worker
812*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->ap_vendor_elements) {
813*03f9172cSAndroid Build Coastguard Worker bss->vendor_elements =
814*03f9172cSAndroid Build Coastguard Worker wpabuf_dup(wpa_s->conf->ap_vendor_elements);
815*03f9172cSAndroid Build Coastguard Worker }
816*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->ap_assocresp_elements) {
817*03f9172cSAndroid Build Coastguard Worker bss->assocresp_elements =
818*03f9172cSAndroid Build Coastguard Worker wpabuf_dup(wpa_s->conf->ap_assocresp_elements);
819*03f9172cSAndroid Build Coastguard Worker }
820*03f9172cSAndroid Build Coastguard Worker
821*03f9172cSAndroid Build Coastguard Worker bss->ftm_responder = wpa_s->conf->ftm_responder;
822*03f9172cSAndroid Build Coastguard Worker bss->ftm_initiator = wpa_s->conf->ftm_initiator;
823*03f9172cSAndroid Build Coastguard Worker
824*03f9172cSAndroid Build Coastguard Worker bss->transition_disable = ssid->transition_disable;
825*03f9172cSAndroid Build Coastguard Worker
826*03f9172cSAndroid Build Coastguard Worker return 0;
827*03f9172cSAndroid Build Coastguard Worker }
828*03f9172cSAndroid Build Coastguard Worker
829*03f9172cSAndroid Build Coastguard Worker
ap_public_action_rx(void * ctx,const u8 * buf,size_t len,int freq)830*03f9172cSAndroid Build Coastguard Worker static void ap_public_action_rx(void *ctx, const u8 *buf, size_t len, int freq)
831*03f9172cSAndroid Build Coastguard Worker {
832*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
833*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
834*03f9172cSAndroid Build Coastguard Worker const struct ieee80211_mgmt *mgmt;
835*03f9172cSAndroid Build Coastguard Worker
836*03f9172cSAndroid Build Coastguard Worker mgmt = (const struct ieee80211_mgmt *) buf;
837*03f9172cSAndroid Build Coastguard Worker if (len < IEEE80211_HDRLEN + 1)
838*03f9172cSAndroid Build Coastguard Worker return;
839*03f9172cSAndroid Build Coastguard Worker if (mgmt->u.action.category != WLAN_ACTION_PUBLIC)
840*03f9172cSAndroid Build Coastguard Worker return;
841*03f9172cSAndroid Build Coastguard Worker wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid,
842*03f9172cSAndroid Build Coastguard Worker mgmt->u.action.category,
843*03f9172cSAndroid Build Coastguard Worker buf + IEEE80211_HDRLEN + 1,
844*03f9172cSAndroid Build Coastguard Worker len - IEEE80211_HDRLEN - 1, freq);
845*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
846*03f9172cSAndroid Build Coastguard Worker }
847*03f9172cSAndroid Build Coastguard Worker
848*03f9172cSAndroid Build Coastguard Worker
ap_wps_event_cb(void * ctx,enum wps_event event,union wps_event_data * data)849*03f9172cSAndroid Build Coastguard Worker static void ap_wps_event_cb(void *ctx, enum wps_event event,
850*03f9172cSAndroid Build Coastguard Worker union wps_event_data *data)
851*03f9172cSAndroid Build Coastguard Worker {
852*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
853*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
854*03f9172cSAndroid Build Coastguard Worker
855*03f9172cSAndroid Build Coastguard Worker if (event == WPS_EV_FAIL) {
856*03f9172cSAndroid Build Coastguard Worker struct wps_event_fail *fail = &data->fail;
857*03f9172cSAndroid Build Coastguard Worker
858*03f9172cSAndroid Build Coastguard Worker if (wpa_s->p2pdev && wpa_s->p2pdev != wpa_s &&
859*03f9172cSAndroid Build Coastguard Worker wpa_s == wpa_s->global->p2p_group_formation) {
860*03f9172cSAndroid Build Coastguard Worker /*
861*03f9172cSAndroid Build Coastguard Worker * src/ap/wps_hostapd.c has already sent this on the
862*03f9172cSAndroid Build Coastguard Worker * main interface, so only send on the parent interface
863*03f9172cSAndroid Build Coastguard Worker * here if needed.
864*03f9172cSAndroid Build Coastguard Worker */
865*03f9172cSAndroid Build Coastguard Worker wpa_msg(wpa_s->p2pdev, MSG_INFO, WPS_EVENT_FAIL
866*03f9172cSAndroid Build Coastguard Worker "msg=%d config_error=%d",
867*03f9172cSAndroid Build Coastguard Worker fail->msg, fail->config_error);
868*03f9172cSAndroid Build Coastguard Worker }
869*03f9172cSAndroid Build Coastguard Worker wpas_p2p_wps_failed(wpa_s, fail);
870*03f9172cSAndroid Build Coastguard Worker }
871*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
872*03f9172cSAndroid Build Coastguard Worker }
873*03f9172cSAndroid Build Coastguard Worker
874*03f9172cSAndroid Build Coastguard Worker
ap_sta_authorized_cb(void * ctx,const u8 * mac_addr,int authorized,const u8 * p2p_dev_addr,const u8 * ip)875*03f9172cSAndroid Build Coastguard Worker static void ap_sta_authorized_cb(void *ctx, const u8 *mac_addr,
876*03f9172cSAndroid Build Coastguard Worker int authorized, const u8 *p2p_dev_addr,
877*03f9172cSAndroid Build Coastguard Worker const u8 *ip)
878*03f9172cSAndroid Build Coastguard Worker {
879*03f9172cSAndroid Build Coastguard Worker wpas_notify_sta_authorized(ctx, mac_addr, authorized, p2p_dev_addr, ip);
880*03f9172cSAndroid Build Coastguard Worker }
881*03f9172cSAndroid Build Coastguard Worker
882*03f9172cSAndroid Build Coastguard Worker
883*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
ap_new_psk_cb(void * ctx,const u8 * mac_addr,const u8 * p2p_dev_addr,const u8 * psk,size_t psk_len)884*03f9172cSAndroid Build Coastguard Worker static void ap_new_psk_cb(void *ctx, const u8 *mac_addr, const u8 *p2p_dev_addr,
885*03f9172cSAndroid Build Coastguard Worker const u8 *psk, size_t psk_len)
886*03f9172cSAndroid Build Coastguard Worker {
887*03f9172cSAndroid Build Coastguard Worker
888*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
889*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL || wpa_s->current_ssid == NULL)
890*03f9172cSAndroid Build Coastguard Worker return;
891*03f9172cSAndroid Build Coastguard Worker wpas_p2p_new_psk_cb(wpa_s, mac_addr, p2p_dev_addr, psk, psk_len);
892*03f9172cSAndroid Build Coastguard Worker }
893*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
894*03f9172cSAndroid Build Coastguard Worker
895*03f9172cSAndroid Build Coastguard Worker
ap_vendor_action_rx(void * ctx,const u8 * buf,size_t len,int freq)896*03f9172cSAndroid Build Coastguard Worker static int ap_vendor_action_rx(void *ctx, const u8 *buf, size_t len, int freq)
897*03f9172cSAndroid Build Coastguard Worker {
898*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
899*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
900*03f9172cSAndroid Build Coastguard Worker const struct ieee80211_mgmt *mgmt;
901*03f9172cSAndroid Build Coastguard Worker
902*03f9172cSAndroid Build Coastguard Worker mgmt = (const struct ieee80211_mgmt *) buf;
903*03f9172cSAndroid Build Coastguard Worker if (len < IEEE80211_HDRLEN + 1)
904*03f9172cSAndroid Build Coastguard Worker return -1;
905*03f9172cSAndroid Build Coastguard Worker wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid,
906*03f9172cSAndroid Build Coastguard Worker mgmt->u.action.category,
907*03f9172cSAndroid Build Coastguard Worker buf + IEEE80211_HDRLEN + 1,
908*03f9172cSAndroid Build Coastguard Worker len - IEEE80211_HDRLEN - 1, freq);
909*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
910*03f9172cSAndroid Build Coastguard Worker return 0;
911*03f9172cSAndroid Build Coastguard Worker }
912*03f9172cSAndroid Build Coastguard Worker
913*03f9172cSAndroid Build Coastguard Worker
ap_probe_req_rx(void * ctx,const u8 * sa,const u8 * da,const u8 * bssid,const u8 * ie,size_t ie_len,int ssi_signal)914*03f9172cSAndroid Build Coastguard Worker static int ap_probe_req_rx(void *ctx, const u8 *sa, const u8 *da,
915*03f9172cSAndroid Build Coastguard Worker const u8 *bssid, const u8 *ie, size_t ie_len,
916*03f9172cSAndroid Build Coastguard Worker int ssi_signal)
917*03f9172cSAndroid Build Coastguard Worker {
918*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
919*03f9172cSAndroid Build Coastguard Worker unsigned int freq = 0;
920*03f9172cSAndroid Build Coastguard Worker
921*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
922*03f9172cSAndroid Build Coastguard Worker freq = wpa_s->ap_iface->freq;
923*03f9172cSAndroid Build Coastguard Worker
924*03f9172cSAndroid Build Coastguard Worker return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len,
925*03f9172cSAndroid Build Coastguard Worker freq, ssi_signal);
926*03f9172cSAndroid Build Coastguard Worker }
927*03f9172cSAndroid Build Coastguard Worker
928*03f9172cSAndroid Build Coastguard Worker
ap_wps_reg_success_cb(void * ctx,const u8 * mac_addr,const u8 * uuid_e)929*03f9172cSAndroid Build Coastguard Worker static void ap_wps_reg_success_cb(void *ctx, const u8 *mac_addr,
930*03f9172cSAndroid Build Coastguard Worker const u8 *uuid_e)
931*03f9172cSAndroid Build Coastguard Worker {
932*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
933*03f9172cSAndroid Build Coastguard Worker wpas_p2p_wps_success(wpa_s, mac_addr, 1);
934*03f9172cSAndroid Build Coastguard Worker }
935*03f9172cSAndroid Build Coastguard Worker
936*03f9172cSAndroid Build Coastguard Worker
wpas_ap_configured_cb(void * ctx)937*03f9172cSAndroid Build Coastguard Worker static void wpas_ap_configured_cb(void *ctx)
938*03f9172cSAndroid Build Coastguard Worker {
939*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
940*03f9172cSAndroid Build Coastguard Worker
941*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "AP interface setup completed - state %s",
942*03f9172cSAndroid Build Coastguard Worker hostapd_state_text(wpa_s->ap_iface->state));
943*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface->state == HAPD_IFACE_DISABLED) {
944*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
945*03f9172cSAndroid Build Coastguard Worker return;
946*03f9172cSAndroid Build Coastguard Worker }
947*03f9172cSAndroid Build Coastguard Worker
948*03f9172cSAndroid Build Coastguard Worker if (wpa_s->current_ssid) {
949*03f9172cSAndroid Build Coastguard Worker int acs = 0;
950*03f9172cSAndroid Build Coastguard Worker
951*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_ACS
952*03f9172cSAndroid Build Coastguard Worker acs = wpa_s->current_ssid->acs;
953*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_ACS */
954*03f9172cSAndroid Build Coastguard Worker if (acs || (wpa_s->assoc_freq && wpa_s->ap_iface->freq &&
955*03f9172cSAndroid Build Coastguard Worker (int) wpa_s->assoc_freq != wpa_s->ap_iface->freq)) {
956*03f9172cSAndroid Build Coastguard Worker wpa_s->assoc_freq = wpa_s->ap_iface->freq;
957*03f9172cSAndroid Build Coastguard Worker wpa_s->current_ssid->frequency = wpa_s->ap_iface->freq;
958*03f9172cSAndroid Build Coastguard Worker }
959*03f9172cSAndroid Build Coastguard Worker }
960*03f9172cSAndroid Build Coastguard Worker
961*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
962*03f9172cSAndroid Build Coastguard Worker
963*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_configured_cb)
964*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_configured_cb(wpa_s->ap_configured_cb_ctx,
965*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_configured_cb_data);
966*03f9172cSAndroid Build Coastguard Worker }
967*03f9172cSAndroid Build Coastguard Worker
968*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_create_ap(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)969*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
970*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid)
971*03f9172cSAndroid Build Coastguard Worker {
972*03f9172cSAndroid Build Coastguard Worker struct wpa_driver_associate_params params;
973*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *hapd_iface;
974*03f9172cSAndroid Build Coastguard Worker struct hostapd_config *conf;
975*03f9172cSAndroid Build Coastguard Worker size_t i;
976*03f9172cSAndroid Build Coastguard Worker
977*03f9172cSAndroid Build Coastguard Worker if (ssid->ssid == NULL || ssid->ssid_len == 0) {
978*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR, "No SSID configured for AP mode");
979*03f9172cSAndroid Build Coastguard Worker return -1;
980*03f9172cSAndroid Build Coastguard Worker }
981*03f9172cSAndroid Build Coastguard Worker
982*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
983*03f9172cSAndroid Build Coastguard Worker
984*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "Setting up AP (SSID='%s')",
985*03f9172cSAndroid Build Coastguard Worker wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
986*03f9172cSAndroid Build Coastguard Worker
987*03f9172cSAndroid Build Coastguard Worker os_memset(¶ms, 0, sizeof(params));
988*03f9172cSAndroid Build Coastguard Worker params.ssid = ssid->ssid;
989*03f9172cSAndroid Build Coastguard Worker params.ssid_len = ssid->ssid_len;
990*03f9172cSAndroid Build Coastguard Worker switch (ssid->mode) {
991*03f9172cSAndroid Build Coastguard Worker case WPAS_MODE_AP:
992*03f9172cSAndroid Build Coastguard Worker case WPAS_MODE_P2P_GO:
993*03f9172cSAndroid Build Coastguard Worker case WPAS_MODE_P2P_GROUP_FORMATION:
994*03f9172cSAndroid Build Coastguard Worker params.mode = IEEE80211_MODE_AP;
995*03f9172cSAndroid Build Coastguard Worker break;
996*03f9172cSAndroid Build Coastguard Worker default:
997*03f9172cSAndroid Build Coastguard Worker return -1;
998*03f9172cSAndroid Build Coastguard Worker }
999*03f9172cSAndroid Build Coastguard Worker if (ssid->frequency == 0)
1000*03f9172cSAndroid Build Coastguard Worker ssid->frequency = 2462; /* default channel 11 */
1001*03f9172cSAndroid Build Coastguard Worker params.freq.freq = ssid->frequency;
1002*03f9172cSAndroid Build Coastguard Worker
1003*03f9172cSAndroid Build Coastguard Worker if ((ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO) &&
1004*03f9172cSAndroid Build Coastguard Worker ssid->enable_edmg) {
1005*03f9172cSAndroid Build Coastguard Worker u8 primary_channel;
1006*03f9172cSAndroid Build Coastguard Worker
1007*03f9172cSAndroid Build Coastguard Worker if (ieee80211_freq_to_chan(ssid->frequency, &primary_channel) ==
1008*03f9172cSAndroid Build Coastguard Worker NUM_HOSTAPD_MODES) {
1009*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_WARNING,
1010*03f9172cSAndroid Build Coastguard Worker "EDMG: Failed to get the primary channel");
1011*03f9172cSAndroid Build Coastguard Worker return -1;
1012*03f9172cSAndroid Build Coastguard Worker }
1013*03f9172cSAndroid Build Coastguard Worker
1014*03f9172cSAndroid Build Coastguard Worker hostapd_encode_edmg_chan(ssid->enable_edmg, ssid->edmg_channel,
1015*03f9172cSAndroid Build Coastguard Worker primary_channel, ¶ms.freq.edmg);
1016*03f9172cSAndroid Build Coastguard Worker }
1017*03f9172cSAndroid Build Coastguard Worker
1018*03f9172cSAndroid Build Coastguard Worker params.wpa_proto = ssid->proto;
1019*03f9172cSAndroid Build Coastguard Worker if (ssid->key_mgmt & WPA_KEY_MGMT_PSK)
1020*03f9172cSAndroid Build Coastguard Worker wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1021*03f9172cSAndroid Build Coastguard Worker else if (ssid->key_mgmt & WPA_KEY_MGMT_SAE)
1022*03f9172cSAndroid Build Coastguard Worker wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1023*03f9172cSAndroid Build Coastguard Worker else
1024*03f9172cSAndroid Build Coastguard Worker wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
1025*03f9172cSAndroid Build Coastguard Worker params.key_mgmt_suite = wpa_s->key_mgmt;
1026*03f9172cSAndroid Build Coastguard Worker
1027*03f9172cSAndroid Build Coastguard Worker wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(ssid->pairwise_cipher,
1028*03f9172cSAndroid Build Coastguard Worker 1);
1029*03f9172cSAndroid Build Coastguard Worker if (wpa_s->pairwise_cipher < 0) {
1030*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise "
1031*03f9172cSAndroid Build Coastguard Worker "cipher.");
1032*03f9172cSAndroid Build Coastguard Worker return -1;
1033*03f9172cSAndroid Build Coastguard Worker }
1034*03f9172cSAndroid Build Coastguard Worker params.pairwise_suite = wpa_s->pairwise_cipher;
1035*03f9172cSAndroid Build Coastguard Worker params.group_suite = params.pairwise_suite;
1036*03f9172cSAndroid Build Coastguard Worker
1037*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
1038*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_P2P_GO ||
1039*03f9172cSAndroid Build Coastguard Worker ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1040*03f9172cSAndroid Build Coastguard Worker params.p2p = 1;
1041*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
1042*03f9172cSAndroid Build Coastguard Worker
1043*03f9172cSAndroid Build Coastguard Worker if (wpa_s->p2pdev->set_ap_uapsd)
1044*03f9172cSAndroid Build Coastguard Worker params.uapsd = wpa_s->p2pdev->ap_uapsd;
1045*03f9172cSAndroid Build Coastguard Worker else if (params.p2p && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_UAPSD))
1046*03f9172cSAndroid Build Coastguard Worker params.uapsd = 1; /* mandatory for P2P GO */
1047*03f9172cSAndroid Build Coastguard Worker else
1048*03f9172cSAndroid Build Coastguard Worker params.uapsd = -1;
1049*03f9172cSAndroid Build Coastguard Worker
1050*03f9172cSAndroid Build Coastguard Worker if (ieee80211_is_dfs(params.freq.freq, wpa_s->hw.modes,
1051*03f9172cSAndroid Build Coastguard Worker wpa_s->hw.num_modes))
1052*03f9172cSAndroid Build Coastguard Worker params.freq.freq = 0; /* set channel after CAC */
1053*03f9172cSAndroid Build Coastguard Worker
1054*03f9172cSAndroid Build Coastguard Worker if (params.p2p)
1055*03f9172cSAndroid Build Coastguard Worker wpa_drv_get_ext_capa(wpa_s, WPA_IF_P2P_GO);
1056*03f9172cSAndroid Build Coastguard Worker else
1057*03f9172cSAndroid Build Coastguard Worker wpa_drv_get_ext_capa(wpa_s, WPA_IF_AP_BSS);
1058*03f9172cSAndroid Build Coastguard Worker
1059*03f9172cSAndroid Build Coastguard Worker if (wpa_drv_associate(wpa_s, ¶ms) < 0) {
1060*03f9172cSAndroid Build Coastguard Worker wpa_msg(wpa_s, MSG_INFO, "Failed to start AP functionality");
1061*03f9172cSAndroid Build Coastguard Worker return -1;
1062*03f9172cSAndroid Build Coastguard Worker }
1063*03f9172cSAndroid Build Coastguard Worker
1064*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface = hapd_iface = hostapd_alloc_iface();
1065*03f9172cSAndroid Build Coastguard Worker if (hapd_iface == NULL)
1066*03f9172cSAndroid Build Coastguard Worker return -1;
1067*03f9172cSAndroid Build Coastguard Worker hapd_iface->owner = wpa_s;
1068*03f9172cSAndroid Build Coastguard Worker hapd_iface->drv_flags = wpa_s->drv_flags;
1069*03f9172cSAndroid Build Coastguard Worker hapd_iface->drv_flags2 = wpa_s->drv_flags2;
1070*03f9172cSAndroid Build Coastguard Worker hapd_iface->probe_resp_offloads = wpa_s->probe_resp_offloads;
1071*03f9172cSAndroid Build Coastguard Worker hapd_iface->extended_capa = wpa_s->extended_capa;
1072*03f9172cSAndroid Build Coastguard Worker hapd_iface->extended_capa_mask = wpa_s->extended_capa_mask;
1073*03f9172cSAndroid Build Coastguard Worker hapd_iface->extended_capa_len = wpa_s->extended_capa_len;
1074*03f9172cSAndroid Build Coastguard Worker hapd_iface->drv_max_acl_mac_addrs = wpa_s->drv_max_acl_mac_addrs;
1075*03f9172cSAndroid Build Coastguard Worker
1076*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->conf = conf = hostapd_config_defaults();
1077*03f9172cSAndroid Build Coastguard Worker if (conf == NULL) {
1078*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
1079*03f9172cSAndroid Build Coastguard Worker return -1;
1080*03f9172cSAndroid Build Coastguard Worker }
1081*03f9172cSAndroid Build Coastguard Worker
1082*03f9172cSAndroid Build Coastguard Worker os_memcpy(wpa_s->ap_iface->conf->wmm_ac_params,
1083*03f9172cSAndroid Build Coastguard Worker wpa_s->conf->wmm_ac_params,
1084*03f9172cSAndroid Build Coastguard Worker sizeof(wpa_s->conf->wmm_ac_params));
1085*03f9172cSAndroid Build Coastguard Worker
1086*03f9172cSAndroid Build Coastguard Worker os_memcpy(wpa_s->ap_iface->conf->tx_queue, wpa_s->conf->tx_queue,
1087*03f9172cSAndroid Build Coastguard Worker sizeof(wpa_s->conf->tx_queue));
1088*03f9172cSAndroid Build Coastguard Worker
1089*03f9172cSAndroid Build Coastguard Worker if (params.uapsd > 0) {
1090*03f9172cSAndroid Build Coastguard Worker conf->bss[0]->wmm_enabled = 1;
1091*03f9172cSAndroid Build Coastguard Worker conf->bss[0]->wmm_uapsd = 1;
1092*03f9172cSAndroid Build Coastguard Worker }
1093*03f9172cSAndroid Build Coastguard Worker
1094*03f9172cSAndroid Build Coastguard Worker if (wpa_supplicant_conf_ap(wpa_s, ssid, conf)) {
1095*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR, "Failed to create AP configuration");
1096*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
1097*03f9172cSAndroid Build Coastguard Worker return -1;
1098*03f9172cSAndroid Build Coastguard Worker }
1099*03f9172cSAndroid Build Coastguard Worker
1100*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
1101*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_P2P_GO)
1102*03f9172cSAndroid Build Coastguard Worker conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER;
1103*03f9172cSAndroid Build Coastguard Worker else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1104*03f9172cSAndroid Build Coastguard Worker conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER |
1105*03f9172cSAndroid Build Coastguard Worker P2P_GROUP_FORMATION;
1106*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
1107*03f9172cSAndroid Build Coastguard Worker
1108*03f9172cSAndroid Build Coastguard Worker hapd_iface->num_bss = conf->num_bss;
1109*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss = os_calloc(conf->num_bss,
1110*03f9172cSAndroid Build Coastguard Worker sizeof(struct hostapd_data *));
1111*03f9172cSAndroid Build Coastguard Worker if (hapd_iface->bss == NULL) {
1112*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
1113*03f9172cSAndroid Build Coastguard Worker return -1;
1114*03f9172cSAndroid Build Coastguard Worker }
1115*03f9172cSAndroid Build Coastguard Worker
1116*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < conf->num_bss; i++) {
1117*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i] =
1118*03f9172cSAndroid Build Coastguard Worker hostapd_alloc_bss_data(hapd_iface, conf,
1119*03f9172cSAndroid Build Coastguard Worker conf->bss[i]);
1120*03f9172cSAndroid Build Coastguard Worker if (hapd_iface->bss[i] == NULL) {
1121*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
1122*03f9172cSAndroid Build Coastguard Worker return -1;
1123*03f9172cSAndroid Build Coastguard Worker }
1124*03f9172cSAndroid Build Coastguard Worker
1125*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->msg_ctx = wpa_s;
1126*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->msg_ctx_parent = wpa_s->p2pdev;
1127*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->public_action_cb = ap_public_action_rx;
1128*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->public_action_cb_ctx = wpa_s;
1129*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->vendor_action_cb = ap_vendor_action_rx;
1130*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->vendor_action_cb_ctx = wpa_s;
1131*03f9172cSAndroid Build Coastguard Worker hostapd_register_probereq_cb(hapd_iface->bss[i],
1132*03f9172cSAndroid Build Coastguard Worker ap_probe_req_rx, wpa_s);
1133*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->wps_reg_success_cb = ap_wps_reg_success_cb;
1134*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->wps_reg_success_cb_ctx = wpa_s;
1135*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->wps_event_cb = ap_wps_event_cb;
1136*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->wps_event_cb_ctx = wpa_s;
1137*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->sta_authorized_cb = ap_sta_authorized_cb;
1138*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->sta_authorized_cb_ctx = wpa_s;
1139*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
1140*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->new_psk_cb = ap_new_psk_cb;
1141*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->new_psk_cb_ctx = wpa_s;
1142*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->p2p = wpa_s->global->p2p;
1143*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->p2p_group = wpas_p2p_group_init(wpa_s,
1144*03f9172cSAndroid Build Coastguard Worker ssid);
1145*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
1146*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->setup_complete_cb = wpas_ap_configured_cb;
1147*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->setup_complete_cb_ctx = wpa_s;
1148*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_TESTING_OPTIONS
1149*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->ext_eapol_frame_io =
1150*03f9172cSAndroid Build Coastguard Worker wpa_s->ext_eapol_frame_io;
1151*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_TESTING_OPTIONS */
1152*03f9172cSAndroid Build Coastguard Worker
1153*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WNM_AP
1154*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_AP)
1155*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[i]->conf->bss_transition = 1;
1156*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WNM_AP */
1157*03f9172cSAndroid Build Coastguard Worker }
1158*03f9172cSAndroid Build Coastguard Worker
1159*03f9172cSAndroid Build Coastguard Worker os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN);
1160*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[0]->driver = wpa_s->driver;
1161*03f9172cSAndroid Build Coastguard Worker hapd_iface->bss[0]->drv_priv = wpa_s->drv_priv;
1162*03f9172cSAndroid Build Coastguard Worker
1163*03f9172cSAndroid Build Coastguard Worker wpa_s->current_ssid = ssid;
1164*03f9172cSAndroid Build Coastguard Worker eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1165*03f9172cSAndroid Build Coastguard Worker os_memcpy(wpa_s->bssid, wpa_s->own_addr, ETH_ALEN);
1166*03f9172cSAndroid Build Coastguard Worker wpa_s->assoc_freq = ssid->frequency;
1167*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->conf->enable_edmg = ssid->enable_edmg;
1168*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->conf->edmg_channel = ssid->edmg_channel;
1169*03f9172cSAndroid Build Coastguard Worker
1170*03f9172cSAndroid Build Coastguard Worker #if defined(CONFIG_P2P) && defined(CONFIG_ACS)
1171*03f9172cSAndroid Build Coastguard Worker if (wpa_s->p2p_go_do_acs) {
1172*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->conf->channel = 0;
1173*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->conf->hw_mode = wpa_s->p2p_go_acs_band;
1174*03f9172cSAndroid Build Coastguard Worker ssid->acs = 1;
1175*03f9172cSAndroid Build Coastguard Worker }
1176*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P && CONFIG_ACS */
1177*03f9172cSAndroid Build Coastguard Worker
1178*03f9172cSAndroid Build Coastguard Worker if (hostapd_setup_interface(wpa_s->ap_iface)) {
1179*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_ERROR, "Failed to initialize AP interface");
1180*03f9172cSAndroid Build Coastguard Worker wpa_supplicant_ap_deinit(wpa_s);
1181*03f9172cSAndroid Build Coastguard Worker return -1;
1182*03f9172cSAndroid Build Coastguard Worker }
1183*03f9172cSAndroid Build Coastguard Worker
1184*03f9172cSAndroid Build Coastguard Worker return 0;
1185*03f9172cSAndroid Build Coastguard Worker }
1186*03f9172cSAndroid Build Coastguard Worker
1187*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_deinit(struct wpa_supplicant * wpa_s)1188*03f9172cSAndroid Build Coastguard Worker void wpa_supplicant_ap_deinit(struct wpa_supplicant *wpa_s)
1189*03f9172cSAndroid Build Coastguard Worker {
1190*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS
1191*03f9172cSAndroid Build Coastguard Worker eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL);
1192*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS */
1193*03f9172cSAndroid Build Coastguard Worker
1194*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1195*03f9172cSAndroid Build Coastguard Worker return;
1196*03f9172cSAndroid Build Coastguard Worker
1197*03f9172cSAndroid Build Coastguard Worker wpa_s->current_ssid = NULL;
1198*03f9172cSAndroid Build Coastguard Worker eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1199*03f9172cSAndroid Build Coastguard Worker wpa_s->assoc_freq = 0;
1200*03f9172cSAndroid Build Coastguard Worker wpas_p2p_ap_deinit(wpa_s);
1201*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->driver_ap_teardown =
1202*03f9172cSAndroid Build Coastguard Worker !!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT);
1203*03f9172cSAndroid Build Coastguard Worker
1204*03f9172cSAndroid Build Coastguard Worker hostapd_interface_deinit(wpa_s->ap_iface);
1205*03f9172cSAndroid Build Coastguard Worker hostapd_interface_free(wpa_s->ap_iface);
1206*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface = NULL;
1207*03f9172cSAndroid Build Coastguard Worker wpa_drv_deinit_ap(wpa_s);
1208*03f9172cSAndroid Build Coastguard Worker wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
1209*03f9172cSAndroid Build Coastguard Worker " reason=%d locally_generated=1",
1210*03f9172cSAndroid Build Coastguard Worker MAC2STR(wpa_s->own_addr), WLAN_REASON_DEAUTH_LEAVING);
1211*03f9172cSAndroid Build Coastguard Worker }
1212*03f9172cSAndroid Build Coastguard Worker
1213*03f9172cSAndroid Build Coastguard Worker
ap_tx_status(void * ctx,const u8 * addr,const u8 * buf,size_t len,int ack)1214*03f9172cSAndroid Build Coastguard Worker void ap_tx_status(void *ctx, const u8 *addr,
1215*03f9172cSAndroid Build Coastguard Worker const u8 *buf, size_t len, int ack)
1216*03f9172cSAndroid Build Coastguard Worker {
1217*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1218*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
1219*03f9172cSAndroid Build Coastguard Worker hostapd_tx_status(wpa_s->ap_iface->bss[0], addr, buf, len, ack);
1220*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1221*03f9172cSAndroid Build Coastguard Worker }
1222*03f9172cSAndroid Build Coastguard Worker
1223*03f9172cSAndroid Build Coastguard Worker
ap_eapol_tx_status(void * ctx,const u8 * dst,const u8 * data,size_t len,int ack)1224*03f9172cSAndroid Build Coastguard Worker void ap_eapol_tx_status(void *ctx, const u8 *dst,
1225*03f9172cSAndroid Build Coastguard Worker const u8 *data, size_t len, int ack)
1226*03f9172cSAndroid Build Coastguard Worker {
1227*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1228*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
1229*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
1230*03f9172cSAndroid Build Coastguard Worker return;
1231*03f9172cSAndroid Build Coastguard Worker hostapd_tx_status(wpa_s->ap_iface->bss[0], dst, data, len, ack);
1232*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1233*03f9172cSAndroid Build Coastguard Worker }
1234*03f9172cSAndroid Build Coastguard Worker
1235*03f9172cSAndroid Build Coastguard Worker
ap_client_poll_ok(void * ctx,const u8 * addr)1236*03f9172cSAndroid Build Coastguard Worker void ap_client_poll_ok(void *ctx, const u8 *addr)
1237*03f9172cSAndroid Build Coastguard Worker {
1238*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1239*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
1240*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1241*03f9172cSAndroid Build Coastguard Worker hostapd_client_poll_ok(wpa_s->ap_iface->bss[0], addr);
1242*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1243*03f9172cSAndroid Build Coastguard Worker }
1244*03f9172cSAndroid Build Coastguard Worker
1245*03f9172cSAndroid Build Coastguard Worker
ap_rx_from_unknown_sta(void * ctx,const u8 * addr,int wds)1246*03f9172cSAndroid Build Coastguard Worker void ap_rx_from_unknown_sta(void *ctx, const u8 *addr, int wds)
1247*03f9172cSAndroid Build Coastguard Worker {
1248*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1249*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
1250*03f9172cSAndroid Build Coastguard Worker ieee802_11_rx_from_unknown(wpa_s->ap_iface->bss[0], addr, wds);
1251*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1252*03f9172cSAndroid Build Coastguard Worker }
1253*03f9172cSAndroid Build Coastguard Worker
1254*03f9172cSAndroid Build Coastguard Worker
ap_mgmt_rx(void * ctx,struct rx_mgmt * rx_mgmt)1255*03f9172cSAndroid Build Coastguard Worker void ap_mgmt_rx(void *ctx, struct rx_mgmt *rx_mgmt)
1256*03f9172cSAndroid Build Coastguard Worker {
1257*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1258*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
1259*03f9172cSAndroid Build Coastguard Worker struct hostapd_frame_info fi;
1260*03f9172cSAndroid Build Coastguard Worker os_memset(&fi, 0, sizeof(fi));
1261*03f9172cSAndroid Build Coastguard Worker fi.freq = rx_mgmt->freq;
1262*03f9172cSAndroid Build Coastguard Worker fi.datarate = rx_mgmt->datarate;
1263*03f9172cSAndroid Build Coastguard Worker fi.ssi_signal = rx_mgmt->ssi_signal;
1264*03f9172cSAndroid Build Coastguard Worker ieee802_11_mgmt(wpa_s->ap_iface->bss[0], rx_mgmt->frame,
1265*03f9172cSAndroid Build Coastguard Worker rx_mgmt->frame_len, &fi);
1266*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1267*03f9172cSAndroid Build Coastguard Worker }
1268*03f9172cSAndroid Build Coastguard Worker
1269*03f9172cSAndroid Build Coastguard Worker
ap_mgmt_tx_cb(void * ctx,const u8 * buf,size_t len,u16 stype,int ok)1270*03f9172cSAndroid Build Coastguard Worker void ap_mgmt_tx_cb(void *ctx, const u8 *buf, size_t len, u16 stype, int ok)
1271*03f9172cSAndroid Build Coastguard Worker {
1272*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1273*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = ctx;
1274*03f9172cSAndroid Build Coastguard Worker ieee802_11_mgmt_cb(wpa_s->ap_iface->bss[0], buf, len, stype, ok);
1275*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1276*03f9172cSAndroid Build Coastguard Worker }
1277*03f9172cSAndroid Build Coastguard Worker
1278*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_rx_eapol(struct wpa_supplicant * wpa_s,const u8 * src_addr,const u8 * buf,size_t len,enum frame_encryption encrypted)1279*03f9172cSAndroid Build Coastguard Worker void wpa_supplicant_ap_rx_eapol(struct wpa_supplicant *wpa_s,
1280*03f9172cSAndroid Build Coastguard Worker const u8 *src_addr, const u8 *buf, size_t len,
1281*03f9172cSAndroid Build Coastguard Worker enum frame_encryption encrypted)
1282*03f9172cSAndroid Build Coastguard Worker {
1283*03f9172cSAndroid Build Coastguard Worker ieee802_1x_receive(wpa_s->ap_iface->bss[0], src_addr, buf, len,
1284*03f9172cSAndroid Build Coastguard Worker encrypted);
1285*03f9172cSAndroid Build Coastguard Worker }
1286*03f9172cSAndroid Build Coastguard Worker
1287*03f9172cSAndroid Build Coastguard Worker
1288*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS
1289*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_wps_pbc(struct wpa_supplicant * wpa_s,const u8 * bssid,const u8 * p2p_dev_addr)1290*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_ap_wps_pbc(struct wpa_supplicant *wpa_s, const u8 *bssid,
1291*03f9172cSAndroid Build Coastguard Worker const u8 *p2p_dev_addr)
1292*03f9172cSAndroid Build Coastguard Worker {
1293*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
1294*03f9172cSAndroid Build Coastguard Worker return -1;
1295*03f9172cSAndroid Build Coastguard Worker return hostapd_wps_button_pushed(wpa_s->ap_iface->bss[0],
1296*03f9172cSAndroid Build Coastguard Worker p2p_dev_addr);
1297*03f9172cSAndroid Build Coastguard Worker }
1298*03f9172cSAndroid Build Coastguard Worker
1299*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_wps_cancel(struct wpa_supplicant * wpa_s)1300*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_ap_wps_cancel(struct wpa_supplicant *wpa_s)
1301*03f9172cSAndroid Build Coastguard Worker {
1302*03f9172cSAndroid Build Coastguard Worker struct wps_registrar *reg;
1303*03f9172cSAndroid Build Coastguard Worker int reg_sel = 0, wps_sta = 0;
1304*03f9172cSAndroid Build Coastguard Worker
1305*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]->wps)
1306*03f9172cSAndroid Build Coastguard Worker return -1;
1307*03f9172cSAndroid Build Coastguard Worker
1308*03f9172cSAndroid Build Coastguard Worker reg = wpa_s->ap_iface->bss[0]->wps->registrar;
1309*03f9172cSAndroid Build Coastguard Worker reg_sel = wps_registrar_wps_cancel(reg);
1310*03f9172cSAndroid Build Coastguard Worker wps_sta = ap_for_each_sta(wpa_s->ap_iface->bss[0],
1311*03f9172cSAndroid Build Coastguard Worker ap_sta_wps_cancel, NULL);
1312*03f9172cSAndroid Build Coastguard Worker
1313*03f9172cSAndroid Build Coastguard Worker if (!reg_sel && !wps_sta) {
1314*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "No WPS operation in progress at this "
1315*03f9172cSAndroid Build Coastguard Worker "time");
1316*03f9172cSAndroid Build Coastguard Worker return -1;
1317*03f9172cSAndroid Build Coastguard Worker }
1318*03f9172cSAndroid Build Coastguard Worker
1319*03f9172cSAndroid Build Coastguard Worker /*
1320*03f9172cSAndroid Build Coastguard Worker * There are 2 cases to return wps cancel as success:
1321*03f9172cSAndroid Build Coastguard Worker * 1. When wps cancel was initiated but no connection has been
1322*03f9172cSAndroid Build Coastguard Worker * established with client yet.
1323*03f9172cSAndroid Build Coastguard Worker * 2. Client is in the middle of exchanging WPS messages.
1324*03f9172cSAndroid Build Coastguard Worker */
1325*03f9172cSAndroid Build Coastguard Worker
1326*03f9172cSAndroid Build Coastguard Worker return 0;
1327*03f9172cSAndroid Build Coastguard Worker }
1328*03f9172cSAndroid Build Coastguard Worker
1329*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_wps_pin(struct wpa_supplicant * wpa_s,const u8 * bssid,const char * pin,char * buf,size_t buflen,int timeout)1330*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_ap_wps_pin(struct wpa_supplicant *wpa_s, const u8 *bssid,
1331*03f9172cSAndroid Build Coastguard Worker const char *pin, char *buf, size_t buflen,
1332*03f9172cSAndroid Build Coastguard Worker int timeout)
1333*03f9172cSAndroid Build Coastguard Worker {
1334*03f9172cSAndroid Build Coastguard Worker int ret, ret_len = 0;
1335*03f9172cSAndroid Build Coastguard Worker
1336*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
1337*03f9172cSAndroid Build Coastguard Worker return -1;
1338*03f9172cSAndroid Build Coastguard Worker
1339*03f9172cSAndroid Build Coastguard Worker if (pin == NULL) {
1340*03f9172cSAndroid Build Coastguard Worker unsigned int rpin;
1341*03f9172cSAndroid Build Coastguard Worker
1342*03f9172cSAndroid Build Coastguard Worker if (wps_generate_pin(&rpin) < 0)
1343*03f9172cSAndroid Build Coastguard Worker return -1;
1344*03f9172cSAndroid Build Coastguard Worker ret_len = os_snprintf(buf, buflen, "%08d", rpin);
1345*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(buflen, ret_len))
1346*03f9172cSAndroid Build Coastguard Worker return -1;
1347*03f9172cSAndroid Build Coastguard Worker pin = buf;
1348*03f9172cSAndroid Build Coastguard Worker } else if (buf) {
1349*03f9172cSAndroid Build Coastguard Worker ret_len = os_snprintf(buf, buflen, "%s", pin);
1350*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(buflen, ret_len))
1351*03f9172cSAndroid Build Coastguard Worker return -1;
1352*03f9172cSAndroid Build Coastguard Worker }
1353*03f9172cSAndroid Build Coastguard Worker
1354*03f9172cSAndroid Build Coastguard Worker ret = hostapd_wps_add_pin(wpa_s->ap_iface->bss[0], bssid, "any", pin,
1355*03f9172cSAndroid Build Coastguard Worker timeout);
1356*03f9172cSAndroid Build Coastguard Worker if (ret)
1357*03f9172cSAndroid Build Coastguard Worker return -1;
1358*03f9172cSAndroid Build Coastguard Worker return ret_len;
1359*03f9172cSAndroid Build Coastguard Worker }
1360*03f9172cSAndroid Build Coastguard Worker
1361*03f9172cSAndroid Build Coastguard Worker
wpas_wps_ap_pin_timeout(void * eloop_data,void * user_ctx)1362*03f9172cSAndroid Build Coastguard Worker static void wpas_wps_ap_pin_timeout(void *eloop_data, void *user_ctx)
1363*03f9172cSAndroid Build Coastguard Worker {
1364*03f9172cSAndroid Build Coastguard Worker struct wpa_supplicant *wpa_s = eloop_data;
1365*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "WPS: AP PIN timed out");
1366*03f9172cSAndroid Build Coastguard Worker wpas_wps_ap_pin_disable(wpa_s);
1367*03f9172cSAndroid Build Coastguard Worker }
1368*03f9172cSAndroid Build Coastguard Worker
1369*03f9172cSAndroid Build Coastguard Worker
wpas_wps_ap_pin_enable(struct wpa_supplicant * wpa_s,int timeout)1370*03f9172cSAndroid Build Coastguard Worker static void wpas_wps_ap_pin_enable(struct wpa_supplicant *wpa_s, int timeout)
1371*03f9172cSAndroid Build Coastguard Worker {
1372*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1373*03f9172cSAndroid Build Coastguard Worker
1374*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1375*03f9172cSAndroid Build Coastguard Worker return;
1376*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1377*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "WPS: Enabling AP PIN (timeout=%d)", timeout);
1378*03f9172cSAndroid Build Coastguard Worker hapd->ap_pin_failures = 0;
1379*03f9172cSAndroid Build Coastguard Worker eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL);
1380*03f9172cSAndroid Build Coastguard Worker if (timeout > 0)
1381*03f9172cSAndroid Build Coastguard Worker eloop_register_timeout(timeout, 0,
1382*03f9172cSAndroid Build Coastguard Worker wpas_wps_ap_pin_timeout, wpa_s, NULL);
1383*03f9172cSAndroid Build Coastguard Worker }
1384*03f9172cSAndroid Build Coastguard Worker
1385*03f9172cSAndroid Build Coastguard Worker
wpas_wps_ap_pin_disable(struct wpa_supplicant * wpa_s)1386*03f9172cSAndroid Build Coastguard Worker void wpas_wps_ap_pin_disable(struct wpa_supplicant *wpa_s)
1387*03f9172cSAndroid Build Coastguard Worker {
1388*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1389*03f9172cSAndroid Build Coastguard Worker
1390*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1391*03f9172cSAndroid Build Coastguard Worker return;
1392*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "WPS: Disabling AP PIN");
1393*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1394*03f9172cSAndroid Build Coastguard Worker os_free(hapd->conf->ap_pin);
1395*03f9172cSAndroid Build Coastguard Worker hapd->conf->ap_pin = NULL;
1396*03f9172cSAndroid Build Coastguard Worker eloop_cancel_timeout(wpas_wps_ap_pin_timeout, wpa_s, NULL);
1397*03f9172cSAndroid Build Coastguard Worker }
1398*03f9172cSAndroid Build Coastguard Worker
1399*03f9172cSAndroid Build Coastguard Worker
wpas_wps_ap_pin_random(struct wpa_supplicant * wpa_s,int timeout)1400*03f9172cSAndroid Build Coastguard Worker const char * wpas_wps_ap_pin_random(struct wpa_supplicant *wpa_s, int timeout)
1401*03f9172cSAndroid Build Coastguard Worker {
1402*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1403*03f9172cSAndroid Build Coastguard Worker unsigned int pin;
1404*03f9172cSAndroid Build Coastguard Worker char pin_txt[9];
1405*03f9172cSAndroid Build Coastguard Worker
1406*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1407*03f9172cSAndroid Build Coastguard Worker return NULL;
1408*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1409*03f9172cSAndroid Build Coastguard Worker if (wps_generate_pin(&pin) < 0)
1410*03f9172cSAndroid Build Coastguard Worker return NULL;
1411*03f9172cSAndroid Build Coastguard Worker os_snprintf(pin_txt, sizeof(pin_txt), "%08u", pin);
1412*03f9172cSAndroid Build Coastguard Worker os_free(hapd->conf->ap_pin);
1413*03f9172cSAndroid Build Coastguard Worker hapd->conf->ap_pin = os_strdup(pin_txt);
1414*03f9172cSAndroid Build Coastguard Worker if (hapd->conf->ap_pin == NULL)
1415*03f9172cSAndroid Build Coastguard Worker return NULL;
1416*03f9172cSAndroid Build Coastguard Worker wpas_wps_ap_pin_enable(wpa_s, timeout);
1417*03f9172cSAndroid Build Coastguard Worker
1418*03f9172cSAndroid Build Coastguard Worker return hapd->conf->ap_pin;
1419*03f9172cSAndroid Build Coastguard Worker }
1420*03f9172cSAndroid Build Coastguard Worker
1421*03f9172cSAndroid Build Coastguard Worker
wpas_wps_ap_pin_get(struct wpa_supplicant * wpa_s)1422*03f9172cSAndroid Build Coastguard Worker const char * wpas_wps_ap_pin_get(struct wpa_supplicant *wpa_s)
1423*03f9172cSAndroid Build Coastguard Worker {
1424*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1425*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1426*03f9172cSAndroid Build Coastguard Worker return NULL;
1427*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1428*03f9172cSAndroid Build Coastguard Worker return hapd->conf->ap_pin;
1429*03f9172cSAndroid Build Coastguard Worker }
1430*03f9172cSAndroid Build Coastguard Worker
1431*03f9172cSAndroid Build Coastguard Worker
wpas_wps_ap_pin_set(struct wpa_supplicant * wpa_s,const char * pin,int timeout)1432*03f9172cSAndroid Build Coastguard Worker int wpas_wps_ap_pin_set(struct wpa_supplicant *wpa_s, const char *pin,
1433*03f9172cSAndroid Build Coastguard Worker int timeout)
1434*03f9172cSAndroid Build Coastguard Worker {
1435*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1436*03f9172cSAndroid Build Coastguard Worker char pin_txt[9];
1437*03f9172cSAndroid Build Coastguard Worker int ret;
1438*03f9172cSAndroid Build Coastguard Worker
1439*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1440*03f9172cSAndroid Build Coastguard Worker return -1;
1441*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1442*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(pin_txt, sizeof(pin_txt), "%s", pin);
1443*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(sizeof(pin_txt), ret))
1444*03f9172cSAndroid Build Coastguard Worker return -1;
1445*03f9172cSAndroid Build Coastguard Worker os_free(hapd->conf->ap_pin);
1446*03f9172cSAndroid Build Coastguard Worker hapd->conf->ap_pin = os_strdup(pin_txt);
1447*03f9172cSAndroid Build Coastguard Worker if (hapd->conf->ap_pin == NULL)
1448*03f9172cSAndroid Build Coastguard Worker return -1;
1449*03f9172cSAndroid Build Coastguard Worker wpas_wps_ap_pin_enable(wpa_s, timeout);
1450*03f9172cSAndroid Build Coastguard Worker
1451*03f9172cSAndroid Build Coastguard Worker return 0;
1452*03f9172cSAndroid Build Coastguard Worker }
1453*03f9172cSAndroid Build Coastguard Worker
1454*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_pwd_auth_fail(struct wpa_supplicant * wpa_s)1455*03f9172cSAndroid Build Coastguard Worker void wpa_supplicant_ap_pwd_auth_fail(struct wpa_supplicant *wpa_s)
1456*03f9172cSAndroid Build Coastguard Worker {
1457*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1458*03f9172cSAndroid Build Coastguard Worker
1459*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1460*03f9172cSAndroid Build Coastguard Worker return;
1461*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1462*03f9172cSAndroid Build Coastguard Worker
1463*03f9172cSAndroid Build Coastguard Worker /*
1464*03f9172cSAndroid Build Coastguard Worker * Registrar failed to prove its knowledge of the AP PIN. Disable AP
1465*03f9172cSAndroid Build Coastguard Worker * PIN if this happens multiple times to slow down brute force attacks.
1466*03f9172cSAndroid Build Coastguard Worker */
1467*03f9172cSAndroid Build Coastguard Worker hapd->ap_pin_failures++;
1468*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "WPS: AP PIN authentication failure number %u",
1469*03f9172cSAndroid Build Coastguard Worker hapd->ap_pin_failures);
1470*03f9172cSAndroid Build Coastguard Worker if (hapd->ap_pin_failures < 3)
1471*03f9172cSAndroid Build Coastguard Worker return;
1472*03f9172cSAndroid Build Coastguard Worker
1473*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "WPS: Disable AP PIN");
1474*03f9172cSAndroid Build Coastguard Worker hapd->ap_pin_failures = 0;
1475*03f9172cSAndroid Build Coastguard Worker os_free(hapd->conf->ap_pin);
1476*03f9172cSAndroid Build Coastguard Worker hapd->conf->ap_pin = NULL;
1477*03f9172cSAndroid Build Coastguard Worker }
1478*03f9172cSAndroid Build Coastguard Worker
1479*03f9172cSAndroid Build Coastguard Worker
1480*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS_NFC
1481*03f9172cSAndroid Build Coastguard Worker
wpas_ap_wps_nfc_config_token(struct wpa_supplicant * wpa_s,int ndef)1482*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wpas_ap_wps_nfc_config_token(struct wpa_supplicant *wpa_s,
1483*03f9172cSAndroid Build Coastguard Worker int ndef)
1484*03f9172cSAndroid Build Coastguard Worker {
1485*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1486*03f9172cSAndroid Build Coastguard Worker
1487*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1488*03f9172cSAndroid Build Coastguard Worker return NULL;
1489*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1490*03f9172cSAndroid Build Coastguard Worker return hostapd_wps_nfc_config_token(hapd, ndef);
1491*03f9172cSAndroid Build Coastguard Worker }
1492*03f9172cSAndroid Build Coastguard Worker
1493*03f9172cSAndroid Build Coastguard Worker
wpas_ap_wps_nfc_handover_sel(struct wpa_supplicant * wpa_s,int ndef)1494*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wpas_ap_wps_nfc_handover_sel(struct wpa_supplicant *wpa_s,
1495*03f9172cSAndroid Build Coastguard Worker int ndef)
1496*03f9172cSAndroid Build Coastguard Worker {
1497*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1498*03f9172cSAndroid Build Coastguard Worker
1499*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1500*03f9172cSAndroid Build Coastguard Worker return NULL;
1501*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1502*03f9172cSAndroid Build Coastguard Worker return hostapd_wps_nfc_hs_cr(hapd, ndef);
1503*03f9172cSAndroid Build Coastguard Worker }
1504*03f9172cSAndroid Build Coastguard Worker
1505*03f9172cSAndroid Build Coastguard Worker
wpas_ap_wps_nfc_report_handover(struct wpa_supplicant * wpa_s,const struct wpabuf * req,const struct wpabuf * sel)1506*03f9172cSAndroid Build Coastguard Worker int wpas_ap_wps_nfc_report_handover(struct wpa_supplicant *wpa_s,
1507*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *req,
1508*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *sel)
1509*03f9172cSAndroid Build Coastguard Worker {
1510*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1511*03f9172cSAndroid Build Coastguard Worker
1512*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1513*03f9172cSAndroid Build Coastguard Worker return -1;
1514*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1515*03f9172cSAndroid Build Coastguard Worker return hostapd_wps_nfc_report_handover(hapd, req, sel);
1516*03f9172cSAndroid Build Coastguard Worker }
1517*03f9172cSAndroid Build Coastguard Worker
1518*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS_NFC */
1519*03f9172cSAndroid Build Coastguard Worker
1520*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS */
1521*03f9172cSAndroid Build Coastguard Worker
1522*03f9172cSAndroid Build Coastguard Worker
1523*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_CTRL_IFACE
1524*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_sta_first(struct wpa_supplicant * wpa_s,char * buf,size_t buflen)1525*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_sta_first(struct wpa_supplicant *wpa_s,
1526*03f9172cSAndroid Build Coastguard Worker char *buf, size_t buflen)
1527*03f9172cSAndroid Build Coastguard Worker {
1528*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1529*03f9172cSAndroid Build Coastguard Worker
1530*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1531*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1532*03f9172cSAndroid Build Coastguard Worker else if (wpa_s->ifmsh)
1533*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ifmsh->bss[0];
1534*03f9172cSAndroid Build Coastguard Worker else
1535*03f9172cSAndroid Build Coastguard Worker return -1;
1536*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_sta_first(hapd, buf, buflen);
1537*03f9172cSAndroid Build Coastguard Worker }
1538*03f9172cSAndroid Build Coastguard Worker
1539*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_sta(struct wpa_supplicant * wpa_s,const char * txtaddr,char * buf,size_t buflen)1540*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_sta(struct wpa_supplicant *wpa_s, const char *txtaddr,
1541*03f9172cSAndroid Build Coastguard Worker char *buf, size_t buflen)
1542*03f9172cSAndroid Build Coastguard Worker {
1543*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1544*03f9172cSAndroid Build Coastguard Worker
1545*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1546*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1547*03f9172cSAndroid Build Coastguard Worker else if (wpa_s->ifmsh)
1548*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ifmsh->bss[0];
1549*03f9172cSAndroid Build Coastguard Worker else
1550*03f9172cSAndroid Build Coastguard Worker return -1;
1551*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_sta(hapd, txtaddr, buf, buflen);
1552*03f9172cSAndroid Build Coastguard Worker }
1553*03f9172cSAndroid Build Coastguard Worker
1554*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_sta_next(struct wpa_supplicant * wpa_s,const char * txtaddr,char * buf,size_t buflen)1555*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_sta_next(struct wpa_supplicant *wpa_s, const char *txtaddr,
1556*03f9172cSAndroid Build Coastguard Worker char *buf, size_t buflen)
1557*03f9172cSAndroid Build Coastguard Worker {
1558*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1559*03f9172cSAndroid Build Coastguard Worker
1560*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1561*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1562*03f9172cSAndroid Build Coastguard Worker else if (wpa_s->ifmsh)
1563*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ifmsh->bss[0];
1564*03f9172cSAndroid Build Coastguard Worker else
1565*03f9172cSAndroid Build Coastguard Worker return -1;
1566*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_sta_next(hapd, txtaddr, buf, buflen);
1567*03f9172cSAndroid Build Coastguard Worker }
1568*03f9172cSAndroid Build Coastguard Worker
1569*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_sta_disassociate(struct wpa_supplicant * wpa_s,const char * txtaddr)1570*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_sta_disassociate(struct wpa_supplicant *wpa_s,
1571*03f9172cSAndroid Build Coastguard Worker const char *txtaddr)
1572*03f9172cSAndroid Build Coastguard Worker {
1573*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1574*03f9172cSAndroid Build Coastguard Worker return -1;
1575*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_disassociate(wpa_s->ap_iface->bss[0],
1576*03f9172cSAndroid Build Coastguard Worker txtaddr);
1577*03f9172cSAndroid Build Coastguard Worker }
1578*03f9172cSAndroid Build Coastguard Worker
1579*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_sta_deauthenticate(struct wpa_supplicant * wpa_s,const char * txtaddr)1580*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_sta_deauthenticate(struct wpa_supplicant *wpa_s,
1581*03f9172cSAndroid Build Coastguard Worker const char *txtaddr)
1582*03f9172cSAndroid Build Coastguard Worker {
1583*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1584*03f9172cSAndroid Build Coastguard Worker return -1;
1585*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_deauthenticate(wpa_s->ap_iface->bss[0],
1586*03f9172cSAndroid Build Coastguard Worker txtaddr);
1587*03f9172cSAndroid Build Coastguard Worker }
1588*03f9172cSAndroid Build Coastguard Worker
1589*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_wpa_get_status(struct wpa_supplicant * wpa_s,char * buf,size_t buflen,int verbose)1590*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_wpa_get_status(struct wpa_supplicant *wpa_s, char *buf,
1591*03f9172cSAndroid Build Coastguard Worker size_t buflen, int verbose)
1592*03f9172cSAndroid Build Coastguard Worker {
1593*03f9172cSAndroid Build Coastguard Worker char *pos = buf, *end = buf + buflen;
1594*03f9172cSAndroid Build Coastguard Worker int ret;
1595*03f9172cSAndroid Build Coastguard Worker struct hostapd_bss_config *conf;
1596*03f9172cSAndroid Build Coastguard Worker
1597*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface == NULL)
1598*03f9172cSAndroid Build Coastguard Worker return -1;
1599*03f9172cSAndroid Build Coastguard Worker
1600*03f9172cSAndroid Build Coastguard Worker conf = wpa_s->ap_iface->bss[0]->conf;
1601*03f9172cSAndroid Build Coastguard Worker if (conf->wpa == 0)
1602*03f9172cSAndroid Build Coastguard Worker return 0;
1603*03f9172cSAndroid Build Coastguard Worker
1604*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(pos, end - pos,
1605*03f9172cSAndroid Build Coastguard Worker "pairwise_cipher=%s\n"
1606*03f9172cSAndroid Build Coastguard Worker "group_cipher=%s\n"
1607*03f9172cSAndroid Build Coastguard Worker "key_mgmt=%s\n",
1608*03f9172cSAndroid Build Coastguard Worker wpa_cipher_txt(conf->rsn_pairwise),
1609*03f9172cSAndroid Build Coastguard Worker wpa_cipher_txt(conf->wpa_group),
1610*03f9172cSAndroid Build Coastguard Worker wpa_key_mgmt_txt(conf->wpa_key_mgmt,
1611*03f9172cSAndroid Build Coastguard Worker conf->wpa));
1612*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(end - pos, ret))
1613*03f9172cSAndroid Build Coastguard Worker return pos - buf;
1614*03f9172cSAndroid Build Coastguard Worker pos += ret;
1615*03f9172cSAndroid Build Coastguard Worker return pos - buf;
1616*03f9172cSAndroid Build Coastguard Worker }
1617*03f9172cSAndroid Build Coastguard Worker
1618*03f9172cSAndroid Build Coastguard Worker
1619*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WNM_AP
1620*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_disassoc_imminent(struct wpa_supplicant * wpa_s,const char * buf)1621*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_disassoc_imminent(struct wpa_supplicant *wpa_s,
1622*03f9172cSAndroid Build Coastguard Worker const char *buf)
1623*03f9172cSAndroid Build Coastguard Worker {
1624*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1625*03f9172cSAndroid Build Coastguard Worker
1626*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1627*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1628*03f9172cSAndroid Build Coastguard Worker else
1629*03f9172cSAndroid Build Coastguard Worker return -1;
1630*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_disassoc_imminent(hapd, buf);
1631*03f9172cSAndroid Build Coastguard Worker }
1632*03f9172cSAndroid Build Coastguard Worker
1633*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_ess_disassoc(struct wpa_supplicant * wpa_s,const char * buf)1634*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_ess_disassoc(struct wpa_supplicant *wpa_s, const char *buf)
1635*03f9172cSAndroid Build Coastguard Worker {
1636*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1637*03f9172cSAndroid Build Coastguard Worker
1638*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1639*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1640*03f9172cSAndroid Build Coastguard Worker else
1641*03f9172cSAndroid Build Coastguard Worker return -1;
1642*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_ess_disassoc(hapd, buf);
1643*03f9172cSAndroid Build Coastguard Worker }
1644*03f9172cSAndroid Build Coastguard Worker
1645*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_bss_tm_req(struct wpa_supplicant * wpa_s,const char * buf)1646*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_bss_tm_req(struct wpa_supplicant *wpa_s, const char *buf)
1647*03f9172cSAndroid Build Coastguard Worker {
1648*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1649*03f9172cSAndroid Build Coastguard Worker
1650*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1651*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1652*03f9172cSAndroid Build Coastguard Worker else
1653*03f9172cSAndroid Build Coastguard Worker return -1;
1654*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_bss_tm_req(hapd, buf);
1655*03f9172cSAndroid Build Coastguard Worker }
1656*03f9172cSAndroid Build Coastguard Worker
1657*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WNM_AP */
1658*03f9172cSAndroid Build Coastguard Worker
1659*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_acl_add_mac(struct wpa_supplicant * wpa_s,enum macaddr_acl acl_type,const char * buf)1660*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_acl_add_mac(struct wpa_supplicant *wpa_s,
1661*03f9172cSAndroid Build Coastguard Worker enum macaddr_acl acl_type,
1662*03f9172cSAndroid Build Coastguard Worker const char *buf)
1663*03f9172cSAndroid Build Coastguard Worker {
1664*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1665*03f9172cSAndroid Build Coastguard Worker
1666*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1667*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1668*03f9172cSAndroid Build Coastguard Worker else
1669*03f9172cSAndroid Build Coastguard Worker return -1;
1670*03f9172cSAndroid Build Coastguard Worker
1671*03f9172cSAndroid Build Coastguard Worker hapd->conf->macaddr_acl = acl_type;
1672*03f9172cSAndroid Build Coastguard Worker
1673*03f9172cSAndroid Build Coastguard Worker if (acl_type == ACCEPT_UNLESS_DENIED)
1674*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_acl_add_mac(&hapd->conf->deny_mac,
1675*03f9172cSAndroid Build Coastguard Worker &hapd->conf->num_deny_mac,
1676*03f9172cSAndroid Build Coastguard Worker buf);
1677*03f9172cSAndroid Build Coastguard Worker if (acl_type == DENY_UNLESS_ACCEPTED)
1678*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_acl_add_mac(
1679*03f9172cSAndroid Build Coastguard Worker &hapd->conf->accept_mac,
1680*03f9172cSAndroid Build Coastguard Worker &hapd->conf->num_accept_mac, buf);
1681*03f9172cSAndroid Build Coastguard Worker
1682*03f9172cSAndroid Build Coastguard Worker return -1;
1683*03f9172cSAndroid Build Coastguard Worker }
1684*03f9172cSAndroid Build Coastguard Worker
1685*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_acl_del_mac(struct wpa_supplicant * wpa_s,enum macaddr_acl acl_type,const char * buf)1686*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_acl_del_mac(struct wpa_supplicant *wpa_s,
1687*03f9172cSAndroid Build Coastguard Worker enum macaddr_acl acl_type,
1688*03f9172cSAndroid Build Coastguard Worker const char *buf)
1689*03f9172cSAndroid Build Coastguard Worker {
1690*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1691*03f9172cSAndroid Build Coastguard Worker
1692*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1693*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1694*03f9172cSAndroid Build Coastguard Worker else
1695*03f9172cSAndroid Build Coastguard Worker return -1;
1696*03f9172cSAndroid Build Coastguard Worker
1697*03f9172cSAndroid Build Coastguard Worker hapd->conf->macaddr_acl = acl_type;
1698*03f9172cSAndroid Build Coastguard Worker
1699*03f9172cSAndroid Build Coastguard Worker if (acl_type == ACCEPT_UNLESS_DENIED)
1700*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_acl_del_mac(&hapd->conf->deny_mac,
1701*03f9172cSAndroid Build Coastguard Worker &hapd->conf->num_deny_mac,
1702*03f9172cSAndroid Build Coastguard Worker buf);
1703*03f9172cSAndroid Build Coastguard Worker if (acl_type == DENY_UNLESS_ACCEPTED)
1704*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_acl_del_mac(
1705*03f9172cSAndroid Build Coastguard Worker &hapd->conf->accept_mac, &hapd->conf->num_accept_mac,
1706*03f9172cSAndroid Build Coastguard Worker buf);
1707*03f9172cSAndroid Build Coastguard Worker
1708*03f9172cSAndroid Build Coastguard Worker return -1;
1709*03f9172cSAndroid Build Coastguard Worker }
1710*03f9172cSAndroid Build Coastguard Worker
1711*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_acl_show_mac(struct wpa_supplicant * wpa_s,enum macaddr_acl acl_type,char * buf,size_t buflen)1712*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_acl_show_mac(struct wpa_supplicant *wpa_s,
1713*03f9172cSAndroid Build Coastguard Worker enum macaddr_acl acl_type, char *buf,
1714*03f9172cSAndroid Build Coastguard Worker size_t buflen)
1715*03f9172cSAndroid Build Coastguard Worker {
1716*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1717*03f9172cSAndroid Build Coastguard Worker
1718*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1719*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1720*03f9172cSAndroid Build Coastguard Worker else
1721*03f9172cSAndroid Build Coastguard Worker return -1;
1722*03f9172cSAndroid Build Coastguard Worker
1723*03f9172cSAndroid Build Coastguard Worker if (acl_type == ACCEPT_UNLESS_DENIED)
1724*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_acl_show_mac(hapd->conf->deny_mac,
1725*03f9172cSAndroid Build Coastguard Worker hapd->conf->num_deny_mac,
1726*03f9172cSAndroid Build Coastguard Worker buf, buflen);
1727*03f9172cSAndroid Build Coastguard Worker if (acl_type == DENY_UNLESS_ACCEPTED)
1728*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_acl_show_mac(
1729*03f9172cSAndroid Build Coastguard Worker hapd->conf->accept_mac, hapd->conf->num_accept_mac,
1730*03f9172cSAndroid Build Coastguard Worker buf, buflen);
1731*03f9172cSAndroid Build Coastguard Worker
1732*03f9172cSAndroid Build Coastguard Worker return -1;
1733*03f9172cSAndroid Build Coastguard Worker }
1734*03f9172cSAndroid Build Coastguard Worker
1735*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_acl_clear_list(struct wpa_supplicant * wpa_s,enum macaddr_acl acl_type)1736*03f9172cSAndroid Build Coastguard Worker void ap_ctrl_iface_acl_clear_list(struct wpa_supplicant *wpa_s,
1737*03f9172cSAndroid Build Coastguard Worker enum macaddr_acl acl_type)
1738*03f9172cSAndroid Build Coastguard Worker {
1739*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1740*03f9172cSAndroid Build Coastguard Worker
1741*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1742*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1743*03f9172cSAndroid Build Coastguard Worker else
1744*03f9172cSAndroid Build Coastguard Worker return;
1745*03f9172cSAndroid Build Coastguard Worker
1746*03f9172cSAndroid Build Coastguard Worker hapd->conf->macaddr_acl = acl_type;
1747*03f9172cSAndroid Build Coastguard Worker
1748*03f9172cSAndroid Build Coastguard Worker if (acl_type == ACCEPT_UNLESS_DENIED)
1749*03f9172cSAndroid Build Coastguard Worker hostapd_ctrl_iface_acl_clear_list(&hapd->conf->deny_mac,
1750*03f9172cSAndroid Build Coastguard Worker &hapd->conf->num_deny_mac);
1751*03f9172cSAndroid Build Coastguard Worker else if (acl_type == DENY_UNLESS_ACCEPTED)
1752*03f9172cSAndroid Build Coastguard Worker hostapd_ctrl_iface_acl_clear_list(&hapd->conf->accept_mac,
1753*03f9172cSAndroid Build Coastguard Worker &hapd->conf->num_accept_mac);
1754*03f9172cSAndroid Build Coastguard Worker }
1755*03f9172cSAndroid Build Coastguard Worker
1756*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_disassoc_deny_mac(struct wpa_supplicant * wpa_s)1757*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_disassoc_deny_mac(struct wpa_supplicant *wpa_s)
1758*03f9172cSAndroid Build Coastguard Worker {
1759*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1760*03f9172cSAndroid Build Coastguard Worker
1761*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1762*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1763*03f9172cSAndroid Build Coastguard Worker else
1764*03f9172cSAndroid Build Coastguard Worker return -1;
1765*03f9172cSAndroid Build Coastguard Worker
1766*03f9172cSAndroid Build Coastguard Worker return hostapd_disassoc_deny_mac(hapd);
1767*03f9172cSAndroid Build Coastguard Worker }
1768*03f9172cSAndroid Build Coastguard Worker
1769*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_disassoc_accept_mac(struct wpa_supplicant * wpa_s)1770*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_disassoc_accept_mac(struct wpa_supplicant *wpa_s)
1771*03f9172cSAndroid Build Coastguard Worker {
1772*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1773*03f9172cSAndroid Build Coastguard Worker
1774*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1775*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1776*03f9172cSAndroid Build Coastguard Worker else
1777*03f9172cSAndroid Build Coastguard Worker return -1;
1778*03f9172cSAndroid Build Coastguard Worker
1779*03f9172cSAndroid Build Coastguard Worker return hostapd_disassoc_accept_mac(hapd);
1780*03f9172cSAndroid Build Coastguard Worker }
1781*03f9172cSAndroid Build Coastguard Worker
1782*03f9172cSAndroid Build Coastguard Worker
ap_ctrl_iface_set_acl(struct wpa_supplicant * wpa_s)1783*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_set_acl(struct wpa_supplicant *wpa_s)
1784*03f9172cSAndroid Build Coastguard Worker {
1785*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1786*03f9172cSAndroid Build Coastguard Worker
1787*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1788*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1789*03f9172cSAndroid Build Coastguard Worker else
1790*03f9172cSAndroid Build Coastguard Worker return -1;
1791*03f9172cSAndroid Build Coastguard Worker
1792*03f9172cSAndroid Build Coastguard Worker return hostapd_set_acl(hapd);
1793*03f9172cSAndroid Build Coastguard Worker }
1794*03f9172cSAndroid Build Coastguard Worker
1795*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_CTRL_IFACE */
1796*03f9172cSAndroid Build Coastguard Worker
1797*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_update_beacon(struct wpa_supplicant * wpa_s)1798*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_ap_update_beacon(struct wpa_supplicant *wpa_s)
1799*03f9172cSAndroid Build Coastguard Worker {
1800*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
1801*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid = wpa_s->current_ssid;
1802*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1803*03f9172cSAndroid Build Coastguard Worker
1804*03f9172cSAndroid Build Coastguard Worker if (ssid == NULL || wpa_s->ap_iface == NULL ||
1805*03f9172cSAndroid Build Coastguard Worker ssid->mode == WPAS_MODE_INFRA ||
1806*03f9172cSAndroid Build Coastguard Worker ssid->mode == WPAS_MODE_IBSS)
1807*03f9172cSAndroid Build Coastguard Worker return -1;
1808*03f9172cSAndroid Build Coastguard Worker
1809*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_P2P
1810*03f9172cSAndroid Build Coastguard Worker if (ssid->mode == WPAS_MODE_P2P_GO)
1811*03f9172cSAndroid Build Coastguard Worker iface->conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER;
1812*03f9172cSAndroid Build Coastguard Worker else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1813*03f9172cSAndroid Build Coastguard Worker iface->conf->bss[0]->p2p = P2P_ENABLED | P2P_GROUP_OWNER |
1814*03f9172cSAndroid Build Coastguard Worker P2P_GROUP_FORMATION;
1815*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_P2P */
1816*03f9172cSAndroid Build Coastguard Worker
1817*03f9172cSAndroid Build Coastguard Worker hapd = iface->bss[0];
1818*03f9172cSAndroid Build Coastguard Worker if (hapd->drv_priv == NULL)
1819*03f9172cSAndroid Build Coastguard Worker return -1;
1820*03f9172cSAndroid Build Coastguard Worker ieee802_11_set_beacons(iface);
1821*03f9172cSAndroid Build Coastguard Worker hostapd_set_ap_wps_ie(hapd);
1822*03f9172cSAndroid Build Coastguard Worker
1823*03f9172cSAndroid Build Coastguard Worker return 0;
1824*03f9172cSAndroid Build Coastguard Worker }
1825*03f9172cSAndroid Build Coastguard Worker
1826*03f9172cSAndroid Build Coastguard Worker
ap_switch_channel(struct wpa_supplicant * wpa_s,struct csa_settings * settings)1827*03f9172cSAndroid Build Coastguard Worker int ap_switch_channel(struct wpa_supplicant *wpa_s,
1828*03f9172cSAndroid Build Coastguard Worker struct csa_settings *settings)
1829*03f9172cSAndroid Build Coastguard Worker {
1830*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
1831*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = NULL;
1832*03f9172cSAndroid Build Coastguard Worker
1833*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
1834*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ap_iface;
1835*03f9172cSAndroid Build Coastguard Worker else if (wpa_s->ifmsh)
1836*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
1837*03f9172cSAndroid Build Coastguard Worker
1838*03f9172cSAndroid Build Coastguard Worker if (!iface || !iface->bss[0])
1839*03f9172cSAndroid Build Coastguard Worker return -1;
1840*03f9172cSAndroid Build Coastguard Worker
1841*03f9172cSAndroid Build Coastguard Worker return hostapd_switch_channel(iface->bss[0], settings);
1842*03f9172cSAndroid Build Coastguard Worker #else /* NEED_AP_MLME */
1843*03f9172cSAndroid Build Coastguard Worker return -1;
1844*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
1845*03f9172cSAndroid Build Coastguard Worker }
1846*03f9172cSAndroid Build Coastguard Worker
1847*03f9172cSAndroid Build Coastguard Worker
1848*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_CTRL_IFACE
ap_ctrl_iface_chanswitch(struct wpa_supplicant * wpa_s,const char * pos)1849*03f9172cSAndroid Build Coastguard Worker int ap_ctrl_iface_chanswitch(struct wpa_supplicant *wpa_s, const char *pos)
1850*03f9172cSAndroid Build Coastguard Worker {
1851*03f9172cSAndroid Build Coastguard Worker struct csa_settings settings;
1852*03f9172cSAndroid Build Coastguard Worker int ret = hostapd_parse_csa_settings(pos, &settings);
1853*03f9172cSAndroid Build Coastguard Worker
1854*03f9172cSAndroid Build Coastguard Worker if (ret)
1855*03f9172cSAndroid Build Coastguard Worker return ret;
1856*03f9172cSAndroid Build Coastguard Worker
1857*03f9172cSAndroid Build Coastguard Worker settings.link_id = -1;
1858*03f9172cSAndroid Build Coastguard Worker
1859*03f9172cSAndroid Build Coastguard Worker return ap_switch_channel(wpa_s, &settings);
1860*03f9172cSAndroid Build Coastguard Worker }
1861*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_CTRL_IFACE */
1862*03f9172cSAndroid Build Coastguard Worker
1863*03f9172cSAndroid Build Coastguard Worker
wpas_ap_ch_switch(struct wpa_supplicant * wpa_s,int freq,int ht,int offset,int width,int cf1,int cf2,u16 punct_bitmap,int finished)1864*03f9172cSAndroid Build Coastguard Worker void wpas_ap_ch_switch(struct wpa_supplicant *wpa_s, int freq, int ht,
1865*03f9172cSAndroid Build Coastguard Worker int offset, int width, int cf1, int cf2,
1866*03f9172cSAndroid Build Coastguard Worker u16 punct_bitmap, int finished)
1867*03f9172cSAndroid Build Coastguard Worker {
1868*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
1869*03f9172cSAndroid Build Coastguard Worker
1870*03f9172cSAndroid Build Coastguard Worker if (!iface)
1871*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
1872*03f9172cSAndroid Build Coastguard Worker if (!iface)
1873*03f9172cSAndroid Build Coastguard Worker return;
1874*03f9172cSAndroid Build Coastguard Worker wpa_s->assoc_freq = freq;
1875*03f9172cSAndroid Build Coastguard Worker if (wpa_s->current_ssid)
1876*03f9172cSAndroid Build Coastguard Worker wpa_s->current_ssid->frequency = freq;
1877*03f9172cSAndroid Build Coastguard Worker hostapd_event_ch_switch(iface->bss[0], freq, ht,
1878*03f9172cSAndroid Build Coastguard Worker offset, width, cf1, cf2, punct_bitmap,
1879*03f9172cSAndroid Build Coastguard Worker finished);
1880*03f9172cSAndroid Build Coastguard Worker }
1881*03f9172cSAndroid Build Coastguard Worker
1882*03f9172cSAndroid Build Coastguard Worker
wpa_supplicant_ap_mac_addr_filter(struct wpa_supplicant * wpa_s,const u8 * addr)1883*03f9172cSAndroid Build Coastguard Worker int wpa_supplicant_ap_mac_addr_filter(struct wpa_supplicant *wpa_s,
1884*03f9172cSAndroid Build Coastguard Worker const u8 *addr)
1885*03f9172cSAndroid Build Coastguard Worker {
1886*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1887*03f9172cSAndroid Build Coastguard Worker struct hostapd_bss_config *conf;
1888*03f9172cSAndroid Build Coastguard Worker
1889*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
1890*03f9172cSAndroid Build Coastguard Worker return -1;
1891*03f9172cSAndroid Build Coastguard Worker
1892*03f9172cSAndroid Build Coastguard Worker if (addr)
1893*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "AP: Set MAC address filter: " MACSTR,
1894*03f9172cSAndroid Build Coastguard Worker MAC2STR(addr));
1895*03f9172cSAndroid Build Coastguard Worker else
1896*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "AP: Clear MAC address filter");
1897*03f9172cSAndroid Build Coastguard Worker
1898*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1899*03f9172cSAndroid Build Coastguard Worker conf = hapd->conf;
1900*03f9172cSAndroid Build Coastguard Worker
1901*03f9172cSAndroid Build Coastguard Worker os_free(conf->accept_mac);
1902*03f9172cSAndroid Build Coastguard Worker conf->accept_mac = NULL;
1903*03f9172cSAndroid Build Coastguard Worker conf->num_accept_mac = 0;
1904*03f9172cSAndroid Build Coastguard Worker os_free(conf->deny_mac);
1905*03f9172cSAndroid Build Coastguard Worker conf->deny_mac = NULL;
1906*03f9172cSAndroid Build Coastguard Worker conf->num_deny_mac = 0;
1907*03f9172cSAndroid Build Coastguard Worker
1908*03f9172cSAndroid Build Coastguard Worker if (addr == NULL) {
1909*03f9172cSAndroid Build Coastguard Worker conf->macaddr_acl = ACCEPT_UNLESS_DENIED;
1910*03f9172cSAndroid Build Coastguard Worker return 0;
1911*03f9172cSAndroid Build Coastguard Worker }
1912*03f9172cSAndroid Build Coastguard Worker
1913*03f9172cSAndroid Build Coastguard Worker conf->macaddr_acl = DENY_UNLESS_ACCEPTED;
1914*03f9172cSAndroid Build Coastguard Worker conf->accept_mac = os_zalloc(sizeof(struct mac_acl_entry));
1915*03f9172cSAndroid Build Coastguard Worker if (conf->accept_mac == NULL)
1916*03f9172cSAndroid Build Coastguard Worker return -1;
1917*03f9172cSAndroid Build Coastguard Worker os_memcpy(conf->accept_mac[0].addr, addr, ETH_ALEN);
1918*03f9172cSAndroid Build Coastguard Worker conf->num_accept_mac = 1;
1919*03f9172cSAndroid Build Coastguard Worker
1920*03f9172cSAndroid Build Coastguard Worker return 0;
1921*03f9172cSAndroid Build Coastguard Worker }
1922*03f9172cSAndroid Build Coastguard Worker
1923*03f9172cSAndroid Build Coastguard Worker
1924*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS_NFC
wpas_ap_wps_add_nfc_pw(struct wpa_supplicant * wpa_s,u16 pw_id,const struct wpabuf * pw,const u8 * pubkey_hash)1925*03f9172cSAndroid Build Coastguard Worker int wpas_ap_wps_add_nfc_pw(struct wpa_supplicant *wpa_s, u16 pw_id,
1926*03f9172cSAndroid Build Coastguard Worker const struct wpabuf *pw, const u8 *pubkey_hash)
1927*03f9172cSAndroid Build Coastguard Worker {
1928*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1929*03f9172cSAndroid Build Coastguard Worker struct wps_context *wps;
1930*03f9172cSAndroid Build Coastguard Worker
1931*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
1932*03f9172cSAndroid Build Coastguard Worker return -1;
1933*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1934*03f9172cSAndroid Build Coastguard Worker wps = hapd->wps;
1935*03f9172cSAndroid Build Coastguard Worker
1936*03f9172cSAndroid Build Coastguard Worker if (wpa_s->p2pdev->conf->wps_nfc_dh_pubkey == NULL ||
1937*03f9172cSAndroid Build Coastguard Worker wpa_s->p2pdev->conf->wps_nfc_dh_privkey == NULL) {
1938*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "P2P: No NFC DH key known");
1939*03f9172cSAndroid Build Coastguard Worker return -1;
1940*03f9172cSAndroid Build Coastguard Worker }
1941*03f9172cSAndroid Build Coastguard Worker
1942*03f9172cSAndroid Build Coastguard Worker dh5_free(wps->dh_ctx);
1943*03f9172cSAndroid Build Coastguard Worker wpabuf_free(wps->dh_pubkey);
1944*03f9172cSAndroid Build Coastguard Worker wpabuf_free(wps->dh_privkey);
1945*03f9172cSAndroid Build Coastguard Worker wps->dh_privkey = wpabuf_dup(
1946*03f9172cSAndroid Build Coastguard Worker wpa_s->p2pdev->conf->wps_nfc_dh_privkey);
1947*03f9172cSAndroid Build Coastguard Worker wps->dh_pubkey = wpabuf_dup(
1948*03f9172cSAndroid Build Coastguard Worker wpa_s->p2pdev->conf->wps_nfc_dh_pubkey);
1949*03f9172cSAndroid Build Coastguard Worker if (wps->dh_privkey == NULL || wps->dh_pubkey == NULL) {
1950*03f9172cSAndroid Build Coastguard Worker wps->dh_ctx = NULL;
1951*03f9172cSAndroid Build Coastguard Worker wpabuf_free(wps->dh_pubkey);
1952*03f9172cSAndroid Build Coastguard Worker wps->dh_pubkey = NULL;
1953*03f9172cSAndroid Build Coastguard Worker wpabuf_free(wps->dh_privkey);
1954*03f9172cSAndroid Build Coastguard Worker wps->dh_privkey = NULL;
1955*03f9172cSAndroid Build Coastguard Worker return -1;
1956*03f9172cSAndroid Build Coastguard Worker }
1957*03f9172cSAndroid Build Coastguard Worker wps->dh_ctx = dh5_init_fixed(wps->dh_privkey, wps->dh_pubkey);
1958*03f9172cSAndroid Build Coastguard Worker if (wps->dh_ctx == NULL)
1959*03f9172cSAndroid Build Coastguard Worker return -1;
1960*03f9172cSAndroid Build Coastguard Worker
1961*03f9172cSAndroid Build Coastguard Worker return wps_registrar_add_nfc_pw_token(hapd->wps->registrar, pubkey_hash,
1962*03f9172cSAndroid Build Coastguard Worker pw_id,
1963*03f9172cSAndroid Build Coastguard Worker pw ? wpabuf_head(pw) : NULL,
1964*03f9172cSAndroid Build Coastguard Worker pw ? wpabuf_len(pw) : 0, 1);
1965*03f9172cSAndroid Build Coastguard Worker }
1966*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS_NFC */
1967*03f9172cSAndroid Build Coastguard Worker
1968*03f9172cSAndroid Build Coastguard Worker
1969*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_CTRL_IFACE
wpas_ap_stop_ap(struct wpa_supplicant * wpa_s)1970*03f9172cSAndroid Build Coastguard Worker int wpas_ap_stop_ap(struct wpa_supplicant *wpa_s)
1971*03f9172cSAndroid Build Coastguard Worker {
1972*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
1973*03f9172cSAndroid Build Coastguard Worker
1974*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
1975*03f9172cSAndroid Build Coastguard Worker return -1;
1976*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
1977*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_stop_ap(hapd);
1978*03f9172cSAndroid Build Coastguard Worker }
1979*03f9172cSAndroid Build Coastguard Worker
1980*03f9172cSAndroid Build Coastguard Worker
wpas_ap_pmksa_cache_list(struct wpa_supplicant * wpa_s,char * buf,size_t len)1981*03f9172cSAndroid Build Coastguard Worker int wpas_ap_pmksa_cache_list(struct wpa_supplicant *wpa_s, char *buf,
1982*03f9172cSAndroid Build Coastguard Worker size_t len)
1983*03f9172cSAndroid Build Coastguard Worker {
1984*03f9172cSAndroid Build Coastguard Worker size_t reply_len = 0, i;
1985*03f9172cSAndroid Build Coastguard Worker char ap_delimiter[] = "---- AP ----\n";
1986*03f9172cSAndroid Build Coastguard Worker char mesh_delimiter[] = "---- mesh ----\n";
1987*03f9172cSAndroid Build Coastguard Worker size_t dlen;
1988*03f9172cSAndroid Build Coastguard Worker
1989*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface) {
1990*03f9172cSAndroid Build Coastguard Worker dlen = os_strlen(ap_delimiter);
1991*03f9172cSAndroid Build Coastguard Worker if (dlen > len - reply_len)
1992*03f9172cSAndroid Build Coastguard Worker return reply_len;
1993*03f9172cSAndroid Build Coastguard Worker os_memcpy(&buf[reply_len], ap_delimiter, dlen);
1994*03f9172cSAndroid Build Coastguard Worker reply_len += dlen;
1995*03f9172cSAndroid Build Coastguard Worker
1996*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < wpa_s->ap_iface->num_bss; i++) {
1997*03f9172cSAndroid Build Coastguard Worker reply_len += hostapd_ctrl_iface_pmksa_list(
1998*03f9172cSAndroid Build Coastguard Worker wpa_s->ap_iface->bss[i],
1999*03f9172cSAndroid Build Coastguard Worker &buf[reply_len], len - reply_len);
2000*03f9172cSAndroid Build Coastguard Worker }
2001*03f9172cSAndroid Build Coastguard Worker }
2002*03f9172cSAndroid Build Coastguard Worker
2003*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ifmsh) {
2004*03f9172cSAndroid Build Coastguard Worker dlen = os_strlen(mesh_delimiter);
2005*03f9172cSAndroid Build Coastguard Worker if (dlen > len - reply_len)
2006*03f9172cSAndroid Build Coastguard Worker return reply_len;
2007*03f9172cSAndroid Build Coastguard Worker os_memcpy(&buf[reply_len], mesh_delimiter, dlen);
2008*03f9172cSAndroid Build Coastguard Worker reply_len += dlen;
2009*03f9172cSAndroid Build Coastguard Worker
2010*03f9172cSAndroid Build Coastguard Worker reply_len += hostapd_ctrl_iface_pmksa_list(
2011*03f9172cSAndroid Build Coastguard Worker wpa_s->ifmsh->bss[0], &buf[reply_len],
2012*03f9172cSAndroid Build Coastguard Worker len - reply_len);
2013*03f9172cSAndroid Build Coastguard Worker }
2014*03f9172cSAndroid Build Coastguard Worker
2015*03f9172cSAndroid Build Coastguard Worker return reply_len;
2016*03f9172cSAndroid Build Coastguard Worker }
2017*03f9172cSAndroid Build Coastguard Worker
2018*03f9172cSAndroid Build Coastguard Worker
wpas_ap_pmksa_cache_flush(struct wpa_supplicant * wpa_s)2019*03f9172cSAndroid Build Coastguard Worker void wpas_ap_pmksa_cache_flush(struct wpa_supplicant *wpa_s)
2020*03f9172cSAndroid Build Coastguard Worker {
2021*03f9172cSAndroid Build Coastguard Worker size_t i;
2022*03f9172cSAndroid Build Coastguard Worker
2023*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface) {
2024*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < wpa_s->ap_iface->num_bss; i++)
2025*03f9172cSAndroid Build Coastguard Worker hostapd_ctrl_iface_pmksa_flush(wpa_s->ap_iface->bss[i]);
2026*03f9172cSAndroid Build Coastguard Worker }
2027*03f9172cSAndroid Build Coastguard Worker
2028*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ifmsh)
2029*03f9172cSAndroid Build Coastguard Worker hostapd_ctrl_iface_pmksa_flush(wpa_s->ifmsh->bss[0]);
2030*03f9172cSAndroid Build Coastguard Worker }
2031*03f9172cSAndroid Build Coastguard Worker
2032*03f9172cSAndroid Build Coastguard Worker
2033*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_PMKSA_CACHE_EXTERNAL
2034*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_MESH
2035*03f9172cSAndroid Build Coastguard Worker
wpas_ap_pmksa_cache_list_mesh(struct wpa_supplicant * wpa_s,const u8 * addr,char * buf,size_t len)2036*03f9172cSAndroid Build Coastguard Worker int wpas_ap_pmksa_cache_list_mesh(struct wpa_supplicant *wpa_s, const u8 *addr,
2037*03f9172cSAndroid Build Coastguard Worker char *buf, size_t len)
2038*03f9172cSAndroid Build Coastguard Worker {
2039*03f9172cSAndroid Build Coastguard Worker return hostapd_ctrl_iface_pmksa_list_mesh(wpa_s->ifmsh->bss[0], addr,
2040*03f9172cSAndroid Build Coastguard Worker &buf[0], len);
2041*03f9172cSAndroid Build Coastguard Worker }
2042*03f9172cSAndroid Build Coastguard Worker
2043*03f9172cSAndroid Build Coastguard Worker
wpas_ap_pmksa_cache_add_external(struct wpa_supplicant * wpa_s,char * cmd)2044*03f9172cSAndroid Build Coastguard Worker int wpas_ap_pmksa_cache_add_external(struct wpa_supplicant *wpa_s, char *cmd)
2045*03f9172cSAndroid Build Coastguard Worker {
2046*03f9172cSAndroid Build Coastguard Worker struct external_pmksa_cache *entry;
2047*03f9172cSAndroid Build Coastguard Worker void *pmksa_cache;
2048*03f9172cSAndroid Build Coastguard Worker
2049*03f9172cSAndroid Build Coastguard Worker pmksa_cache = hostapd_ctrl_iface_pmksa_create_entry(wpa_s->own_addr,
2050*03f9172cSAndroid Build Coastguard Worker cmd);
2051*03f9172cSAndroid Build Coastguard Worker if (!pmksa_cache)
2052*03f9172cSAndroid Build Coastguard Worker return -1;
2053*03f9172cSAndroid Build Coastguard Worker
2054*03f9172cSAndroid Build Coastguard Worker entry = os_zalloc(sizeof(struct external_pmksa_cache));
2055*03f9172cSAndroid Build Coastguard Worker if (!entry)
2056*03f9172cSAndroid Build Coastguard Worker return -1;
2057*03f9172cSAndroid Build Coastguard Worker
2058*03f9172cSAndroid Build Coastguard Worker entry->pmksa_cache = pmksa_cache;
2059*03f9172cSAndroid Build Coastguard Worker
2060*03f9172cSAndroid Build Coastguard Worker dl_list_add(&wpa_s->mesh_external_pmksa_cache, &entry->list);
2061*03f9172cSAndroid Build Coastguard Worker
2062*03f9172cSAndroid Build Coastguard Worker return 0;
2063*03f9172cSAndroid Build Coastguard Worker }
2064*03f9172cSAndroid Build Coastguard Worker
2065*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_MESH */
2066*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_PMKSA_CACHE_EXTERNAL */
2067*03f9172cSAndroid Build Coastguard Worker
2068*03f9172cSAndroid Build Coastguard Worker
wpas_ap_update_beacon(struct wpa_supplicant * wpa_s)2069*03f9172cSAndroid Build Coastguard Worker int wpas_ap_update_beacon(struct wpa_supplicant *wpa_s)
2070*03f9172cSAndroid Build Coastguard Worker {
2071*03f9172cSAndroid Build Coastguard Worker struct hostapd_data *hapd;
2072*03f9172cSAndroid Build Coastguard Worker
2073*03f9172cSAndroid Build Coastguard Worker if (!wpa_s->ap_iface)
2074*03f9172cSAndroid Build Coastguard Worker return -1;
2075*03f9172cSAndroid Build Coastguard Worker hapd = wpa_s->ap_iface->bss[0];
2076*03f9172cSAndroid Build Coastguard Worker
2077*03f9172cSAndroid Build Coastguard Worker wpabuf_free(hapd->conf->assocresp_elements);
2078*03f9172cSAndroid Build Coastguard Worker hapd->conf->assocresp_elements = NULL;
2079*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->ap_assocresp_elements) {
2080*03f9172cSAndroid Build Coastguard Worker hapd->conf->assocresp_elements =
2081*03f9172cSAndroid Build Coastguard Worker wpabuf_dup(wpa_s->conf->ap_assocresp_elements);
2082*03f9172cSAndroid Build Coastguard Worker }
2083*03f9172cSAndroid Build Coastguard Worker
2084*03f9172cSAndroid Build Coastguard Worker wpabuf_free(hapd->conf->vendor_elements);
2085*03f9172cSAndroid Build Coastguard Worker hapd->conf->vendor_elements = NULL;
2086*03f9172cSAndroid Build Coastguard Worker if (wpa_s->conf->ap_vendor_elements) {
2087*03f9172cSAndroid Build Coastguard Worker hapd->conf->vendor_elements =
2088*03f9172cSAndroid Build Coastguard Worker wpabuf_dup(wpa_s->conf->ap_vendor_elements);
2089*03f9172cSAndroid Build Coastguard Worker }
2090*03f9172cSAndroid Build Coastguard Worker
2091*03f9172cSAndroid Build Coastguard Worker return ieee802_11_set_beacon(hapd);
2092*03f9172cSAndroid Build Coastguard Worker }
2093*03f9172cSAndroid Build Coastguard Worker
2094*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_CTRL_IFACE */
2095*03f9172cSAndroid Build Coastguard Worker
2096*03f9172cSAndroid Build Coastguard Worker
2097*03f9172cSAndroid Build Coastguard Worker #ifdef NEED_AP_MLME
wpas_ap_event_dfs_radar_detected(struct wpa_supplicant * wpa_s,struct dfs_event * radar)2098*03f9172cSAndroid Build Coastguard Worker void wpas_ap_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
2099*03f9172cSAndroid Build Coastguard Worker struct dfs_event *radar)
2100*03f9172cSAndroid Build Coastguard Worker {
2101*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
2102*03f9172cSAndroid Build Coastguard Worker
2103*03f9172cSAndroid Build Coastguard Worker if (!iface)
2104*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
2105*03f9172cSAndroid Build Coastguard Worker if (!iface || !iface->bss[0])
2106*03f9172cSAndroid Build Coastguard Worker return;
2107*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "DFS radar detected on %d MHz", radar->freq);
2108*03f9172cSAndroid Build Coastguard Worker hostapd_dfs_radar_detected(iface, radar->freq,
2109*03f9172cSAndroid Build Coastguard Worker radar->ht_enabled, radar->chan_offset,
2110*03f9172cSAndroid Build Coastguard Worker radar->chan_width,
2111*03f9172cSAndroid Build Coastguard Worker radar->cf1, radar->cf2);
2112*03f9172cSAndroid Build Coastguard Worker }
2113*03f9172cSAndroid Build Coastguard Worker
2114*03f9172cSAndroid Build Coastguard Worker
wpas_ap_event_dfs_cac_started(struct wpa_supplicant * wpa_s,struct dfs_event * radar)2115*03f9172cSAndroid Build Coastguard Worker void wpas_ap_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
2116*03f9172cSAndroid Build Coastguard Worker struct dfs_event *radar)
2117*03f9172cSAndroid Build Coastguard Worker {
2118*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
2119*03f9172cSAndroid Build Coastguard Worker
2120*03f9172cSAndroid Build Coastguard Worker if (!iface)
2121*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
2122*03f9172cSAndroid Build Coastguard Worker if (!iface || !iface->bss[0])
2123*03f9172cSAndroid Build Coastguard Worker return;
2124*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "DFS CAC started on %d MHz", radar->freq);
2125*03f9172cSAndroid Build Coastguard Worker hostapd_dfs_start_cac(iface, radar->freq,
2126*03f9172cSAndroid Build Coastguard Worker radar->ht_enabled, radar->chan_offset,
2127*03f9172cSAndroid Build Coastguard Worker radar->chan_width, radar->cf1, radar->cf2);
2128*03f9172cSAndroid Build Coastguard Worker }
2129*03f9172cSAndroid Build Coastguard Worker
2130*03f9172cSAndroid Build Coastguard Worker
wpas_ap_event_dfs_cac_finished(struct wpa_supplicant * wpa_s,struct dfs_event * radar)2131*03f9172cSAndroid Build Coastguard Worker void wpas_ap_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
2132*03f9172cSAndroid Build Coastguard Worker struct dfs_event *radar)
2133*03f9172cSAndroid Build Coastguard Worker {
2134*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
2135*03f9172cSAndroid Build Coastguard Worker
2136*03f9172cSAndroid Build Coastguard Worker if (!iface)
2137*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
2138*03f9172cSAndroid Build Coastguard Worker if (!iface || !iface->bss[0])
2139*03f9172cSAndroid Build Coastguard Worker return;
2140*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "DFS CAC finished on %d MHz", radar->freq);
2141*03f9172cSAndroid Build Coastguard Worker hostapd_dfs_complete_cac(iface, 1, radar->freq,
2142*03f9172cSAndroid Build Coastguard Worker radar->ht_enabled, radar->chan_offset,
2143*03f9172cSAndroid Build Coastguard Worker radar->chan_width, radar->cf1, radar->cf2);
2144*03f9172cSAndroid Build Coastguard Worker }
2145*03f9172cSAndroid Build Coastguard Worker
2146*03f9172cSAndroid Build Coastguard Worker
wpas_ap_event_dfs_cac_aborted(struct wpa_supplicant * wpa_s,struct dfs_event * radar)2147*03f9172cSAndroid Build Coastguard Worker void wpas_ap_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
2148*03f9172cSAndroid Build Coastguard Worker struct dfs_event *radar)
2149*03f9172cSAndroid Build Coastguard Worker {
2150*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
2151*03f9172cSAndroid Build Coastguard Worker
2152*03f9172cSAndroid Build Coastguard Worker if (!iface)
2153*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
2154*03f9172cSAndroid Build Coastguard Worker if (!iface || !iface->bss[0])
2155*03f9172cSAndroid Build Coastguard Worker return;
2156*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "DFS CAC aborted on %d MHz", radar->freq);
2157*03f9172cSAndroid Build Coastguard Worker hostapd_dfs_complete_cac(iface, 0, radar->freq,
2158*03f9172cSAndroid Build Coastguard Worker radar->ht_enabled, radar->chan_offset,
2159*03f9172cSAndroid Build Coastguard Worker radar->chan_width, radar->cf1, radar->cf2);
2160*03f9172cSAndroid Build Coastguard Worker }
2161*03f9172cSAndroid Build Coastguard Worker
2162*03f9172cSAndroid Build Coastguard Worker
wpas_ap_event_dfs_cac_nop_finished(struct wpa_supplicant * wpa_s,struct dfs_event * radar)2163*03f9172cSAndroid Build Coastguard Worker void wpas_ap_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
2164*03f9172cSAndroid Build Coastguard Worker struct dfs_event *radar)
2165*03f9172cSAndroid Build Coastguard Worker {
2166*03f9172cSAndroid Build Coastguard Worker struct hostapd_iface *iface = wpa_s->ap_iface;
2167*03f9172cSAndroid Build Coastguard Worker
2168*03f9172cSAndroid Build Coastguard Worker if (!iface)
2169*03f9172cSAndroid Build Coastguard Worker iface = wpa_s->ifmsh;
2170*03f9172cSAndroid Build Coastguard Worker if (!iface || !iface->bss[0])
2171*03f9172cSAndroid Build Coastguard Worker return;
2172*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "DFS NOP finished on %d MHz", radar->freq);
2173*03f9172cSAndroid Build Coastguard Worker hostapd_dfs_nop_finished(iface, radar->freq,
2174*03f9172cSAndroid Build Coastguard Worker radar->ht_enabled, radar->chan_offset,
2175*03f9172cSAndroid Build Coastguard Worker radar->chan_width, radar->cf1, radar->cf2);
2176*03f9172cSAndroid Build Coastguard Worker }
2177*03f9172cSAndroid Build Coastguard Worker #endif /* NEED_AP_MLME */
2178*03f9172cSAndroid Build Coastguard Worker
2179*03f9172cSAndroid Build Coastguard Worker
ap_periodic(struct wpa_supplicant * wpa_s)2180*03f9172cSAndroid Build Coastguard Worker void ap_periodic(struct wpa_supplicant *wpa_s)
2181*03f9172cSAndroid Build Coastguard Worker {
2182*03f9172cSAndroid Build Coastguard Worker if (wpa_s->ap_iface)
2183*03f9172cSAndroid Build Coastguard Worker hostapd_periodic_iface(wpa_s->ap_iface);
2184*03f9172cSAndroid Build Coastguard Worker }
2185