Patchwork [7/7] Adding a simple periodic autoscan module

login
register
mail settings
Submitter Tomasz Bursztyka
Date June 26, 2012, 8:05 a.m.
Message ID <1340697952-4209-8-git-send-email-tomasz.bursztyka@linux.intel.com>
Download mbox | patch
Permalink /patch/167334/
State Accepted
Commit e3659c89d22d7a4aeae240b5e6f20562c84d6742
Headers show

Comments

Tomasz Bursztyka - June 26, 2012, 8:05 a.m.
This module will sets a fixed scanning interval.
Thus, the parameter to this module is following this format: <fixed interval>

Signed-hostap: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
---
 wpa_supplicant/Makefile            |    6 +++
 wpa_supplicant/autoscan.c          |    7 ++++
 wpa_supplicant/autoscan_periodic.c |   69 ++++++++++++++++++++++++++++++++++++
 wpa_supplicant/defconfig           |    2 +
 wpa_supplicant/wpa_supplicant.conf |    3 ++
 5 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100644 wpa_supplicant/autoscan_periodic.c
Jouni Malinen - June 26, 2012, 4:33 p.m.
On Tue, Jun 26, 2012 at 11:05:52AM +0300, Tomasz Bursztyka wrote:
> diff --git a/wpa_supplicant/autoscan_periodic.c b/wpa_supplicant/autoscan_periodic.c
> +static int periodic_interval = 0;

I changed this to use dynamically allocated structure instead of a
static variable since a single wpa_supplicant process can manage
multiple radios (or virtual interfaces) and there could be conflicting
configuration for each radio.


PS.

The configured autoscan parameter could be copied in
wpas_p2p_clone_config() to make sure it gets used in the case separate
P2P group interfaces are used. Though, I'm not sure whether this is
really something that would ever make much sense with P2P since more
common configuration there is to remove the P2P group automatically if
the GO is not found and as such, the interface is less likely to remain
in scanning state for extended periods.

Patch

diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile
index e088685..dc6af35 100644
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -1327,6 +1327,12 @@  OBJS += autoscan_exponential.o
 NEED_AUTOSCAN=y
 endif
 
+ifdef CONFIG_AUTOSCAN_PERIODIC
+CFLAGS += -DCONFIG_AUTOSCAN_PERIODIC
+OBJS += autoscan_periodic.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 4abf62a..8a65df3 100644
--- a/wpa_supplicant/autoscan.c
+++ b/wpa_supplicant/autoscan.c
@@ -19,10 +19,17 @@ 
 extern const struct autoscan_ops autoscan_exponential_ops;
 #endif /* CONFIG_AUTOSCAN_EXPONENTIAL */
 
+#ifdef CONFIG_AUTOSCAN_PERIODIC
+extern const struct autoscan_ops autoscan_periodic_ops;
+#endif /* CONFIG_AUTOSCAN_PERIODIC */
+
 static const struct autoscan_ops * autoscan_modules[] = {
 #ifdef CONFIG_AUTOSCAN_EXPONENTIAL
 	&autoscan_exponential_ops,
 #endif /* CONFIG_AUTOSCAN_EXPONENTIAL */
+#ifdef CONFIG_AUTOSCAN_PERIODIC
+	&autoscan_periodic_ops,
+#endif /* CONFIG_AUTOSCAN_PERIODIC */
 	NULL
 };
 
diff --git a/wpa_supplicant/autoscan_periodic.c b/wpa_supplicant/autoscan_periodic.c
new file mode 100644
index 0000000..887120f
--- /dev/null
+++ b/wpa_supplicant/autoscan_periodic.c
@@ -0,0 +1,69 @@ 
+/*
+ * WPA Supplicant - auto scan periodic module
+ * Copyright (c) 2012, Intel Corporation. All rights reserved.
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README and COPYING for more details.
+ */
+
+#include "includes.h"
+
+#include "common.h"
+#include "wpa_supplicant_i.h"
+#include "autoscan.h"
+
+
+static int periodic_interval = 0;
+
+static int autoscan_periodic_get_params(const char *params)
+{
+	int interval;
+
+	if (params == NULL)
+		return -1;
+
+	interval = atoi(params);
+
+	if (interval < 0)
+		return -1;
+
+	periodic_interval = interval;
+
+	return 0;
+}
+
+
+static void * autoscan_periodic_init(struct wpa_supplicant *wpa_s,
+				     const char *params)
+{
+	if (autoscan_periodic_get_params(params) < 0)
+		return NULL;
+
+	wpa_printf(MSG_DEBUG, "autoscan periodic: interval is %d",
+		   periodic_interval);
+
+	return &periodic_interval;
+}
+
+
+static void autoscan_periodic_deinit(void *priv)
+{
+	periodic_interval = 0;
+}
+
+
+static int autoscan_periodic_notify_scan(void *priv,
+					 struct wpa_scan_results *scan_res)
+{
+	wpa_printf(MSG_DEBUG, "autoscan periodic: scan result notification");
+
+	return periodic_interval;
+}
+
+
+const struct autoscan_ops autoscan_periodic_ops = {
+	.name = "periodic",
+	.init = autoscan_periodic_init,
+	.deinit = autoscan_periodic_deinit,
+	.notify_scan = autoscan_periodic_notify_scan,
+};
diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig
index c007909..9addcbf 100644
--- a/wpa_supplicant/defconfig
+++ b/wpa_supplicant/defconfig
@@ -508,3 +508,5 @@  CONFIG_PEERKEY=y
 # Enabling directly a module will enable autoscan support.
 # For exponential module:
 #CONFIG_AUTOSCAN_EXPONENTIAL=y
+# For periodic module:
+#CONFIG_AUTOSCAN_PERIODIC=y
diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf
index 4557467..ccde844 100644
--- a/wpa_supplicant/wpa_supplicant.conf
+++ b/wpa_supplicant/wpa_supplicant.conf
@@ -234,6 +234,9 @@  fast_reauth=1
 #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)
+# For periodic module, parameters would be <fixed interval>
+#autoscan=periodic:30
+# So a delay of 30 seconds will be applied between each scan
 
 # filter_ssids - SSID-based scan result filtering
 # 0 = do not filter scan results (default)