FT: Add a workaround to set PTK after reassociation

If the PTK configuration prior to association fails, allow reassociation
attempt to continue and configure PTK after association. This is a
workaround for drivers that do not allow PTK to be configured before
association (e.g., current cfg80211/mac80211).
This commit is contained in:
Jouni Malinen 2010-03-13 17:15:38 +02:00
parent 71024cb255
commit 86f7b62a33
2 changed files with 29 additions and 9 deletions

View file

@ -629,18 +629,29 @@ int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
} }
ret = wpa_ft_install_ptk(sm, bssid); ret = wpa_ft_install_ptk(sm, bssid);
if (ret) {
/*
* Some drivers do not support key configuration when we are
* not associated with the target AP. Work around this by
* trying again after the following reassociation gets
* completed.
*/
wpa_printf(MSG_DEBUG, "FT: Failed to set PTK prior to "
"association - try again after reassociation");
sm->set_ptk_after_assoc = 1;
} else
sm->set_ptk_after_assoc = 0;
if (ret == 0) {
sm->ft_completed = 1; sm->ft_completed = 1;
if (ft_action) { if (ft_action) {
/* TODO: trigger re-association to the Target AP; /*
* MLME is now doing this automatically, but it should * The caller is expected trigger re-association with the
* really be done only if we get here successfully. */ * Target AP.
*/
os_memcpy(sm->bssid, target_ap, ETH_ALEN); os_memcpy(sm->bssid, target_ap, ETH_ALEN);
} }
}
return ret; return 0;
} }
@ -896,6 +907,14 @@ int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
return -1; return -1;
#endif /* CONFIG_IEEE80211W */ #endif /* CONFIG_IEEE80211W */
if (sm->set_ptk_after_assoc) {
wpa_printf(MSG_DEBUG, "FT: Try to set PTK again now that we "
"are associated");
if (wpa_ft_install_ptk(sm, src_addr) < 0)
return -1;
sm->set_ptk_after_assoc = 0;
}
if (parse.ric) { if (parse.ric) {
wpa_hexdump(MSG_MSGDUMP, "FT: RIC Response", wpa_hexdump(MSG_MSGDUMP, "FT: RIC Response",
parse.ric, parse.ric_len); parse.ric, parse.ric_len);

View file

@ -106,6 +106,7 @@ struct wpa_sm {
int ft_completed; int ft_completed;
int over_the_ds_in_progress; int over_the_ds_in_progress;
u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */ u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */
int set_ptk_after_assoc;
#endif /* CONFIG_IEEE80211R */ #endif /* CONFIG_IEEE80211R */
}; };