Include previous BSSID in connection request to indicate reassociation

This allows the SME-in-the-driver case to get similar information about
reassociation that was already available for the SME-in-wpa_supplicant
case.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2016-03-24 12:35:05 +02:00 committed by Jouni Malinen
parent 00c3c4ac9b
commit 6a5ee810a3
2 changed files with 10 additions and 1 deletions

View File

@ -1646,9 +1646,11 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
wmm_ac_clear_saved_tspecs(wpa_s); wmm_ac_clear_saved_tspecs(wpa_s);
wpa_s->reassoc_same_bss = 0; wpa_s->reassoc_same_bss = 0;
wpa_s->reassoc_same_ess = 0;
if (wpa_s->last_ssid == ssid) { if (wpa_s->last_ssid == ssid) {
wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS"); wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
wpa_s->reassoc_same_ess = 1;
if (wpa_s->current_bss && wpa_s->current_bss == bss) { if (wpa_s->current_bss && wpa_s->current_bss == bss) {
wmm_ac_save_tspecs(wpa_s); wmm_ac_save_tspecs(wpa_s);
wpa_s->reassoc_same_bss = 1; wpa_s->reassoc_same_bss = 1;
@ -2063,6 +2065,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
int wep_keys_set = 0; int wep_keys_set = 0;
int assoc_failed = 0; int assoc_failed = 0;
struct wpa_ssid *old_ssid; struct wpa_ssid *old_ssid;
u8 prev_bssid[ETH_ALEN];
#ifdef CONFIG_HT_OVERRIDES #ifdef CONFIG_HT_OVERRIDES
struct ieee80211_ht_capabilities htcaps; struct ieee80211_ht_capabilities htcaps;
struct ieee80211_ht_capabilities htcaps_mask; struct ieee80211_ht_capabilities htcaps_mask;
@ -2096,6 +2099,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
return; return;
} }
os_memcpy(prev_bssid, wpa_s->bssid, ETH_ALEN);
os_memset(&params, 0, sizeof(params)); os_memset(&params, 0, sizeof(params));
wpa_s->reassociate = 0; wpa_s->reassociate = 0;
wpa_s->eap_expected_failure = 0; wpa_s->eap_expected_failure = 0;
@ -2536,6 +2540,10 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
} }
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
if (wpa_s->reassoc_same_ess && !is_zero_ether_addr(prev_bssid) &&
wpa_s->current_ssid)
params.prev_bssid = prev_bssid;
ret = wpa_drv_associate(wpa_s, &params); ret = wpa_drv_associate(wpa_s, &params);
if (ret < 0) { if (ret < 0) {
wpa_msg(wpa_s, MSG_INFO, "Association request to the driver " wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "

View File

@ -494,7 +494,8 @@ struct wpa_supplicant {
u8 pending_bssid[ETH_ALEN]; /* If wpa_state == WPA_ASSOCIATING, this u8 pending_bssid[ETH_ALEN]; /* If wpa_state == WPA_ASSOCIATING, this
* field contains the target BSSID. */ * field contains the target BSSID. */
int reassociate; /* reassociation requested */ int reassociate; /* reassociation requested */
int reassoc_same_bss; /* reassociating to the same bss */ unsigned int reassoc_same_bss:1; /* reassociating to the same BSS */
unsigned int reassoc_same_ess:1; /* reassociating to the same ESS */
int disconnected; /* all connections disabled; i.e., do no reassociate int disconnected; /* all connections disabled; i.e., do no reassociate
* before this has been cleared */ * before this has been cleared */
struct wpa_ssid *current_ssid; struct wpa_ssid *current_ssid;