Handle interface disabled/enabled more consistently

It was possible for the interface not to be marked in INTERFACE_DISABLED
state in case the event was processed for P2P GO because the wpa_s
instance could have been removed in case of a separate group interface.
Change the state first to avoid leaving different state for the case
where separate group interface is not used.

Mark scan to be a normal scan on INTERFACE_ENABLED so that scanning
rules (e.g., skip scan if no networks enabled) get used consistently.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2015-01-08 22:39:18 +02:00
parent 8f2cf37923
commit 635874b55a

View File

@ -3379,6 +3379,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
if (!wpa_s->ap_iface) { if (!wpa_s->ap_iface) {
wpa_supplicant_set_state(wpa_s, wpa_supplicant_set_state(wpa_s,
WPA_DISCONNECTED); WPA_DISCONNECTED);
wpa_s->scan_req = NORMAL_SCAN_REQ;
wpa_supplicant_req_scan(wpa_s, 0, 0); wpa_supplicant_req_scan(wpa_s, 0, 0);
} else } else
wpa_supplicant_set_state(wpa_s, wpa_supplicant_set_state(wpa_s,
@ -3395,6 +3396,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO || if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO ||
(wpa_s->current_ssid && wpa_s->current_ssid->p2p_group && (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group &&
wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO)) { wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO)) {
/*
* Mark interface disabled if this happens to end up not
* being removed as a separate P2P group interface.
*/
wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED);
/* /*
* The interface was externally disabled. Remove * The interface was externally disabled. Remove
* it assuming an external entity will start a * it assuming an external entity will start a
@ -3405,6 +3411,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
wpas_p2p_interface_unavailable(wpa_s); wpas_p2p_interface_unavailable(wpa_s);
else else
wpas_p2p_disconnect(wpa_s); wpas_p2p_disconnect(wpa_s);
/*
* wpa_s instance may have been freed, so must not use
* it here anymore.
*/
break; break;
} }
if (wpa_s->p2p_scan_work && wpa_s->global->p2p && if (wpa_s->p2p_scan_work && wpa_s->global->p2p &&