bss_load.c revision 281681
1281681Srpaulo/* 2281681Srpaulo * BSS Load Element / Channel Utilization 3281681Srpaulo * Copyright (c) 2014, Qualcomm Atheros, Inc. 4281681Srpaulo * 5281681Srpaulo * This software may be distributed under the terms of the BSD license. 6281681Srpaulo * See README for more details. 7281681Srpaulo */ 8281681Srpaulo 9281681Srpaulo#include "utils/includes.h" 10281681Srpaulo 11281681Srpaulo#include "utils/common.h" 12281681Srpaulo#include "utils/eloop.h" 13281681Srpaulo#include "hostapd.h" 14281681Srpaulo#include "bss_load.h" 15281681Srpaulo#include "ap_drv_ops.h" 16281681Srpaulo#include "beacon.h" 17281681Srpaulo 18281681Srpaulo 19281681Srpaulostatic void update_channel_utilization(void *eloop_data, void *user_data) 20281681Srpaulo{ 21281681Srpaulo struct hostapd_data *hapd = eloop_data; 22281681Srpaulo unsigned int sec, usec; 23281681Srpaulo int err; 24281681Srpaulo 25281681Srpaulo if (!(hapd->beacon_set_done && hapd->started)) 26281681Srpaulo return; 27281681Srpaulo 28281681Srpaulo err = hostapd_drv_get_survey(hapd, hapd->iface->freq); 29281681Srpaulo if (err) { 30281681Srpaulo wpa_printf(MSG_ERROR, "BSS Load: Failed to get survey data"); 31281681Srpaulo return; 32281681Srpaulo } 33281681Srpaulo 34281681Srpaulo ieee802_11_set_beacon(hapd); 35281681Srpaulo 36281681Srpaulo sec = ((hapd->bss_load_update_timeout / 1000) * 1024) / 1000; 37281681Srpaulo usec = (hapd->bss_load_update_timeout % 1000) * 1024; 38281681Srpaulo eloop_register_timeout(sec, usec, update_channel_utilization, hapd, 39281681Srpaulo NULL); 40281681Srpaulo} 41281681Srpaulo 42281681Srpaulo 43281681Srpauloint bss_load_update_init(struct hostapd_data *hapd) 44281681Srpaulo{ 45281681Srpaulo struct hostapd_bss_config *conf = hapd->conf; 46281681Srpaulo struct hostapd_config *iconf = hapd->iconf; 47281681Srpaulo unsigned int sec, usec; 48281681Srpaulo 49281681Srpaulo if (!conf->bss_load_update_period || !iconf->beacon_int) 50281681Srpaulo return -1; 51281681Srpaulo 52281681Srpaulo hapd->bss_load_update_timeout = conf->bss_load_update_period * 53281681Srpaulo iconf->beacon_int; 54281681Srpaulo sec = ((hapd->bss_load_update_timeout / 1000) * 1024) / 1000; 55281681Srpaulo usec = (hapd->bss_load_update_timeout % 1000) * 1024; 56281681Srpaulo eloop_register_timeout(sec, usec, update_channel_utilization, hapd, 57281681Srpaulo NULL); 58281681Srpaulo return 0; 59281681Srpaulo} 60281681Srpaulo 61281681Srpaulo 62281681Srpaulovoid bss_load_update_deinit(struct hostapd_data *hapd) 63281681Srpaulo{ 64281681Srpaulo eloop_cancel_timeout(update_channel_utilization, hapd, NULL); 65281681Srpaulo} 66