]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Fix req_scan-deplete-timeout and update eloop API for this
authorJouni Malinen <j@w1.fi>
Sun, 5 Jan 2014 07:59:38 +0000 (09:59 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 7 Jan 2014 08:45:10 +0000 (10:45 +0200)
Commit e2f5a9889a3a2bb8f1eed0cf274c7fbbabe3e9de was supposed to prevent
new scan request from pushing out the old one. However, it did not
really do that since eloop_deplete_timeout() returned 0 both for the
case where the old timeout existed (and was sooner) and if the old
timeout did not exist. It returned 1 only for the case where an old
timeout did exist and was larger than the new requested value. That case
used to result in wpa_supplicant_req_scan() rescheduling the timeout,
but hew code in eloop_deplete_timeout() did the exact same thing and as
such, did not really change anything apart from the debug log message.

Extend the eloop_deplete_timeout() (and eloop_replenish_timeout() for
that matter since it is very similar) to return three different values
based on whether the timeout existed or not and if yes, whether it was
modified. This allows wpa_supplicant_req_scan() to schedule a new
timeout only in the case there was no old timeout.

Signed-hostap: Jouni Malinen <j@w1.fi>

src/ap/sta_info.c
src/ap/wps_hostapd.c
src/utils/eloop.c
src/utils/eloop.h
src/utils/eloop_win.c
wpa_supplicant/scan.c

index 4592cc85f05ea1f10bf800e114affbd5b8ce7afe..670b83447dd827f1c409b069c74229e0d2a2f647 100644 (file)
@@ -494,7 +494,7 @@ void ap_sta_replenish_timeout(struct hostapd_data *hapd, struct sta_info *sta,
                              u32 session_timeout)
 {
        if (eloop_replenish_timeout(session_timeout, 0,
-                                   ap_handle_session_timer, hapd, sta)) {
+                                   ap_handle_session_timer, hapd, sta) == 1) {
                hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
                               HOSTAPD_LEVEL_DEBUG, "setting session timeout "
                               "to %d seconds", session_timeout);
index 9edf0f5dc9eaaf85116a2263dbf3e2b483aaf555..4c94210e9b34459b55aaecc4b30212119b1c9c9e 100644 (file)
@@ -295,7 +295,8 @@ void hostapd_wps_eap_completed(struct hostapd_data *hapd)
         * timeout to happen after EAP completion rather than the originally
         * scheduled 100 ms after new configuration became known.
         */
-       if (eloop_deplete_timeout(0, 0, wps_reload_config, hapd->iface, NULL))
+       if (eloop_deplete_timeout(0, 0, wps_reload_config, hapd->iface, NULL) ==
+           1)
                wpa_printf(MSG_DEBUG, "WPS: Reschedule immediate configuration reload");
 }
 
index e983edcfb6a6317c68d317ec7583ed125917b603..f83a2327ae4973fd93abfe24ba0be3622d9f47f0 100644 (file)
@@ -623,10 +623,11 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
                                                       user_data);
                                return 1;
                        }
+                       return 0;
                }
        }
 
-       return 0;
+       return -1;
 }
 
 
@@ -654,10 +655,11 @@ int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
                                                       user_data);
                                return 1;
                        }
+                       return 0;
                }
        }
 
-       return 0;
+       return -1;
 }
 
 
index d3980fa4959c6309bb29515a5f6929268aa13a2a..07b8c0dc3352000d4dda90fc246f1c1640822add 100644 (file)
@@ -229,7 +229,8 @@ int eloop_is_timeout_registered(eloop_timeout_handler handler,
  * @handler: Matching callback function
  * @eloop_data: Matching eloop_data
  * @user_data: Matching user_data
- * Returns: 1 if the timeout is depleted, 0 if no change is made
+ * Returns: 1 if the timeout is depleted, 0 if no change is made, -1 if no
+ * timeout matched
  *
  * Find a registered matching <handler,eloop_data,user_data> timeout. If found,
  * deplete the timeout if remaining time is more than the requested time.
@@ -245,7 +246,8 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
  * @handler: Matching callback function
  * @eloop_data: Matching eloop_data
  * @user_data: Matching user_data
- * Returns: 1 if the timeout is replenished, 0 if no change is made
+ * Returns: 1 if the timeout is replenished, 0 if no change is made, -1 if no
+ * timeout matched
  *
  * Find a registered matching <handler,eloop_data,user_data> timeout. If found,
  * replenish the timeout if remaining time is less than the requested time.
index a1f999648f17d27c3589c3d63c30b9a2393bb8d6..de47fb21837c249be0dc55b95c2103d4b71eb328 100644 (file)
@@ -378,10 +378,11 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
                                                       user_data);
                                return 1;
                        }
+                       return 0;
                }
        }
 
-       return 0;
+       return -1;
 }
 
 
@@ -409,10 +410,11 @@ int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
                                                       user_data);
                                return 1;
                        }
+                       return 0;
                }
        }
 
-       return 0;
+       return -1;
 }
 
 
index c45130fef14c10a5bd43cdf7d3b421dc646391ec..da827bd7e29d871d4481deb444dd59c78636ccd7 100644 (file)
@@ -888,17 +888,19 @@ void wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec)
  */
 void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec)
 {
-       if (eloop_deplete_timeout(sec, usec, wpa_supplicant_scan, wpa_s, NULL))
-       {
-               wpa_dbg(wpa_s, MSG_DEBUG, "Rescheduling scan request: %d sec %d usec",
+       int res = eloop_deplete_timeout(sec, usec, wpa_supplicant_scan, wpa_s,
+                                       NULL);
+       if (res == 1) {
+               wpa_dbg(wpa_s, MSG_DEBUG, "Rescheduling scan request: %d.%06d sec",
                        sec, usec);
-               return;
+       } else if (res == 0) {
+               wpa_dbg(wpa_s, MSG_DEBUG, "Ignore new scan request for %d.%06d sec since an earlier request is scheduled to trigger sooner",
+                       sec, usec);
+       } else {
+               wpa_dbg(wpa_s, MSG_DEBUG, "Setting scan request: %d.%06d sec",
+                       sec, usec);
+               eloop_register_timeout(sec, usec, wpa_supplicant_scan, wpa_s, NULL);
        }
-
-       wpa_dbg(wpa_s, MSG_DEBUG, "Setting scan request: %d sec %d usec",
-               sec, usec);
-       eloop_cancel_timeout(wpa_supplicant_scan, wpa_s, NULL);
-       eloop_register_timeout(sec, usec, wpa_supplicant_scan, wpa_s, NULL);
 }