| OLD | NEW |
| 1 /* | 1 /* |
| 2 * WPA Supplicant - background scan and roaming module: simple | 2 * WPA Supplicant - background scan and roaming module: simple |
| 3 * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi> | 3 * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi> |
| 4 * | 4 * |
| 5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Alternatively, this software may be distributed under the terms of BSD | 9 * Alternatively, this software may be distributed under the terms of BSD |
| 10 * license. | 10 * license. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "bgscan.h" | 24 #include "bgscan.h" |
| 25 | 25 |
| 26 struct bgscan_simple_data { | 26 struct bgscan_simple_data { |
| 27 struct wpa_supplicant *wpa_s; | 27 struct wpa_supplicant *wpa_s; |
| 28 const struct wpa_ssid *ssid; | 28 const struct wpa_ssid *ssid; |
| 29 int scan_interval; | 29 int scan_interval; |
| 30 int signal_threshold; | 30 int signal_threshold; |
| 31 int short_interval; /* use if signal < threshold */ | 31 int short_interval; /* use if signal < threshold */ |
| 32 int long_interval; /* use if signal > threshold */ | 32 int long_interval; /* use if signal > threshold */ |
| 33 struct os_time last_bgscan; | 33 struct os_time last_bgscan; |
| 34 int init_scan; |
| 34 }; | 35 }; |
| 35 | 36 |
| 36 | 37 |
| 37 static void bgscan_simple_timeout(void *eloop_ctx, void *timeout_ctx) | 38 static void bgscan_simple_timeout(void *eloop_ctx, void *timeout_ctx) |
| 38 { | 39 { |
| 39 struct bgscan_simple_data *data = eloop_ctx; | 40 struct bgscan_simple_data *data = eloop_ctx; |
| 40 struct wpa_supplicant *wpa_s = data->wpa_s; | 41 struct wpa_supplicant *wpa_s = data->wpa_s; |
| 41 struct wpa_driver_scan_params params; | 42 struct wpa_driver_scan_params params; |
| 42 | 43 |
| 43 os_memset(¶ms, 0, sizeof(params)); | 44 os_memset(¶ms, 0, sizeof(params)); |
| 44 params.num_ssids = 1; | 45 params.num_ssids = 1; |
| 45 params.ssids[0].ssid = data->ssid->ssid; | 46 params.ssids[0].ssid = data->ssid->ssid; |
| 46 params.ssids[0].ssid_len = data->ssid->ssid_len; | 47 params.ssids[0].ssid_len = data->ssid->ssid_len; |
| 47 params.freqs = data->ssid->scan_freq; | 48 params.freqs = data->ssid->scan_freq; |
| 48 | 49 |
| 49 /* | 50 /* |
| 50 * A more advanced bgscan module would learn about most like channels | 51 * A more advanced bgscan module would learn about most like channels |
| 51 * over time and request scans only for some channels (probing others | 52 * over time and request scans only for some channels (probing others |
| 52 * every now and then) to reduce effect on the data connection. | 53 * every now and then) to reduce effect on the data connection. |
| 53 */ | 54 */ |
| 54 | 55 |
| 55 wpa_printf(MSG_DEBUG, "bgscan simple: Request a background scan"); | 56 wpa_printf(MSG_DEBUG, "bgscan simple: Request a background scan"); |
| 56 if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { | 57 if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { |
| 57 wpa_printf(MSG_DEBUG, "bgscan simple: Failed to trigger scan"); | 58 wpa_printf(MSG_DEBUG, "bgscan simple: Failed to trigger scan"); |
| 58 eloop_register_timeout(data->scan_interval, 0, | 59 eloop_register_timeout(data->scan_interval, 0, |
| 59 bgscan_simple_timeout, data, NULL); | 60 bgscan_simple_timeout, data, NULL); |
| 60 » } else | 61 » } else { |
| 61 os_get_time(&data->last_bgscan); | 62 os_get_time(&data->last_bgscan); |
| 63 data->init_scan = 0; |
| 64 } |
| 62 } | 65 } |
| 63 | 66 |
| 64 | 67 |
| 65 static int bgscan_simple_get_params(struct bgscan_simple_data *data, | 68 static int bgscan_simple_get_params(struct bgscan_simple_data *data, |
| 66 const char *params) | 69 const char *params) |
| 67 { | 70 { |
| 68 const char *pos; | 71 const char *pos; |
| 69 | 72 |
| 70 if (params == NULL) | 73 if (params == NULL) |
| 71 return 0; | 74 return 0; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 data->signal_threshold, data->short_interval, | 118 data->signal_threshold, data->short_interval, |
| 116 data->long_interval); | 119 data->long_interval); |
| 117 | 120 |
| 118 if (data->signal_threshold && | 121 if (data->signal_threshold && |
| 119 wpa_drv_signal_monitor(wpa_s, data->signal_threshold, 4) < 0) { | 122 wpa_drv_signal_monitor(wpa_s, data->signal_threshold, 4) < 0) { |
| 120 wpa_printf(MSG_ERROR, "bgscan simple: Failed to enable " | 123 wpa_printf(MSG_ERROR, "bgscan simple: Failed to enable " |
| 121 "signal strength monitoring"); | 124 "signal strength monitoring"); |
| 122 } | 125 } |
| 123 | 126 |
| 124 data->scan_interval = data->short_interval; | 127 data->scan_interval = data->short_interval; |
| 128 data->init_scan = 1; |
| 125 eloop_register_timeout(data->scan_interval, 0, bgscan_simple_timeout, | 129 eloop_register_timeout(data->scan_interval, 0, bgscan_simple_timeout, |
| 126 data, NULL); | 130 data, NULL); |
| 127 return data; | 131 return data; |
| 128 } | 132 } |
| 129 | 133 |
| 130 | 134 |
| 131 static void bgscan_simple_deinit(void *priv) | 135 static void bgscan_simple_deinit(void *priv) |
| 132 { | 136 { |
| 133 struct bgscan_simple_data *data = priv; | 137 struct bgscan_simple_data *data = priv; |
| 134 eloop_cancel_timeout(bgscan_simple_timeout, data, NULL); | 138 eloop_cancel_timeout(bgscan_simple_timeout, data, NULL); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 164 wpa_printf(MSG_DEBUG, "bgscan simple: beacon loss"); | 168 wpa_printf(MSG_DEBUG, "bgscan simple: beacon loss"); |
| 165 /* TODO: speed up background scanning */ | 169 /* TODO: speed up background scanning */ |
| 166 } | 170 } |
| 167 | 171 |
| 168 | 172 |
| 169 static void bgscan_simple_notify_signal_change(void *priv, int above) | 173 static void bgscan_simple_notify_signal_change(void *priv, int above) |
| 170 { | 174 { |
| 171 struct bgscan_simple_data *data = priv; | 175 struct bgscan_simple_data *data = priv; |
| 172 | 176 |
| 173 if (data->short_interval == data->long_interval || | 177 if (data->short_interval == data->long_interval || |
| 174 » data->signal_threshold == 0) | 178 » data->signal_threshold == 0 || |
| 179 » data->init_scan != 0) |
| 175 return; | 180 return; |
| 176 | 181 |
| 177 wpa_printf(MSG_DEBUG, "bgscan simple: signal level changed " | 182 wpa_printf(MSG_DEBUG, "bgscan simple: signal level changed " |
| 178 "(above=%d)", above); | 183 "(above=%d)", above); |
| 179 if (data->scan_interval == data->long_interval && !above) { | 184 if (data->scan_interval == data->long_interval && !above) { |
| 180 wpa_printf(MSG_DEBUG, "bgscan simple: Trigger immediate scan " | 185 wpa_printf(MSG_DEBUG, "bgscan simple: Trigger immediate scan " |
| 181 "and start using short bgscan interval"); | 186 "and start using short bgscan interval"); |
| 182 data->scan_interval = data->short_interval; | 187 data->scan_interval = data->short_interval; |
| 183 eloop_cancel_timeout(bgscan_simple_timeout, data, NULL); | 188 eloop_cancel_timeout(bgscan_simple_timeout, data, NULL); |
| 184 eloop_register_timeout(0, 0, bgscan_simple_timeout, data, | 189 eloop_register_timeout(0, 0, bgscan_simple_timeout, data, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 210 | 215 |
| 211 | 216 |
| 212 const struct bgscan_ops bgscan_simple_ops = { | 217 const struct bgscan_ops bgscan_simple_ops = { |
| 213 .name = "simple", | 218 .name = "simple", |
| 214 .init = bgscan_simple_init, | 219 .init = bgscan_simple_init, |
| 215 .deinit = bgscan_simple_deinit, | 220 .deinit = bgscan_simple_deinit, |
| 216 .notify_scan = bgscan_simple_notify_scan, | 221 .notify_scan = bgscan_simple_notify_scan, |
| 217 .notify_beacon_loss = bgscan_simple_notify_beacon_loss, | 222 .notify_beacon_loss = bgscan_simple_notify_beacon_loss, |
| 218 .notify_signal_change = bgscan_simple_notify_signal_change, | 223 .notify_signal_change = bgscan_simple_notify_signal_change, |
| 219 }; | 224 }; |
| OLD | NEW |