wpa_s AP mode: complete only when setup is complete

The AP code might, currently only in the case of HT40, defer actual
enabling to after a scan. In this case, the wpa_s AP code gets confused.
Add a callback for it to use and make it use it to finish only when the
setup has actually completed.

With appropriate hacks in place this allows using HT40 in P2P mode.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2011-03-19 13:11:15 +02:00 committed by Jouni Malinen
parent c202f19c68
commit c76e5d7f9b
3 changed files with 20 additions and 5 deletions

View file

@ -784,6 +784,9 @@ int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err)
return -1; return -1;
} }
if (hapd->setup_complete_cb)
hapd->setup_complete_cb(hapd->setup_complete_cb_ctx);
wpa_printf(MSG_DEBUG, "%s: Setup of interface done.", wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
iface->bss[0]->conf->iface); iface->bss[0]->conf->iface);

View file

@ -145,6 +145,9 @@ struct hostapd_data {
int authorized); int authorized);
void *sta_authorized_cb_ctx; void *sta_authorized_cb_ctx;
void (*setup_complete_cb)(void *ctx);
void *setup_complete_cb_ctx;
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
struct p2p_data *p2p; struct p2p_data *p2p;
struct p2p_group *p2p_group; struct p2p_group *p2p_group;

View file

@ -293,6 +293,18 @@ static void ap_wps_reg_success_cb(void *ctx, const u8 *mac_addr,
} }
static void wpas_ap_configured_cb(void *ctx)
{
struct wpa_supplicant *wpa_s = ctx;
wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
if (wpa_s->ap_configured_cb)
wpa_s->ap_configured_cb(wpa_s->ap_configured_cb_ctx,
wpa_s->ap_configured_cb_data);
}
int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s, int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid) struct wpa_ssid *ssid)
{ {
@ -427,6 +439,8 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
wpa_s, ssid->p2p_persistent_group, wpa_s, ssid->p2p_persistent_group,
ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION); ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION);
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
hapd_iface->bss[i]->setup_complete_cb = wpas_ap_configured_cb;
hapd_iface->bss[i]->setup_complete_cb_ctx = wpa_s;
} }
os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN); os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN);
@ -442,11 +456,6 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
wpa_s->current_ssid = ssid; wpa_s->current_ssid = ssid;
os_memcpy(wpa_s->bssid, wpa_s->own_addr, ETH_ALEN); os_memcpy(wpa_s->bssid, wpa_s->own_addr, ETH_ALEN);
wpa_s->assoc_freq = ssid->frequency; wpa_s->assoc_freq = ssid->frequency;
wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
if (wpa_s->ap_configured_cb)
wpa_s->ap_configured_cb(wpa_s->ap_configured_cb_ctx,
wpa_s->ap_configured_cb_data);
return 0; return 0;
} }