1*f05cddf9SRui Paulo /*
2*f05cddf9SRui Paulo * WPA Supplicant - auto scan exponential module
3*f05cddf9SRui Paulo * Copyright (c) 2012, Intel Corporation. All rights reserved.
4*f05cddf9SRui Paulo *
5*f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license.
6*f05cddf9SRui Paulo * See README for more details.
7*f05cddf9SRui Paulo */
8*f05cddf9SRui Paulo
9*f05cddf9SRui Paulo #include "includes.h"
10*f05cddf9SRui Paulo
11*f05cddf9SRui Paulo #include "common.h"
12*f05cddf9SRui Paulo #include "wpa_supplicant_i.h"
13*f05cddf9SRui Paulo #include "autoscan.h"
14*f05cddf9SRui Paulo
15*f05cddf9SRui Paulo struct autoscan_exponential_data {
16*f05cddf9SRui Paulo struct wpa_supplicant *wpa_s;
17*f05cddf9SRui Paulo int base;
18*f05cddf9SRui Paulo int limit;
19*f05cddf9SRui Paulo int interval;
20*f05cddf9SRui Paulo };
21*f05cddf9SRui Paulo
22*f05cddf9SRui Paulo
23*f05cddf9SRui Paulo static int
autoscan_exponential_get_params(struct autoscan_exponential_data * data,const char * params)24*f05cddf9SRui Paulo autoscan_exponential_get_params(struct autoscan_exponential_data *data,
25*f05cddf9SRui Paulo const char *params)
26*f05cddf9SRui Paulo {
27*f05cddf9SRui Paulo const char *pos;
28*f05cddf9SRui Paulo
29*f05cddf9SRui Paulo if (params == NULL)
30*f05cddf9SRui Paulo return -1;
31*f05cddf9SRui Paulo
32*f05cddf9SRui Paulo data->base = atoi(params);
33*f05cddf9SRui Paulo
34*f05cddf9SRui Paulo pos = os_strchr(params, ':');
35*f05cddf9SRui Paulo if (pos == NULL)
36*f05cddf9SRui Paulo return -1;
37*f05cddf9SRui Paulo
38*f05cddf9SRui Paulo pos++;
39*f05cddf9SRui Paulo data->limit = atoi(pos);
40*f05cddf9SRui Paulo
41*f05cddf9SRui Paulo return 0;
42*f05cddf9SRui Paulo }
43*f05cddf9SRui Paulo
44*f05cddf9SRui Paulo
autoscan_exponential_init(struct wpa_supplicant * wpa_s,const char * params)45*f05cddf9SRui Paulo static void * autoscan_exponential_init(struct wpa_supplicant *wpa_s,
46*f05cddf9SRui Paulo const char *params)
47*f05cddf9SRui Paulo {
48*f05cddf9SRui Paulo struct autoscan_exponential_data *data;
49*f05cddf9SRui Paulo
50*f05cddf9SRui Paulo data = os_zalloc(sizeof(struct autoscan_exponential_data));
51*f05cddf9SRui Paulo if (data == NULL)
52*f05cddf9SRui Paulo return NULL;
53*f05cddf9SRui Paulo
54*f05cddf9SRui Paulo if (autoscan_exponential_get_params(data, params) < 0) {
55*f05cddf9SRui Paulo os_free(data);
56*f05cddf9SRui Paulo return NULL;
57*f05cddf9SRui Paulo }
58*f05cddf9SRui Paulo
59*f05cddf9SRui Paulo wpa_printf(MSG_DEBUG, "autoscan exponential: base exponential is %d "
60*f05cddf9SRui Paulo "and limit is %d", data->base, data->limit);
61*f05cddf9SRui Paulo
62*f05cddf9SRui Paulo data->wpa_s = wpa_s;
63*f05cddf9SRui Paulo
64*f05cddf9SRui Paulo return data;
65*f05cddf9SRui Paulo }
66*f05cddf9SRui Paulo
67*f05cddf9SRui Paulo
autoscan_exponential_deinit(void * priv)68*f05cddf9SRui Paulo static void autoscan_exponential_deinit(void *priv)
69*f05cddf9SRui Paulo {
70*f05cddf9SRui Paulo struct autoscan_exponential_data *data = priv;
71*f05cddf9SRui Paulo
72*f05cddf9SRui Paulo os_free(data);
73*f05cddf9SRui Paulo }
74*f05cddf9SRui Paulo
75*f05cddf9SRui Paulo
autoscan_exponential_notify_scan(void * priv,struct wpa_scan_results * scan_res)76*f05cddf9SRui Paulo static int autoscan_exponential_notify_scan(void *priv,
77*f05cddf9SRui Paulo struct wpa_scan_results *scan_res)
78*f05cddf9SRui Paulo {
79*f05cddf9SRui Paulo struct autoscan_exponential_data *data = priv;
80*f05cddf9SRui Paulo
81*f05cddf9SRui Paulo wpa_printf(MSG_DEBUG, "autoscan exponential: scan result "
82*f05cddf9SRui Paulo "notification");
83*f05cddf9SRui Paulo
84*f05cddf9SRui Paulo if (data->interval >= data->limit)
85*f05cddf9SRui Paulo return data->limit;
86*f05cddf9SRui Paulo
87*f05cddf9SRui Paulo if (data->interval <= 0)
88*f05cddf9SRui Paulo data->interval = data->base;
89*f05cddf9SRui Paulo else {
90*f05cddf9SRui Paulo data->interval = data->interval * data->base;
91*f05cddf9SRui Paulo if (data->interval > data->limit)
92*f05cddf9SRui Paulo return data->limit;
93*f05cddf9SRui Paulo }
94*f05cddf9SRui Paulo
95*f05cddf9SRui Paulo return data->interval;
96*f05cddf9SRui Paulo }
97*f05cddf9SRui Paulo
98*f05cddf9SRui Paulo
99*f05cddf9SRui Paulo const struct autoscan_ops autoscan_exponential_ops = {
100*f05cddf9SRui Paulo .name = "exponential",
101*f05cddf9SRui Paulo .init = autoscan_exponential_init,
102*f05cddf9SRui Paulo .deinit = autoscan_exponential_deinit,
103*f05cddf9SRui Paulo .notify_scan = autoscan_exponential_notify_scan,
104*f05cddf9SRui Paulo };
105