]>
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 | ||
16 | #ifdef CONFIG_BGSCAN_SIMPLE | |
17 | extern const struct bgscan_ops bgscan_simple_ops; | |
18 | #endif /* CONFIG_BGSCAN_SIMPLE */ | |
c4d71c25 JM |
19 | #ifdef CONFIG_BGSCAN_LEARN |
20 | extern const struct bgscan_ops bgscan_learn_ops; | |
21 | #endif /* CONFIG_BGSCAN_LEARN */ | |
60b94c98 JM |
22 | |
23 | static const struct bgscan_ops * bgscan_modules[] = { | |
24 | #ifdef CONFIG_BGSCAN_SIMPLE | |
25 | &bgscan_simple_ops, | |
26 | #endif /* CONFIG_BGSCAN_SIMPLE */ | |
c4d71c25 JM |
27 | #ifdef CONFIG_BGSCAN_LEARN |
28 | &bgscan_learn_ops, | |
29 | #endif /* CONFIG_BGSCAN_LEARN */ | |
60b94c98 JM |
30 | NULL |
31 | }; | |
32 | ||
33 | ||
31392709 HD |
34 | int bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, |
35 | const char *name) | |
60b94c98 | 36 | { |
60b94c98 JM |
37 | const char *params; |
38 | size_t nlen; | |
39 | int i; | |
40 | const struct bgscan_ops *ops = NULL; | |
41 | ||
42 | bgscan_deinit(wpa_s); | |
43 | if (name == NULL) | |
31392709 | 44 | return -1; |
60b94c98 JM |
45 | |
46 | params = os_strchr(name, ':'); | |
47 | if (params == NULL) { | |
48 | params = ""; | |
49 | nlen = os_strlen(name); | |
50 | } else { | |
51 | nlen = params - name; | |
52 | params++; | |
53 | } | |
54 | ||
55 | for (i = 0; bgscan_modules[i]; i++) { | |
56 | if (os_strncmp(name, bgscan_modules[i]->name, nlen) == 0) { | |
57 | ops = bgscan_modules[i]; | |
58 | break; | |
59 | } | |
60 | } | |
61 | ||
62 | if (ops == NULL) { | |
63 | wpa_printf(MSG_ERROR, "bgscan: Could not find module " | |
64 | "matching the parameter '%s'", name); | |
65 | return -1; | |
66 | } | |
67 | ||
68 | wpa_s->bgscan_priv = ops->init(wpa_s, params, ssid); | |
69 | if (wpa_s->bgscan_priv == NULL) | |
70 | return -1; | |
71 | wpa_s->bgscan = ops; | |
72 | wpa_printf(MSG_DEBUG, "bgscan: Initialized module '%s' with " | |
73 | "parameters '%s'", ops->name, params); | |
74 | ||
75 | return 0; | |
76 | } | |
77 | ||
78 | ||
79 | void bgscan_deinit(struct wpa_supplicant *wpa_s) | |
80 | { | |
81 | if (wpa_s->bgscan && wpa_s->bgscan_priv) { | |
82 | wpa_printf(MSG_DEBUG, "bgscan: Deinitializing module '%s'", | |
83 | wpa_s->bgscan->name); | |
84 | wpa_s->bgscan->deinit(wpa_s->bgscan_priv); | |
85 | wpa_s->bgscan = NULL; | |
86 | wpa_s->bgscan_priv = NULL; | |
87 | } | |
88 | } | |
89 | ||
90 | ||
c2594c36 JM |
91 | int bgscan_notify_scan(struct wpa_supplicant *wpa_s, |
92 | struct wpa_scan_results *scan_res) | |
60b94c98 JM |
93 | { |
94 | if (wpa_s->bgscan && wpa_s->bgscan_priv) | |
c2594c36 JM |
95 | return wpa_s->bgscan->notify_scan(wpa_s->bgscan_priv, |
96 | scan_res); | |
60b94c98 JM |
97 | return 0; |
98 | } | |
99 | ||
100 | ||
101 | void bgscan_notify_beacon_loss(struct wpa_supplicant *wpa_s) | |
102 | { | |
103 | if (wpa_s->bgscan && wpa_s->bgscan_priv) | |
104 | wpa_s->bgscan->notify_beacon_loss(wpa_s->bgscan_priv); | |
105 | } | |
106 | ||
107 | ||
60a972a6 | 108 | void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above, |
174fa789 PS |
109 | int current_signal, int current_noise, |
110 | int current_txrate) | |
60b94c98 JM |
111 | { |
112 | if (wpa_s->bgscan && wpa_s->bgscan_priv) | |
60a972a6 | 113 | wpa_s->bgscan->notify_signal_change(wpa_s->bgscan_priv, above, |
174fa789 PS |
114 | current_signal, |
115 | current_noise, | |
116 | current_txrate); | |
60b94c98 | 117 | } |