diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk index 995089a3d..97affc18e 100644 --- a/wpa_supplicant/Android.mk +++ b/wpa_supplicant/Android.mk @@ -1304,6 +1304,12 @@ L_CFLAGS += -DCONFIG_BGSCAN OBJS += bgscan.c endif +ifdef CONFIG_AUTOSCAN_EXPONENTIAL +L_CFLAGS += -DCONFIG_AUTOSCAN_EXPONENTIAL +OBJS += autoscan_exponential.c +NEED_AUTOSCAN=y +endif + ifdef NEED_AUTOSCAN L_CFLAGS += -DCONFIG_AUTOSCAN OBJS += autoscan.c diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index d06a15bf3..e08868582 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -1321,6 +1321,12 @@ CFLAGS += -DCONFIG_BGSCAN OBJS += bgscan.o endif +ifdef CONFIG_AUTOSCAN_EXPONENTIAL +CFLAGS += -DCONFIG_AUTOSCAN_EXPONENTIAL +OBJS += autoscan_exponential.o +NEED_AUTOSCAN=y +endif + ifdef NEED_AUTOSCAN CFLAGS += -DCONFIG_AUTOSCAN OBJS += autoscan.o diff --git a/wpa_supplicant/autoscan.c b/wpa_supplicant/autoscan.c index 2d4249c67..c53729146 100644 --- a/wpa_supplicant/autoscan.c +++ b/wpa_supplicant/autoscan.c @@ -15,7 +15,14 @@ #include "scan.h" #include "autoscan.h" +#ifdef CONFIG_AUTOSCAN_EXPONENTIAL +extern const struct autoscan_ops autoscan_exponential_ops; +#endif /* CONFIG_AUTOSCAN_EXPONENTIAL */ + static const struct autoscan_ops * autoscan_modules[] = { +#ifdef CONFIG_AUTOSCAN_EXPONENTIAL + &autoscan_exponential_ops, +#endif /* CONFIG_AUTOSCAN_EXPONENTIAL */ NULL }; diff --git a/wpa_supplicant/autoscan_exponential.c b/wpa_supplicant/autoscan_exponential.c new file mode 100644 index 000000000..9cd992124 --- /dev/null +++ b/wpa_supplicant/autoscan_exponential.c @@ -0,0 +1,101 @@ +/* + * WPA Supplicant - auto scan exponential module + * Copyright (c) 2012, Intel Corporation. All rights reserved. + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "includes.h" + +#include "common.h" +#include "wpa_supplicant_i.h" +#include "autoscan.h" + +struct autoscan_exponential_data { + struct wpa_supplicant *wpa_s; + int base; + int limit; + int interval; +}; + + +static int +autoscan_exponential_get_params(struct autoscan_exponential_data *data, + const char *params) +{ + const char *pos; + + if (params == NULL) + return -1; + + data->base = atoi(params); + + pos = os_strchr(params, ':'); + if (pos == NULL) + return -1; + + pos++; + data->limit = atoi(pos); + + return 0; +} + + +static void * autoscan_exponential_init(struct wpa_supplicant *wpa_s, + const char *params) +{ + struct autoscan_exponential_data *data; + + data = os_zalloc(sizeof(struct autoscan_exponential_data)); + if (data == NULL) + return NULL; + + if (autoscan_exponential_get_params(data, params) < 0) { + os_free(data); + return NULL; + } + + wpa_printf(MSG_DEBUG, "autoscan exponential: base exponential is %d " + "and limit is %d", data->base, data->limit); + + data->wpa_s = wpa_s; + + return data; +} + + +static void autoscan_exponential_deinit(void *priv) +{ + struct autoscan_exponential_data *data = priv; + + os_free(data); +} + + +static int autoscan_exponential_notify_scan(void *priv, + struct wpa_scan_results *scan_res) +{ + struct autoscan_exponential_data *data = priv; + + wpa_printf(MSG_DEBUG, "autoscan exponential: scan result " + "notification"); + + if (data->interval >= data->limit) + return data->limit; + + if (data->interval <= 0) + data->interval = data->base; + + data->interval = data->interval * data->base; + + return data->interval; +} + + +const struct autoscan_ops autoscan_exponential_ops = { + .name = "exponential", + .init = autoscan_exponential_init, + .deinit = autoscan_exponential_deinit, + .notify_scan = autoscan_exponential_notify_scan, +}; diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig index d7b679ebe..e70517334 100644 --- a/wpa_supplicant/defconfig +++ b/wpa_supplicant/defconfig @@ -504,4 +504,7 @@ CONFIG_PEERKEY=y # Autoscan # This can be used to enable automatic scan support in wpa_supplicant. # See wpa_supplicant.conf for more information on autoscan usage. -#CONFIG_AUTOSCAN=y +# +# Enabling directly a module will enable autoscan support. +# For exponential module: +#CONFIG_AUTOSCAN_EXPONENTIAL=y diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf index 52e658108..455746723 100644 --- a/wpa_supplicant/wpa_supplicant.conf +++ b/wpa_supplicant/wpa_supplicant.conf @@ -230,6 +230,10 @@ fast_reauth=1 # within an interface in following format: #autoscan=: # autoscan is like bgscan but on disconnected or inactive state. +# For instance, on exponential module parameters would be : +#autoscan=exponential:3:300 +# Which means a delay between scans on a base exponential of 3, +# up to the limit of 300 seconds (3, 9, 27 ... 300) # filter_ssids - SSID-based scan result filtering # 0 = do not filter scan results (default)