]>
Commit | Line | Data |
---|---|---|
60b94c98 JM |
1 | /* |
2 | * WPA Supplicant - background scan and roaming interface | |
e2f74005 | 3 | * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi> |
60b94c98 | 4 | * |
0f3d578e JM |
5 | * This software may be distributed under the terms of the BSD license. |
6 | * See README for more details. | |
60b94c98 JM |
7 | */ |
8 | ||
9 | #include "includes.h" | |
10 | ||
11 | #include "common.h" | |
12 | #include "wpa_supplicant_i.h" | |
13 | #include "config_ssid.h" | |
14 | #include "bgscan.h" | |
15 | ||
60b94c98 JM |
16 | |
17 | static const struct bgscan_ops * bgscan_modules[] = { | |
18 | #ifdef CONFIG_BGSCAN_SIMPLE | |
19 | &bgscan_simple_ops, | |
20 | #endif /* CONFIG_BGSCAN_SIMPLE */ | |
c4d71c25 JM |
21 | #ifdef CONFIG_BGSCAN_LEARN |
22 | &bgscan_learn_ops, | |
23 | #endif /* CONFIG_BGSCAN_LEARN */ | |
60b94c98 JM |
24 | NULL |
25 | }; | |
26 | ||
27 | ||
31392709 HD |
28 | int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, |
29 | const char *name) | |
60b94c98 | 30 | { |
60b94c98 JM |
31 | const char *params; |
32 | size_t nlen; | |
33 | int i; | |
34 | const struct bgscan_ops *ops = NULL; | |
35 | ||
36 | bgscan_deinit(wpa_s); | |
60b94c98 JM |
37 | |
38 | params = os_strchr(name, ':'); | |
39 | if (params == NULL) { | |
40 | params = ""; | |
41 | nlen = os_strlen(name); | |
42 | } else { | |
43 | nlen = params - name; | |
44 | params++; | |
45 | } | |
46 | ||
47 | for (i = 0; bgscan_modules[i]; i++) { | |
48 | if (os_strncmp(name, bgscan_modules[i]->name, nlen) == 0) { | |
49 | ops = bgscan_modules[i]; | |
50 | break; | |
51 | } | |
52 | } | |
53 | ||
54 | if (ops == NULL) { | |
55 | wpa_printf(MSG_ERROR, "bgscan: Could not find module " | |
56 | "matching the parameter '%s'", name); | |
57 | return -1; | |
58 | } | |
59 | ||
60 | wpa_s->bgscan_priv = ops->init(wpa_s, params, ssid); | |
61 | if (wpa_s->bgscan_priv == NULL) | |
62 | return -1; | |
63 | wpa_s->bgscan = ops; | |
64 | wpa_printf(MSG_DEBUG, "bgscan: Initialized module '%s' with " | |
65 | "parameters '%s'", ops->name, params); | |
66 | ||
67 | return 0; | |
68 | } | |
69 | ||
70 | ||
71 | void bgscan_deinit(struct wpa_supplicant *wpa_s) | |
72 | { | |
73 | if (wpa_s->bgscan && wpa_s->bgscan_priv) { | |
74 | wpa_printf(MSG_DEBUG, "bgscan: Deinitializing module '%s'", | |
75 | wpa_s->bgscan->name); | |
76 | wpa_s->bgscan->deinit(wpa_s->bgscan_priv); | |
77 | wpa_s->bgscan = NULL; | |
78 | wpa_s->bgscan_priv = NULL; | |
79 | } | |
80 | } | |
81 | ||
82 | ||
c2594c36 JM |
83 | int bgscan_notify_scan(struct wpa_supplicant *wpa_s, |
84 | struct wpa_scan_results *scan_res) | |
60b94c98 JM |
85 | { |
86 | if (wpa_s->bgscan && wpa_s->bgscan_priv) | |
c2594c36 JM |
87 | return wpa_s->bgscan->notify_scan(wpa_s->bgscan_priv, |
88 | scan_res); | |
60b94c98 JM |
89 | return 0; |
90 | } | |
91 | ||
92 | ||
93 | void bgscan_notify_beacon_loss(struct wpa_supplicant *wpa_s) | |
94 | { | |
95 | if (wpa_s->bgscan && wpa_s->bgscan_priv) | |
96 | wpa_s->bgscan->notify_beacon_loss(wpa_s->bgscan_priv); | |
97 | } | |
98 | ||
99 | ||
60a972a6 | 100 | void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above, |
174fa789 PS |
101 | int current_signal, int current_noise, |
102 | int current_txrate) | |
60b94c98 JM |
103 | { |
104 | if (wpa_s->bgscan && wpa_s->bgscan_priv) | |
60a972a6 | 105 | wpa_s->bgscan->notify_signal_change(wpa_s->bgscan_priv, above, |
174fa789 PS |
106 | current_signal, |
107 | current_noise, | |
108 | current_txrate); | |
60b94c98 | 109 | } |