xref: /dflybsd-src/contrib/wpa_supplicant/wpa_supplicant/bgscan.c (revision 3a84a4273475ed07d0ab1c2dfeffdfedef35d9cd)
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