X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=wpa_supplicant%2Fevents.c;h=159b024040df2d7651bb749e80662b0c6be69dc3;hb=refs%2Fheads%2Fmaster;hp=cd5928ebb3f9c3f1a46cd9dbd5ed5716e545951d;hpb=0632542b8b640d04780af6ca4c154f520d8214d5;p=wpasupplicant diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index cd5928e..159b024 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -18,10 +18,10 @@ #include "eapol_supp/eapol_supp_sm.h" #include "wpa.h" #include "eloop.h" -#include "drivers/driver.h" #include "config.h" #include "l2_packet/l2_packet.h" #include "wpa_supplicant_i.h" +#include "driver_i.h" #include "pcsc_funcs.h" #include "preauth.h" #include "pmksa_cache.h" @@ -33,6 +33,7 @@ #include "wpas_glue.h" #include "wps_supplicant.h" #include "ibss_rsn.h" +#include "sme.h" static int wpa_supplicant_select_config(struct wpa_supplicant *wpa_s) @@ -614,6 +615,8 @@ static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s) struct wpa_scan_res *selected = NULL; struct wpa_ssid *ssid = NULL; + wpa_supplicant_notify_scanning(wpa_s, 0); + if (wpa_supplicant_get_scan_results(wpa_s) < 0) { if (wpa_s->conf->ap_scan == 2) return; @@ -708,11 +711,58 @@ req_scan: #endif /* CONFIG_NO_SCAN_PROCESSING */ +#ifdef CONFIG_IEEE80211R +static void wpa_assoc_set_ft_params(struct wpa_supplicant *wpa_s, + const u8 *ftie, const u8 *mdie) +{ + const u8 *mobility_domain = NULL; + const u8 *r0kh_id = NULL; + size_t r0kh_id_len = 0; + const u8 *r1kh_id = NULL; + struct rsn_ftie *hdr; + const u8 *pos, *end; + + if (mdie == NULL || ftie == NULL) + return; + + if (mdie[1] >= MOBILITY_DOMAIN_ID_LEN) { + mobility_domain = mdie + 2; +#ifdef CONFIG_SME + wpa_s->sme.ft_used = 1; + os_memcpy(wpa_s->sme.mobility_domain, mobility_domain, 2); +#endif /* CONFIG_SME */ + } + if (ftie[1] >= sizeof(struct rsn_ftie)) { + end = ftie + 2 + ftie[1]; + hdr = (struct rsn_ftie *) (ftie + 2); + pos = (const u8 *) (hdr + 1); + while (pos + 1 < end) { + if (pos + 2 + pos[1] > end) + break; + if (pos[0] == FTIE_SUBELEM_R1KH_ID && + pos[1] == FT_R1KH_ID_LEN) + r1kh_id = pos + 2; + else if (pos[0] == FTIE_SUBELEM_R0KH_ID && + pos[1] >= 1 && pos[1] <= FT_R0KH_ID_MAX_LEN) { + r0kh_id = pos + 2; + r0kh_id_len = pos[1]; + } + pos += 2 + pos[1]; + } + } + wpa_sm_set_ft_params(wpa_s->wpa, mobility_domain, r0kh_id, + r0kh_id_len, r1kh_id); +} +#endif /* CONFIG_IEEE80211R */ + static void wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s, union wpa_event_data *data) { int l, len, found = 0, wpa_found, rsn_found; - u8 *p; + const u8 *p; +#ifdef CONFIG_IEEE80211R + const u8 *mdie = NULL, *ftie = NULL; +#endif /* CONFIG_IEEE80211R */ wpa_printf(MSG_DEBUG, "Association info event"); if (data->assoc_info.req_ies) @@ -752,6 +802,29 @@ static void wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s, if (!found && data->assoc_info.req_ies) wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0); +#ifdef CONFIG_IEEE80211R + p = data->assoc_info.resp_ies; + l = data->assoc_info.resp_ies_len; + + /* Go through the IEs and make a copy of the WPA/RSN IE, if present. */ + while (p && l >= 2) { + len = p[1] + 2; + if (len > l) { + wpa_hexdump(MSG_DEBUG, "Truncated IE in assoc_info", + p, l); + break; + } + if (p[0] == WLAN_EID_FAST_BSS_TRANSITION) + ftie = p; + else if (p[0] == WLAN_EID_MOBILITY_DOMAIN) + mdie = p; + l -= len; + p += len; + } + + wpa_assoc_set_ft_params(wpa_s, ftie, mdie); +#endif /* CONFIG_IEEE80211R */ + /* WPA/RSN IE from Beacon/ProbeResp */ p = data->assoc_info.beacon_ies; l = data->assoc_info.beacon_ies_len; @@ -802,9 +875,9 @@ static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s, wpa_supplicant_event_associnfo(wpa_s, data); wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATED); - if (wpa_s->use_client_mlme) + if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) os_memcpy(bssid, wpa_s->bssid, ETH_ALEN); - if (wpa_s->use_client_mlme || + if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) || (wpa_drv_get_bssid(wpa_s, bssid) >= 0 && os_memcmp(bssid, wpa_s->bssid, ETH_ALEN) != 0)) { wpa_msg(wpa_s, MSG_DEBUG, "Associated to a new BSS: BSSID=" @@ -859,7 +932,7 @@ static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s, } wpa_supplicant_cancel_scan(wpa_s); - if (wpa_s->driver_4way_handshake && + if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) && wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) { /* * We are done; the driver will take care of RSN 4-way @@ -1017,6 +1090,19 @@ wpa_supplicant_event_michael_mic_failure(struct wpa_supplicant *wpa_s, } +#ifdef CONFIG_TERMINATE_ONLASTIF +static int any_interfaces(struct wpa_supplicant *head) +{ + struct wpa_supplicant *wpa_s; + + for (wpa_s = head; wpa_s != NULL; wpa_s = wpa_s->next) + if (!wpa_s->interface_removed) + return 1; + return 0; +} +#endif /* CONFIG_TERMINATE_ONLASTIF */ + + static void wpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s, union wpa_event_data *data) @@ -1041,6 +1127,11 @@ wpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s, wpa_supplicant_mark_disassoc(wpa_s); l2_packet_deinit(wpa_s->l2); wpa_s->l2 = NULL; +#ifdef CONFIG_TERMINATE_ONLASTIF + /* check if last interface */ + if (!any_interfaces(wpa_s->global->ifaces)) + eloop_terminate(); +#endif /* CONFIG_TERMINATE_ONLASTIF */ break; } } @@ -1069,7 +1160,9 @@ wpa_supplicant_event_ft_response(struct wpa_supplicant *wpa_s, if (wpa_ft_process_response(wpa_s->wpa, data->ft_ies.ies, data->ft_ies.ies_len, data->ft_ies.ft_action, - data->ft_ies.target_ap) < 0) { + data->ft_ies.target_ap, + data->ft_ies.ric_ies, + data->ft_ies.ric_ies_len) < 0) { /* TODO: prevent MLME/driver from trying to associate? */ } } @@ -1093,9 +1186,13 @@ void wpa_supplicant_event(void *ctx, wpa_event_type event, struct wpa_supplicant *wpa_s = ctx; switch (event) { + case EVENT_AUTH: + sme_event_auth(wpa_s, data); + break; case EVENT_ASSOC: wpa_supplicant_event_assoc(wpa_s, data); break; + case EVENT_DEAUTH: case EVENT_DISASSOC: wpa_supplicant_event_disassoc(wpa_s); break; @@ -1131,6 +1228,15 @@ void wpa_supplicant_event(void *ctx, wpa_event_type event, wpa_supplicant_event_ibss_rsn_start(wpa_s, data); break; #endif /* CONFIG_IBSS_RSN */ + case EVENT_ASSOC_REJECT: + sme_event_assoc_reject(wpa_s, data); + break; + case EVENT_AUTH_TIMED_OUT: + sme_event_auth_timed_out(wpa_s, data); + break; + case EVENT_ASSOC_TIMED_OUT: + sme_event_assoc_timed_out(wpa_s, data); + break; default: wpa_printf(MSG_INFO, "Unknown event %d", event); break;