]>
Commit | Line | Data |
---|---|---|
c0fba2b3 TB |
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; | |
460b36d0 | 89 | else { |
ccea4eb3 | 90 | data->interval = data->interval * data->base; |
460b36d0 JM |
91 | if (data->interval > data->limit) |
92 | return data->limit; | |
93 | } | |
c0fba2b3 TB |
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 | }; |