bgscan.c revision c5ec7f57ead87efa365800228aa0b09a12d9e6c4
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - background scan and roaming interface
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_supplicant_i.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config_ssid.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "bgscan.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_BGSCAN_SIMPLE
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern const struct bgscan_ops bgscan_simple_ops;
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_BGSCAN_SIMPLE */
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_BGSCAN_LEARN
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern const struct bgscan_ops bgscan_learn_ops;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_BGSCAN_LEARN */
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const struct bgscan_ops * bgscan_modules[] = {
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_BGSCAN_SIMPLE
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	&bgscan_simple_ops,
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_BGSCAN_SIMPLE */
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_BGSCAN_LEARN
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	&bgscan_learn_ops,
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_BGSCAN_LEARN */
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	NULL
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint bgscan_init(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *name = ssid->bgscan;
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *params;
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t nlen;
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct bgscan_ops *ops = NULL;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	bgscan_deinit(wpa_s);
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (name == NULL)
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params = os_strchr(name, ':');
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (params == NULL) {
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params = "";
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nlen = os_strlen(name);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nlen = params - name;
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params++;
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; bgscan_modules[i]; i++) {
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncmp(name, bgscan_modules[i]->name, nlen) == 0) {
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ops = bgscan_modules[i];
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ops == NULL) {
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "bgscan: Could not find module "
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "matching the parameter '%s'", name);
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->bgscan_priv = ops->init(wpa_s, params, ssid);
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->bgscan_priv == NULL)
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->bgscan = ops;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_printf(MSG_DEBUG, "bgscan: Initialized module '%s' with "
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		   "parameters '%s'", ops->name, params);
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid bgscan_deinit(struct wpa_supplicant *wpa_s)
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->bgscan && wpa_s->bgscan_priv) {
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "bgscan: Deinitializing module '%s'",
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   wpa_s->bgscan->name);
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->bgscan->deinit(wpa_s->bgscan_priv);
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->bgscan = NULL;
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->bgscan_priv = NULL;
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint bgscan_notify_scan(struct wpa_supplicant *wpa_s,
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       struct wpa_scan_results *scan_res)
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->bgscan && wpa_s->bgscan_priv)
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->bgscan->notify_scan(wpa_s->bgscan_priv,
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  scan_res);
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid bgscan_notify_beacon_loss(struct wpa_supplicant *wpa_s)
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->bgscan && wpa_s->bgscan_priv)
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->bgscan->notify_beacon_loss(wpa_s->bgscan_priv);
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above,
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 int current_signal, int current_noise,
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 int current_txrate)
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->bgscan && wpa_s->bgscan_priv)
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->bgscan->notify_signal_change(wpa_s->bgscan_priv, above,
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    current_signal,
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    current_noise,
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    current_txrate);
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
118