HS 2.0R2: Try to scan multiple times for OSU providers
authorJouni Malinen <jouni@qca.qualcomm.com>
Fri, 13 Dec 2013 02:39:00 +0000 (18:39 -0800)
committerJouni Malinen <j@w1.fi>
Tue, 25 Feb 2014 23:24:24 +0000 (01:24 +0200)
Scan operation is not that reliable, so try couple of times if no
OSU provider matches are found during fetch_osu command.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

wpa_supplicant/hs20_supplicant.c
wpa_supplicant/hs20_supplicant.h
wpa_supplicant/interworking.c
wpa_supplicant/wpa_supplicant_i.h

index 2cacb42..b873c7c 100644 (file)
@@ -385,6 +385,7 @@ void hs20_parse_rx_hs20_anqp_resp(struct wpa_supplicant *wpa_s,
        case HS20_STYPE_OSU_PROVIDERS_LIST:
                wpa_msg(wpa_s, MSG_INFO, "RX-HS20-ANQP " MACSTR
                        " OSU Providers list", MAC2STR(sa));
+               wpa_s->num_prov_found++;
                if (anqp) {
                        wpabuf_free(anqp->hs20_osu_providers_list);
                        anqp->hs20_osu_providers_list =
@@ -821,11 +822,20 @@ int hs20_fetch_osu(struct wpa_supplicant *wpa_s)
        }
 
        wpa_msg(wpa_s, MSG_INFO, "Starting OSU provisioning information fetch");
+       wpa_s->num_osu_scans = 0;
+       wpa_s->num_prov_found = 0;
+       hs20_start_osu_scan(wpa_s);
+
+       return 0;
+}
+
+
+void hs20_start_osu_scan(struct wpa_supplicant *wpa_s)
+{
+       wpa_s->num_osu_scans++;
        wpa_s->scan_req = MANUAL_SCAN_REQ;
        wpa_s->scan_res_handler = hs20_osu_scan_res_handler;
        wpa_supplicant_req_scan(wpa_s, 0, 0);
-
-       return 0;
 }
 
 
index 9782528..88e5062 100644 (file)
@@ -32,5 +32,6 @@ void hs20_osu_icon_fetch(struct wpa_supplicant *wpa_s);
 int hs20_fetch_osu(struct wpa_supplicant *wpa_s);
 void hs20_cancel_fetch_osu(struct wpa_supplicant *wpa_s);
 void hs20_icon_fetch_failed(struct wpa_supplicant *wpa_s);
+void hs20_start_osu_scan(struct wpa_supplicant *wpa_s);
 
 #endif /* HS20_SUPPLICANT_H */
index fcfa639..abf5dee 100644 (file)
@@ -2474,6 +2474,12 @@ static void interworking_next_anqp_fetch(struct wpa_supplicant *wpa_s)
 
        if (found == 0) {
                if (wpa_s->fetch_osu_info) {
+                       if (wpa_s->num_prov_found == 0 &&
+                           wpa_s->num_osu_scans < 3) {
+                               wpa_printf(MSG_DEBUG, "HS 2.0: No OSU providers seen - try to scan again");
+                               hs20_start_osu_scan(wpa_s);
+                               return;
+                       }
                        wpa_printf(MSG_DEBUG, "Interworking: Next icon");
                        hs20_osu_icon_fetch(wpa_s);
                        return;
index 0b505ff..1314734 100644 (file)
@@ -778,6 +778,8 @@ struct wpa_supplicant {
        struct osu_provider *osu_prov;
        size_t osu_prov_count;
        struct os_reltime osu_icon_fetch_start;
+       unsigned int num_osu_scans;
+       unsigned int num_prov_found;
 #endif /* CONFIG_INTERWORKING */
        unsigned int drv_capa_known;