nl80211: Register for IBSS auth frames before eloop

The IBSS code registers the bss nl_mgmt socket for auth
frames when the join event happens, but that is too late
as then the socket is already on the eloop, which could
cause problems when other events are received at the
same time as the registration is done.

Move the auth frame registration to the initial setup
before the socket is put onto the eloop.

Signed-hostap: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2013-10-26 16:00:52 +03:00 committed by Jouni Malinen
parent 03610ad28d
commit e8d1168b73

View File

@ -1830,8 +1830,6 @@ static void mlme_event_michael_mic_failure(struct i802_bss *bss,
static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv, static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
struct nlattr *tb[]) struct nlattr *tb[])
{ {
u16 type = (WLAN_FC_TYPE_MGMT << 2) | (WLAN_FC_STYPE_AUTH << 4);
if (tb[NL80211_ATTR_MAC] == NULL) { if (tb[NL80211_ATTR_MAC] == NULL) {
wpa_printf(MSG_DEBUG, "nl80211: No address in IBSS joined " wpa_printf(MSG_DEBUG, "nl80211: No address in IBSS joined "
"event"); "event");
@ -1839,10 +1837,6 @@ static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
} }
os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN); os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
/* register for any AUTH message */
nl80211_register_frame(&drv->first_bss, drv->first_bss.nl_mgmt,
type, NULL, 0);
drv->associated = 1; drv->associated = 1;
wpa_printf(MSG_DEBUG, "nl80211: IBSS " MACSTR " joined", wpa_printf(MSG_DEBUG, "nl80211: IBSS " MACSTR " joined",
MAC2STR(drv->bssid)); MAC2STR(drv->bssid));
@ -3805,6 +3799,13 @@ static int nl80211_mgmt_subscribe_non_ap(struct i802_bss *bss)
wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with non-AP " wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with non-AP "
"handle %p", bss->nl_mgmt); "handle %p", bss->nl_mgmt);
if (drv->nlmode == NL80211_IFTYPE_ADHOC) {
u16 type = (WLAN_FC_TYPE_MGMT << 2) | (WLAN_FC_STYPE_AUTH << 4);
/* register for any AUTH message */
nl80211_register_frame(bss, bss->nl_mgmt, type, NULL, 0);
}
#ifdef CONFIG_INTERWORKING #ifdef CONFIG_INTERWORKING
/* QoS Map Configure */ /* QoS Map Configure */
if (nl80211_register_action_frame(bss, (u8 *) "\x01\x04", 2) < 0) if (nl80211_register_action_frame(bss, (u8 *) "\x01\x04", 2) < 0)