xref: /aosp_15_r20/external/wpa_supplicant_8/wpa_supplicant/ap.c (revision 03f9172ca588f91df233974f4258bab95191f931)
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(&params, 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, &params.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, &params) < 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