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 }; 105