|
@@ -1380,6 +1380,55 @@ void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
|
|
|
}
|
|
|
|
|
|
|
|
|
+int wpas_update_random_addr(struct wpa_supplicant *wpa_s)
|
|
|
+{
|
|
|
+ struct os_reltime now;
|
|
|
+ u8 addr[ETH_ALEN];
|
|
|
+
|
|
|
+ os_get_reltime(&now);
|
|
|
+ if (wpa_s->last_mac_addr_change.sec != 0 &&
|
|
|
+ !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
|
|
|
+ wpa_s->conf->rand_addr_lifetime)) {
|
|
|
+ wpa_msg(wpa_s, MSG_DEBUG,
|
|
|
+ "Previously selected random MAC address has not yet expired");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (random_mac_addr(addr) < 0)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
|
|
|
+ wpa_msg(wpa_s, MSG_INFO,
|
|
|
+ "Failed to set random MAC address");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ os_get_reltime(&wpa_s->last_mac_addr_change);
|
|
|
+ wpa_s->mac_addr_changed = 1;
|
|
|
+
|
|
|
+ if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
|
|
|
+ wpa_msg(wpa_s, MSG_INFO,
|
|
|
+ "Could not update MAC address information");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
|
|
|
+ MAC2STR(addr));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
|
|
|
+{
|
|
|
+ if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
|
|
|
+ !wpa_s->conf->preassoc_mac_addr)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return wpas_update_random_addr(wpa_s);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
|
|
|
|
|
|
/**
|
|
@@ -1395,6 +1444,29 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
|
|
|
{
|
|
|
struct wpa_connect_work *cwork;
|
|
|
|
|
|
+ if (wpa_s->last_ssid == ssid) {
|
|
|
+ wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
|
|
|
+ } else if (ssid->mac_addr == 1 ||
|
|
|
+ (ssid->mac_addr == -1 && wpa_s->conf->mac_addr == 1)) {
|
|
|
+ if (wpas_update_random_addr(wpa_s) < 0)
|
|
|
+ return;
|
|
|
+ wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
|
|
|
+ } else if (wpa_s->mac_addr_changed) {
|
|
|
+ if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
|
|
|
+ wpa_msg(wpa_s, MSG_INFO,
|
|
|
+ "Could not restore permanent MAC address");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ wpa_s->mac_addr_changed = 0;
|
|
|
+ if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
|
|
|
+ wpa_msg(wpa_s, MSG_INFO,
|
|
|
+ "Could not update MAC address information");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
|
|
|
+ }
|
|
|
+ wpa_s->last_ssid = ssid;
|
|
|
+
|
|
|
#ifdef CONFIG_IBSS_RSN
|
|
|
ibss_rsn_deinit(wpa_s->ibss_rsn);
|
|
|
wpa_s->ibss_rsn = NULL;
|
|
@@ -2662,6 +2734,8 @@ int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+ wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|