t.sec -= WPA_BSS_EXPIRATION_AGE;
dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) {
- if (os_memcmp(bss->bssid, wpa_s->bssid, ETH_ALEN) == 0 ||
+ if (bss == wpa_s->current_bss ||
+ os_memcmp(bss->bssid, wpa_s->bssid, ETH_ALEN) == 0 ||
os_memcmp(bss->bssid, wpa_s->pending_bssid, ETH_ALEN) == 0)
continue; /* do not expire BSSes that are in use */
{
DBusMessage *reply = NULL;
char *bss_obj_path = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
- struct wpa_bss *bss = NULL;
if (bss_obj_path == NULL)
return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
NULL);
- /* TODO: store current BSS or BSS id in wpa_s */
- if (!is_zero_ether_addr(wpa_s->bssid))
- bss = wpa_bss_get_bssid(wpa_s, wpa_s->bssid);
-
- if (bss)
+ if (wpa_s->current_bss)
os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
"%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
- wpa_s->dbus_new_path, bss->id);
+ wpa_s->dbus_new_path, wpa_s->current_bss->id);
else
os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
wpa_s, WLAN_REASON_DEAUTH_LEAVING);
return;
}
+ if (wpa_s->current_ssid) {
+ struct wpa_bss *bss = NULL;
+ struct wpa_ssid *ssid = wpa_s->current_ssid;
+ if (ssid->ssid_len > 0)
+ bss = wpa_bss_get(wpa_s, bssid,
+ ssid->ssid, ssid->ssid_len);
+ if (!bss)
+ bss = wpa_bss_get_bssid(wpa_s, bssid);
+ if (bss)
+ wpa_s->current_bss = bss;
+ }
}
#ifdef CONFIG_SME
return;
}
+ wpa_s->current_bss = bss;
+
os_memset(¶ms, 0, sizeof(params));
wpa_s->reassociate = 0;
return;
}
wpa_supplicant_create_ap(wpa_s, ssid);
+ wpa_s->current_bss = bss;
#else /* CONFIG_AP */
wpa_printf(MSG_ERROR, "AP mode support not included in the "
"build");
}
old_ssid = wpa_s->current_ssid;
wpa_s->current_ssid = ssid;
+ wpa_s->current_bss = bss;
wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
wpa_supplicant_initiate_eapol(wpa_s);
if (old_ssid != wpa_s->current_ssid)
wpa_supplicant_mark_disassoc(wpa_s);
old_ssid = wpa_s->current_ssid;
wpa_s->current_ssid = NULL;
+ wpa_s->current_bss = NULL;
wpa_sm_set_config(wpa_s->wpa, NULL);
eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
if (old_ssid != wpa_s->current_ssid)
wpa_supplicant_mark_disassoc(wpa_s);
old_ssid = wpa_s->current_ssid;
wpa_s->current_ssid = NULL;
+ wpa_s->current_bss = NULL;
wpa_sm_set_config(wpa_s->wpa, NULL);
eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
if (old_ssid != wpa_s->current_ssid)
int disconnected; /* all connections disabled; i.e., do no reassociate
* before this has been cleared */
struct wpa_ssid *current_ssid;
+ struct wpa_bss *current_bss;
int ap_ies_from_associnfo;
unsigned int assoc_freq;