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