Verify that beacon setup succeeds before proceeding

There is no point in starting the AP operations unless
the driver can be successfully configured to beacon.

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2013-12-24 22:46:20 +02:00
parent 7d7f7be2e5
commit bad5cdf491
3 changed files with 33 additions and 17 deletions

View file

@ -878,20 +878,21 @@ void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params)
} }
void ieee802_11_set_beacon(struct hostapd_data *hapd) int ieee802_11_set_beacon(struct hostapd_data *hapd)
{ {
struct wpa_driver_ap_params params; struct wpa_driver_ap_params params;
struct wpabuf *beacon, *proberesp, *assocresp; struct wpabuf *beacon, *proberesp, *assocresp;
int res, ret = -1;
if (hapd->iface->csa_in_progress) { if (hapd->iface->csa_in_progress) {
wpa_printf(MSG_ERROR, "Cannot set beacons during CSA period"); wpa_printf(MSG_ERROR, "Cannot set beacons during CSA period");
return; return -1;
} }
hapd->beacon_set_done = 1; hapd->beacon_set_done = 1;
if (ieee802_11_build_ap_params(hapd, &params) < 0) if (ieee802_11_build_ap_params(hapd, &params) < 0)
return; return -1;
if (hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp) < if (hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp) <
0) 0)
@ -901,31 +902,46 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
params.proberesp_ies = proberesp; params.proberesp_ies = proberesp;
params.assocresp_ies = assocresp; params.assocresp_ies = assocresp;
if (hostapd_drv_set_ap(hapd, &params)) res = hostapd_drv_set_ap(hapd, &params);
wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp); hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp);
if (res)
wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
else
ret = 0;
fail: fail:
ieee802_11_free_ap_params(&params); ieee802_11_free_ap_params(&params);
return ret;
} }
void ieee802_11_set_beacons(struct hostapd_iface *iface) int ieee802_11_set_beacons(struct hostapd_iface *iface)
{ {
size_t i; size_t i;
int ret = 0;
for (i = 0; i < iface->num_bss; i++) { for (i = 0; i < iface->num_bss; i++) {
if (iface->bss[i]->started) if (iface->bss[i]->started &&
ieee802_11_set_beacon(iface->bss[i]); ieee802_11_set_beacon(iface->bss[i]) < 0)
ret = -1;
} }
return ret;
} }
/* only update beacons if started */ /* only update beacons if started */
void ieee802_11_update_beacons(struct hostapd_iface *iface) int ieee802_11_update_beacons(struct hostapd_iface *iface)
{ {
size_t i; size_t i;
for (i = 0; i < iface->num_bss; i++) int ret = 0;
if (iface->bss[i]->beacon_set_done && iface->bss[i]->started)
ieee802_11_set_beacon(iface->bss[i]); for (i = 0; i < iface->num_bss; i++) {
if (iface->bss[i]->beacon_set_done && iface->bss[i]->started &&
ieee802_11_set_beacon(iface->bss[i]) < 0)
ret = -1;
}
return ret;
} }
#endif /* CONFIG_NATIVE_WINDOWS */ #endif /* CONFIG_NATIVE_WINDOWS */

View file

@ -21,9 +21,9 @@ struct ieee80211_mgmt;
void handle_probe_req(struct hostapd_data *hapd, void handle_probe_req(struct hostapd_data *hapd,
const struct ieee80211_mgmt *mgmt, size_t len, const struct ieee80211_mgmt *mgmt, size_t len,
int ssi_signal); int ssi_signal);
void ieee802_11_set_beacon(struct hostapd_data *hapd); int ieee802_11_set_beacon(struct hostapd_data *hapd);
void ieee802_11_set_beacons(struct hostapd_iface *iface); int ieee802_11_set_beacons(struct hostapd_iface *iface);
void ieee802_11_update_beacons(struct hostapd_iface *iface); int ieee802_11_update_beacons(struct hostapd_iface *iface);
int ieee802_11_build_ap_params(struct hostapd_data *hapd, int ieee802_11_build_ap_params(struct hostapd_data *hapd,
struct wpa_driver_ap_params *params); struct wpa_driver_ap_params *params);
void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params); void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params);

View file

@ -810,8 +810,8 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
return -1; return -1;
} }
if (!hapd->conf->start_disabled) if (!hapd->conf->start_disabled && ieee802_11_set_beacon(hapd) < 0)
ieee802_11_set_beacon(hapd); return -1;
if (hapd->wpa_auth && wpa_init_keys(hapd->wpa_auth) < 0) if (hapd->wpa_auth && wpa_init_keys(hapd->wpa_auth) < 0)
return -1; return -1;