diff options
author | Eliad Peller <eliad@wizery.com> | 2011-12-29 13:58:19 +0200 |
---|---|---|
committer | Arik Nemtsov <arik@wizery.com> | 2012-08-02 13:00:26 +0300 |
commit | 74d1e3e57787adc6db14ef95773758541ad7455b (patch) | |
tree | fa3fc5bd5a7be9cbf1e0bddc7d2fa72b1aa9e4c9 /src/ap | |
parent | 6e72d7b7977bfd6310c38aa5d87de0982ddcbb4d (diff) | |
download | external_wpa_supplicant_8_ti-74d1e3e57787adc6db14ef95773758541ad7455b.zip external_wpa_supplicant_8_ti-74d1e3e57787adc6db14ef95773758541ad7455b.tar.gz external_wpa_supplicant_8_ti-74d1e3e57787adc6db14ef95773758541ad7455b.tar.bz2 |
add station before getting assoc resp tx completion
Add the station before sending the association
response (rather than after tx completion), in
order to handle EAPOL-Start before tx completion
race.
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Diffstat (limited to 'src/ap')
-rw-r--r-- | src/ap/ieee802_11.c | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 3996c90..bf826ad 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -824,6 +824,36 @@ static void send_deauth(struct hostapd_data *hapd, const u8 *addr, } +static void add_pre_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta) +{ + struct ieee80211_ht_capabilities ht_cap; + /* + * Remove the STA entry in order to make sure the STA PS state gets + * cleared and configuration gets updated in case of reassociation back + * to the same AP. + */ + hostapd_drv_sta_remove(hapd, sta->addr); + +#ifdef CONFIG_IEEE80211N + if (sta->flags & WLAN_STA_HT) + hostapd_get_ht_capab(hapd, sta->ht_capabilities, &ht_cap); +#endif /* CONFIG_IEEE80211N */ + + if (hostapd_sta_add(hapd, sta->addr, sta->aid, sta->capability, + sta->supported_rates, sta->supported_rates_len, + sta->listen_interval, + sta->flags & WLAN_STA_HT ? &ht_cap : NULL, + sta->flags, sta->qosinfo)) { + hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_NOTICE, + "Could not add STA to kernel driver"); + + ap_sta_disconnect(hapd, sta, sta->addr, + WLAN_REASON_DISASSOC_AP_BUSY); + } +} + + static void send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, u16 status_code, int reassoc, const u8 *ies, size_t ies_len) @@ -918,6 +948,11 @@ static void send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, } #endif /* CONFIG_P2P */ + if (status_code == WLAN_STATUS_SUCCESS) { + wpa_printf(MSG_DEBUG, "Adding associated sta"); + add_pre_assoc_sta(hapd, sta); + } + #ifdef CONFIG_P2P_MANAGER if (hapd->conf->p2p & P2P_MANAGE) p = hostapd_eid_p2p_manage(hapd, p); @@ -1487,14 +1522,6 @@ static void handle_assoc_cb(struct hostapd_data *hapd, u16 status; struct sta_info *sta; int new_assoc = 1; - struct ieee80211_ht_capabilities ht_cap; - - if (!ok) { - hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, - HOSTAPD_LEVEL_DEBUG, - "did not acknowledge association response"); - return; - } if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt->u.reassoc_resp) : sizeof(mgmt->u.assoc_resp))) { @@ -1503,15 +1530,24 @@ static void handle_assoc_cb(struct hostapd_data *hapd, return; } + sta = ap_get_sta(hapd, mgmt->da); + if (!sta) { + printf("handle_assoc_cb: STA " MACSTR " not found\n", + MAC2STR(mgmt->da)); + return; + } + if (reassoc) status = le_to_host16(mgmt->u.reassoc_resp.status_code); else status = le_to_host16(mgmt->u.assoc_resp.status_code); - sta = ap_get_sta(hapd, mgmt->da); - if (!sta) { - printf("handle_assoc_cb: STA " MACSTR " not found\n", - MAC2STR(mgmt->da)); + if (!ok) { + hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_DEBUG, + "did not acknowledge association response"); + if (status == WLAN_STATUS_SUCCESS) + hostapd_drv_sta_remove(hapd, sta->addr); return; } @@ -1548,33 +1584,6 @@ static void handle_assoc_cb(struct hostapd_data *hapd, sta->sa_query_timed_out = 0; #endif /* CONFIG_IEEE80211W */ - /* - * Remove the STA entry in order to make sure the STA PS state gets - * cleared and configuration gets updated in case of reassociation back - * to the same AP. - */ - hostapd_drv_sta_remove(hapd, sta->addr); - -#ifdef CONFIG_IEEE80211N - if (sta->flags & WLAN_STA_HT) - hostapd_get_ht_capab(hapd, sta->ht_capabilities, &ht_cap); -#endif /* CONFIG_IEEE80211N */ - - if (hostapd_sta_add(hapd, sta->addr, sta->aid, sta->capability, - sta->supported_rates, sta->supported_rates_len, - sta->listen_interval, - sta->flags & WLAN_STA_HT ? &ht_cap : NULL, - sta->flags, sta->qosinfo)) { - hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, - HOSTAPD_LEVEL_NOTICE, - "Could not add STA to kernel driver"); - - ap_sta_disconnect(hapd, sta, sta->addr, - WLAN_REASON_DISASSOC_AP_BUSY); - - goto fail; - } - if (sta->flags & WLAN_STA_WDS) hostapd_set_wds_sta(hapd, sta->addr, sta->aid, 1); |