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