No automatic reconnection after AP was down

Bojan Prtvar bojan.prtvar
Wed Sep 24 04:12:30 PDT 2014


On 17/09/2014 10:24, Bojan Prtvar wrote:
> Hi,
> 
> On 16/09/2014 20:56, Dan Williams wrote:
>>  wlan0:    skip - no WPA/RSN proto match
>>  wlan0: No suitable network found
>> The AP that's been selected is not broadcasting any WPA or RSN
>> information elements, so that AP is not WPA/RSN capable.  But since your
>> configuration requires WPA or RSN, there is a mismatch and you cannot
>> connect to the AP.
>>
>> This is probably an AP bug: it should not broadcasting beacons with the
>> wrong information, before it has completely set itself up.  Here, it
>> seems to be starting up and sending out a beacon without any encryption
>> indication, and then later (well, a second or two or three) it probably
>> changes the information elements to specify WPA or RSN.  If this AP is
>> actually a hotspot that you've created yourself, then the driver/hostap
>> should be fixed.
>>
>> wpa_supplicant does have some code to handle this, so if the AP does
>> change it's beacon I would expect the supplicant to notice and
>> eventually connect.  What does "iw wlan0 scan dump" show on your machine
>> for marvell_5GHz when this problem happens?
>>
> Thanks for shedding some light. When the problem happens "iw wlan0 scan
> dump" shows no output, when the box reconnects it gives nice&long report.
> Could you please point me to the piece of code which handles situation
> "when AP change it's bacon"? My wpa_supplicant is little dated, maybe I
> only need to back port existing fix. Or there may be an open space for
> further improvement.
> 
> Regards,
> Bojan

I need to revisit this topic, but this time I did my homework. It turns
out that Dan Williams was right and the AP initially does broadcast the
beacons with wrong information.

SIDE NOTE BEGIN:
Why we don't have some handy parser of IEs in dump_scan_res(), we only
do a hexdump?
SIDE NOTE END

The wpa_supplicant detects this situation, and bottom-line of handling
is in wpas_select_network_from_last_scan().
It does:

            if (wpa_supplicant_req_sched_scan(wpa_s))
                wpa_supplicant_req_new_scan(wpa_s, timeout_sec,
                                timeout_usec);

The problem is, I hit this condition in wpa_supplicant_req_sched_scan():

    if (wpa_s->sched_scanning) {
        wpa_dbg(wpa_s, MSG_DEBUG, "Already sched scanning");
        return 0;
    }

The wpa_supplicant_req_new_scan() never gets called and I don't get scan
results any more after this happens. So this looks like a race condition
over wpa_s->sched_scanning variable.

Idea for a workaround is simple(it works for me, but I would like to get
a feedback).

Regards,
Bojan

diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 1a0bc41..0956d82 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1473,9 +1473,8 @@ static int
wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s,
                                return 0;
                        }
 #endif /* CONFIG_WPS */
-                       if (wpa_supplicant_req_sched_scan(wpa_s))
-                               wpa_supplicant_req_new_scan(wpa_s,
timeout_sec,
-                                                           timeout_usec);
+                       wpa_supplicant_req_new_scan(wpa_s, timeout_sec,
+                                                   timeout_usec);
                }
        }
        return 0;




More information about the Hostap mailing list