Reject authentication start during explicit roam requests
The roam D-Bus and ROAM control itnerface commands flip the reassociate bit before calling wpa_supplicant_connect(). wpa_supplicant connect eventually aborts ongoing scans (if any), which causes scan results to be reported. Since the reassociate bit is set, this will trigger a connection attempt based on the aborted scan's scan results and cancel the initial connetion request. This often causes wpa_supplicant to reassociate to the same AP it is currently associated to instead of the explicitly requested roaming target. Add a roam_in_progress flag to indicate that we're currently attempting to roam via an explicitly request to a specific BSS so that we don't initiate another connection attempt based on the possibly received scan results from a scan that was in progress at the time the roam command was received. Signed-off-by: Matthew Wang <matthewmwang@chromium.org>
This commit is contained in:
parent
800fb69970
commit
5ac977758d
4 changed files with 28 additions and 0 deletions
|
@ -5656,6 +5656,7 @@ static int wpa_supplicant_ctrl_iface_roam(struct wpa_supplicant *wpa_s,
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid[ETH_ALEN];
|
||||||
struct wpa_bss *bss;
|
struct wpa_bss *bss;
|
||||||
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
||||||
|
struct wpa_radio_work *already_connecting;
|
||||||
|
|
||||||
if (hwaddr_aton(addr, bssid)) {
|
if (hwaddr_aton(addr, bssid)) {
|
||||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE ROAM: invalid "
|
wpa_printf(MSG_DEBUG, "CTRL_IFACE ROAM: invalid "
|
||||||
|
@ -5683,9 +5684,18 @@ static int wpa_supplicant_ctrl_iface_roam(struct wpa_supplicant *wpa_s,
|
||||||
* allow roaming to other networks
|
* allow roaming to other networks
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
already_connecting = radio_work_pending(wpa_s, "sme-connect");
|
||||||
wpa_s->reassociate = 1;
|
wpa_s->reassociate = 1;
|
||||||
wpa_supplicant_connect(wpa_s, bss, ssid);
|
wpa_supplicant_connect(wpa_s, bss, ssid);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Indicate that an explicitly requested roam is in progress so scan
|
||||||
|
* results that come in before the 'sme-connect' radio work gets
|
||||||
|
* executed do not override the original connection attempt.
|
||||||
|
*/
|
||||||
|
if (!already_connecting && radio_work_pending(wpa_s, "sme-connect"))
|
||||||
|
wpa_s->roam_in_progress = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif /* CONFIG_NO_SCAN_PROCESSING */
|
#endif /* CONFIG_NO_SCAN_PROCESSING */
|
||||||
}
|
}
|
||||||
|
|
|
@ -1979,6 +1979,7 @@ DBusMessage * wpas_dbus_handler_roam(DBusMessage *message,
|
||||||
struct wpa_bss *bss;
|
struct wpa_bss *bss;
|
||||||
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
||||||
char *addr;
|
char *addr;
|
||||||
|
struct wpa_radio_work *already_connecting;
|
||||||
|
|
||||||
if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &addr,
|
if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &addr,
|
||||||
DBUS_TYPE_INVALID))
|
DBUS_TYPE_INVALID))
|
||||||
|
@ -2002,9 +2003,18 @@ DBusMessage * wpas_dbus_handler_roam(DBusMessage *message,
|
||||||
message, "Target BSS not found");
|
message, "Target BSS not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
already_connecting = radio_work_pending(wpa_s, "sme-connect");
|
||||||
wpa_s->reassociate = 1;
|
wpa_s->reassociate = 1;
|
||||||
wpa_supplicant_connect(wpa_s, bss, ssid);
|
wpa_supplicant_connect(wpa_s, bss, ssid);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Indicate that an explicitly requested roam is in progress so scan
|
||||||
|
* results that come in before the 'sme-connect' radio work gets
|
||||||
|
* executed do not override the original connection attempt.
|
||||||
|
*/
|
||||||
|
if (!already_connecting && radio_work_pending(wpa_s, "sme-connect"))
|
||||||
|
wpa_s->roam_in_progress = true;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif /* CONFIG_NO_SCAN_PROCESSING */
|
#endif /* CONFIG_NO_SCAN_PROCESSING */
|
||||||
}
|
}
|
||||||
|
|
|
@ -941,6 +941,8 @@ static void sme_auth_start_cb(struct wpa_radio_work *work, int deinit)
|
||||||
struct wpa_connect_work *cwork = work->ctx;
|
struct wpa_connect_work *cwork = work->ctx;
|
||||||
struct wpa_supplicant *wpa_s = work->wpa_s;
|
struct wpa_supplicant *wpa_s = work->wpa_s;
|
||||||
|
|
||||||
|
wpa_s->roam_in_progress = false;
|
||||||
|
|
||||||
if (deinit) {
|
if (deinit) {
|
||||||
if (work->started)
|
if (work->started)
|
||||||
wpa_s->connect_work = NULL;
|
wpa_s->connect_work = NULL;
|
||||||
|
@ -981,6 +983,11 @@ void sme_authenticate(struct wpa_supplicant *wpa_s,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wpa_s->roam_in_progress) {
|
||||||
|
wpa_dbg(wpa_s, MSG_DEBUG,
|
||||||
|
"SME: Reject sme_authenticate() in favor of explicit roam request");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (radio_work_pending(wpa_s, "sme-connect")) {
|
if (radio_work_pending(wpa_s, "sme-connect")) {
|
||||||
/*
|
/*
|
||||||
* The previous sme-connect work might no longer be valid due to
|
* The previous sme-connect work might no longer be valid due to
|
||||||
|
|
|
@ -621,6 +621,7 @@ 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 */
|
||||||
|
bool roam_in_progress; /* roam in progress */
|
||||||
unsigned int reassoc_same_bss:1; /* 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 */
|
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
|
||||||
|
|
Loading…
Reference in a new issue