xref: /freebsd-src/contrib/wpa/wpa_supplicant/autoscan_exponential.c (revision 0bfd163f522701b486e066fa2e56624c02f5081a)
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