Handle interface disabled/enabled more consistently
authorJouni Malinen <j@w1.fi>
Thu, 8 Jan 2015 20:39:18 +0000 (22:39 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 8 Jan 2015 20:43:48 +0000 (22:43 +0200)
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>
wpa_supplicant/events.c

index 3c295c8..7f90393 100644 (file)
@@ -3379,6 +3379,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                        if (!wpa_s->ap_iface) {
                                wpa_supplicant_set_state(wpa_s,
                                                         WPA_DISCONNECTED);
+                               wpa_s->scan_req = NORMAL_SCAN_REQ;
                                wpa_supplicant_req_scan(wpa_s, 0, 0);
                        } else
                                wpa_supplicant_set_state(wpa_s,
@@ -3396,6 +3397,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                    (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group &&
                     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
                         * it assuming an external entity will start a
                         * new session if needed.
@@ -3405,6 +3411,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                                wpas_p2p_interface_unavailable(wpa_s);
                        else
                                wpas_p2p_disconnect(wpa_s);
+                       /*
+                        * wpa_s instance may have been freed, so must not use
+                        * it here anymore.
+                        */
                        break;
                }
                if (wpa_s->p2p_scan_work && wpa_s->global->p2p &&