98e9d553f2
When using MAC randomization wpa_supplicant can change the local MAC address during roaming scenario: 1. We attach to AP1 (with MAC1/SSID1). 2. Roaming to AP2 (with MAC2/SSID2) is started: a) we send DEAUTH(for AP1, with MAC1) b) we change MAC to MAC2 due to randomization c) we start authentication for AP2 d) we get notification about DEAUTH for AP1 (which we ignore) e) we complete association with AP2 In point 2d we completely ignore the notification which later causes problems. This happens if the deauthentication event is generated by the local driver (e.g., due to beacon loss) instead of AP2 sending an explicit Deauthentication frame. The intended behavior is as follows: during roaming we generate DEAUTH (2a) and signal this event right away. To protect from handling of our own DEAUTH for the 2nd time supplicant marks 'ignore_next_local_deauth' variable. In point 2d we should receive this notification and clear the flag but this does not happen because MAC1 in the notification is not the current MAC address (it has been changed in 2b) so this notification is ignored as a one with a "foreign" address. So we end up successfully at AP2 but with 'ignore_next_local_deauth' still set which causes problems. For example if AP2 shuts down it has been observed on some drivers that the DEAUTH notification is generated as a local one and since we have flag to ignore it nothing is reported over D-Bus. To address the problem let's store the previously used MAC address and use it for checking for foreign address (in combination with the current one). Signed-off-by: Andrzej Ostruszka <amo@semihalf.com> |
||
---|---|---|
.. | ||
android_drv.h | ||
driver.h | ||
driver_atheros.c | ||
driver_bsd.c | ||
driver_common.c | ||
driver_hostap.c | ||
driver_hostap.h | ||
driver_macsec_linux.c | ||
driver_macsec_qca.c | ||
driver_ndis.c | ||
driver_ndis.h | ||
driver_ndis_.c | ||
driver_nl80211.c | ||
driver_nl80211.h | ||
driver_nl80211_android.c | ||
driver_nl80211_capa.c | ||
driver_nl80211_event.c | ||
driver_nl80211_monitor.c | ||
driver_nl80211_scan.c | ||
driver_none.c | ||
driver_openbsd.c | ||
driver_privsep.c | ||
driver_roboswitch.c | ||
driver_wext.c | ||
driver_wext.h | ||
driver_wired.c | ||
driver_wired_common.c | ||
driver_wired_common.h | ||
drivers.c | ||
drivers.mak | ||
drivers.mk | ||
linux_defines.h | ||
linux_ioctl.c | ||
linux_ioctl.h | ||
linux_wext.h | ||
Makefile | ||
ndis_events.c | ||
netlink.c | ||
netlink.h | ||
nl80211_copy.h | ||
priv_netlink.h | ||
rfkill.c | ||
rfkill.h |