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