WPS UPnP: Fix UPnP initialization for non-bridge case with some drivers
If the driver wrapper is setting up the interface up only at commit(), UPnP initialization fails. Fix that by moving UPnP setup to happen after the driver commit() call.
This commit is contained in:
parent
fa5165586f
commit
86795546f7
3 changed files with 39 additions and 8 deletions
|
@ -784,6 +784,17 @@ int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* WPS UPnP module can be initialized only when the "upnp_iface" is up.
|
||||
* If "interface" and "upnp_iface" are the same (e.g., non-bridge
|
||||
* mode), the interface is up only after driver_commit, so initialize
|
||||
* WPS after driver_commit.
|
||||
*/
|
||||
for (j = 0; j < iface->num_bss; j++) {
|
||||
if (hostapd_init_wps_complete(iface->bss[j]))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (hapd->setup_complete_cb)
|
||||
hapd->setup_complete_cb(hapd->setup_complete_cb_ctx);
|
||||
|
||||
|
|
|
@ -876,14 +876,6 @@ int hostapd_init_wps(struct hostapd_data *hapd,
|
|||
wps->model_description = hapd->conf->model_description;
|
||||
wps->model_url = hapd->conf->model_url;
|
||||
wps->upc = hapd->conf->upc;
|
||||
|
||||
if (hostapd_wps_upnp_init(hapd, wps) < 0) {
|
||||
wpa_printf(MSG_ERROR, "Failed to initialize WPS UPnP");
|
||||
wps_registrar_deinit(wps->registrar);
|
||||
os_free(wps->network_key);
|
||||
os_free(wps);
|
||||
return -1;
|
||||
}
|
||||
#endif /* CONFIG_WPS_UPNP */
|
||||
|
||||
hostapd_register_probereq_cb(hapd, hostapd_wps_probe_req_rx, hapd);
|
||||
|
@ -894,6 +886,28 @@ int hostapd_init_wps(struct hostapd_data *hapd,
|
|||
}
|
||||
|
||||
|
||||
int hostapd_init_wps_complete(struct hostapd_data *hapd)
|
||||
{
|
||||
struct wps_context *wps = hapd->wps;
|
||||
|
||||
if (hapd->wps == NULL)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_WPS_UPNP
|
||||
if (hostapd_wps_upnp_init(hapd, wps) < 0) {
|
||||
wpa_printf(MSG_ERROR, "Failed to initialize WPS UPnP");
|
||||
wps_registrar_deinit(wps->registrar);
|
||||
os_free(wps->network_key);
|
||||
os_free(wps);
|
||||
hapd->wps = NULL;
|
||||
return -1;
|
||||
}
|
||||
#endif /* CONFIG_WPS_UPNP */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void hostapd_deinit_wps(struct hostapd_data *hapd)
|
||||
{
|
||||
eloop_cancel_timeout(hostapd_wps_reenable_ap_pin, hapd, NULL);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
int hostapd_init_wps(struct hostapd_data *hapd,
|
||||
struct hostapd_bss_config *conf);
|
||||
int hostapd_init_wps_complete(struct hostapd_data *hapd);
|
||||
void hostapd_deinit_wps(struct hostapd_data *hapd);
|
||||
void hostapd_update_wps(struct hostapd_data *hapd);
|
||||
int hostapd_wps_add_pin(struct hostapd_data *hapd, const u8 *addr,
|
||||
|
@ -50,6 +51,11 @@ static inline void hostapd_deinit_wps(struct hostapd_data *hapd)
|
|||
{
|
||||
}
|
||||
|
||||
static inline int hostapd_init_wps_complete(struct hostapd_data *hapd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void hostapd_update_wps(struct hostapd_data *hapd)
|
||||
{
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue