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